At the moment, cpu_post_load() exists with error on the first catch of unexpected register in the incoming stream. Let the code go further and trace all the issues before exiting.
Signed-off-by: Eric Auger <[email protected]> --- target/arm/machine.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/target/arm/machine.c b/target/arm/machine.c index 7dd649e8f64..13f3955be67 100644 --- a/target/arm/machine.c +++ b/target/arm/machine.c @@ -1058,6 +1058,7 @@ static int cpu_post_load(void *opaque, int version_id) { ARMCPU *cpu = opaque; CPUARMState *env = &cpu->env; + bool fail = false; int i, v; trace_cpu_post_load(cpu->cpreg_vmstate_array_len, @@ -1090,13 +1091,14 @@ static int cpu_post_load(void *opaque, int version_id) */ for (i = 0, v = 0; i < cpu->cpreg_array_len - && v < cpu->cpreg_vmstate_array_len; i++) { + && v < cpu->cpreg_vmstate_array_len;) { if (cpu->cpreg_vmstate_indexes[v] > cpu->cpreg_indexes[i]) { g_autofree gchar *name = print_register_name(cpu->cpreg_indexes[i]); warn_report("%s: %s " "expected by the destination but not in the incoming stream: " "skip it", __func__, name); + i++; continue; } if (cpu->cpreg_vmstate_indexes[v] < cpu->cpreg_indexes[i]) { @@ -1104,12 +1106,18 @@ static int cpu_post_load(void *opaque, int version_id) error_report("%s: %s in the incoming stream but unknown on the destination: " "fail migration", __func__, name); - return -1; + v++; + fail = true; + continue; } /* matching register, copy the value over */ cpu->cpreg_values[i] = cpu->cpreg_vmstate_values[v]; + i++; v++; } + if (fail) { + return -1; + } if (kvm_enabled()) { if (!kvm_arm_cpu_post_load(cpu)) { -- 2.53.0
