* [PATCH 0/2] arm: add kvm-psci-version vcpu property
@ 2025-09-11 14:49 Sebastian Ott
  2025-09-11 14:49 ` [PATCH 1/2] target/arm/kvm: add constants for new PSCI versions Sebastian Ott
                   ` (2 more replies)
  0 siblings, 3 replies; 14+ messages in thread
From: Sebastian Ott @ 2025-09-11 14:49 UTC (permalink / raw)
  To: Peter Maydell, Paolo Bonzini
  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.
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 .
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                 | 70 +++++++++++++++++++++++++++++++-
 4 files changed, 82 insertions(+), 1 deletion(-)
-- 
2.42.0
^ permalink raw reply	[flat|nested] 14+ messages in thread* [PATCH 1/2] target/arm/kvm: add constants for new PSCI versions 2025-09-11 14:49 [PATCH 0/2] arm: add kvm-psci-version vcpu property Sebastian Ott @ 2025-09-11 14:49 ` Sebastian Ott 2025-09-18 15:26 ` Eric Auger 2025-09-11 14:49 ` [PATCH 2/2] target/arm/kvm: add kvm-psci-version vcpu property Sebastian Ott 2025-09-11 15:18 ` [PATCH 0/2] arm: " Peter Maydell 2 siblings, 1 reply; 14+ messages in thread From: Sebastian Ott @ 2025-09-11 14:49 UTC (permalink / raw) To: Peter Maydell, Paolo Bonzini 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 c44d23dbe7..239a8801df 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] 14+ messages in thread
* Re: [PATCH 1/2] target/arm/kvm: add constants for new PSCI versions 2025-09-11 14:49 ` [PATCH 1/2] target/arm/kvm: add constants for new PSCI versions Sebastian Ott @ 2025-09-18 15:26 ` Eric Auger 0 siblings, 0 replies; 14+ messages in thread From: Eric Auger @ 2025-09-18 15:26 UTC (permalink / raw) To: Sebastian Ott, Peter Maydell, Paolo Bonzini Cc: qemu-arm, qemu-devel, kvm, kvmarm On 9/11/25 4:49 PM, Sebastian Ott wrote: > 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 c44d23dbe7..239a8801df 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 */ I would simply squash this in next patch Thanks Eric ^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 2/2] target/arm/kvm: add kvm-psci-version vcpu property 2025-09-11 14:49 [PATCH 0/2] arm: add kvm-psci-version vcpu property Sebastian Ott 2025-09-11 14:49 ` [PATCH 1/2] target/arm/kvm: add constants for new PSCI versions Sebastian Ott @ 2025-09-11 14:49 ` Sebastian Ott 2025-09-18 15:26 ` Eric Auger 2025-10-27 16:42 ` Peter Maydell 2025-09-11 15:18 ` [PATCH 0/2] arm: " Peter Maydell 2 siblings, 2 replies; 14+ messages in thread From: Sebastian Ott @ 2025-09-11 14:49 UTC (permalink / raw) To: Peter Maydell, Paolo Bonzini 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 | 70 +++++++++++++++++++++++++++++++- 3 files changed, 80 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 c15d79a106..44292aab32 100644 --- a/target/arm/cpu.h +++ b/target/arm/cpu.h @@ -974,6 +974,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 6672344855..bc6073f395 100644 --- a/target/arm/kvm.c +++ b/target/arm/kvm.c @@ -483,6 +483,59 @@ 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); + const char *val; + + switch (cpu->prop_psci_version) { + case QEMU_PSCI_VERSION_0_1: + val = "0.1"; + break; + case QEMU_PSCI_VERSION_0_2: + val = "0.2"; + break; + case QEMU_PSCI_VERSION_1_0: + val = "1.0"; + break; + case QEMU_PSCI_VERSION_1_1: + val = "1.1"; + break; + case QEMU_PSCI_VERSION_1_2: + val = "1.2"; + break; + case QEMU_PSCI_VERSION_1_3: + val = "1.3"; + break; + default: + val = "0.2"; + break; + } + return g_strdup(val); +} + +static void kvm_set_psci_version(Object *obj, const char *value, Error **errp) +{ + ARMCPU *cpu = ARM_CPU(obj); + + if (!strcmp(value, "0.1")) { + cpu->prop_psci_version = QEMU_PSCI_VERSION_0_1; + } else if (!strcmp(value, "0.2")) { + cpu->prop_psci_version = QEMU_PSCI_VERSION_0_2; + } else if (!strcmp(value, "1.0")) { + cpu->prop_psci_version = QEMU_PSCI_VERSION_1_0; + } else if (!strcmp(value, "1.1")) { + cpu->prop_psci_version = QEMU_PSCI_VERSION_1_1; + } else if (!strcmp(value, "1.2")) { + cpu->prop_psci_version = QEMU_PSCI_VERSION_1_2; + } else if (!strcmp(value, "1.3")) { + cpu->prop_psci_version = QEMU_PSCI_VERSION_1_3; + } else { + error_setg(errp, "Invalid PSCI-version value"); + error_append_hint(errp, "Valid values are 0.1, 0.2, 1.0, 1.1, 1.2, 1.3\n"); + } +} + /* KVM VCPU properties should be prefixed with "kvm-". */ void kvm_arm_add_vcpu_properties(ARMCPU *cpu) { @@ -504,6 +557,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) @@ -1883,7 +1942,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; } @@ -1922,6 +1982,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 %lx 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] 14+ messages in thread
* Re: [PATCH 2/2] target/arm/kvm: add kvm-psci-version vcpu property 2025-09-11 14:49 ` [PATCH 2/2] target/arm/kvm: add kvm-psci-version vcpu property Sebastian Ott @ 2025-09-18 15:26 ` Eric Auger 2025-10-27 16:42 ` Peter Maydell 1 sibling, 0 replies; 14+ messages in thread From: Eric Auger @ 2025-09-18 15:26 UTC (permalink / raw) To: Sebastian Ott, Peter Maydell, Paolo Bonzini Cc: qemu-arm, qemu-devel, kvm, kvmarm Hi Sebastian, On 9/11/25 4:49 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 | 70 +++++++++++++++++++++++++++++++- > 3 files changed, 80 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 c15d79a106..44292aab32 100644 > --- a/target/arm/cpu.h > +++ b/target/arm/cpu.h > @@ -974,6 +974,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 6672344855..bc6073f395 100644 > --- a/target/arm/kvm.c > +++ b/target/arm/kvm.c > @@ -483,6 +483,59 @@ 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); > + const char *val; > + > + switch (cpu->prop_psci_version) { > + case QEMU_PSCI_VERSION_0_1: > + val = "0.1"; > + break; > + case QEMU_PSCI_VERSION_0_2: > + val = "0.2"; > + break; > + case QEMU_PSCI_VERSION_1_0: > + val = "1.0"; > + break; > + case QEMU_PSCI_VERSION_1_1: > + val = "1.1"; > + break; > + case QEMU_PSCI_VERSION_1_2: > + val = "1.2"; > + break; > + case QEMU_PSCI_VERSION_1_3: > + val = "1.3"; > + break; > + default: > + val = "0.2"; can you explain why you return 0.2 by default? Shouldn't we report the default value exposed by KVM? > + break; > + } > + return g_strdup(val); > +} > + > +static void kvm_set_psci_version(Object *obj, const char *value, Error **errp) > +{ > + ARMCPU *cpu = ARM_CPU(obj); > + > + if (!strcmp(value, "0.1")) { > + cpu->prop_psci_version = QEMU_PSCI_VERSION_0_1; > + } else if (!strcmp(value, "0.2")) { > + cpu->prop_psci_version = QEMU_PSCI_VERSION_0_2; > + } else if (!strcmp(value, "1.0")) { > + cpu->prop_psci_version = QEMU_PSCI_VERSION_1_0; > + } else if (!strcmp(value, "1.1")) { > + cpu->prop_psci_version = QEMU_PSCI_VERSION_1_1; > + } else if (!strcmp(value, "1.2")) { > + cpu->prop_psci_version = QEMU_PSCI_VERSION_1_2; > + } else if (!strcmp(value, "1.3")) { > + cpu->prop_psci_version = QEMU_PSCI_VERSION_1_3; > + } else { > + error_setg(errp, "Invalid PSCI-version value"); > + error_append_hint(errp, "Valid values are 0.1, 0.2, 1.0, 1.1, 1.2, 1.3\n"); > + } > +} > + > /* KVM VCPU properties should be prefixed with "kvm-". */ > void kvm_arm_add_vcpu_properties(ARMCPU *cpu) > { > @@ -504,6 +557,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) > @@ -1883,7 +1942,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)) { I don't get why this change is needed. Please can you explain? > cpu->psci_version = QEMU_PSCI_VERSION_0_2; > cpu->kvm_init_features[0] |= 1 << KVM_ARM_VCPU_PSCI_0_2; > } > @@ -1922,6 +1982,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 %lx is not supported by KVM", psciver); don't you need a PRIx64 here? > + return ret; > + } > + } > /* > * KVM reports the exact PSCI version it is implementing via a > * special sysreg. If it is present, use its contents to determine Thanks Eric ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 2/2] target/arm/kvm: add kvm-psci-version vcpu property 2025-09-11 14:49 ` [PATCH 2/2] target/arm/kvm: add kvm-psci-version vcpu property Sebastian Ott 2025-09-18 15:26 ` Eric Auger @ 2025-10-27 16:42 ` Peter Maydell 2025-10-28 11:00 ` Sebastian Ott 1 sibling, 1 reply; 14+ messages in thread From: Peter Maydell @ 2025-10-27 16:42 UTC (permalink / raw) To: Sebastian Ott; +Cc: Paolo Bonzini, qemu-arm, qemu-devel, kvm, kvmarm On Thu, 11 Sept 2025 at 15:49, Sebastian Ott <sebott@redhat.com> 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 | 70 +++++++++++++++++++++++++++++++- > 3 files changed, 80 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 c15d79a106..44292aab32 100644 > --- a/target/arm/cpu.h > +++ b/target/arm/cpu.h > @@ -974,6 +974,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 6672344855..bc6073f395 100644 > --- a/target/arm/kvm.c > +++ b/target/arm/kvm.c > @@ -483,6 +483,59 @@ 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); > + const char *val; > + > + switch (cpu->prop_psci_version) { > + case QEMU_PSCI_VERSION_0_1: > + val = "0.1"; > + break; > + case QEMU_PSCI_VERSION_0_2: > + val = "0.2"; > + break; > + case QEMU_PSCI_VERSION_1_0: > + val = "1.0"; > + break; > + case QEMU_PSCI_VERSION_1_1: > + val = "1.1"; > + break; > + case QEMU_PSCI_VERSION_1_2: > + val = "1.2"; > + break; > + case QEMU_PSCI_VERSION_1_3: > + val = "1.3"; > + break; > + default: > + val = "0.2"; > + break; > + } > + return g_strdup(val); > +} > + > +static void kvm_set_psci_version(Object *obj, const char *value, Error **errp) > +{ > + ARMCPU *cpu = ARM_CPU(obj); > + > + if (!strcmp(value, "0.1")) { > + cpu->prop_psci_version = QEMU_PSCI_VERSION_0_1; > + } else if (!strcmp(value, "0.2")) { > + cpu->prop_psci_version = QEMU_PSCI_VERSION_0_2; > + } else if (!strcmp(value, "1.0")) { > + cpu->prop_psci_version = QEMU_PSCI_VERSION_1_0; > + } else if (!strcmp(value, "1.1")) { > + cpu->prop_psci_version = QEMU_PSCI_VERSION_1_1; > + } else if (!strcmp(value, "1.2")) { > + cpu->prop_psci_version = QEMU_PSCI_VERSION_1_2; > + } else if (!strcmp(value, "1.3")) { > + cpu->prop_psci_version = QEMU_PSCI_VERSION_1_3; We already have six values here and it's not implausible we might end up with more in future; maybe we should make the mapping between string and constant data-driven rather than having code written out longhand in the get and set functions? > + } else { > + error_setg(errp, "Invalid PSCI-version value"); > + error_append_hint(errp, "Valid values are 0.1, 0.2, 1.0, 1.1, 1.2, 1.3\n"); > + } > +} thanks -- PMM ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 2/2] target/arm/kvm: add kvm-psci-version vcpu property 2025-10-27 16:42 ` Peter Maydell @ 2025-10-28 11:00 ` Sebastian Ott 0 siblings, 0 replies; 14+ messages in thread From: Sebastian Ott @ 2025-10-28 11:00 UTC (permalink / raw) To: Peter Maydell; +Cc: Paolo Bonzini, qemu-arm, qemu-devel, kvm, kvmarm On Mon, 27 Oct 2025, Peter Maydell wrote: > On Thu, 11 Sept 2025 at 15:49, Sebastian Ott <sebott@redhat.com> 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 | 70 +++++++++++++++++++++++++++++++- >> 3 files changed, 80 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 c15d79a106..44292aab32 100644 >> --- a/target/arm/cpu.h >> +++ b/target/arm/cpu.h >> @@ -974,6 +974,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 6672344855..bc6073f395 100644 >> --- a/target/arm/kvm.c >> +++ b/target/arm/kvm.c >> @@ -483,6 +483,59 @@ 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); >> + const char *val; >> + >> + switch (cpu->prop_psci_version) { >> + case QEMU_PSCI_VERSION_0_1: >> + val = "0.1"; >> + break; >> + case QEMU_PSCI_VERSION_0_2: >> + val = "0.2"; >> + break; >> + case QEMU_PSCI_VERSION_1_0: >> + val = "1.0"; >> + break; >> + case QEMU_PSCI_VERSION_1_1: >> + val = "1.1"; >> + break; >> + case QEMU_PSCI_VERSION_1_2: >> + val = "1.2"; >> + break; >> + case QEMU_PSCI_VERSION_1_3: >> + val = "1.3"; >> + break; >> + default: >> + val = "0.2"; >> + break; >> + } >> + return g_strdup(val); >> +} >> + >> +static void kvm_set_psci_version(Object *obj, const char *value, Error **errp) >> +{ >> + ARMCPU *cpu = ARM_CPU(obj); >> + >> + if (!strcmp(value, "0.1")) { >> + cpu->prop_psci_version = QEMU_PSCI_VERSION_0_1; >> + } else if (!strcmp(value, "0.2")) { >> + cpu->prop_psci_version = QEMU_PSCI_VERSION_0_2; >> + } else if (!strcmp(value, "1.0")) { >> + cpu->prop_psci_version = QEMU_PSCI_VERSION_1_0; >> + } else if (!strcmp(value, "1.1")) { >> + cpu->prop_psci_version = QEMU_PSCI_VERSION_1_1; >> + } else if (!strcmp(value, "1.2")) { >> + cpu->prop_psci_version = QEMU_PSCI_VERSION_1_2; >> + } else if (!strcmp(value, "1.3")) { >> + cpu->prop_psci_version = QEMU_PSCI_VERSION_1_3; > > We already have six values here and it's not implausible > we might end up with more in future; maybe we should make the > mapping between string and constant data-driven rather > than having code written out longhand in the get and set > functions? Yes, sure. I'll send out a V2. Thanks! Sebastian ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 0/2] arm: add kvm-psci-version vcpu property 2025-09-11 14:49 [PATCH 0/2] arm: add kvm-psci-version vcpu property Sebastian Ott 2025-09-11 14:49 ` [PATCH 1/2] target/arm/kvm: add constants for new PSCI versions Sebastian Ott 2025-09-11 14:49 ` [PATCH 2/2] target/arm/kvm: add kvm-psci-version vcpu property Sebastian Ott @ 2025-09-11 15:18 ` Peter Maydell 2025-09-11 15:59 ` Sebastian Ott 2 siblings, 1 reply; 14+ messages in thread From: Peter Maydell @ 2025-09-11 15:18 UTC (permalink / raw) To: Sebastian Ott; +Cc: Paolo Bonzini, qemu-arm, qemu-devel, kvm, kvmarm On Thu, 11 Sept 2025 at 15:49, Sebastian Ott <sebott@redhat.com> wrote: > > This series adds a vcpu knob to request a specific PSCI version > from KVM via the KVM_REG_ARM_PSCI_VERSION FW register. > > 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 . > > Sebastian Ott (2): > target/arm/kvm: add constants for new PSCI versions > target/arm/kvm: add kvm-psci-version vcpu property Could we have some rationale, please? What's the use case where you might need to specify a particular PSCI version? thanks -- PMM ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 0/2] arm: add kvm-psci-version vcpu property 2025-09-11 15:18 ` [PATCH 0/2] arm: " Peter Maydell @ 2025-09-11 15:59 ` Sebastian Ott 2025-09-11 16:02 ` Peter Maydell 0 siblings, 1 reply; 14+ messages in thread From: Sebastian Ott @ 2025-09-11 15:59 UTC (permalink / raw) To: Peter Maydell; +Cc: Paolo Bonzini, qemu-arm, qemu-devel, kvm, kvmarm On Thu, 11 Sep 2025, Peter Maydell wrote: > On Thu, 11 Sept 2025 at 15:49, Sebastian Ott <sebott@redhat.com> wrote: >> >> This series adds a vcpu knob to request a specific PSCI version >> from KVM via the KVM_REG_ARM_PSCI_VERSION FW register. >> >> 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 . >> >> Sebastian Ott (2): >> target/arm/kvm: add constants for new PSCI versions >> target/arm/kvm: add kvm-psci-version vcpu property > > Could we have some rationale, please? What's the use case > where you might need to specify a particular PSCI version? The use case is migrating between different host kernel versions. Per default the kernel reports the latest PSCI version in the KVM_REG_ARM_PSCI_VERSION register (for KVM_CAP_ARM_PSCI_0_2) - when that differs between source and target a migration will fail. This property allows to request a PSCI version that is supported by both sides. Specifically I want to support migration between host kernels with and without the following Linux commit: 8be82d536a9f KVM: arm64: Add support for PSCI v1.2 and v1.3 Regards, Sebastian ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 0/2] arm: add kvm-psci-version vcpu property 2025-09-11 15:59 ` Sebastian Ott @ 2025-09-11 16:02 ` Peter Maydell 2025-09-11 16:29 ` Sebastian Ott 0 siblings, 1 reply; 14+ messages in thread From: Peter Maydell @ 2025-09-11 16:02 UTC (permalink / raw) To: Sebastian Ott; +Cc: Paolo Bonzini, qemu-arm, qemu-devel, kvm, kvmarm On Thu, 11 Sept 2025 at 16:59, Sebastian Ott <sebott@redhat.com> wrote: > > On Thu, 11 Sep 2025, Peter Maydell wrote: > > On Thu, 11 Sept 2025 at 15:49, Sebastian Ott <sebott@redhat.com> wrote: > >> > >> This series adds a vcpu knob to request a specific PSCI version > >> from KVM via the KVM_REG_ARM_PSCI_VERSION FW register. > >> > >> 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 . > >> > >> Sebastian Ott (2): > >> target/arm/kvm: add constants for new PSCI versions > >> target/arm/kvm: add kvm-psci-version vcpu property > > > > Could we have some rationale, please? What's the use case > > where you might need to specify a particular PSCI version? > > The use case is migrating between different host kernel versions. > Per default the kernel reports the latest PSCI version in the > KVM_REG_ARM_PSCI_VERSION register (for KVM_CAP_ARM_PSCI_0_2) - > when that differs between source and target a migration will fail. > > This property allows to request a PSCI version that is supported by > both sides. Specifically I want to support migration between host > kernels with and without the following Linux commit: > 8be82d536a9f KVM: arm64: Add support for PSCI v1.2 and v1.3 So if the destination kernel is post that commit and the source kernel pre-dates it, do we fail migration? Or is this only a migration failure when the destination doesn't support the PSCI version we defaulted to at the source end? thanks -- PMM ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 0/2] arm: add kvm-psci-version vcpu property 2025-09-11 16:02 ` Peter Maydell @ 2025-09-11 16:29 ` Sebastian Ott 2025-09-11 16:32 ` Peter Maydell 0 siblings, 1 reply; 14+ messages in thread From: Sebastian Ott @ 2025-09-11 16:29 UTC (permalink / raw) To: Peter Maydell; +Cc: Paolo Bonzini, qemu-arm, qemu-devel, kvm, kvmarm On Thu, 11 Sep 2025, Peter Maydell wrote: > On Thu, 11 Sept 2025 at 16:59, Sebastian Ott <sebott@redhat.com> wrote: >> >> On Thu, 11 Sep 2025, Peter Maydell wrote: >>> On Thu, 11 Sept 2025 at 15:49, Sebastian Ott <sebott@redhat.com> wrote: >>>> >>>> This series adds a vcpu knob to request a specific PSCI version >>>> from KVM via the KVM_REG_ARM_PSCI_VERSION FW register. >>>> >>>> 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 . >>>> >>>> Sebastian Ott (2): >>>> target/arm/kvm: add constants for new PSCI versions >>>> target/arm/kvm: add kvm-psci-version vcpu property >>> >>> Could we have some rationale, please? What's the use case >>> where you might need to specify a particular PSCI version? >> >> The use case is migrating between different host kernel versions. >> Per default the kernel reports the latest PSCI version in the >> KVM_REG_ARM_PSCI_VERSION register (for KVM_CAP_ARM_PSCI_0_2) - >> when that differs between source and target a migration will fail. >> >> This property allows to request a PSCI version that is supported by >> both sides. Specifically I want to support migration between host >> kernels with and without the following Linux commit: >> 8be82d536a9f KVM: arm64: Add support for PSCI v1.2 and v1.3 > > So if the destination kernel is post that commit and the > source kernel pre-dates it, do we fail migration? This case works with current qemu without any changes, since on target qemu would write the register value it has stored from the source side (QEMU_PSCI_VERSION_1_1) and thus requests kvm on target to emulate that version. > Or is > this only a migration failure when the destination doesn't > support the PSCI version we defaulted to at the source end? Yes, this doesn't work with current qemu. On target qemu would write QEMU_PSCI_VERSION_1_3 to the KVM_REG_ARM_PSCI_VERSION register but that kernel doesn't know this version and the migration will fail. With this series you could request QEMU_PSCI_VERSION_1_1 on the source kernel to allow a migration. (For RHEL we have distro specific machine types that will use this property to handle that via compats.) Sebastian ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 0/2] arm: add kvm-psci-version vcpu property 2025-09-11 16:29 ` Sebastian Ott @ 2025-09-11 16:32 ` Peter Maydell 2025-09-11 16:46 ` Sebastian Ott 0 siblings, 1 reply; 14+ messages in thread From: Peter Maydell @ 2025-09-11 16:32 UTC (permalink / raw) To: Sebastian Ott; +Cc: Paolo Bonzini, qemu-arm, qemu-devel, kvm, kvmarm On Thu, 11 Sept 2025 at 17:29, Sebastian Ott <sebott@redhat.com> wrote: > > On Thu, 11 Sep 2025, Peter Maydell wrote: > > On Thu, 11 Sept 2025 at 16:59, Sebastian Ott <sebott@redhat.com> wrote: > >> > >> On Thu, 11 Sep 2025, Peter Maydell wrote: > >>> On Thu, 11 Sept 2025 at 15:49, Sebastian Ott <sebott@redhat.com> wrote: > >>>> > >>>> This series adds a vcpu knob to request a specific PSCI version > >>>> from KVM via the KVM_REG_ARM_PSCI_VERSION FW register. > >>>> > >>>> 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 . > >>>> > >>>> Sebastian Ott (2): > >>>> target/arm/kvm: add constants for new PSCI versions > >>>> target/arm/kvm: add kvm-psci-version vcpu property > >>> > >>> Could we have some rationale, please? What's the use case > >>> where you might need to specify a particular PSCI version? > >> > >> The use case is migrating between different host kernel versions. > >> Per default the kernel reports the latest PSCI version in the > >> KVM_REG_ARM_PSCI_VERSION register (for KVM_CAP_ARM_PSCI_0_2) - > >> when that differs between source and target a migration will fail. > >> > >> This property allows to request a PSCI version that is supported by > >> both sides. Specifically I want to support migration between host > >> kernels with and without the following Linux commit: > >> 8be82d536a9f KVM: arm64: Add support for PSCI v1.2 and v1.3 > > > > So if the destination kernel is post that commit and the > > source kernel pre-dates it, do we fail migration? > > This case works with current qemu without any changes, since on > target qemu would write the register value it has stored from > the source side (QEMU_PSCI_VERSION_1_1) and thus requests kvm > on target to emulate that version. > > > Or is > > this only a migration failure when the destination doesn't > > support the PSCI version we defaulted to at the source end? > > Yes, this doesn't work with current qemu. On target qemu would > write QEMU_PSCI_VERSION_1_3 to the KVM_REG_ARM_PSCI_VERSION > register but that kernel doesn't know this version and the > migration will fail. I was under the impression that trying to migrate backwards from a newer kernel to an older one was likely to fail for various reasons (notably "new kernel reports a new system register the old one doesn't") ? Perhaps we should think about the problem in a wider scope than just the PSCI version... thanks -- PMM ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 0/2] arm: add kvm-psci-version vcpu property 2025-09-11 16:32 ` Peter Maydell @ 2025-09-11 16:46 ` Sebastian Ott 2025-09-18 14:25 ` Eric Auger 0 siblings, 1 reply; 14+ messages in thread From: Sebastian Ott @ 2025-09-11 16:46 UTC (permalink / raw) To: Peter Maydell Cc: Paolo Bonzini, qemu-arm, qemu-devel, kvm, kvmarm, Cornelia Huck, Eric Auger On Thu, 11 Sep 2025, Peter Maydell wrote: > On Thu, 11 Sept 2025 at 17:29, Sebastian Ott <sebott@redhat.com> wrote: >> >> On Thu, 11 Sep 2025, Peter Maydell wrote: >>> On Thu, 11 Sept 2025 at 16:59, Sebastian Ott <sebott@redhat.com> wrote: >>>> >>>> On Thu, 11 Sep 2025, Peter Maydell wrote: >>>>> On Thu, 11 Sept 2025 at 15:49, Sebastian Ott <sebott@redhat.com> wrote: >>>>>> >>>>>> This series adds a vcpu knob to request a specific PSCI version >>>>>> from KVM via the KVM_REG_ARM_PSCI_VERSION FW register. >>>>>> >>>>>> 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 . >>>>>> >>>>>> Sebastian Ott (2): >>>>>> target/arm/kvm: add constants for new PSCI versions >>>>>> target/arm/kvm: add kvm-psci-version vcpu property >>>>> >>>>> Could we have some rationale, please? What's the use case >>>>> where you might need to specify a particular PSCI version? >>>> >>>> The use case is migrating between different host kernel versions. >>>> Per default the kernel reports the latest PSCI version in the >>>> KVM_REG_ARM_PSCI_VERSION register (for KVM_CAP_ARM_PSCI_0_2) - >>>> when that differs between source and target a migration will fail. >>>> >>>> This property allows to request a PSCI version that is supported by >>>> both sides. Specifically I want to support migration between host >>>> kernels with and without the following Linux commit: >>>> 8be82d536a9f KVM: arm64: Add support for PSCI v1.2 and v1.3 >>> >>> So if the destination kernel is post that commit and the >>> source kernel pre-dates it, do we fail migration? >> >> This case works with current qemu without any changes, since on >> target qemu would write the register value it has stored from >> the source side (QEMU_PSCI_VERSION_1_1) and thus requests kvm >> on target to emulate that version. >> >>> Or is >>> this only a migration failure when the destination doesn't >>> support the PSCI version we defaulted to at the source end? >> >> Yes, this doesn't work with current qemu. On target qemu would >> write QEMU_PSCI_VERSION_1_3 to the KVM_REG_ARM_PSCI_VERSION >> register but that kernel doesn't know this version and the >> migration will fail. > > I was under the impression that trying to migrate backwards > from a newer kernel to an older one was likely to fail > for various reasons (notably "new kernel reports a new > system register the old one doesn't") ? Perhaps we should > think about the problem in a wider scope than just the > PSCI version... Yes we already are ;-) See this series from Cornelia: https://lore.kernel.org/qemu-devel/20250414163849.321857-1-cohuck@redhat.com/ And this from Eric: https://lore.kernel.org/qemu-devel/20250911134324.3702720-1-eric.auger@redhat.com/ Both will help mitigate register differences for a backwards/downgrade migration. Sebastian ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 0/2] arm: add kvm-psci-version vcpu property 2025-09-11 16:46 ` Sebastian Ott @ 2025-09-18 14:25 ` Eric Auger 0 siblings, 0 replies; 14+ messages in thread From: Eric Auger @ 2025-09-18 14:25 UTC (permalink / raw) To: Sebastian Ott, Peter Maydell Cc: Paolo Bonzini, qemu-arm, qemu-devel, kvm, kvmarm, Cornelia Huck Hi Peter, On 9/11/25 6:46 PM, Sebastian Ott wrote: > On Thu, 11 Sep 2025, Peter Maydell wrote: >> On Thu, 11 Sept 2025 at 17:29, Sebastian Ott <sebott@redhat.com> wrote: >>> >>> On Thu, 11 Sep 2025, Peter Maydell wrote: >>>> On Thu, 11 Sept 2025 at 16:59, Sebastian Ott <sebott@redhat.com> >>>> wrote: >>>>> >>>>> On Thu, 11 Sep 2025, Peter Maydell wrote: >>>>>> On Thu, 11 Sept 2025 at 15:49, Sebastian Ott <sebott@redhat.com> >>>>>> wrote: >>>>>>> >>>>>>> This series adds a vcpu knob to request a specific PSCI version >>>>>>> from KVM via the KVM_REG_ARM_PSCI_VERSION FW register. >>>>>>> >>>>>>> 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 . >>>>>>> >>>>>>> Sebastian Ott (2): >>>>>>> target/arm/kvm: add constants for new PSCI versions >>>>>>> target/arm/kvm: add kvm-psci-version vcpu property >>>>>> >>>>>> Could we have some rationale, please? What's the use case >>>>>> where you might need to specify a particular PSCI version? >>>>> >>>>> The use case is migrating between different host kernel versions. >>>>> Per default the kernel reports the latest PSCI version in the >>>>> KVM_REG_ARM_PSCI_VERSION register (for KVM_CAP_ARM_PSCI_0_2) - >>>>> when that differs between source and target a migration will fail. >>>>> >>>>> This property allows to request a PSCI version that is supported by >>>>> both sides. Specifically I want to support migration between host >>>>> kernels with and without the following Linux commit: >>>>> 8be82d536a9f KVM: arm64: Add support for PSCI v1.2 and v1.3 >>>> >>>> So if the destination kernel is post that commit and the >>>> source kernel pre-dates it, do we fail migration? >>> >>> This case works with current qemu without any changes, since on >>> target qemu would write the register value it has stored from >>> the source side (QEMU_PSCI_VERSION_1_1) and thus requests kvm >>> on target to emulate that version. >>> >>>> Or is >>>> this only a migration failure when the destination doesn't >>>> support the PSCI version we defaulted to at the source end? >>> >>> Yes, this doesn't work with current qemu. On target qemu would >>> write QEMU_PSCI_VERSION_1_3 to the KVM_REG_ARM_PSCI_VERSION >>> register but that kernel doesn't know this version and the >>> migration will fail. >> >> I was under the impression that trying to migrate backwards >> from a newer kernel to an older one was likely to fail >> for various reasons (notably "new kernel reports a new >> system register the old one doesn't") ? Perhaps we should >> think about the problem in a wider scope than just the >> PSCI version... > > Yes we already are ;-) See this series from Cornelia: > https://lore.kernel.org/qemu-devel/20250414163849.321857-1-cohuck@redhat.com/ > > > And this from Eric: > https://lore.kernel.org/qemu-devel/20250911134324.3702720-1-eric.auger@redhat.com/ > the above series especially handles a class of migration errors where the source host kernel exposes more KVM regs to userspace than destination host kernel. In that case, currently, the vcpu state cannot be migrated. I should have called that: mitigation of* "failed to load cpu:cpreg_vmstate_array_len" migration errors. Sebastian tries to handle a change in the default value of a pseudo FW register. We would like to have a compat to keep the old value for old machine types. Thanks Eric * > > Both will help mitigate register differences for a backwards/downgrade > migration. > > Sebastian > ^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2025-10-28 11:03 UTC | newest] Thread overview: 14+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2025-09-11 14:49 [PATCH 0/2] arm: add kvm-psci-version vcpu property Sebastian Ott 2025-09-11 14:49 ` [PATCH 1/2] target/arm/kvm: add constants for new PSCI versions Sebastian Ott 2025-09-18 15:26 ` Eric Auger 2025-09-11 14:49 ` [PATCH 2/2] target/arm/kvm: add kvm-psci-version vcpu property Sebastian Ott 2025-09-18 15:26 ` Eric Auger 2025-10-27 16:42 ` Peter Maydell 2025-10-28 11:00 ` Sebastian Ott 2025-09-11 15:18 ` [PATCH 0/2] arm: " Peter Maydell 2025-09-11 15:59 ` Sebastian Ott 2025-09-11 16:02 ` Peter Maydell 2025-09-11 16:29 ` Sebastian Ott 2025-09-11 16:32 ` Peter Maydell 2025-09-11 16:46 ` Sebastian Ott 2025-09-18 14:25 ` Eric Auger
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).