Factorize the code that initializes the kvm init features from the cpu settings in a helper. Use it kvm_arch_init_vcpu(). Soon it will be used by another function.
The only change in the code relates to the check of kvm_state. The future caller won't have the VM created when calling the helper and for this caller it is OK ignoring PSCI version setting. Signed-off-by: Eric Auger <[email protected]> --- target/arm/kvm.c | 36 ++++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/target/arm/kvm.c b/target/arm/kvm.c index 1f6f9ba586..840501f9bf 100644 --- a/target/arm/kvm.c +++ b/target/arm/kvm.c @@ -2191,27 +2191,18 @@ int kvm_arch_pre_create_vcpu(CPUState *cpu, Error **errp) return 0; } -int kvm_arch_init_vcpu(CPUState *cs, Error **errp) +/* Determine init features for this CPU */ +static void kvm_arm_vcpu_prepare_init_features(ARMCPU *cpu) { - int ret; - uint64_t mpidr; - ARMCPU *cpu = ARM_CPU(cs); + CPUState *cs = CPU(cpu); CPUARMState *env = &cpu->env; - uint64_t psciver; - if (cpu->kvm_target == QEMU_KVM_ARM_TARGET_NONE) { - error_setg(errp, "KVM is not supported for this guest CPU type"); - return -EINVAL; - } - - qemu_add_vm_change_state_handler(kvm_arm_vm_state_change, cpu); - - /* Determine init features for this CPU */ memset(cpu->kvm_init_features, 0, sizeof(cpu->kvm_init_features)); + if (cs->start_powered_off) { cpu->kvm_init_features[0] |= 1 << KVM_ARM_VCPU_POWER_OFF; } - if (cpu->psci_version != QEMU_PSCI_VERSION_0_1 && + if (cpu->psci_version != QEMU_PSCI_VERSION_0_1 && cs->kvm_state && kvm_check_extension(cs->kvm_state, KVM_CAP_ARM_PSCI_0_2)) { /* * Versions >= v0.2 are backward compatible with v0.2 @@ -2235,6 +2226,23 @@ int kvm_arch_init_vcpu(CPUState *cs, Error **errp) if (cpu->has_el2 && kvm_arm_el2_supported()) { cpu->kvm_init_features[0] |= 1 << KVM_ARM_VCPU_HAS_EL2; } +} + +int kvm_arch_init_vcpu(CPUState *cs, Error **errp) +{ + int ret; + uint64_t mpidr; + ARMCPU *cpu = ARM_CPU(cs); + uint64_t psciver; + + if (cpu->kvm_target == QEMU_KVM_ARM_TARGET_NONE) { + error_setg(errp, "KVM is not supported for this guest CPU type"); + return -EINVAL; + } + + qemu_add_vm_change_state_handler(kvm_arm_vm_state_change, cpu); + + kvm_arm_vcpu_prepare_init_features(cpu); /* Do KVM_ARM_VCPU_INIT ioctl */ ret = kvm_arm_vcpu_init(cpu); -- 2.53.0
