* [PATCH v2 0/2] arm: add kvm-psci-version vcpu property @ 2025-10-30 16:59 Sebastian Ott 2025-10-30 16:59 ` [PATCH v2 1/2] target/arm/kvm: add constants for new PSCI versions Sebastian Ott 2025-10-30 16:59 ` [PATCH v2 2/2] target/arm/kvm: add kvm-psci-version vcpu property Sebastian Ott 0 siblings, 2 replies; 6+ messages in thread From: Sebastian Ott @ 2025-10-30 16:59 UTC (permalink / raw) To: Peter Maydell, Paolo Bonzini, Eric Auger Cc: qemu-arm, qemu-devel, kvm, kvmarm, Sebastian Ott This series adds a vcpu knob to request a specific PSCI version from KVM via the KVM_REG_ARM_PSCI_VERSION FW register. The use case for this is to support migration between host kernels that differ in their default (a.k.a. most recent) PSCI version. Note: in order to support PSCI v0.1 we need to drop vcpu initialization with KVM_CAP_ARM_PSCI_0_2 in that case. Alternatively we could limit support to versions >=0.2 . Changes since V1 [1]: * incorporated feedback from Peter and Eric [1] https://lore.kernel.org/kvmarm/20250911144923.24259-1-sebott@redhat.com/ Sebastian Ott (2): target/arm/kvm: add constants for new PSCI versions target/arm/kvm: add kvm-psci-version vcpu property docs/system/arm/cpu-features.rst | 5 +++ target/arm/cpu.h | 6 ++++ target/arm/kvm-consts.h | 2 ++ target/arm/kvm.c | 60 +++++++++++++++++++++++++++++++- 4 files changed, 72 insertions(+), 1 deletion(-) -- 2.42.0 ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v2 1/2] target/arm/kvm: add constants for new PSCI versions 2025-10-30 16:59 [PATCH v2 0/2] arm: add kvm-psci-version vcpu property Sebastian Ott @ 2025-10-30 16:59 ` Sebastian Ott 2025-11-11 17:50 ` Eric Auger 2025-10-30 16:59 ` [PATCH v2 2/2] target/arm/kvm: add kvm-psci-version vcpu property Sebastian Ott 1 sibling, 1 reply; 6+ messages in thread From: Sebastian Ott @ 2025-10-30 16:59 UTC (permalink / raw) To: Peter Maydell, Paolo Bonzini, Eric Auger Cc: qemu-arm, qemu-devel, kvm, kvmarm, Sebastian Ott Add constants for PSCI version 1_2 and 1_3. Signed-off-by: Sebastian Ott <sebott@redhat.com> --- target/arm/kvm-consts.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/target/arm/kvm-consts.h b/target/arm/kvm-consts.h index 54ae5da7ce..9fba3e886d 100644 --- a/target/arm/kvm-consts.h +++ b/target/arm/kvm-consts.h @@ -97,6 +97,8 @@ MISMATCH_CHECK(QEMU_PSCI_1_0_FN_PSCI_FEATURES, PSCI_1_0_FN_PSCI_FEATURES); #define QEMU_PSCI_VERSION_0_2 0x00002 #define QEMU_PSCI_VERSION_1_0 0x10000 #define QEMU_PSCI_VERSION_1_1 0x10001 +#define QEMU_PSCI_VERSION_1_2 0x10002 +#define QEMU_PSCI_VERSION_1_3 0x10003 MISMATCH_CHECK(QEMU_PSCI_0_2_RET_TOS_MIGRATION_NOT_REQUIRED, PSCI_0_2_TOS_MP); /* We don't bother to check every possible version value */ -- 2.42.0 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v2 1/2] target/arm/kvm: add constants for new PSCI versions 2025-10-30 16:59 ` [PATCH v2 1/2] target/arm/kvm: add constants for new PSCI versions Sebastian Ott @ 2025-11-11 17:50 ` Eric Auger 0 siblings, 0 replies; 6+ messages in thread From: Eric Auger @ 2025-11-11 17:50 UTC (permalink / raw) To: Sebastian Ott, Peter Maydell, Paolo Bonzini Cc: qemu-arm, qemu-devel, kvm, kvmarm Hi Sebstian, On 10/30/25 5:59 PM, Sebastian Ott wrote: > Add constants for PSCI version 1_2 and 1_3. > > Signed-off-by: Sebastian Ott <sebott@redhat.com> Reviewed-by: Eric Auger <eric.auger@redhat.com> Eric > --- > target/arm/kvm-consts.h | 2 ++ > 1 file changed, 2 insertions(+) > > diff --git a/target/arm/kvm-consts.h b/target/arm/kvm-consts.h > index 54ae5da7ce..9fba3e886d 100644 > --- a/target/arm/kvm-consts.h > +++ b/target/arm/kvm-consts.h > @@ -97,6 +97,8 @@ MISMATCH_CHECK(QEMU_PSCI_1_0_FN_PSCI_FEATURES, PSCI_1_0_FN_PSCI_FEATURES); > #define QEMU_PSCI_VERSION_0_2 0x00002 > #define QEMU_PSCI_VERSION_1_0 0x10000 > #define QEMU_PSCI_VERSION_1_1 0x10001 > +#define QEMU_PSCI_VERSION_1_2 0x10002 > +#define QEMU_PSCI_VERSION_1_3 0x10003 > > MISMATCH_CHECK(QEMU_PSCI_0_2_RET_TOS_MIGRATION_NOT_REQUIRED, PSCI_0_2_TOS_MP); > /* We don't bother to check every possible version value */ ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v2 2/2] target/arm/kvm: add kvm-psci-version vcpu property 2025-10-30 16:59 [PATCH v2 0/2] arm: add kvm-psci-version vcpu property Sebastian Ott 2025-10-30 16:59 ` [PATCH v2 1/2] target/arm/kvm: add constants for new PSCI versions Sebastian Ott @ 2025-10-30 16:59 ` Sebastian Ott 2025-11-11 17:57 ` Eric Auger 1 sibling, 1 reply; 6+ messages in thread From: Sebastian Ott @ 2025-10-30 16:59 UTC (permalink / raw) To: Peter Maydell, Paolo Bonzini, Eric Auger Cc: qemu-arm, qemu-devel, kvm, kvmarm, Sebastian Ott 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 Signed-off-by: Sebastian Ott <sebott@redhat.com> --- docs/system/arm/cpu-features.rst | 5 +++ target/arm/cpu.h | 6 ++++ target/arm/kvm.c | 60 +++++++++++++++++++++++++++++++- 3 files changed, 70 insertions(+), 1 deletion(-) diff --git a/docs/system/arm/cpu-features.rst b/docs/system/arm/cpu-features.rst index 37d5dfd15b..1d32ce0fee 100644 --- a/docs/system/arm/cpu-features.rst +++ b/docs/system/arm/cpu-features.rst @@ -204,6 +204,11 @@ the list of KVM VCPU features and their descriptions. the guest scheduler behavior and/or be exposed to the guest userspace. +``kvm-psci-version`` + Override the default (as of kernel v6.13 that would be PSCI v1.3) + PSCI version emulated by the kernel. 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.h b/target/arm/cpu.h index 39f2b2e54d..c2032070b7 100644 --- a/target/arm/cpu.h +++ b/target/arm/cpu.h @@ -981,6 +981,12 @@ struct ArchCPU { */ uint32_t psci_version; + /* + * Intermediate value used during property parsing. + * Once finalized, the value should be read from psci_version. + */ + uint32_t prop_psci_version; + /* Current power state, access guarded by BQL */ ARMPSCIState power_state; diff --git a/target/arm/kvm.c b/target/arm/kvm.c index 0d57081e69..c53b307b76 100644 --- a/target/arm/kvm.c +++ b/target/arm/kvm.c @@ -484,6 +484,49 @@ 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; } +struct psci_version { + uint32_t number; + const char *str; +}; + +static const struct psci_version psci_versions[] = { + { QEMU_PSCI_VERSION_0_1, "0.1" }, + { QEMU_PSCI_VERSION_0_2, "0.2" }, + { QEMU_PSCI_VERSION_1_0, "1.0" }, + { QEMU_PSCI_VERSION_1_1, "1.1" }, + { QEMU_PSCI_VERSION_1_2, "1.2" }, + { QEMU_PSCI_VERSION_1_3, "1.3" }, + { -1, NULL }, +}; + +static char *kvm_get_psci_version(Object *obj, Error **errp) +{ + ARMCPU *cpu = ARM_CPU(obj); + const struct psci_version *ver; + + for (ver = psci_versions; ver->number != -1; ver++) { + if (ver->number == cpu->prop_psci_version) + return g_strdup(ver->str); + } + + g_assert_not_reached(); +} + +static void kvm_set_psci_version(Object *obj, const char *value, Error **errp) +{ + ARMCPU *cpu = ARM_CPU(obj); + const struct psci_version *ver; + + for (ver = psci_versions; ver->number != -1; ver++) { + if (!strcmp(value, ver->str)) { + cpu->prop_psci_version = ver->number; + return; + } + } + + error_setg(errp, "Invalid PSCI-version value"); +} + /* KVM VCPU properties should be prefixed with "kvm-". */ void kvm_arm_add_vcpu_properties(ARMCPU *cpu) { @@ -505,6 +548,12 @@ void kvm_arm_add_vcpu_properties(ARMCPU *cpu) kvm_steal_time_set); object_property_set_description(obj, "kvm-steal-time", "Set off to disable KVM steal time."); + + object_property_add_str(obj, "kvm-psci-version", kvm_get_psci_version, + kvm_set_psci_version); + object_property_set_description(obj, "kvm-psci-version", + "Set PSCI version. " + "Valid values are 0.1, 0.2, 1.0, 1.1, 1.2, 1.3"); } bool kvm_arm_pmu_supported(void) @@ -1959,7 +2008,8 @@ int kvm_arch_init_vcpu(CPUState *cs) if (cs->start_powered_off) { cpu->kvm_init_features[0] |= 1 << KVM_ARM_VCPU_POWER_OFF; } - if (kvm_check_extension(cs->kvm_state, KVM_CAP_ARM_PSCI_0_2)) { + if (cpu->prop_psci_version != QEMU_PSCI_VERSION_0_1 && + kvm_check_extension(cs->kvm_state, KVM_CAP_ARM_PSCI_0_2)) { cpu->psci_version = QEMU_PSCI_VERSION_0_2; cpu->kvm_init_features[0] |= 1 << KVM_ARM_VCPU_PSCI_0_2; } @@ -1998,6 +2048,14 @@ int kvm_arch_init_vcpu(CPUState *cs) } } + if (cpu->prop_psci_version) { + psciver = cpu->prop_psci_version; + ret = kvm_set_one_reg(cs, KVM_REG_ARM_PSCI_VERSION, &psciver); + if (ret) { + error_report("PSCI version %"PRIx64" is not supported by KVM", psciver); + return ret; + } + } /* * KVM reports the exact PSCI version it is implementing via a * special sysreg. If it is present, use its contents to determine -- 2.42.0 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v2 2/2] target/arm/kvm: add kvm-psci-version vcpu property 2025-10-30 16:59 ` [PATCH v2 2/2] target/arm/kvm: add kvm-psci-version vcpu property Sebastian Ott @ 2025-11-11 17:57 ` Eric Auger 2025-11-12 17:20 ` Sebastian Ott 0 siblings, 1 reply; 6+ messages in thread From: Eric Auger @ 2025-11-11 17:57 UTC (permalink / raw) To: Sebastian Ott, Peter Maydell, Paolo Bonzini Cc: qemu-arm, qemu-devel, kvm, kvmarm On 10/30/25 5:59 PM, Sebastian Ott 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 > > Signed-off-by: Sebastian Ott <sebott@redhat.com> > --- > docs/system/arm/cpu-features.rst | 5 +++ > target/arm/cpu.h | 6 ++++ > target/arm/kvm.c | 60 +++++++++++++++++++++++++++++++- > 3 files changed, 70 insertions(+), 1 deletion(-) > > diff --git a/docs/system/arm/cpu-features.rst b/docs/system/arm/cpu-features.rst > index 37d5dfd15b..1d32ce0fee 100644 > --- a/docs/system/arm/cpu-features.rst > +++ b/docs/system/arm/cpu-features.rst > @@ -204,6 +204,11 @@ the list of KVM VCPU features and their descriptions. > the guest scheduler behavior and/or be exposed to the guest > userspace. > > +``kvm-psci-version`` > + Override the default (as of kernel v6.13 that would be PSCI v1.3) > + PSCI version emulated by the kernel. 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.h b/target/arm/cpu.h > index 39f2b2e54d..c2032070b7 100644 > --- a/target/arm/cpu.h > +++ b/target/arm/cpu.h > @@ -981,6 +981,12 @@ struct ArchCPU { > */ > uint32_t psci_version; > > + /* > + * Intermediate value used during property parsing. > + * Once finalized, the value should be read from psci_version. > + */ > + uint32_t prop_psci_version; > + > /* Current power state, access guarded by BQL */ > ARMPSCIState power_state; > > diff --git a/target/arm/kvm.c b/target/arm/kvm.c > index 0d57081e69..c53b307b76 100644 > --- a/target/arm/kvm.c > +++ b/target/arm/kvm.c > @@ -484,6 +484,49 @@ 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; > } > > +struct psci_version { > + uint32_t number; > + const char *str; > +}; > + > +static const struct psci_version psci_versions[] = { > + { QEMU_PSCI_VERSION_0_1, "0.1" }, > + { QEMU_PSCI_VERSION_0_2, "0.2" }, > + { QEMU_PSCI_VERSION_1_0, "1.0" }, > + { QEMU_PSCI_VERSION_1_1, "1.1" }, > + { QEMU_PSCI_VERSION_1_2, "1.2" }, > + { QEMU_PSCI_VERSION_1_3, "1.3" }, > + { -1, NULL }, > +}; > + > +static char *kvm_get_psci_version(Object *obj, Error **errp) > +{ > + ARMCPU *cpu = ARM_CPU(obj); > + const struct psci_version *ver; > + > + for (ver = psci_versions; ver->number != -1; ver++) { > + if (ver->number == cpu->prop_psci_version) I still have the same question/comment as on v1. In case the end user does not override the psci version I think you want to return the default value, retrieved from KVM through KVM_REG_ARM_PSCI_VERSION and which populates cpu->psci_version. So to me you should use cpu->psci_version instead > + return g_strdup(ver->str); > + } > + > + g_assert_not_reached(); > +} > + > +static void kvm_set_psci_version(Object *obj, const char *value, Error **errp) > +{ > + ARMCPU *cpu = ARM_CPU(obj); > + const struct psci_version *ver; > + > + for (ver = psci_versions; ver->number != -1; ver++) { > + if (!strcmp(value, ver->str)) { > + cpu->prop_psci_version = ver->number; > + return; > + } > + } > + > + error_setg(errp, "Invalid PSCI-version value"); > +} > + > /* KVM VCPU properties should be prefixed with "kvm-". */ > void kvm_arm_add_vcpu_properties(ARMCPU *cpu) > { > @@ -505,6 +548,12 @@ void kvm_arm_add_vcpu_properties(ARMCPU *cpu) > kvm_steal_time_set); > object_property_set_description(obj, "kvm-steal-time", > "Set off to disable KVM steal time."); > + > + object_property_add_str(obj, "kvm-psci-version", kvm_get_psci_version, > + kvm_set_psci_version); > + object_property_set_description(obj, "kvm-psci-version", > + "Set PSCI version. " > + "Valid values are 0.1, 0.2, 1.0, 1.1, 1.2, 1.3"); > } > > bool kvm_arm_pmu_supported(void) > @@ -1959,7 +2008,8 @@ int kvm_arch_init_vcpu(CPUState *cs) > if (cs->start_powered_off) { > cpu->kvm_init_features[0] |= 1 << KVM_ARM_VCPU_POWER_OFF; > } > - if (kvm_check_extension(cs->kvm_state, KVM_CAP_ARM_PSCI_0_2)) { > + if (cpu->prop_psci_version != QEMU_PSCI_VERSION_0_1 && I don't understand what this change stands for. Please document it through both a comment and a commit msg explanation Thanks Eric > + kvm_check_extension(cs->kvm_state, KVM_CAP_ARM_PSCI_0_2)) { > cpu->psci_version = QEMU_PSCI_VERSION_0_2; > cpu->kvm_init_features[0] |= 1 << KVM_ARM_VCPU_PSCI_0_2; > } > @@ -1998,6 +2048,14 @@ int kvm_arch_init_vcpu(CPUState *cs) > } > } > > + if (cpu->prop_psci_version) { > + psciver = cpu->prop_psci_version; > + ret = kvm_set_one_reg(cs, KVM_REG_ARM_PSCI_VERSION, &psciver); > + if (ret) { > + error_report("PSCI version %"PRIx64" is not supported by KVM", psciver); > + return ret; > + } > + } > /* > * KVM reports the exact PSCI version it is implementing via a > * special sysreg. If it is present, use its contents to determine ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2 2/2] target/arm/kvm: add kvm-psci-version vcpu property 2025-11-11 17:57 ` Eric Auger @ 2025-11-12 17:20 ` Sebastian Ott 0 siblings, 0 replies; 6+ messages in thread From: Sebastian Ott @ 2025-11-12 17:20 UTC (permalink / raw) To: Eric Auger Cc: Peter Maydell, Paolo Bonzini, qemu-arm, qemu-devel, kvm, kvmarm On Tue, 11 Nov 2025, Eric Auger wrote: > On 10/30/25 5:59 PM, Sebastian Ott 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 >> >> Signed-off-by: Sebastian Ott <sebott@redhat.com> >> --- [...] >> +static char *kvm_get_psci_version(Object *obj, Error **errp) >> +{ >> + ARMCPU *cpu = ARM_CPU(obj); >> + const struct psci_version *ver; >> + >> + for (ver = psci_versions; ver->number != -1; ver++) { >> + if (ver->number == cpu->prop_psci_version) > I still have the same question/comment as on v1. In case the end user > does not override the psci version I think you want to return the > default value, retrieved from KVM through KVM_REG_ARM_PSCI_VERSION and > which populates cpu->psci_version. So to me you should use > cpu->psci_version instead Sry, I didn't get your question the first time and double checked that the VM uses the default/most recent version when the property is not set. I just found out how to actually call this function (via qom-get) and you're right: the VM uses the correct version but we report something different here - and in this version even trigger the assertion. Ouch. [...] >> @@ -1959,7 +2008,8 @@ int kvm_arch_init_vcpu(CPUState *cs) >> if (cs->start_powered_off) { >> cpu->kvm_init_features[0] |= 1 << KVM_ARM_VCPU_POWER_OFF; >> } >> - if (kvm_check_extension(cs->kvm_state, KVM_CAP_ARM_PSCI_0_2)) { >> + if (cpu->prop_psci_version != QEMU_PSCI_VERSION_0_1 && > I don't understand what this change stands for. Please document it > through both a comment and a commit msg explanation The explanation is in the cover letter - I'll move it to this patch. Thanks, Sebastian ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2025-11-12 17:23 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2025-10-30 16:59 [PATCH v2 0/2] arm: add kvm-psci-version vcpu property Sebastian Ott 2025-10-30 16:59 ` [PATCH v2 1/2] target/arm/kvm: add constants for new PSCI versions Sebastian Ott 2025-11-11 17:50 ` Eric Auger 2025-10-30 16:59 ` [PATCH v2 2/2] target/arm/kvm: add kvm-psci-version vcpu property Sebastian Ott 2025-11-11 17:57 ` Eric Auger 2025-11-12 17:20 ` Sebastian Ott
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).