Only x86 actually does anything for this.
Signed-off-by: Alex Bennée <[email protected]>
---
include/accel/kvm/cpu-ops.h | 7 +++++++
include/system/kvm.h | 1 -
target/i386/kvm/kvm_i386.h | 1 +
accel/kvm/kvm-all.c | 19 +++++++++++++------
target/arm/kvm.c | 5 -----
target/i386/kvm/kvm-cpu.c | 1 +
target/i386/kvm/kvm.c | 2 +-
target/loongarch/kvm/kvm.c | 5 -----
target/ppc/kvm.c | 5 -----
target/riscv/kvm/kvm-cpu.c | 5 -----
target/s390x/kvm/kvm.c | 5 -----
11 files changed, 23 insertions(+), 33 deletions(-)
diff --git a/include/accel/kvm/cpu-ops.h b/include/accel/kvm/cpu-ops.h
index b3f6b8e47b7..9b8a54253b1 100644
--- a/include/accel/kvm/cpu-ops.h
+++ b/include/accel/kvm/cpu-ops.h
@@ -19,6 +19,12 @@ struct kvm_run;
/**
* struct KVMCPUOps - Target-specific per-vCPU operations for KVM
*
+ * @pre_create_vcpu: Optional callback executed before creating the KVM vCPU
+ * (via KVM_CREATE_VCPU). Used by architectures that need
+ * to configure VM-level capabilities or features before
+ * vCPUs are created (e.g. x86 PMU disable or TDX).
+ * May be NULL if the target does not require pre-creation
+ * handling.
* @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.
@@ -54,6 +60,7 @@ struct kvm_run;
* processing before execution.
*/
typedef struct KVMCPUOps {
+ int (*pre_create_vcpu)(CPUState *cpu, Error **errp);
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 b2d76f99df0..3b08eb4f5d0 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_pre_create_vcpu(CPUState *cpu, Error **errp);
int kvm_arch_init_vcpu(CPUState *cpu);
int kvm_arch_destroy_vcpu(CPUState *cpu);
diff --git a/target/i386/kvm/kvm_i386.h b/target/i386/kvm/kvm_i386.h
index 2c92afc3320..b5dace5d3be 100644
--- a/target/i386/kvm/kvm_i386.h
+++ b/target/i386/kvm/kvm_i386.h
@@ -33,6 +33,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_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 3de05bb8bb8..dbd4cfc7c7a 100644
--- a/accel/kvm/kvm-all.c
+++ b/accel/kvm/kvm-all.c
@@ -460,6 +460,8 @@ static int kvm_rebind_vcpus(Error **errp)
int kvm_fd, ret = 0;
CPU_FOREACH(cpu) {
+ const KVMCPUOps *ops = kvm_get_cpu_ops(cpu);
+
vcpu_id = kvm_arch_vcpu_id(cpu);
if (cpu->kvm_fd) {
@@ -480,9 +482,11 @@ static int kvm_rebind_vcpus(Error **errp)
goto err;
}
- ret = kvm_arch_pre_create_vcpu(cpu, errp);
- if (ret < 0) {
- goto err;
+ if (ops->pre_create_vcpu) {
+ ret = ops->pre_create_vcpu(cpu, errp);
+ if (ret < 0) {
+ goto err;
+ }
}
kvm_fd = kvm_vm_ioctl(s, KVM_CREATE_VCPU, vcpu_id);
@@ -723,14 +727,17 @@ static int map_kvm_dirty_gfns(KVMState *s, CPUState *cpu,
Error **errp)
int kvm_init_vcpu(CPUState *cpu, Error **errp)
{
+ const KVMCPUOps *ops = kvm_get_cpu_ops(cpu);
KVMState *s = kvm_state;
int ret;
trace_kvm_init_vcpu(cpu->cpu_index, kvm_arch_vcpu_id(cpu));
- ret = kvm_arch_pre_create_vcpu(cpu, errp);
- if (ret < 0) {
- goto err;
+ if (ops->pre_create_vcpu) {
+ ret = ops->pre_create_vcpu(cpu, errp);
+ if (ret < 0) {
+ goto err;
+ }
}
ret = kvm_create_vcpu(cpu);
diff --git a/target/arm/kvm.c b/target/arm/kvm.c
index ea8c4d02ee8..da6c3e0b3d3 100644
--- a/target/arm/kvm.c
+++ b/target/arm/kvm.c
@@ -1994,11 +1994,6 @@ static int kvm_arm_sve_set_vls(ARMCPU *cpu)
#define ARM_CPU_ID_MPIDR 3, 0, 0, 0, 5
-int kvm_arch_pre_create_vcpu(CPUState *cpu, Error **errp)
-{
- return 0;
-}
-
int kvm_arch_init_vcpu(CPUState *cs)
{
int ret;
diff --git a/target/i386/kvm/kvm-cpu.c b/target/i386/kvm/kvm-cpu.c
index 08308ef8a80..e2cf42a126e 100644
--- a/target/i386/kvm/kvm-cpu.c
+++ b/target/i386/kvm/kvm-cpu.c
@@ -235,6 +235,7 @@ static void kvm_cpu_instance_init(CPUState *cs)
}
static const KVMCPUOps x86_kvm_cpu_ops = {
+ .pre_create_vcpu = x86_kvm_pre_create_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 7ee6d3d4f38..1c53b62a1f7 100644
--- a/target/i386/kvm/kvm.c
+++ b/target/i386/kvm/kvm.c
@@ -2056,7 +2056,7 @@ full:
abort();
}
-int kvm_arch_pre_create_vcpu(CPUState *cpu, Error **errp)
+int x86_kvm_pre_create_vcpu(CPUState *cpu, Error **errp)
{
static bool first = true;
int ret;
diff --git a/target/loongarch/kvm/kvm.c b/target/loongarch/kvm/kvm.c
index 1e7565732e8..9ce6e9e65b4 100644
--- a/target/loongarch/kvm/kvm.c
+++ b/target/loongarch/kvm/kvm.c
@@ -1297,11 +1297,6 @@ static int kvm_cpu_check_misc_v1_1(CPUState *cs, Error
**errp)
return 0;
}
-int kvm_arch_pre_create_vcpu(CPUState *cpu, Error **errp)
-{
- return 0;
-}
-
int kvm_arch_init_vcpu(CPUState *cs)
{
uint64_t val;
diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c
index 25f797cb2d8..8a2d2421dc2 100644
--- a/target/ppc/kvm.c
+++ b/target/ppc/kvm.c
@@ -480,11 +480,6 @@ static void kvmppc_hw_debug_points_init(CPUPPCState *cenv)
}
}
-int kvm_arch_pre_create_vcpu(CPUState *cpu, Error **errp)
-{
- return 0;
-}
-
int kvm_arch_init_vcpu(CPUState *cs)
{
PowerPCCPU *cpu = POWERPC_CPU(cs);
diff --git a/target/riscv/kvm/kvm-cpu.c b/target/riscv/kvm/kvm-cpu.c
index c38c07a563b..cef9d90c66f 100644
--- a/target/riscv/kvm/kvm-cpu.c
+++ b/target/riscv/kvm/kvm-cpu.c
@@ -1579,11 +1579,6 @@ 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_pre_create_vcpu(CPUState *cpu, Error **errp)
-{
- return 0;
-}
-
int kvm_arch_init_vcpu(CPUState *cs)
{
int ret = 0;
diff --git a/target/s390x/kvm/kvm.c b/target/s390x/kvm/kvm.c
index c85d286288b..64020450dec 100644
--- a/target/s390x/kvm/kvm.c
+++ b/target/s390x/kvm/kvm.c
@@ -400,11 +400,6 @@ unsigned long kvm_arch_vcpu_id(CPUState *cpu)
return cpu->cpu_index;
}
-int kvm_arch_pre_create_vcpu(CPUState *cpu, Error **errp)
-{
- return 0;
-}
-
int kvm_arch_init_vcpu(CPUState *cs)
{
unsigned int max_cpus = MACHINE(qdev_get_machine())->smp.max_cpus;
--
2.47.3