Hi Connie, On 11/19/25 5:35 PM, Cornelia Huck wrote: > On Tue, Nov 18 2025, Eric Auger <[email protected]> wrote: > >> More recent kernels sometimes expose new registers in an >> unconditionnal manner. This situation breaks backward migration >> as qemu notices there are more registers in the input stream >> than supported on the destination host. This leads to a >> "failed to load cpu:cpreg_vmstate_array_len" error. >> >> A good example is the introduction of KVM_REG_ARM_VENDOR_HYP_BMAP_2 >> pseudo FW register in v6.16 by commit C0000e58c74e (“KVM: arm64: >> Introduce KVM_REG_ARM_VENDOR_HYP_BMAP_2”). Trying to do backward >> migration from a host kernel that features the commit to a destination >> host that doesn't, fail with above error. >> >> Currently QEMU is not using that feature so ignoring this latter >> is not a problem. An easy way to fix the migration issue is to teach >> qemu we don't care about that register and we can simply ignore it >> when syncing its state during migration. >> >> This patch introduces an array of such hidden registers. Soon it will >> be settable through an array property. >> >> If hidden, the register is moved out of the array of cpreg which is >> built in kvm_arm_init_cpreg_list(). That way their state won't be >> synced. >> >> Signed-off-by: Eric Auger <[email protected]> >> >> --- >> >> v1 -> v2: >> - Move the property in a separate patch >> - improve the commit msg >> - change the trace point to just print info in >> kvm_arm_init_cpreg_list() >> - improve comment in cpu.h (Connie) >> --- >> target/arm/cpu.h | 23 +++++++++++++++++++++++ >> target/arm/kvm.c | 12 +++++++++++- >> target/arm/trace-events | 2 ++ >> 3 files changed, 36 insertions(+), 1 deletion(-) >> >> diff --git a/target/arm/cpu.h b/target/arm/cpu.h >> index 077b0cce5b..0a283940be 100644 >> --- a/target/arm/cpu.h >> +++ b/target/arm/cpu.h >> @@ -1044,6 +1044,18 @@ struct ArchCPU { >> /* KVM steal time */ >> OnOffAuto kvm_steal_time; >> >> + /* >> + * Register indexes that must be hidden. Although normally >> + * supported (defined in TCG description or exposed by KVM) they are >> + * willingly hidden for migration sake. This may be used to allow >> + * backward migration to older versions that do implement a specific >> + * feature. With KVM acceleration the indexes are the ones described >> + * in linux/Documentation/virt/kvm/api.rst. With TCG, this is the TCG >> + * sysreg index. >> + */ > Hmm... what about > > "Array of register indexes that need to be hidden to allow migration in > certain cases, i.e. when a register is exposed in KVM or defined in TCG > but not actually used in QEMU. For the KVM case, the indexes are as > described in Linux Documentation/virt/kvm/api.rst. For TCG, the indexes > are the TCG sysreg indexes." sounds good.
about the TCG index, I am not sure. It rather looks cpreg_to_kvm_id(ENCODE_CP_REG()) in the case of Aarch32 DBGDTRTX index I need to use to succeed the migration > >> + uint64_t *hidden_regs; >> + uint32_t nr_hidden_regs; >> + >> /* Uniprocessor system with MP extensions */ >> bool mp_is_up; >> > Otherwise, LGTM. Thanks! Eric >
