target/i386: allow reordering max_x86_cpu_initfn vs accel CPU init

The PMU feature is only supported by KVM, so move it there.  And since
all accelerators other than TCG overwrite the vendor, set it in
max_x86_cpu_initfn only if it has not been initialized by the
superclass.  This makes it possible to run max_x86_cpu_initfn
after accelerator init.

Reviewed-by: Xiaoyao Li <xiaoyao.li@intel.com>
Reviewed-by: Zhao Liu <zhao1.liu@intel.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Paolo Bonzini 2025-07-10 18:49:17 +02:00
parent d93972d88b
commit 810fcc41fc
2 changed files with 14 additions and 12 deletions

View file

@ -6199,21 +6199,21 @@ static void max_x86_cpu_class_init(ObjectClass *oc, const void *data)
static void max_x86_cpu_initfn(Object *obj)
{
X86CPU *cpu = X86_CPU(obj);
/* We can't fill the features array here because we don't know yet if
* "migratable" is true or false.
*/
object_property_set_bool(OBJECT(cpu), "pmu", true, &error_abort);
CPUX86State *env = &cpu->env;
/*
* these defaults are used for TCG and all other accelerators
* besides KVM and HVF, which overwrite these values
* these defaults are used for TCG, other accelerators overwrite these
* values
*/
object_property_set_str(OBJECT(cpu), "vendor", CPUID_VENDOR_AMD,
&error_abort);
object_property_set_str(OBJECT(cpu), "model-id",
"QEMU TCG CPU version " QEMU_HW_VERSION,
&error_abort);
if (!env->cpuid_vendor1) {
object_property_set_str(OBJECT(cpu), "vendor", CPUID_VENDOR_AMD,
&error_abort);
}
if (!env->cpuid_model[0]) {
object_property_set_str(OBJECT(cpu), "model-id",
"QEMU TCG CPU version " QEMU_HW_VERSION,
&error_abort);
}
}
static const TypeInfo max_x86_cpu_type_info = {

View file

@ -111,6 +111,8 @@ static void kvm_cpu_max_instance_init(X86CPU *cpu)
host_cpu_max_instance_init(cpu);
object_property_set_bool(OBJECT(cpu), "pmu", true, &error_abort);
if (lmce_supported()) {
object_property_set_bool(OBJECT(cpu), "lmce", true, &error_abort);
}