On Fri, 20 Feb 2026 at 11:57, Sebastian Ott <[email protected]> wrote: > > Provide a kvm specific vcpu property to override the default > (as of kernel v6.13 that would be PSCI v1.3) PSCI version emulated > by kvm. Current valid values are: 0.1, 0.2, 1.0, 1.1, 1.2, and 1.3 > > Note: in order to support PSCI v0.1 we need to drop vcpu > initialization with KVM_CAP_ARM_PSCI_0_2 in that case. > > Reviewed-by: Eric Auger <[email protected]> > Tested-by: Eric Auger <[email protected]> > Signed-off-by: Sebastian Ott <[email protected]> > --- > docs/system/arm/cpu-features.rst | 11 ++++++++ > target/arm/cpu.c | 8 +++++- > target/arm/kvm.c | 48 ++++++++++++++++++++++++++++++-- > 3 files changed, 64 insertions(+), 3 deletions(-) > > diff --git a/docs/system/arm/cpu-features.rst > b/docs/system/arm/cpu-features.rst > index 3db1f19401..ce19ae6a04 100644 > --- a/docs/system/arm/cpu-features.rst > +++ b/docs/system/arm/cpu-features.rst > @@ -204,6 +204,17 @@ the list of KVM VCPU features and their descriptions. > the guest scheduler behavior and/or be exposed to the guest > userspace. > > +``kvm-psci-version`` > + Set the Power State Coordination Interface (PSCI) firmware ABI version > + that KVM provides to the guest. By default KVM will use the newest > + version that it knows about (which is PSCI v1.3 in Linux v6.13). > + > + You only need to set this if you want to be able to migrate this > + VM to a host machine running an older kernel that does not > + recognize the PSCI version that this host's kernel defaults to. > + > + Current valid values are: 0.1, 0.2, 1.0, 1.1, 1.2, and 1.3. > + > TCG VCPU Features > ================= > > diff --git a/target/arm/cpu.c b/target/arm/cpu.c > index 10f8280eef..60f391651d 100644 > --- a/target/arm/cpu.c > +++ b/target/arm/cpu.c > @@ -1144,7 +1144,13 @@ static void arm_cpu_initfn(Object *obj) > * picky DTB consumer will also provide a helpful error message. > */ > cpu->dtb_compatible = "qemu,unknown"; > - cpu->psci_version = QEMU_PSCI_VERSION_0_1; /* By default assume PSCI > v0.1 */ > + if (!kvm_enabled()) { > + /* By default KVM will use the newest PSCI version that it knows > about. > + * This can be changed using the kvm-psci-version property. > + * For others assume PSCI v0.1 by default. > + */ > + cpu->psci_version = QEMU_PSCI_VERSION_0_1; > + } > cpu->kvm_target = QEMU_KVM_ARM_TARGET_NONE; > > if (tcg_enabled() || hvf_enabled()) { > diff --git a/target/arm/kvm.c b/target/arm/kvm.c > index ded582e0da..5453460965 100644 > --- a/target/arm/kvm.c > +++ b/target/arm/kvm.c > @@ -485,6 +485,28 @@ static void kvm_steal_time_set(Object *obj, bool value, > Error **errp) > ARM_CPU(obj)->kvm_steal_time = value ? ON_OFF_AUTO_ON : ON_OFF_AUTO_OFF; > } > > +static char *kvm_get_psci_version(Object *obj, Error **errp) > +{ > + ARMCPU *cpu = ARM_CPU(obj); > + > + return g_strdup_printf("%d.%d", > + (int) PSCI_VERSION_MAJOR(cpu->psci_version), > + (int) PSCI_VERSION_MINOR(cpu->psci_version)); > +} > + > +static void kvm_set_psci_version(Object *obj, const char *value, Error > **errp) > +{ > + ARMCPU *cpu = ARM_CPU(obj); > + uint16_t maj, min; > + > + if (sscanf(value, "%hd.%hd", &maj, &min) != 2) {
%hd is a signed value, so this will accept "-3.-5" I think ? Probably we want %hu. (If you agree I can just make this fix locally, no need for you to respin.) -- PMM
