On Thu, Oct 16 2025, Eric Auger <[email protected]> wrote: More information is really valuable here. I have some nits :)
> Currently whenthe number of KVM registers exposed by the source is s/whenthe/when the/ > larger than the one exposed on the destination, the migration fails > with: "failed to load cpu:cpreg_vmstate_array_len" > > This gives no information about which registers are causing the trouble. > > This patches rework the target/arm/machine code so that it becomes s/patches rework/patch reworks/ > able to handle an input stream with a larger set of registers than > the destination and print useful information about which registers > are causing the trouble. The migration outcome is unchanged: > - unexpected registers still will fail the migration > - missing ones are print but will not fail the migration, as done today. s/print/printed/ > > The input stream can contain MAX_CPREG_VMSTATE_ANOMALIES(10) extra > registers compared to what exists on the target. > > If there are more registers we will still hit the previous > "load cpu:cpreg_vmstate_array_len" error. > > At most, MAX_CPREG_VMSTATE_ANOMALIES missing registers > and MAX_CPREG_VMSTATE_ANOMALIES unexpected registers are print. s/print/printed/ If we really get tons of register discrepancies, I'd expect the reason for that to be something more obvious, so limiting should be fine. > > Example: > > qemu-system-aarch64: kvm_arm_cpu_post_load Missing register in input stream: > 0 0x6030000000160003 fw feat reg 3 > qemu-system-aarch64: kvm_arm_cpu_post_load Unexpected register in input > stream: 0 0x603000000013c103 op0:3 op1:0 crn:2 crm:0 op2:3 > qemu-system-aarch64: kvm_arm_cpu_post_load Unexpected register in input > stream: 1 0x603000000013c512 op0:3 op1:0 crn:10 crm:2 op2:2 > qemu-system-aarch64: kvm_arm_cpu_post_load Unexpected register in input > stream: 2 0x603000000013c513 op0:3 op1:0 crn:10 crm:2 op2:3 > qemu-system-aarch64: error while loading state for instance 0x0 of device > 'cpu' > qemu-system-aarch64: load of migration failed: Operation not permitted > > Signed-off-by: Eric Auger <[email protected]> > --- > target/arm/cpu.h | 6 +++++ > target/arm/kvm.c | 23 ++++++++++++++++ > target/arm/machine.c | 58 ++++++++++++++++++++++++++++++++++++----- > target/arm/trace-events | 7 +++++ > 4 files changed, 88 insertions(+), 6 deletions(-) > > diff --git a/target/arm/cpu.h b/target/arm/cpu.h > index bf221e6f97..a7ed3f34f8 100644 > --- a/target/arm/cpu.h > +++ b/target/arm/cpu.h > @@ -936,6 +936,12 @@ struct ArchCPU { > uint64_t *cpreg_vmstate_values; > int32_t cpreg_vmstate_array_len; > > + #define MAX_CPREG_VMSTATE_ANOMALIES 10 > + uint64_t cpreg_vmstate_missing_indexes[MAX_CPREG_VMSTATE_ANOMALIES]; > + int32_t cpreg_vmstate_missing_indexes_array_len; > + uint64_t cpreg_vmstate_unexpected_indexes[MAX_CPREG_VMSTATE_ANOMALIES]; > + int32_t cpreg_vmstate_unexpected_indexes_array_len; "indices"? > + > DynamicGDBFeatureInfo dyn_sysreg_feature; > DynamicGDBFeatureInfo dyn_svereg_feature; > DynamicGDBFeatureInfo dyn_smereg_feature; (...)
