Every architecture needs to implement this. I did note that loongarch references init_vcpu for feature detection but maybe that should be moved to kvm_arch_pre_create_vcpu?
Signed-off-by: Alex Bennée <[email protected]> --- include/accel/kvm/cpu-ops.h | 4 ++++ include/system/kvm.h | 1 - target/i386/kvm/kvm_i386.h | 1 + accel/kvm/kvm-all.c | 8 ++++---- target/arm/kvm.c | 3 ++- target/i386/kvm/kvm-cpu.c | 1 + target/i386/kvm/kvm.c | 2 +- target/loongarch/cpu.c | 8 ++++---- target/loongarch/kvm/kvm.c | 3 ++- target/ppc/kvm.c | 3 ++- target/riscv/kvm/kvm-cpu.c | 3 ++- target/s390x/kvm/kvm.c | 3 ++- 12 files changed, 25 insertions(+), 15 deletions(-) diff --git a/include/accel/kvm/cpu-ops.h b/include/accel/kvm/cpu-ops.h index 9b8a54253b1..23557a42ba7 100644 --- a/include/accel/kvm/cpu-ops.h +++ b/include/accel/kvm/cpu-ops.h @@ -25,6 +25,9 @@ struct kvm_run; * vCPUs are created (e.g. x86 PMU disable or TDX). * May be NULL if the target does not require pre-creation * handling. + * @init_vcpu: Mandatory callback executed to perform architecture-specific + * initialization of a newly created KVM vCPU. + * Returns 0 on success, or a negative errno on failure. * @get_registers: Mandatory callback to synchronize architecture-specific * vCPU register state from KVM into QEMU's CPUState. * Returns 0 on success, or a negative errno on failure. @@ -61,6 +64,7 @@ struct kvm_run; */ typedef struct KVMCPUOps { int (*pre_create_vcpu)(CPUState *cpu, Error **errp); + int (*init_vcpu)(CPUState *cpu); int (*get_registers)(CPUState *cpu, Error **errp); int (*put_registers)(CPUState *cpu, KvmPutState level, Error **errp); void (*pre_run)(CPUState *cpu, struct kvm_run *run); diff --git a/include/system/kvm.h b/include/system/kvm.h index 3b08eb4f5d0..a722f266dae 100644 --- a/include/system/kvm.h +++ b/include/system/kvm.h @@ -346,7 +346,6 @@ int kvm_arch_get_default_type(MachineState *ms); int kvm_arch_init(MachineState *ms, KVMState *s); -int kvm_arch_init_vcpu(CPUState *cpu); int kvm_arch_destroy_vcpu(CPUState *cpu); #ifdef TARGET_KVM_HAVE_RESET_PARKED_VCPU diff --git a/target/i386/kvm/kvm_i386.h b/target/i386/kvm/kvm_i386.h index b5dace5d3be..8af5a9dc0ef 100644 --- a/target/i386/kvm/kvm_i386.h +++ b/target/i386/kvm/kvm_i386.h @@ -34,6 +34,7 @@ bool kvm_hyperv_expand_features(X86CPU *cpu, Error **errp); int kvm_get_vm_type(MachineState *ms); void kvm_arch_reset_vcpu(X86CPU *cs); int x86_kvm_pre_create_vcpu(CPUState *cpu, Error **errp); +int x86_kvm_init_vcpu(CPUState *cs); int x86_kvm_get_registers(CPUState *cs, Error **errp); int x86_kvm_put_registers(CPUState *cpu, KvmPutState level, Error **errp); void x86_kvm_pre_run(CPUState *cpu, struct kvm_run *run); diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c index dbd4cfc7c7a..d877edaa5e8 100644 --- a/accel/kvm/kvm-all.c +++ b/accel/kvm/kvm-all.c @@ -510,10 +510,10 @@ static int kvm_rebind_vcpus(Error **errp) } } - ret = kvm_arch_init_vcpu(cpu); + ret = ops->init_vcpu(cpu); if (ret < 0) { error_setg_errno(errp, -ret, - "kvm_init_vcpu: kvm_arch_init_vcpu failed (%lu)", + "kvm_init_vcpu: init_vcpu failed (%lu)", vcpu_id); } @@ -760,10 +760,10 @@ int kvm_init_vcpu(CPUState *cpu, Error **errp) } } - ret = kvm_arch_init_vcpu(cpu); + ret = ops->init_vcpu(cpu); if (ret < 0) { error_setg_errno(errp, -ret, - "kvm_init_vcpu: kvm_arch_init_vcpu failed (%lu)", + "kvm_init_vcpu: init_vcpu failed (%lu)", kvm_arch_vcpu_id(cpu)); } cpu->kvm_vcpu_stats_fd = kvm_vcpu_ioctl(cpu, KVM_GET_STATS_FD, NULL); diff --git a/target/arm/kvm.c b/target/arm/kvm.c index da6c3e0b3d3..b62f40623c3 100644 --- a/target/arm/kvm.c +++ b/target/arm/kvm.c @@ -1994,7 +1994,7 @@ static int kvm_arm_sve_set_vls(ARMCPU *cpu) #define ARM_CPU_ID_MPIDR 3, 0, 0, 0, 5 -int kvm_arch_init_vcpu(CPUState *cs) +static int arm_kvm_init_vcpu(CPUState *cs) { int ret; uint64_t mpidr; @@ -2656,6 +2656,7 @@ void arm_gic_cap_kvm_probe(GICCapability *v2, GICCapability *v3) } static const KVMCPUOps arm_kvm_cpu_ops = { + .init_vcpu = arm_kvm_init_vcpu, .get_registers = arm_kvm_get_registers, .put_registers = arm_kvm_put_registers, .pre_run = arm_kvm_pre_run, diff --git a/target/i386/kvm/kvm-cpu.c b/target/i386/kvm/kvm-cpu.c index e2cf42a126e..6c547f204f8 100644 --- a/target/i386/kvm/kvm-cpu.c +++ b/target/i386/kvm/kvm-cpu.c @@ -236,6 +236,7 @@ static void kvm_cpu_instance_init(CPUState *cs) static const KVMCPUOps x86_kvm_cpu_ops = { .pre_create_vcpu = x86_kvm_pre_create_vcpu, + .init_vcpu = x86_kvm_init_vcpu, .get_registers = x86_kvm_get_registers, .put_registers = x86_kvm_put_registers, .pre_run = x86_kvm_pre_run, diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c index 1c53b62a1f7..46b7e497aaf 100644 --- a/target/i386/kvm/kvm.c +++ b/target/i386/kvm/kvm.c @@ -2218,7 +2218,7 @@ static void kvm_init_pmu_info(struct kvm_cpuid2 *cpuid, X86CPU *cpu) } } -int kvm_arch_init_vcpu(CPUState *cs) +int x86_kvm_init_vcpu(CPUState *cs) { struct { struct kvm_cpuid2 cpuid; diff --git a/target/loongarch/cpu.c b/target/loongarch/cpu.c index 54c26998979..d8f54a5526c 100644 --- a/target/loongarch/cpu.c +++ b/target/loongarch/cpu.c @@ -177,7 +177,7 @@ static void loongarch_set_lsx(Object *obj, bool value, Error **errp) } if (kvm_enabled()) { - /* kvm feature detection in function kvm_arch_init_vcpu */ + /* kvm feature detection in loongarch_kvm_init_vcpu */ return; } @@ -213,7 +213,7 @@ static void loongarch_set_lasx(Object *obj, bool value, Error **errp) } if (kvm_enabled()) { - /* kvm feature detection in function kvm_arch_init_vcpu */ + /* kvm feature detection in loongarch_kvm_init_vcpu */ return; } @@ -241,7 +241,7 @@ static void loongarch_set_msgint(Object *obj, bool value, Error **errp) cpu->msgint = value ? ON_OFF_AUTO_ON : ON_OFF_AUTO_OFF; if (kvm_enabled()) { - /* kvm feature detection in function kvm_arch_init_vcpu */ + /* kvm feature detection in loongarch_kvm_init_vcpu */ return; } @@ -260,7 +260,7 @@ static void loongarch_set_ptw(Object *obj, bool value, Error **errp) cpu->ptw = value ? ON_OFF_AUTO_ON : ON_OFF_AUTO_OFF; if (kvm_enabled()) { - /* kvm feature detection in function kvm_arch_init_vcpu */ + /* kvm feature detection in loongarch_kvm_init_vcpu */ return; } diff --git a/target/loongarch/kvm/kvm.c b/target/loongarch/kvm/kvm.c index 9ce6e9e65b4..8f2ceb50a78 100644 --- a/target/loongarch/kvm/kvm.c +++ b/target/loongarch/kvm/kvm.c @@ -1297,7 +1297,7 @@ static int kvm_cpu_check_misc_v1_1(CPUState *cs, Error **errp) return 0; } -int kvm_arch_init_vcpu(CPUState *cs) +static int loongarch_kvm_init_vcpu(CPUState *cs) { uint64_t val; int ret; @@ -1639,6 +1639,7 @@ void kvm_arch_accel_class_init(ObjectClass *oc) } static const KVMCPUOps loongarch_kvm_cpu_ops = { + .init_vcpu = loongarch_kvm_init_vcpu, .get_registers = loongarch_kvm_get_registers, .put_registers = loongarch_kvm_put_registers, .handle_exit = loongarch_kvm_handle_exit, diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c index 8a2d2421dc2..075999b553a 100644 --- a/target/ppc/kvm.c +++ b/target/ppc/kvm.c @@ -480,7 +480,7 @@ static void kvmppc_hw_debug_points_init(CPUPPCState *cenv) } } -int kvm_arch_init_vcpu(CPUState *cs) +static int ppc_kvm_init_vcpu(CPUState *cs) { PowerPCCPU *cpu = POWERPC_CPU(cs); CPUPPCState *cenv = &cpu->env; @@ -3068,6 +3068,7 @@ void kvm_arch_accel_class_init(ObjectClass *oc) } static const KVMCPUOps ppc_kvm_cpu_ops = { + .init_vcpu = ppc_kvm_init_vcpu, .get_registers = ppc_kvm_get_registers, .put_registers = ppc_kvm_put_registers, .handle_exit = ppc_kvm_handle_exit, diff --git a/target/riscv/kvm/kvm-cpu.c b/target/riscv/kvm/kvm-cpu.c index cef9d90c66f..b202882a155 100644 --- a/target/riscv/kvm/kvm-cpu.c +++ b/target/riscv/kvm/kvm-cpu.c @@ -1579,7 +1579,7 @@ static int kvm_vcpu_enable_sbi_dbcn(RISCVCPU *cpu, CPUState *cs) return kvm_set_one_reg(cs, kvm_sbi_dbcn.kvm_reg_id, ®); } -int kvm_arch_init_vcpu(CPUState *cs) +static int riscv_kvm_init_vcpu(CPUState *cs) { int ret = 0; RISCVCPU *cpu = RISCV_CPU(cs); @@ -2179,6 +2179,7 @@ void riscv_kvm_cpu_finalize_features(RISCVCPU *cpu, Error **errp) } static const KVMCPUOps riscv_kvm_cpu_ops = { + .init_vcpu = riscv_kvm_init_vcpu, .get_registers = riscv_kvm_get_registers, .put_registers = riscv_kvm_put_registers, .handle_exit = riscv_kvm_handle_exit, diff --git a/target/s390x/kvm/kvm.c b/target/s390x/kvm/kvm.c index 64020450dec..478b21a57fd 100644 --- a/target/s390x/kvm/kvm.c +++ b/target/s390x/kvm/kvm.c @@ -400,7 +400,7 @@ unsigned long kvm_arch_vcpu_id(CPUState *cpu) return cpu->cpu_index; } -int kvm_arch_init_vcpu(CPUState *cs) +static int s390x_kvm_init_vcpu(CPUState *cs) { unsigned int max_cpus = MACHINE(qdev_get_machine())->smp.max_cpus; S390CPU *cpu = S390_CPU(cs); @@ -2646,6 +2646,7 @@ void kvm_arch_accel_class_init(ObjectClass *oc) } static const KVMCPUOps s390x_kvm_cpu_ops = { + .init_vcpu = s390x_kvm_init_vcpu, .get_registers = s390x_kvm_get_registers, .put_registers = s390x_kvm_put_registers, .handle_exit = s390x_kvm_handle_exit, -- 2.47.3
