This allows us to eliminate all the trivial pc_init_*() functions which just call a compat function followed by pc_init1(), and slowly move duplicate code from piix and q35 init functions into common PC code.
Signed-off-by: Eduardo Habkost <ehabk...@redhat.com> --- hw/i386/pc.c | 12 ++++++++ hw/i386/pc_piix.c | 80 ++++++++++++++-------------------------------------- hw/i386/pc_q35.c | 45 ++++++----------------------- include/hw/i386/pc.h | 4 +++ 4 files changed, 46 insertions(+), 95 deletions(-) diff --git a/hw/i386/pc.c b/hw/i386/pc.c index f1fc901..800d3a3 100644 --- a/hw/i386/pc.c +++ b/hw/i386/pc.c @@ -1609,6 +1609,17 @@ static void pc_machine_initfn(Object *obj) NULL, NULL, NULL, NULL); } +static void pc_machine_init(MachineState *machine) +{ + PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(machine); + if (pcmc->compat_func) { + pcmc->compat_func(machine); + } + if (pcmc->finish_init) { + pcmc->finish_init(machine); + } +} + static void pc_machine_class_init(ObjectClass *oc, void *data) { MachineClass *mc = MACHINE_CLASS(oc); @@ -1621,6 +1632,7 @@ static void pc_machine_class_init(ObjectClass *oc, void *data) pcmc->has_acpi_build = true; pcmc->gigabyte_align = true; pcmc->has_reserved_memory = true; + mc->init = pc_machine_init; mc->get_hotplug_handler = pc_get_hotpug_handler; mc->default_boot_order = "cad"; mc->hot_add_cpu = pc_hot_add_cpu; diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c index da54c26..aef23b1 100644 --- a/hw/i386/pc_piix.c +++ b/hw/i386/pc_piix.c @@ -301,65 +301,19 @@ static void pc_compat_1_2(MachineState *machine) x86_cpu_compat_disable_kvm_features(FEAT_KVM, KVM_FEATURE_PV_EOI); } -static void pc_init_pci_2_0(MachineState *machine) -{ - pc_compat_2_0(machine); - pc_init1(machine); -} - -static void pc_init_pci_1_7(MachineState *machine) -{ - pc_compat_1_7(machine); - pc_init1(machine); -} - -static void pc_init_pci_1_6(MachineState *machine) -{ - pc_compat_1_6(machine); - pc_init1(machine); -} - -static void pc_init_pci_1_5(MachineState *machine) -{ - pc_compat_1_5(machine); - pc_init1(machine); -} - -static void pc_init_pci_1_4(MachineState *machine) -{ - pc_compat_1_4(machine); - pc_init1(machine); -} - -static void pc_init_pci_1_3(MachineState *machine) -{ - pc_compat_1_3(machine); - pc_init1(machine); -} - -/* PC machine init function for pc-0.14 to pc-1.2 */ -static void pc_init_pci_1_2(MachineState *machine) -{ - pc_compat_1_2(machine); - pc_init1(machine); -} - -/* PC init function for pc-0.10 to pc-0.13, and reused by xenfv */ -static void pc_init_pci_no_kvmclock(MachineState *machine) +static void pc_compat_0_13(MachineState *machine) { x86_cpu_compat_disable_kvm_features(FEAT_KVM, KVM_FEATURE_PV_EOI); enable_compat_apic_id_mode(); - pc_init1(machine); } -static void pc_init_isa(MachineState *machine) +static void pc_compat_isa(MachineState *machine) { if (!machine->cpu_model) { machine->cpu_model = "486"; } x86_cpu_compat_disable_kvm_features(FEAT_KVM, KVM_FEATURE_PV_EOI); enable_compat_apic_id_mode(); - pc_init1(machine); } #ifdef CONFIG_XEN @@ -393,8 +347,10 @@ typedef struct PCI440FXMachineClass { static void pc_i440fx_machine_class_init(ObjectClass *oc, void *data) { MachineClass *mc = MACHINE_CLASS(oc); + PCMachineClass *pcmc = PC_MACHINE_CLASS(oc); mc->desc = "Standard PC (i440FX + PIIX, 1996)"; mc->hot_add_cpu = pc_hot_add_cpu; + pcmc->finish_init = pc_init1; } static TypeInfo pc_i440fx_machine_type_info = { @@ -411,7 +367,6 @@ static void pc_i440fx_machine_v2_1_class_init(ObjectClass *oc, void *data) PCMachineClass *pcmc = PC_MACHINE_CLASS(oc); mc->default_machine_opts = "firmware=bios-256k.bin"; mc->alias = "pc"; - mc->init = pc_init1; mc->is_default = 1; mc->name = "pc-i440fx-2.1"; pcmc->pci_enabled = true; @@ -434,11 +389,11 @@ static void pc_i440fx_machine_v2_0_class_init(ObjectClass *oc, void *data) pc_i440fx_machine_v2_1_class_init(oc, data); mc->alias = NULL; mc->is_default = false; - mc->init = pc_init_pci_2_0; mc->name = "pc-i440fx-2.0"; machine_class_add_compat_props(mc, compat_props); pcmc->smbios_legacy_mode = true; pcmc->has_reserved_memory = false; + pcmc->compat_func = pc_compat_2_0; } static TypeInfo pc_i440fx_machine_v2_0_type_info = { @@ -457,12 +412,12 @@ static void pc_i440fx_machine_v1_7_class_init(ObjectClass *oc, void *data) }; pc_i440fx_machine_v2_0_class_init(oc, data); mc->default_machine_opts = NULL; - mc->init = pc_init_pci_1_7; mc->name = "pc-i440fx-1.7"; mc->option_rom_has_mr = true; machine_class_add_compat_props(mc, compat_props); pcmc->smbios_defaults = false; pcmc->gigabyte_align = false; + pcmc->compat_func = pc_compat_1_7; } static TypeInfo pc_i440fx_machine_v1_7_type_info = { @@ -480,11 +435,11 @@ static void pc_i440fx_machine_v1_6_class_init(ObjectClass *oc, void *data) { /* end of list */ } }; pc_i440fx_machine_v1_7_class_init(oc, data); - mc->init = pc_init_pci_1_6; mc->name = "pc-i440fx-1.6"; mc->rom_file_has_mr = false; machine_class_add_compat_props(mc, compat_props); pcmc->has_acpi_build = false; + pcmc->compat_func = pc_compat_1_6; } static TypeInfo pc_i440fx_machine_v1_6_type_info = { @@ -496,14 +451,15 @@ static TypeInfo pc_i440fx_machine_v1_6_type_info = { static void pc_i440fx_machine_v1_5_class_init(ObjectClass *oc, void *data) { MachineClass *mc = MACHINE_CLASS(oc); + PCMachineClass *pcmc = PC_MACHINE_CLASS(oc); static GlobalProperty compat_props[] = { PC_COMPAT_1_5, { /* end of list */ } }; pc_i440fx_machine_v1_6_class_init(oc, data); - mc->init = pc_init_pci_1_5; mc->name = "pc-i440fx-1.5"; machine_class_add_compat_props(mc, compat_props); + pcmc->compat_func = pc_compat_1_5; } static TypeInfo pc_i440fx_machine_v1_5_type_info = { @@ -515,15 +471,16 @@ static TypeInfo pc_i440fx_machine_v1_5_type_info = { static void pc_i440fx_machine_v1_4_class_init(ObjectClass *oc, void *data) { MachineClass *mc = MACHINE_CLASS(oc); + PCMachineClass *pcmc = PC_MACHINE_CLASS(oc); static GlobalProperty compat_props[] = { PC_COMPAT_1_4, { /* end of list */ } }; pc_i440fx_machine_v1_5_class_init(oc, data); mc->hot_add_cpu = NULL; - mc->init = pc_init_pci_1_4; mc->name = "pc-i440fx-1.4"; machine_class_add_compat_props(mc, compat_props); + pcmc->compat_func = pc_compat_1_4; } static TypeInfo pc_i440fx_machine_v1_4_type_info = { @@ -554,14 +511,15 @@ static TypeInfo pc_i440fx_machine_v1_4_type_info = { static void pc_machine_v1_3_class_init(ObjectClass *oc, void *data) { MachineClass *mc = MACHINE_CLASS(oc); + PCMachineClass *pcmc = PC_MACHINE_CLASS(oc); static GlobalProperty compat_props[] = { PC_COMPAT_1_3, { /* end of list */ } }; pc_i440fx_machine_v1_4_class_init(oc, data); - mc->init = pc_init_pci_1_3; mc->name = "pc-1.3"; machine_class_add_compat_props(mc, compat_props); + pcmc->compat_func = pc_compat_1_3; } static TypeInfo pc_machine_v1_3_type_info = { @@ -600,14 +558,15 @@ static TypeInfo pc_machine_v1_3_type_info = { static void pc_machine_v1_2_class_init(ObjectClass *oc, void *data) { MachineClass *mc = MACHINE_CLASS(oc); + PCMachineClass *pcmc = PC_MACHINE_CLASS(oc); static GlobalProperty compat_props[] = { PC_COMPAT_1_2, { /* end of list */ } }; pc_machine_v1_3_class_init(oc, data); - mc->init = pc_init_pci_1_2; mc->name = "pc-1.2"; machine_class_add_compat_props(mc, compat_props); + pcmc->compat_func = pc_compat_1_2; } static TypeInfo pc_machine_v1_2_type_info = { @@ -796,10 +755,11 @@ static void pc_machine_v0_13_class_init(ObjectClass *oc, void *data) { /* end of list */ } }; pc_machine_v0_14_class_init(oc, data); - mc->init = pc_init_pci_no_kvmclock; + mc->hw_version = "0.13"; mc->name = "pc-0.13"; machine_class_add_compat_props(mc, compat_props); + pcmc->compat_func = pc_compat_0_13; pcmc->kvmclock_enabled = false; pcmc->has_acpi_build = false; } @@ -938,11 +898,12 @@ static void isapc_machine_class_init(ObjectClass *oc, void *data) { /* end of list */ } }; mc->desc = "ISA-only PC"; - mc->init = pc_init_isa; mc->max_cpus = 1; mc->hot_add_cpu = NULL; mc->name = "isapc"; machine_class_add_compat_props(mc, compat_props); + pcmc->compat_func = pc_compat_isa; + pcmc->finish_init = pc_init1; pcmc->smbios_defaults = false; pcmc->has_acpi_build = false; } @@ -957,6 +918,7 @@ static TypeInfo isapc_machine_type_info = { static void xenfv_machine_class_init(ObjectClass *oc, void *data) { MachineClass *mc = MACHINE_CLASS(oc); + PCMachineClass *pcmc = PC_MACHINE_CLASS(oc); static GlobalProperty compat_props[] = { /* xenfv has no fwcfg and so does not load acpi from QEMU. * as such new acpi features don't work. @@ -969,12 +931,12 @@ static void xenfv_machine_class_init(ObjectClass *oc, void *data) { /* end of list */ } }; mc->desc = "Xen Fully-virtualized PC"; - mc->init = pc_xen_hvm_init; mc->max_cpus = HVM_MAX_VCPUS; mc->default_machine_opts = "accel=xen"; mc->hot_add_cpu = pc_hot_add_cpu; mc->name = "xenfv"; machine_class_add_compat_props(mc, compat_props); + pcmc->finish_init = pc_xen_hvm_init; } static TypeInfo xenfv_machine_type_info = { diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c index 73e6cab..aa27314 100644 --- a/hw/i386/pc_q35.c +++ b/hw/i386/pc_q35.c @@ -271,36 +271,6 @@ static void pc_compat_1_4(MachineState *machine) x86_cpu_compat_set_features("Westmere", FEAT_1_ECX, 0, CPUID_EXT_PCLMULQDQ); } -static void pc_q35_init_2_0(MachineState *machine) -{ - pc_compat_2_0(machine); - pc_q35_init(machine); -} - -static void pc_q35_init_1_7(MachineState *machine) -{ - pc_compat_1_7(machine); - pc_q35_init(machine); -} - -static void pc_q35_init_1_6(MachineState *machine) -{ - pc_compat_1_6(machine); - pc_q35_init(machine); -} - -static void pc_q35_init_1_5(MachineState *machine) -{ - pc_compat_1_5(machine); - pc_q35_init(machine); -} - -static void pc_q35_init_1_4(MachineState *machine) -{ - pc_compat_1_4(machine); - pc_q35_init(machine); -} - static void pc_q35_machine_class_init(ObjectClass *oc, void *data) { MachineClass *mc = MACHINE_CLASS(oc); @@ -322,10 +292,11 @@ static TypeInfo pc_q35_machine_type_info = { static void pc_q35_machine_v2_1_class_init(ObjectClass *oc, void *data) { MachineClass *mc = MACHINE_CLASS(oc); + PCMachineClass *pcmc = PC_MACHINE_CLASS(oc); mc->default_machine_opts = "firmware=bios-256k.bin"; mc->alias = "q35"; - mc->init = pc_q35_init; mc->name = "pc-q35-2.1"; + pcmc->finish_init = pc_q35_init; } static TypeInfo pc_q35_machine_v2_1_type_info = { @@ -344,11 +315,11 @@ static void pc_q35_machine_v2_0_class_init(ObjectClass *oc, void *data) }; pc_q35_machine_v2_1_class_init(oc, data); mc->alias = NULL; - mc->init = pc_q35_init_2_0; machine_class_add_compat_props(mc, compat_props); mc->name = "pc-q35-2.0"; pcmc->smbios_legacy_mode = true; pcmc->has_reserved_memory = false; + pcmc->compat_func = pc_compat_2_0; } static TypeInfo pc_q35_machine_v2_0_type_info = { @@ -367,10 +338,10 @@ static void pc_q35_machine_v1_7_class_init(ObjectClass *oc, void *data) }; pc_q35_machine_v2_0_class_init(oc, data); mc->default_machine_opts = NULL; - mc->init = pc_q35_init_1_7; mc->option_rom_has_mr = true; machine_class_add_compat_props(mc, compat_props); mc->name = "pc-q35-1.7"; + pcmc->compat_func = pc_compat_1_7; pcmc->smbios_defaults = false; pcmc->gigabyte_align = false; } @@ -390,10 +361,10 @@ static void pc_q35_machine_v1_6_class_init(ObjectClass *oc, void *data) { /* end of list */ } }; pc_q35_machine_v1_7_class_init(oc, data); - mc->init = pc_q35_init_1_6; mc->rom_file_has_mr = false; machine_class_add_compat_props(mc, compat_props); mc->name = "pc-q35-1.6"; + pcmc->compat_func = pc_compat_1_6; pcmc->has_acpi_build = false; } @@ -406,14 +377,15 @@ static TypeInfo pc_q35_machine_v1_6_type_info = { static void pc_q35_machine_v1_5_class_init(ObjectClass *oc, void *data) { MachineClass *mc = MACHINE_CLASS(oc); + PCMachineClass *pcmc = PC_MACHINE_CLASS(oc); static GlobalProperty compat_props[] = { PC_Q35_COMPAT_1_5, { /* end of list */ } }; pc_q35_machine_v1_6_class_init(oc, data); - mc->init = pc_q35_init_1_5; machine_class_add_compat_props(mc, compat_props); mc->name = "pc-q35-1.5"; + pcmc->compat_func = pc_compat_1_5; } static TypeInfo pc_q35_machine_v1_5_type_info = { @@ -425,15 +397,16 @@ static TypeInfo pc_q35_machine_v1_5_type_info = { static void pc_q35_machine_v1_4_class_init(ObjectClass *oc, void *data) { MachineClass *mc = MACHINE_CLASS(oc); + PCMachineClass *pcmc = PC_MACHINE_CLASS(oc); static GlobalProperty compat_props[] = { PC_Q35_COMPAT_1_4, { /* end of list */ } }; pc_q35_machine_v1_5_class_init(oc, data); mc->hot_add_cpu = NULL; - mc->init = pc_q35_init_1_4; machine_class_add_compat_props(mc, compat_props); mc->name = "pc-q35-1.4"; + pcmc->compat_func = pc_compat_1_4; } static TypeInfo pc_q35_machine_v1_4_type_info = { diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h index c5d3cbd..50e0336 100644 --- a/include/hw/i386/pc.h +++ b/include/hw/i386/pc.h @@ -41,6 +41,8 @@ struct PCMachineState { /** * PCMachineClass: * @get_hotplug_handler: pointer to parent class callback @get_hotplug_handler + * @finish_init: Subclass-specific function to finish initialization. + * @compat_func: Compatiblity function to be called before initialization. */ struct PCMachineClass { /*< private >*/ @@ -61,6 +63,8 @@ struct PCMachineClass { */ bool gigabyte_align; bool has_reserved_memory; + void (*finish_init)(MachineState *machine); + void (*compat_func)(MachineState *machine); }; typedef struct PCMachineState PCMachineState; -- 1.9.0