diff mbox

[v3,1/6] pc: Move compat boolean globals to PCMachineClass

Message ID 1449010688-19205-2-git-send-email-ehabkost@redhat.com
State New
Headers show

Commit Message

Eduardo Habkost Dec. 1, 2015, 10:58 p.m. UTC
This way the compat flags can be initialized in the machine_options()
function. This will help us to eventually eliminate the pc_compat_*()
functions.

Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
---
 hw/i386/pc.c         |  8 +++++
 hw/i386/pc_piix.c    | 84 +++++++++++++++++++++++++---------------------------
 hw/i386/pc_q35.c     | 54 +++++++++++++++------------------
 include/hw/i386/pc.h | 14 +++++++++
 4 files changed, 86 insertions(+), 74 deletions(-)

Comments

Marcel Apfelbaum Dec. 2, 2015, 9:57 a.m. UTC | #1
On 12/02/2015 12:58 AM, Eduardo Habkost wrote:
> This way the compat flags can be initialized in the machine_options()
> function. This will help us to eventually eliminate the pc_compat_*()
> functions.

Hi, I have only a minor comment here,

>
> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
> ---
>   hw/i386/pc.c         |  8 +++++
>   hw/i386/pc_piix.c    | 84 +++++++++++++++++++++++++---------------------------
>   hw/i386/pc_q35.c     | 54 +++++++++++++++------------------
>   include/hw/i386/pc.h | 14 +++++++++
>   4 files changed, 86 insertions(+), 74 deletions(-)
>
> diff --git a/hw/i386/pc.c b/hw/i386/pc.c
> index 5e20e07..129aa04 100644
> --- a/hw/i386/pc.c
> +++ b/hw/i386/pc.c
> @@ -1952,6 +1952,14 @@ static void pc_machine_class_init(ObjectClass *oc, void *data)
>       HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(oc);
>
>       pcmc->get_hotplug_handler = mc->get_hotplug_handler;
> +    pcmc->pci_enabled = true;
> +    pcmc->has_acpi_build = true;
> +    pcmc->rsdp_in_ram = true;
> +    pcmc->smbios_defaults = true;
> +    pcmc->smbios_uuid_encoded = true;
> +    pcmc->gigabyte_align = true;
> +    pcmc->has_reserved_memory = true;
> +    pcmc->kvmclock_enabled = true;
>       mc->get_hotplug_handler = pc_get_hotpug_handler;
>       mc->cpu_index_to_socket_id = pc_cpu_index_to_socket_id;
>       mc->default_boot_order = "cad";
> diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
> index 2e41efe..7a7f748 100644
> --- a/hw/i386/pc_piix.c
> +++ b/hw/i386/pc_piix.c
> @@ -60,26 +60,14 @@ static const int ide_iobase[MAX_IDE_BUS] = { 0x1f0, 0x170 };
>   static const int ide_iobase2[MAX_IDE_BUS] = { 0x3f6, 0x376 };
>   static const int ide_irq[MAX_IDE_BUS] = { 14, 15 };
>
> -static bool pci_enabled = true;
> -static bool has_acpi_build = true;
> -static bool rsdp_in_ram = true;
>   static int legacy_acpi_table_size;
> -static bool smbios_defaults = true;
> -static bool smbios_legacy_mode;
> -static bool smbios_uuid_encoded = true;
> -/* Make sure that guest addresses aligned at 1Gbyte boundaries get mapped to
> - * host addresses aligned at 1Gbyte boundaries.  This way we can use 1GByte
> - * pages in the host.
> - */
> -static bool gigabyte_align = true;
> -static bool has_reserved_memory = true;
> -static bool kvmclock_enabled = true;
>
>   /* PC hardware initialisation */
>   static void pc_init1(MachineState *machine,
>                        const char *host_type, const char *pci_type)
>   {
>       PCMachineState *pcms = PC_MACHINE(machine);
> +    PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms);
>       MemoryRegion *system_memory = get_system_memory();
>       MemoryRegion *system_io = get_system_io();
>       int i;
> @@ -108,7 +96,7 @@ static void pc_init1(MachineState *machine,
>        * breaking migration.
>        */
>       if (machine->ram_size >= 0xe0000000) {
> -        lowmem = gigabyte_align ? 0xc0000000 : 0xe0000000;
> +        lowmem = pcmc->gigabyte_align ? 0xc0000000 : 0xe0000000;
>       } else {
>           lowmem = 0xe0000000;
>       }
> @@ -141,11 +129,11 @@ static void pc_init1(MachineState *machine,
>
>       pc_cpus_init(pcms);
>
> -    if (kvm_enabled() && kvmclock_enabled) {
> +    if (kvm_enabled() && pcmc->kvmclock_enabled) {
>           kvmclock_create();
>       }
>
> -    if (pci_enabled) {
> +    if (pcmc->pci_enabled) {
>           pci_memory = g_new(MemoryRegion, 1);
>           memory_region_init(pci_memory, NULL, "pci", UINT64_MAX);
>           rom_memory = pci_memory;
> @@ -156,18 +144,19 @@ static void pc_init1(MachineState *machine,
>
>       guest_info = pc_guest_info_init(pcms);
>
> -    guest_info->has_acpi_build = has_acpi_build;
> +    guest_info->has_acpi_build = pcmc->has_acpi_build;
>       guest_info->legacy_acpi_table_size = legacy_acpi_table_size;

Why is legacy_acpi_table_size left behind? Maybe it is a new field.

Thanks,
Marcel

>
> -    guest_info->isapc_ram_fw = !pci_enabled;
> -    guest_info->has_reserved_memory = has_reserved_memory;
> -    guest_info->rsdp_in_ram = rsdp_in_ram;
> +    guest_info->isapc_ram_fw = !pcmc->pci_enabled;
> +    guest_info->has_reserved_memory = pcmc->has_reserved_memory;
> +    guest_info->rsdp_in_ram = pcmc->rsdp_in_ram;
>
> -    if (smbios_defaults) {
> +    if (pcmc->smbios_defaults) {
>           MachineClass *mc = MACHINE_GET_CLASS(machine);
>           /* These values are guest ABI, do not change */
>           smbios_set_defaults("QEMU", "Standard PC (i440FX + PIIX, 1996)",
> -                            mc->name, smbios_legacy_mode, smbios_uuid_encoded,
> +                            mc->name, pcmc->smbios_legacy_mode,
> +                            pcmc->smbios_uuid_encoded,
>                               SMBIOS_ENTRY_POINT_21);
>       }
>
> @@ -182,14 +171,14 @@ static void pc_init1(MachineState *machine,
>
>       gsi_state = g_malloc0(sizeof(*gsi_state));
>       if (kvm_irqchip_in_kernel()) {
> -        kvm_pc_setup_irq_routing(pci_enabled);
> +        kvm_pc_setup_irq_routing(pcmc->pci_enabled);
>           gsi = qemu_allocate_irqs(kvm_pc_gsi_handler, gsi_state,
>                                    GSI_NUM_PINS);
>       } else {
>           gsi = qemu_allocate_irqs(gsi_handler, gsi_state, GSI_NUM_PINS);
>       }
>
> -    if (pci_enabled) {
> +    if (pcmc->pci_enabled) {
>           pci_bus = i440fx_init(host_type,
>                                 pci_type,
>                                 &i440fx_state, &piix3_devfn, &isa_bus, gsi,
> @@ -217,13 +206,13 @@ static void pc_init1(MachineState *machine,
>           gsi_state->i8259_irq[i] = i8259[i];
>       }
>       g_free(i8259);
> -    if (pci_enabled) {
> +    if (pcmc->pci_enabled) {
>           ioapic_init_gsi(gsi_state, "i440fx");
>       }
>
>       pc_register_ferr_irq(gsi[13]);
>
> -    pc_vga_init(isa_bus, pci_enabled ? pci_bus : NULL);
> +    pc_vga_init(isa_bus, pcmc->pci_enabled ? pci_bus : NULL);
>
>       assert(pcms->vmport != ON_OFF_AUTO_MAX);
>       if (pcms->vmport == ON_OFF_AUTO_AUTO) {
> @@ -237,7 +226,7 @@ static void pc_init1(MachineState *machine,
>       pc_nic_init(isa_bus, pci_bus);
>
>       ide_drive_get(hd, ARRAY_SIZE(hd));
> -    if (pci_enabled) {
> +    if (pcmc->pci_enabled) {
>           PCIDevice *dev;
>           if (xen_enabled()) {
>               dev = pci_piix3_xen_ide_init(pci_bus, hd, piix3_devfn + 1);
> @@ -264,11 +253,11 @@ static void pc_init1(MachineState *machine,
>
>       pc_cmos_init(pcms, idebus[0], idebus[1], rtc_state);
>
> -    if (pci_enabled && usb_enabled()) {
> +    if (pcmc->pci_enabled && usb_enabled()) {
>           pci_create_simple(pci_bus, piix3_devfn + 2, "piix3-usb-uhci");
>       }
>
> -    if (pci_enabled && acpi_enabled) {
> +    if (pcmc->pci_enabled && acpi_enabled) {
>           DeviceState *piix4_pm;
>           I2CBus *smbus;
>
> @@ -289,7 +278,7 @@ static void pc_init1(MachineState *machine,
>                                    PC_MACHINE_ACPI_DEVICE_PROP, &error_abort);
>       }
>
> -    if (pci_enabled) {
> +    if (pcmc->pci_enabled) {
>           pc_pci_device_init(pci_bus);
>       }
>   }
> @@ -315,7 +304,6 @@ static void pc_compat_2_3(MachineState *machine)
>   static void pc_compat_2_2(MachineState *machine)
>   {
>       pc_compat_2_3(machine);
> -    rsdp_in_ram = false;
>       machine->suppress_vmdesc = true;
>   }
>
> @@ -324,7 +312,6 @@ static void pc_compat_2_1(MachineState *machine)
>       PCMachineState *pcms = PC_MACHINE(machine);
>
>       pc_compat_2_2(machine);
> -    smbios_uuid_encoded = false;
>       x86_cpu_change_kvm_default("svm", NULL);
>       pcms->enforce_aligned_dimm = false;
>   }
> @@ -349,16 +336,12 @@ static void pc_compat_2_0(MachineState *machine)
>        * QEMU 1.7 it is 6414.  For RHEL/CentOS 7.0 it is 6418.
>        */
>       legacy_acpi_table_size = 6652;
> -    smbios_legacy_mode = true;
> -    has_reserved_memory = false;
>       pc_set_legacy_acpi_data_size();
>   }
>
>   static void pc_compat_1_7(MachineState *machine)
>   {
>       pc_compat_2_0(machine);
> -    smbios_defaults = false;
> -    gigabyte_align = false;
>       option_rom_has_mr = true;
>       legacy_acpi_table_size = 6414;
>       x86_cpu_change_kvm_default("x2apic", NULL);
> @@ -368,7 +351,6 @@ static void pc_compat_1_6(MachineState *machine)
>   {
>       pc_compat_1_7(machine);
>       rom_file_has_mr = false;
> -    has_acpi_build = false;
>   }
>
>   static void pc_compat_1_5(MachineState *machine)
> @@ -398,17 +380,10 @@ static void pc_compat_1_2(MachineState *machine)
>   static void pc_compat_0_13(MachineState *machine)
>   {
>       pc_compat_1_2(machine);
> -    kvmclock_enabled = false;
>   }
>
>   static void pc_init_isa(MachineState *machine)
>   {
> -    pci_enabled = false;
> -    has_acpi_build = false;
> -    smbios_defaults = false;
> -    gigabyte_align = false;
> -    smbios_legacy_mode = true;
> -    has_reserved_memory = false;
>       option_rom_has_mr = true;
>       rom_file_has_mr = false;
>       if (!machine->cpu_model) {
> @@ -510,9 +485,11 @@ DEFINE_I440FX_MACHINE(v2_3, "pc-i440fx-2.3", pc_compat_2_3,
>
>   static void pc_i440fx_2_2_machine_options(MachineClass *m)
>   {
> +    PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
>       pc_i440fx_2_3_machine_options(m);
>       m->hw_version = "2.2.0";
>       SET_MACHINE_COMPAT(m, PC_COMPAT_2_2);
> +    pcmc->rsdp_in_ram = false;
>   }
>
>   DEFINE_I440FX_MACHINE(v2_2, "pc-i440fx-2.2", pc_compat_2_2,
> @@ -521,10 +498,12 @@ DEFINE_I440FX_MACHINE(v2_2, "pc-i440fx-2.2", pc_compat_2_2,
>
>   static void pc_i440fx_2_1_machine_options(MachineClass *m)
>   {
> +    PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
>       pc_i440fx_2_2_machine_options(m);
>       m->hw_version = "2.1.0";
>       m->default_display = NULL;
>       SET_MACHINE_COMPAT(m, PC_COMPAT_2_1);
> +    pcmc->smbios_uuid_encoded = false;
>   }
>
>   DEFINE_I440FX_MACHINE(v2_1, "pc-i440fx-2.1", pc_compat_2_1,
> @@ -534,9 +513,12 @@ DEFINE_I440FX_MACHINE(v2_1, "pc-i440fx-2.1", pc_compat_2_1,
>
>   static void pc_i440fx_2_0_machine_options(MachineClass *m)
>   {
> +    PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
>       pc_i440fx_2_1_machine_options(m);
>       m->hw_version = "2.0.0";
>       SET_MACHINE_COMPAT(m, PC_COMPAT_2_0);
> +    pcmc->smbios_legacy_mode = true;
> +    pcmc->has_reserved_memory = false;
>   }
>
>   DEFINE_I440FX_MACHINE(v2_0, "pc-i440fx-2.0", pc_compat_2_0,
> @@ -545,10 +527,13 @@ DEFINE_I440FX_MACHINE(v2_0, "pc-i440fx-2.0", pc_compat_2_0,
>
>   static void pc_i440fx_1_7_machine_options(MachineClass *m)
>   {
> +    PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
>       pc_i440fx_2_0_machine_options(m);
>       m->hw_version = "1.7.0";
>       m->default_machine_opts = NULL;
>       SET_MACHINE_COMPAT(m, PC_COMPAT_1_7);
> +    pcmc->smbios_defaults = false;
> +    pcmc->gigabyte_align = false;
>   }
>
>   DEFINE_I440FX_MACHINE(v1_7, "pc-i440fx-1.7", pc_compat_1_7,
> @@ -557,9 +542,11 @@ DEFINE_I440FX_MACHINE(v1_7, "pc-i440fx-1.7", pc_compat_1_7,
>
>   static void pc_i440fx_1_6_machine_options(MachineClass *m)
>   {
> +    PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
>       pc_i440fx_1_7_machine_options(m);
>       m->hw_version = "1.6.0";
>       SET_MACHINE_COMPAT(m, PC_COMPAT_1_6);
> +    pcmc->has_acpi_build = false;
>   }
>
>   DEFINE_I440FX_MACHINE(v1_6, "pc-i440fx-1.6", pc_compat_1_6,
> @@ -813,9 +800,11 @@ DEFINE_I440FX_MACHINE(v0_14, "pc-0.14", pc_compat_1_2,
>
>   static void pc_i440fx_0_13_machine_options(MachineClass *m)
>   {
> +    PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
>       pc_i440fx_0_14_machine_options(m);
>       m->hw_version = "0.13";
>       SET_MACHINE_COMPAT(m, PC_COMPAT_0_13);
> +    pcmc->kvmclock_enabled = false;
>   }
>
>   DEFINE_I440FX_MACHINE(v0_13, "pc-0.13", pc_compat_0_13,
> @@ -1037,8 +1026,15 @@ void igd_passthrough_isa_bridge_create(PCIBus *bus, uint16_t gpu_dev_id)
>
>   static void isapc_machine_options(MachineClass *m)
>   {
> +    PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
>       m->desc = "ISA-only PC";
>       m->max_cpus = 1;
> +    pcmc->pci_enabled = false;
> +    pcmc->has_acpi_build = false;
> +    pcmc->smbios_defaults = false;
> +    pcmc->gigabyte_align = false;
> +    pcmc->smbios_legacy_mode = true;
> +    pcmc->has_reserved_memory = false;
>   }
>
>   DEFINE_PC_MACHINE(isapc, "isapc", pc_init_isa,
> diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
> index 133bc68..f9afaa2 100644
> --- a/hw/i386/pc_q35.c
> +++ b/hw/i386/pc_q35.c
> @@ -49,22 +49,11 @@
>   /* ICH9 AHCI has 6 ports */
>   #define MAX_SATA_PORTS     6
>
> -static bool has_acpi_build = true;
> -static bool rsdp_in_ram = true;
> -static bool smbios_defaults = true;
> -static bool smbios_legacy_mode;
> -static bool smbios_uuid_encoded = true;
> -/* Make sure that guest addresses aligned at 1Gbyte boundaries get mapped to
> - * host addresses aligned at 1Gbyte boundaries.  This way we can use 1GByte
> - * pages in the host.
> - */
> -static bool gigabyte_align = true;
> -static bool has_reserved_memory = true;
> -
>   /* PC hardware initialisation */
>   static void pc_q35_init(MachineState *machine)
>   {
>       PCMachineState *pcms = PC_MACHINE(machine);
> +    PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms);
>       Q35PCIHost *q35_host;
>       PCIHostState *phb;
>       PCIBus *host_bus;
> @@ -76,7 +65,6 @@ static void pc_q35_init(MachineState *machine)
>       MemoryRegion *ram_memory;
>       GSIState *gsi_state;
>       ISABus *isa_bus;
> -    int pci_enabled = 1;
>       qemu_irq *gsi;
>       qemu_irq *i8259;
>       int i;
> @@ -97,7 +85,7 @@ static void pc_q35_init(MachineState *machine)
>        * breaking migration.
>        */
>       if (machine->ram_size >= 0xb0000000) {
> -        lowmem = gigabyte_align ? 0x80000000 : 0xb0000000;
> +        lowmem = pcmc->gigabyte_align ? 0x80000000 : 0xb0000000;
>       } else {
>           lowmem = 0xb0000000;
>       }
> @@ -134,7 +122,7 @@ static void pc_q35_init(MachineState *machine)
>       kvmclock_create();
>
>       /* pci enabled */
> -    if (pci_enabled) {
> +    if (pcmc->pci_enabled) {
>           pci_memory = g_new(MemoryRegion, 1);
>           memory_region_init(pci_memory, NULL, "pci", UINT64_MAX);
>           rom_memory = pci_memory;
> @@ -145,19 +133,20 @@ static void pc_q35_init(MachineState *machine)
>
>       guest_info = pc_guest_info_init(pcms);
>       guest_info->isapc_ram_fw = false;
> -    guest_info->has_acpi_build = has_acpi_build;
> -    guest_info->has_reserved_memory = has_reserved_memory;
> -    guest_info->rsdp_in_ram = rsdp_in_ram;
> +    guest_info->has_acpi_build = pcmc->has_acpi_build;
> +    guest_info->has_reserved_memory = pcmc->has_reserved_memory;
> +    guest_info->rsdp_in_ram = pcmc->rsdp_in_ram;
>
>       /* Migration was not supported in 2.0 for Q35, so do not bother
>        * with this hack (see hw/i386/acpi-build.c).
>        */
>       guest_info->legacy_acpi_table_size = 0;
>
> -    if (smbios_defaults) {
> +    if (pcmc->smbios_defaults) {
>           /* These values are guest ABI, do not change */
>           smbios_set_defaults("QEMU", "Standard PC (Q35 + ICH9, 2009)",
> -                            mc->name, smbios_legacy_mode, smbios_uuid_encoded,
> +                            mc->name, pcmc->smbios_legacy_mode,
> +                            pcmc->smbios_uuid_encoded,
>                               SMBIOS_ENTRY_POINT_21);
>       }
>
> @@ -170,7 +159,7 @@ static void pc_q35_init(MachineState *machine)
>       /* irq lines */
>       gsi_state = g_malloc0(sizeof(*gsi_state));
>       if (kvm_irqchip_in_kernel()) {
> -        kvm_pc_setup_irq_routing(pci_enabled);
> +        kvm_pc_setup_irq_routing(pcmc->pci_enabled);
>           gsi = qemu_allocate_irqs(kvm_pc_gsi_handler, gsi_state,
>                                    GSI_NUM_PINS);
>       } else {
> @@ -227,7 +216,7 @@ static void pc_q35_init(MachineState *machine)
>       for (i = 0; i < ISA_NUM_IRQS; i++) {
>           gsi_state->i8259_irq[i] = i8259[i];
>       }
> -    if (pci_enabled) {
> +    if (pcmc->pci_enabled) {
>           ioapic_init_gsi(gsi_state, "q35");
>       }
>
> @@ -272,7 +261,7 @@ static void pc_q35_init(MachineState *machine)
>       /* the rest devices to which pci devfn is automatically assigned */
>       pc_vga_init(isa_bus, host_bus);
>       pc_nic_init(isa_bus, host_bus);
> -    if (pci_enabled) {
> +    if (pcmc->pci_enabled) {
>           pc_pci_device_init(host_bus);
>       }
>   }
> @@ -298,7 +287,6 @@ static void pc_compat_2_3(MachineState *machine)
>   static void pc_compat_2_2(MachineState *machine)
>   {
>       pc_compat_2_3(machine);
> -    rsdp_in_ram = false;
>       machine->suppress_vmdesc = true;
>   }
>
> @@ -308,23 +296,18 @@ static void pc_compat_2_1(MachineState *machine)
>
>       pc_compat_2_2(machine);
>       pcms->enforce_aligned_dimm = false;
> -    smbios_uuid_encoded = false;
>       x86_cpu_change_kvm_default("svm", NULL);
>   }
>
>   static void pc_compat_2_0(MachineState *machine)
>   {
>       pc_compat_2_1(machine);
> -    smbios_legacy_mode = true;
> -    has_reserved_memory = false;
>       pc_set_legacy_acpi_data_size();
>   }
>
>   static void pc_compat_1_7(MachineState *machine)
>   {
>       pc_compat_2_0(machine);
> -    smbios_defaults = false;
> -    gigabyte_align = false;
>       option_rom_has_mr = true;
>       x86_cpu_change_kvm_default("x2apic", NULL);
>   }
> @@ -333,7 +316,6 @@ static void pc_compat_1_6(MachineState *machine)
>   {
>       pc_compat_1_7(machine);
>       rom_file_has_mr = false;
> -    has_acpi_build = false;
>   }
>
>   static void pc_compat_1_5(MachineState *machine)
> @@ -409,9 +391,11 @@ DEFINE_Q35_MACHINE(v2_3, "pc-q35-2.3", pc_compat_2_3,
>
>   static void pc_q35_2_2_machine_options(MachineClass *m)
>   {
> +    PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
>       pc_q35_2_3_machine_options(m);
>       m->hw_version = "2.2.0";
>       SET_MACHINE_COMPAT(m, PC_COMPAT_2_2);
> +    pcmc->rsdp_in_ram = false;
>   }
>
>   DEFINE_Q35_MACHINE(v2_2, "pc-q35-2.2", pc_compat_2_2,
> @@ -420,10 +404,12 @@ DEFINE_Q35_MACHINE(v2_2, "pc-q35-2.2", pc_compat_2_2,
>
>   static void pc_q35_2_1_machine_options(MachineClass *m)
>   {
> +    PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
>       pc_q35_2_2_machine_options(m);
>       m->hw_version = "2.1.0";
>       m->default_display = NULL;
>       SET_MACHINE_COMPAT(m, PC_COMPAT_2_1);
> +    pcmc->smbios_uuid_encoded = false;
>   }
>
>   DEFINE_Q35_MACHINE(v2_1, "pc-q35-2.1", pc_compat_2_1,
> @@ -432,9 +418,12 @@ DEFINE_Q35_MACHINE(v2_1, "pc-q35-2.1", pc_compat_2_1,
>
>   static void pc_q35_2_0_machine_options(MachineClass *m)
>   {
> +    PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
>       pc_q35_2_1_machine_options(m);
>       m->hw_version = "2.0.0";
>       SET_MACHINE_COMPAT(m, PC_COMPAT_2_0);
> +    pcmc->has_reserved_memory = false;
> +    pcmc->smbios_legacy_mode = true;
>   }
>
>   DEFINE_Q35_MACHINE(v2_0, "pc-q35-2.0", pc_compat_2_0,
> @@ -443,10 +432,13 @@ DEFINE_Q35_MACHINE(v2_0, "pc-q35-2.0", pc_compat_2_0,
>
>   static void pc_q35_1_7_machine_options(MachineClass *m)
>   {
> +    PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
>       pc_q35_2_0_machine_options(m);
>       m->hw_version = "1.7.0";
>       m->default_machine_opts = NULL;
>       SET_MACHINE_COMPAT(m, PC_COMPAT_1_7);
> +    pcmc->smbios_defaults = false;
> +    pcmc->gigabyte_align = false;
>   }
>
>   DEFINE_Q35_MACHINE(v1_7, "pc-q35-1.7", pc_compat_1_7,
> @@ -455,9 +447,11 @@ DEFINE_Q35_MACHINE(v1_7, "pc-q35-1.7", pc_compat_1_7,
>
>   static void pc_q35_1_6_machine_options(MachineClass *m)
>   {
> +    PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
>       pc_q35_machine_options(m);
>       m->hw_version = "1.6.0";
>       SET_MACHINE_COMPAT(m, PC_COMPAT_1_6);
> +    pcmc->has_acpi_build = false;
>   }
>
>   DEFINE_Q35_MACHINE(v1_6, "pc-q35-1.6", pc_compat_1_6,
> diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
> index 854c330..15171e9 100644
> --- a/include/hw/i386/pc.h
> +++ b/include/hw/i386/pc.h
> @@ -62,6 +62,20 @@ struct PCMachineClass {
>       bool broken_reserved_end;
>       HotplugHandler *(*get_hotplug_handler)(MachineState *machine,
>                                              DeviceState *dev);
> +
> +    bool pci_enabled;
> +    bool has_acpi_build;
> +    bool rsdp_in_ram;
> +    bool smbios_defaults;
> +    bool smbios_legacy_mode;
> +    bool smbios_uuid_encoded;
> +    /* Make sure that guest addresses aligned at 1Gbyte boundaries get
> +     * mapped to host addresses aligned at 1Gbyte boundaries.  This way
> +     * we can use 1GByte pages in the host.
> +     */
> +    bool gigabyte_align;
> +    bool has_reserved_memory;
> +    bool kvmclock_enabled;
>   };
>
>   #define TYPE_PC_MACHINE "generic-pc-machine"
>
Marcel Apfelbaum Dec. 2, 2015, 10:05 a.m. UTC | #2
On 12/02/2015 11:57 AM, Marcel Apfelbaum wrote:
> On 12/02/2015 12:58 AM, Eduardo Habkost wrote:
>> This way the compat flags can be initialized in the machine_options()
>> function. This will help us to eventually eliminate the pc_compat_*()
>> functions.
>
> Hi, I have only a minor comment here,
>
>>
>> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
>> ---
>>   hw/i386/pc.c         |  8 +++++
>>   hw/i386/pc_piix.c    | 84 +++++++++++++++++++++++++---------------------------
>>   hw/i386/pc_q35.c     | 54 +++++++++++++++------------------
>>   include/hw/i386/pc.h | 14 +++++++++
>>   4 files changed, 86 insertions(+), 74 deletions(-)
>>
>> diff --git a/hw/i386/pc.c b/hw/i386/pc.c
>> index 5e20e07..129aa04 100644
>> --- a/hw/i386/pc.c
>> +++ b/hw/i386/pc.c
>> @@ -1952,6 +1952,14 @@ static void pc_machine_class_init(ObjectClass *oc, void *data)
>>       HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(oc);
>>
>>       pcmc->get_hotplug_handler = mc->get_hotplug_handler;
>> +    pcmc->pci_enabled = true;
>> +    pcmc->has_acpi_build = true;
>> +    pcmc->rsdp_in_ram = true;
>> +    pcmc->smbios_defaults = true;
>> +    pcmc->smbios_uuid_encoded = true;
>> +    pcmc->gigabyte_align = true;
>> +    pcmc->has_reserved_memory = true;
>> +    pcmc->kvmclock_enabled = true;
>>       mc->get_hotplug_handler = pc_get_hotpug_handler;
>>       mc->cpu_index_to_socket_id = pc_cpu_index_to_socket_id;
>>       mc->default_boot_order = "cad";
>> diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
>> index 2e41efe..7a7f748 100644
>> --- a/hw/i386/pc_piix.c
>> +++ b/hw/i386/pc_piix.c
>> @@ -60,26 +60,14 @@ static const int ide_iobase[MAX_IDE_BUS] = { 0x1f0, 0x170 };
>>   static const int ide_iobase2[MAX_IDE_BUS] = { 0x3f6, 0x376 };
>>   static const int ide_irq[MAX_IDE_BUS] = { 14, 15 };
>>
>> -static bool pci_enabled = true;
>> -static bool has_acpi_build = true;
>> -static bool rsdp_in_ram = true;
>>   static int legacy_acpi_table_size;
>> -static bool smbios_defaults = true;
>> -static bool smbios_legacy_mode;
>> -static bool smbios_uuid_encoded = true;
>> -/* Make sure that guest addresses aligned at 1Gbyte boundaries get mapped to
>> - * host addresses aligned at 1Gbyte boundaries.  This way we can use 1GByte
>> - * pages in the host.
>> - */
>> -static bool gigabyte_align = true;
>> -static bool has_reserved_memory = true;
>> -static bool kvmclock_enabled = true;
>>
>>   /* PC hardware initialisation */
>>   static void pc_init1(MachineState *machine,
>>                        const char *host_type, const char *pci_type)
>>   {
>>       PCMachineState *pcms = PC_MACHINE(machine);
>> +    PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms);
>>       MemoryRegion *system_memory = get_system_memory();
>>       MemoryRegion *system_io = get_system_io();
>>       int i;
>> @@ -108,7 +96,7 @@ static void pc_init1(MachineState *machine,
>>        * breaking migration.
>>        */
>>       if (machine->ram_size >= 0xe0000000) {
>> -        lowmem = gigabyte_align ? 0xc0000000 : 0xe0000000;
>> +        lowmem = pcmc->gigabyte_align ? 0xc0000000 : 0xe0000000;
>>       } else {
>>           lowmem = 0xe0000000;
>>       }
>> @@ -141,11 +129,11 @@ static void pc_init1(MachineState *machine,
>>
>>       pc_cpus_init(pcms);
>>
>> -    if (kvm_enabled() && kvmclock_enabled) {
>> +    if (kvm_enabled() && pcmc->kvmclock_enabled) {
>>           kvmclock_create();
>>       }
>>
>> -    if (pci_enabled) {
>> +    if (pcmc->pci_enabled) {
>>           pci_memory = g_new(MemoryRegion, 1);
>>           memory_region_init(pci_memory, NULL, "pci", UINT64_MAX);
>>           rom_memory = pci_memory;
>> @@ -156,18 +144,19 @@ static void pc_init1(MachineState *machine,
>>
>>       guest_info = pc_guest_info_init(pcms);
>>
>> -    guest_info->has_acpi_build = has_acpi_build;
>> +    guest_info->has_acpi_build = pcmc->has_acpi_build;
>>       guest_info->legacy_acpi_table_size = legacy_acpi_table_size;
>
> Why is legacy_acpi_table_size left behind? Maybe it is a new field.

Forget about it, the answer is the next patch :)

Reviewed-by: Marcel Apfelbaum <marcel@redhat.com>

Thanks,
Marcel
diff mbox

Patch

diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index 5e20e07..129aa04 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -1952,6 +1952,14 @@  static void pc_machine_class_init(ObjectClass *oc, void *data)
     HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(oc);
 
     pcmc->get_hotplug_handler = mc->get_hotplug_handler;
+    pcmc->pci_enabled = true;
+    pcmc->has_acpi_build = true;
+    pcmc->rsdp_in_ram = true;
+    pcmc->smbios_defaults = true;
+    pcmc->smbios_uuid_encoded = true;
+    pcmc->gigabyte_align = true;
+    pcmc->has_reserved_memory = true;
+    pcmc->kvmclock_enabled = true;
     mc->get_hotplug_handler = pc_get_hotpug_handler;
     mc->cpu_index_to_socket_id = pc_cpu_index_to_socket_id;
     mc->default_boot_order = "cad";
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
index 2e41efe..7a7f748 100644
--- a/hw/i386/pc_piix.c
+++ b/hw/i386/pc_piix.c
@@ -60,26 +60,14 @@  static const int ide_iobase[MAX_IDE_BUS] = { 0x1f0, 0x170 };
 static const int ide_iobase2[MAX_IDE_BUS] = { 0x3f6, 0x376 };
 static const int ide_irq[MAX_IDE_BUS] = { 14, 15 };
 
-static bool pci_enabled = true;
-static bool has_acpi_build = true;
-static bool rsdp_in_ram = true;
 static int legacy_acpi_table_size;
-static bool smbios_defaults = true;
-static bool smbios_legacy_mode;
-static bool smbios_uuid_encoded = true;
-/* Make sure that guest addresses aligned at 1Gbyte boundaries get mapped to
- * host addresses aligned at 1Gbyte boundaries.  This way we can use 1GByte
- * pages in the host.
- */
-static bool gigabyte_align = true;
-static bool has_reserved_memory = true;
-static bool kvmclock_enabled = true;
 
 /* PC hardware initialisation */
 static void pc_init1(MachineState *machine,
                      const char *host_type, const char *pci_type)
 {
     PCMachineState *pcms = PC_MACHINE(machine);
+    PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms);
     MemoryRegion *system_memory = get_system_memory();
     MemoryRegion *system_io = get_system_io();
     int i;
@@ -108,7 +96,7 @@  static void pc_init1(MachineState *machine,
      * breaking migration.
      */
     if (machine->ram_size >= 0xe0000000) {
-        lowmem = gigabyte_align ? 0xc0000000 : 0xe0000000;
+        lowmem = pcmc->gigabyte_align ? 0xc0000000 : 0xe0000000;
     } else {
         lowmem = 0xe0000000;
     }
@@ -141,11 +129,11 @@  static void pc_init1(MachineState *machine,
 
     pc_cpus_init(pcms);
 
-    if (kvm_enabled() && kvmclock_enabled) {
+    if (kvm_enabled() && pcmc->kvmclock_enabled) {
         kvmclock_create();
     }
 
-    if (pci_enabled) {
+    if (pcmc->pci_enabled) {
         pci_memory = g_new(MemoryRegion, 1);
         memory_region_init(pci_memory, NULL, "pci", UINT64_MAX);
         rom_memory = pci_memory;
@@ -156,18 +144,19 @@  static void pc_init1(MachineState *machine,
 
     guest_info = pc_guest_info_init(pcms);
 
-    guest_info->has_acpi_build = has_acpi_build;
+    guest_info->has_acpi_build = pcmc->has_acpi_build;
     guest_info->legacy_acpi_table_size = legacy_acpi_table_size;
 
-    guest_info->isapc_ram_fw = !pci_enabled;
-    guest_info->has_reserved_memory = has_reserved_memory;
-    guest_info->rsdp_in_ram = rsdp_in_ram;
+    guest_info->isapc_ram_fw = !pcmc->pci_enabled;
+    guest_info->has_reserved_memory = pcmc->has_reserved_memory;
+    guest_info->rsdp_in_ram = pcmc->rsdp_in_ram;
 
-    if (smbios_defaults) {
+    if (pcmc->smbios_defaults) {
         MachineClass *mc = MACHINE_GET_CLASS(machine);
         /* These values are guest ABI, do not change */
         smbios_set_defaults("QEMU", "Standard PC (i440FX + PIIX, 1996)",
-                            mc->name, smbios_legacy_mode, smbios_uuid_encoded,
+                            mc->name, pcmc->smbios_legacy_mode,
+                            pcmc->smbios_uuid_encoded,
                             SMBIOS_ENTRY_POINT_21);
     }
 
@@ -182,14 +171,14 @@  static void pc_init1(MachineState *machine,
 
     gsi_state = g_malloc0(sizeof(*gsi_state));
     if (kvm_irqchip_in_kernel()) {
-        kvm_pc_setup_irq_routing(pci_enabled);
+        kvm_pc_setup_irq_routing(pcmc->pci_enabled);
         gsi = qemu_allocate_irqs(kvm_pc_gsi_handler, gsi_state,
                                  GSI_NUM_PINS);
     } else {
         gsi = qemu_allocate_irqs(gsi_handler, gsi_state, GSI_NUM_PINS);
     }
 
-    if (pci_enabled) {
+    if (pcmc->pci_enabled) {
         pci_bus = i440fx_init(host_type,
                               pci_type,
                               &i440fx_state, &piix3_devfn, &isa_bus, gsi,
@@ -217,13 +206,13 @@  static void pc_init1(MachineState *machine,
         gsi_state->i8259_irq[i] = i8259[i];
     }
     g_free(i8259);
-    if (pci_enabled) {
+    if (pcmc->pci_enabled) {
         ioapic_init_gsi(gsi_state, "i440fx");
     }
 
     pc_register_ferr_irq(gsi[13]);
 
-    pc_vga_init(isa_bus, pci_enabled ? pci_bus : NULL);
+    pc_vga_init(isa_bus, pcmc->pci_enabled ? pci_bus : NULL);
 
     assert(pcms->vmport != ON_OFF_AUTO_MAX);
     if (pcms->vmport == ON_OFF_AUTO_AUTO) {
@@ -237,7 +226,7 @@  static void pc_init1(MachineState *machine,
     pc_nic_init(isa_bus, pci_bus);
 
     ide_drive_get(hd, ARRAY_SIZE(hd));
-    if (pci_enabled) {
+    if (pcmc->pci_enabled) {
         PCIDevice *dev;
         if (xen_enabled()) {
             dev = pci_piix3_xen_ide_init(pci_bus, hd, piix3_devfn + 1);
@@ -264,11 +253,11 @@  static void pc_init1(MachineState *machine,
 
     pc_cmos_init(pcms, idebus[0], idebus[1], rtc_state);
 
-    if (pci_enabled && usb_enabled()) {
+    if (pcmc->pci_enabled && usb_enabled()) {
         pci_create_simple(pci_bus, piix3_devfn + 2, "piix3-usb-uhci");
     }
 
-    if (pci_enabled && acpi_enabled) {
+    if (pcmc->pci_enabled && acpi_enabled) {
         DeviceState *piix4_pm;
         I2CBus *smbus;
 
@@ -289,7 +278,7 @@  static void pc_init1(MachineState *machine,
                                  PC_MACHINE_ACPI_DEVICE_PROP, &error_abort);
     }
 
-    if (pci_enabled) {
+    if (pcmc->pci_enabled) {
         pc_pci_device_init(pci_bus);
     }
 }
@@ -315,7 +304,6 @@  static void pc_compat_2_3(MachineState *machine)
 static void pc_compat_2_2(MachineState *machine)
 {
     pc_compat_2_3(machine);
-    rsdp_in_ram = false;
     machine->suppress_vmdesc = true;
 }
 
@@ -324,7 +312,6 @@  static void pc_compat_2_1(MachineState *machine)
     PCMachineState *pcms = PC_MACHINE(machine);
 
     pc_compat_2_2(machine);
-    smbios_uuid_encoded = false;
     x86_cpu_change_kvm_default("svm", NULL);
     pcms->enforce_aligned_dimm = false;
 }
@@ -349,16 +336,12 @@  static void pc_compat_2_0(MachineState *machine)
      * QEMU 1.7 it is 6414.  For RHEL/CentOS 7.0 it is 6418.
      */
     legacy_acpi_table_size = 6652;
-    smbios_legacy_mode = true;
-    has_reserved_memory = false;
     pc_set_legacy_acpi_data_size();
 }
 
 static void pc_compat_1_7(MachineState *machine)
 {
     pc_compat_2_0(machine);
-    smbios_defaults = false;
-    gigabyte_align = false;
     option_rom_has_mr = true;
     legacy_acpi_table_size = 6414;
     x86_cpu_change_kvm_default("x2apic", NULL);
@@ -368,7 +351,6 @@  static void pc_compat_1_6(MachineState *machine)
 {
     pc_compat_1_7(machine);
     rom_file_has_mr = false;
-    has_acpi_build = false;
 }
 
 static void pc_compat_1_5(MachineState *machine)
@@ -398,17 +380,10 @@  static void pc_compat_1_2(MachineState *machine)
 static void pc_compat_0_13(MachineState *machine)
 {
     pc_compat_1_2(machine);
-    kvmclock_enabled = false;
 }
 
 static void pc_init_isa(MachineState *machine)
 {
-    pci_enabled = false;
-    has_acpi_build = false;
-    smbios_defaults = false;
-    gigabyte_align = false;
-    smbios_legacy_mode = true;
-    has_reserved_memory = false;
     option_rom_has_mr = true;
     rom_file_has_mr = false;
     if (!machine->cpu_model) {
@@ -510,9 +485,11 @@  DEFINE_I440FX_MACHINE(v2_3, "pc-i440fx-2.3", pc_compat_2_3,
 
 static void pc_i440fx_2_2_machine_options(MachineClass *m)
 {
+    PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
     pc_i440fx_2_3_machine_options(m);
     m->hw_version = "2.2.0";
     SET_MACHINE_COMPAT(m, PC_COMPAT_2_2);
+    pcmc->rsdp_in_ram = false;
 }
 
 DEFINE_I440FX_MACHINE(v2_2, "pc-i440fx-2.2", pc_compat_2_2,
@@ -521,10 +498,12 @@  DEFINE_I440FX_MACHINE(v2_2, "pc-i440fx-2.2", pc_compat_2_2,
 
 static void pc_i440fx_2_1_machine_options(MachineClass *m)
 {
+    PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
     pc_i440fx_2_2_machine_options(m);
     m->hw_version = "2.1.0";
     m->default_display = NULL;
     SET_MACHINE_COMPAT(m, PC_COMPAT_2_1);
+    pcmc->smbios_uuid_encoded = false;
 }
 
 DEFINE_I440FX_MACHINE(v2_1, "pc-i440fx-2.1", pc_compat_2_1,
@@ -534,9 +513,12 @@  DEFINE_I440FX_MACHINE(v2_1, "pc-i440fx-2.1", pc_compat_2_1,
 
 static void pc_i440fx_2_0_machine_options(MachineClass *m)
 {
+    PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
     pc_i440fx_2_1_machine_options(m);
     m->hw_version = "2.0.0";
     SET_MACHINE_COMPAT(m, PC_COMPAT_2_0);
+    pcmc->smbios_legacy_mode = true;
+    pcmc->has_reserved_memory = false;
 }
 
 DEFINE_I440FX_MACHINE(v2_0, "pc-i440fx-2.0", pc_compat_2_0,
@@ -545,10 +527,13 @@  DEFINE_I440FX_MACHINE(v2_0, "pc-i440fx-2.0", pc_compat_2_0,
 
 static void pc_i440fx_1_7_machine_options(MachineClass *m)
 {
+    PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
     pc_i440fx_2_0_machine_options(m);
     m->hw_version = "1.7.0";
     m->default_machine_opts = NULL;
     SET_MACHINE_COMPAT(m, PC_COMPAT_1_7);
+    pcmc->smbios_defaults = false;
+    pcmc->gigabyte_align = false;
 }
 
 DEFINE_I440FX_MACHINE(v1_7, "pc-i440fx-1.7", pc_compat_1_7,
@@ -557,9 +542,11 @@  DEFINE_I440FX_MACHINE(v1_7, "pc-i440fx-1.7", pc_compat_1_7,
 
 static void pc_i440fx_1_6_machine_options(MachineClass *m)
 {
+    PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
     pc_i440fx_1_7_machine_options(m);
     m->hw_version = "1.6.0";
     SET_MACHINE_COMPAT(m, PC_COMPAT_1_6);
+    pcmc->has_acpi_build = false;
 }
 
 DEFINE_I440FX_MACHINE(v1_6, "pc-i440fx-1.6", pc_compat_1_6,
@@ -813,9 +800,11 @@  DEFINE_I440FX_MACHINE(v0_14, "pc-0.14", pc_compat_1_2,
 
 static void pc_i440fx_0_13_machine_options(MachineClass *m)
 {
+    PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
     pc_i440fx_0_14_machine_options(m);
     m->hw_version = "0.13";
     SET_MACHINE_COMPAT(m, PC_COMPAT_0_13);
+    pcmc->kvmclock_enabled = false;
 }
 
 DEFINE_I440FX_MACHINE(v0_13, "pc-0.13", pc_compat_0_13,
@@ -1037,8 +1026,15 @@  void igd_passthrough_isa_bridge_create(PCIBus *bus, uint16_t gpu_dev_id)
 
 static void isapc_machine_options(MachineClass *m)
 {
+    PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
     m->desc = "ISA-only PC";
     m->max_cpus = 1;
+    pcmc->pci_enabled = false;
+    pcmc->has_acpi_build = false;
+    pcmc->smbios_defaults = false;
+    pcmc->gigabyte_align = false;
+    pcmc->smbios_legacy_mode = true;
+    pcmc->has_reserved_memory = false;
 }
 
 DEFINE_PC_MACHINE(isapc, "isapc", pc_init_isa,
diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
index 133bc68..f9afaa2 100644
--- a/hw/i386/pc_q35.c
+++ b/hw/i386/pc_q35.c
@@ -49,22 +49,11 @@ 
 /* ICH9 AHCI has 6 ports */
 #define MAX_SATA_PORTS     6
 
-static bool has_acpi_build = true;
-static bool rsdp_in_ram = true;
-static bool smbios_defaults = true;
-static bool smbios_legacy_mode;
-static bool smbios_uuid_encoded = true;
-/* Make sure that guest addresses aligned at 1Gbyte boundaries get mapped to
- * host addresses aligned at 1Gbyte boundaries.  This way we can use 1GByte
- * pages in the host.
- */
-static bool gigabyte_align = true;
-static bool has_reserved_memory = true;
-
 /* PC hardware initialisation */
 static void pc_q35_init(MachineState *machine)
 {
     PCMachineState *pcms = PC_MACHINE(machine);
+    PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms);
     Q35PCIHost *q35_host;
     PCIHostState *phb;
     PCIBus *host_bus;
@@ -76,7 +65,6 @@  static void pc_q35_init(MachineState *machine)
     MemoryRegion *ram_memory;
     GSIState *gsi_state;
     ISABus *isa_bus;
-    int pci_enabled = 1;
     qemu_irq *gsi;
     qemu_irq *i8259;
     int i;
@@ -97,7 +85,7 @@  static void pc_q35_init(MachineState *machine)
      * breaking migration.
      */
     if (machine->ram_size >= 0xb0000000) {
-        lowmem = gigabyte_align ? 0x80000000 : 0xb0000000;
+        lowmem = pcmc->gigabyte_align ? 0x80000000 : 0xb0000000;
     } else {
         lowmem = 0xb0000000;
     }
@@ -134,7 +122,7 @@  static void pc_q35_init(MachineState *machine)
     kvmclock_create();
 
     /* pci enabled */
-    if (pci_enabled) {
+    if (pcmc->pci_enabled) {
         pci_memory = g_new(MemoryRegion, 1);
         memory_region_init(pci_memory, NULL, "pci", UINT64_MAX);
         rom_memory = pci_memory;
@@ -145,19 +133,20 @@  static void pc_q35_init(MachineState *machine)
 
     guest_info = pc_guest_info_init(pcms);
     guest_info->isapc_ram_fw = false;
-    guest_info->has_acpi_build = has_acpi_build;
-    guest_info->has_reserved_memory = has_reserved_memory;
-    guest_info->rsdp_in_ram = rsdp_in_ram;
+    guest_info->has_acpi_build = pcmc->has_acpi_build;
+    guest_info->has_reserved_memory = pcmc->has_reserved_memory;
+    guest_info->rsdp_in_ram = pcmc->rsdp_in_ram;
 
     /* Migration was not supported in 2.0 for Q35, so do not bother
      * with this hack (see hw/i386/acpi-build.c).
      */
     guest_info->legacy_acpi_table_size = 0;
 
-    if (smbios_defaults) {
+    if (pcmc->smbios_defaults) {
         /* These values are guest ABI, do not change */
         smbios_set_defaults("QEMU", "Standard PC (Q35 + ICH9, 2009)",
-                            mc->name, smbios_legacy_mode, smbios_uuid_encoded,
+                            mc->name, pcmc->smbios_legacy_mode,
+                            pcmc->smbios_uuid_encoded,
                             SMBIOS_ENTRY_POINT_21);
     }
 
@@ -170,7 +159,7 @@  static void pc_q35_init(MachineState *machine)
     /* irq lines */
     gsi_state = g_malloc0(sizeof(*gsi_state));
     if (kvm_irqchip_in_kernel()) {
-        kvm_pc_setup_irq_routing(pci_enabled);
+        kvm_pc_setup_irq_routing(pcmc->pci_enabled);
         gsi = qemu_allocate_irqs(kvm_pc_gsi_handler, gsi_state,
                                  GSI_NUM_PINS);
     } else {
@@ -227,7 +216,7 @@  static void pc_q35_init(MachineState *machine)
     for (i = 0; i < ISA_NUM_IRQS; i++) {
         gsi_state->i8259_irq[i] = i8259[i];
     }
-    if (pci_enabled) {
+    if (pcmc->pci_enabled) {
         ioapic_init_gsi(gsi_state, "q35");
     }
 
@@ -272,7 +261,7 @@  static void pc_q35_init(MachineState *machine)
     /* the rest devices to which pci devfn is automatically assigned */
     pc_vga_init(isa_bus, host_bus);
     pc_nic_init(isa_bus, host_bus);
-    if (pci_enabled) {
+    if (pcmc->pci_enabled) {
         pc_pci_device_init(host_bus);
     }
 }
@@ -298,7 +287,6 @@  static void pc_compat_2_3(MachineState *machine)
 static void pc_compat_2_2(MachineState *machine)
 {
     pc_compat_2_3(machine);
-    rsdp_in_ram = false;
     machine->suppress_vmdesc = true;
 }
 
@@ -308,23 +296,18 @@  static void pc_compat_2_1(MachineState *machine)
 
     pc_compat_2_2(machine);
     pcms->enforce_aligned_dimm = false;
-    smbios_uuid_encoded = false;
     x86_cpu_change_kvm_default("svm", NULL);
 }
 
 static void pc_compat_2_0(MachineState *machine)
 {
     pc_compat_2_1(machine);
-    smbios_legacy_mode = true;
-    has_reserved_memory = false;
     pc_set_legacy_acpi_data_size();
 }
 
 static void pc_compat_1_7(MachineState *machine)
 {
     pc_compat_2_0(machine);
-    smbios_defaults = false;
-    gigabyte_align = false;
     option_rom_has_mr = true;
     x86_cpu_change_kvm_default("x2apic", NULL);
 }
@@ -333,7 +316,6 @@  static void pc_compat_1_6(MachineState *machine)
 {
     pc_compat_1_7(machine);
     rom_file_has_mr = false;
-    has_acpi_build = false;
 }
 
 static void pc_compat_1_5(MachineState *machine)
@@ -409,9 +391,11 @@  DEFINE_Q35_MACHINE(v2_3, "pc-q35-2.3", pc_compat_2_3,
 
 static void pc_q35_2_2_machine_options(MachineClass *m)
 {
+    PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
     pc_q35_2_3_machine_options(m);
     m->hw_version = "2.2.0";
     SET_MACHINE_COMPAT(m, PC_COMPAT_2_2);
+    pcmc->rsdp_in_ram = false;
 }
 
 DEFINE_Q35_MACHINE(v2_2, "pc-q35-2.2", pc_compat_2_2,
@@ -420,10 +404,12 @@  DEFINE_Q35_MACHINE(v2_2, "pc-q35-2.2", pc_compat_2_2,
 
 static void pc_q35_2_1_machine_options(MachineClass *m)
 {
+    PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
     pc_q35_2_2_machine_options(m);
     m->hw_version = "2.1.0";
     m->default_display = NULL;
     SET_MACHINE_COMPAT(m, PC_COMPAT_2_1);
+    pcmc->smbios_uuid_encoded = false;
 }
 
 DEFINE_Q35_MACHINE(v2_1, "pc-q35-2.1", pc_compat_2_1,
@@ -432,9 +418,12 @@  DEFINE_Q35_MACHINE(v2_1, "pc-q35-2.1", pc_compat_2_1,
 
 static void pc_q35_2_0_machine_options(MachineClass *m)
 {
+    PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
     pc_q35_2_1_machine_options(m);
     m->hw_version = "2.0.0";
     SET_MACHINE_COMPAT(m, PC_COMPAT_2_0);
+    pcmc->has_reserved_memory = false;
+    pcmc->smbios_legacy_mode = true;
 }
 
 DEFINE_Q35_MACHINE(v2_0, "pc-q35-2.0", pc_compat_2_0,
@@ -443,10 +432,13 @@  DEFINE_Q35_MACHINE(v2_0, "pc-q35-2.0", pc_compat_2_0,
 
 static void pc_q35_1_7_machine_options(MachineClass *m)
 {
+    PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
     pc_q35_2_0_machine_options(m);
     m->hw_version = "1.7.0";
     m->default_machine_opts = NULL;
     SET_MACHINE_COMPAT(m, PC_COMPAT_1_7);
+    pcmc->smbios_defaults = false;
+    pcmc->gigabyte_align = false;
 }
 
 DEFINE_Q35_MACHINE(v1_7, "pc-q35-1.7", pc_compat_1_7,
@@ -455,9 +447,11 @@  DEFINE_Q35_MACHINE(v1_7, "pc-q35-1.7", pc_compat_1_7,
 
 static void pc_q35_1_6_machine_options(MachineClass *m)
 {
+    PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
     pc_q35_machine_options(m);
     m->hw_version = "1.6.0";
     SET_MACHINE_COMPAT(m, PC_COMPAT_1_6);
+    pcmc->has_acpi_build = false;
 }
 
 DEFINE_Q35_MACHINE(v1_6, "pc-q35-1.6", pc_compat_1_6,
diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
index 854c330..15171e9 100644
--- a/include/hw/i386/pc.h
+++ b/include/hw/i386/pc.h
@@ -62,6 +62,20 @@  struct PCMachineClass {
     bool broken_reserved_end;
     HotplugHandler *(*get_hotplug_handler)(MachineState *machine,
                                            DeviceState *dev);
+
+    bool pci_enabled;
+    bool has_acpi_build;
+    bool rsdp_in_ram;
+    bool smbios_defaults;
+    bool smbios_legacy_mode;
+    bool smbios_uuid_encoded;
+    /* Make sure that guest addresses aligned at 1Gbyte boundaries get
+     * mapped to host addresses aligned at 1Gbyte boundaries.  This way
+     * we can use 1GByte pages in the host.
+     */
+    bool gigabyte_align;
+    bool has_reserved_memory;
+    bool kvmclock_enabled;
 };
 
 #define TYPE_PC_MACHINE "generic-pc-machine"