accel_cpu_common_realize() first calls accel_cpu->cpu_realize then ops->cpu_realize. Rather than having one handler for each host architecture, use a single host-specific method (prefixed with kvm_arch_* like other similar KVM methods). Register it once as AccelOpsClass cpu_realize handler. Add stubs for when a host lacks such method. PPC's ACCEL_CPU_NAME("kvm") TypeInfo is now empty, remove it. Signed-off-by: Philippe Mathieu-Daudé Reviewed-by: Richard Henderson Reviewed-by: Pierrick Bouvier --- include/system/kvm.h | 2 ++ accel/kvm/kvm-accel-ops.c | 1 + target/arm/kvm.c | 5 +++++ target/i386/kvm/kvm-cpu.c | 3 +-- target/loongarch/kvm/kvm.c | 5 +++++ target/ppc/kvm.c | 23 +---------------------- target/riscv/kvm/kvm-cpu.c | 10 +--------- target/s390x/kvm/kvm.c | 5 +++++ 8 files changed, 21 insertions(+), 33 deletions(-) diff --git a/include/system/kvm.h b/include/system/kvm.h index 5fa33eddda3..cb077d6d863 100644 --- a/include/system/kvm.h +++ b/include/system/kvm.h @@ -223,6 +223,8 @@ void kvm_irqchip_add_change_notifier(Notifier *n); void kvm_irqchip_remove_change_notifier(Notifier *n); void kvm_irqchip_change_notify(void); +bool kvm_arch_cpu_realize(CPUState *cpu, Error **errp); + #ifdef COMPILING_PER_TARGET #include "cpu.h" diff --git a/accel/kvm/kvm-accel-ops.c b/accel/kvm/kvm-accel-ops.c index 6d9140e549f..4e7e3039208 100644 --- a/accel/kvm/kvm-accel-ops.c +++ b/accel/kvm/kvm-accel-ops.c @@ -97,6 +97,7 @@ static void kvm_accel_ops_class_init(ObjectClass *oc, const void *data) AccelOpsClass *ops = ACCEL_OPS_CLASS(oc); ops->create_vcpu_thread = kvm_start_vcpu_thread; + ops->cpu_realize = kvm_arch_cpu_realize; ops->cpu_thread_is_idle = kvm_vcpu_thread_is_idle; ops->cpus_are_resettable = kvm_cpus_are_resettable; ops->synchronize_post_reset = kvm_cpu_synchronize_post_reset; diff --git a/target/arm/kvm.c b/target/arm/kvm.c index 7d194ea112b..22bd924a399 100644 --- a/target/arm/kvm.c +++ b/target/arm/kvm.c @@ -1783,6 +1783,11 @@ void kvm_arch_accel_class_init(ObjectClass *oc) "Eager Page Split chunk size for hugepages. (default: 0, disabled)"); } +bool kvm_arch_cpu_realize(CPUState *cpu, Error **errp) +{ + return true; +} + int kvm_arch_insert_hw_breakpoint(vaddr addr, vaddr len, int type) { switch (type) { diff --git a/target/i386/kvm/kvm-cpu.c b/target/i386/kvm/kvm-cpu.c index c34d9f15c7e..36634ec8929 100644 --- a/target/i386/kvm/kvm-cpu.c +++ b/target/i386/kvm/kvm-cpu.c @@ -39,7 +39,7 @@ static void kvm_set_guest_phys_bits(CPUState *cs) } } -static bool kvm_cpu_realizefn(CPUState *cs, Error **errp) +bool kvm_arch_cpu_realize(CPUState *cs, Error **errp) { X86CPU *cpu = X86_CPU(cs); X86CPUClass *xcc = X86_CPU_GET_CLASS(cpu); @@ -237,7 +237,6 @@ static void kvm_cpu_accel_class_init(ObjectClass *oc, const void *data) { AccelCPUClass *acc = ACCEL_CPU_CLASS(oc); - acc->cpu_target_realize = kvm_cpu_realizefn; acc->cpu_instance_init = kvm_cpu_instance_init; } static const TypeInfo kvm_cpu_accel_type_info = { diff --git a/target/loongarch/kvm/kvm.c b/target/loongarch/kvm/kvm.c index 9d844c4905a..ec4c05006c6 100644 --- a/target/loongarch/kvm/kvm.c +++ b/target/loongarch/kvm/kvm.c @@ -1495,3 +1495,8 @@ int kvm_loongarch_set_interrupt(LoongArchCPU *cpu, int irq, int level) void kvm_arch_accel_class_init(ObjectClass *oc) { } + +bool kvm_arch_cpu_realize(CPUState *cpu, Error **errp) +{ + return true; +} diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c index b94c2997a07..013f5e852e1 100644 --- a/target/ppc/kvm.c +++ b/target/ppc/kvm.c @@ -49,7 +49,6 @@ #include "elf.h" #include "system/kvm_int.h" #include "system/kvm.h" -#include "accel/accel-cpu-target.h" #include CONFIG_DEVICES @@ -2353,7 +2352,7 @@ static void alter_insns(uint64_t *word, uint64_t flags, bool on) } } -static bool kvmppc_cpu_realize(CPUState *cs, Error **errp) +bool kvm_arch_cpu_realize(CPUState *cs, Error **errp) { int ret; const char *vcpu_str = (cs->parent_obj.hotplugged == true) ? @@ -2995,23 +2994,3 @@ void kvmppc_set_reg_tb_offset(PowerPCCPU *cpu, int64_t tb_offset) void kvm_arch_accel_class_init(ObjectClass *oc) { } - -static void kvm_cpu_accel_class_init(ObjectClass *oc, const void *data) -{ - AccelCPUClass *acc = ACCEL_CPU_CLASS(oc); - - acc->cpu_target_realize = kvmppc_cpu_realize; -} - -static const TypeInfo kvm_cpu_accel_type_info = { - .name = ACCEL_CPU_NAME("kvm"), - - .parent = TYPE_ACCEL_CPU, - .class_init = kvm_cpu_accel_class_init, - .abstract = true, -}; -static void kvm_cpu_accel_register_types(void) -{ - type_register_static(&kvm_cpu_accel_type_info); -} -type_init(kvm_cpu_accel_register_types); diff --git a/target/riscv/kvm/kvm-cpu.c b/target/riscv/kvm/kvm-cpu.c index 17ba38403a3..7c4440d0025 100644 --- a/target/riscv/kvm/kvm-cpu.c +++ b/target/riscv/kvm/kvm-cpu.c @@ -1990,14 +1990,7 @@ static void kvm_cpu_instance_init(CPUState *cs) kvm_riscv_add_cpu_user_properties(obj); } -/* - * We'll get here via the following path: - * - * riscv_cpu_realize() - * -> cpu_exec_realizefn() - * -> kvm_cpu_realize() (via accel_cpu_common_realize()) - */ -static bool kvm_cpu_realize(CPUState *cs, Error **errp) +bool kvm_arch_cpu_realize(CPUState *cs, Error **errp) { RISCVCPU *cpu = RISCV_CPU(cs); int ret; @@ -2120,7 +2113,6 @@ static void kvm_cpu_accel_class_init(ObjectClass *oc, const void *data) AccelCPUClass *acc = ACCEL_CPU_CLASS(oc); acc->cpu_instance_init = kvm_cpu_instance_init; - acc->cpu_target_realize = kvm_cpu_realize; } static const TypeInfo kvm_cpu_accel_type_info = { diff --git a/target/s390x/kvm/kvm.c b/target/s390x/kvm/kvm.c index 2e4f435c537..1c259652925 100644 --- a/target/s390x/kvm/kvm.c +++ b/target/s390x/kvm/kvm.c @@ -2611,3 +2611,8 @@ int kvm_s390_topology_set_mtcr(uint64_t attr) void kvm_arch_accel_class_init(ObjectClass *oc) { } + +bool kvm_arch_cpu_realize(CPUState *cpu, Error **errp) +{ + return true; +} -- 2.53.0