qemu/include/hw/i386/pc.h
<<
>>
Prefs
   1#ifndef HW_PC_H
   2#define HW_PC_H
   3
   4#include "qemu-common.h"
   5#include "exec/memory.h"
   6#include "hw/boards.h"
   7#include "hw/isa/isa.h"
   8#include "hw/block/fdc.h"
   9#include "net/net.h"
  10#include "hw/i386/ioapic.h"
  11
  12#include "qemu/range.h"
  13#include "qemu/bitmap.h"
  14#include "sysemu/sysemu.h"
  15#include "hw/pci/pci.h"
  16#include "hw/compat.h"
  17#include "hw/mem/pc-dimm.h"
  18#include "hw/mem/nvdimm.h"
  19#include "hw/acpi/acpi_dev_interface.h"
  20
  21#define HPET_INTCAP "hpet-intcap"
  22
  23/**
  24 * PCMachineState:
  25 * @acpi_dev: link to ACPI PM device that performs ACPI hotplug handling
  26 * @boot_cpus: number of present VCPUs
  27 */
  28struct PCMachineState {
  29    /*< private >*/
  30    MachineState parent_obj;
  31
  32    /* <public> */
  33
  34    /* State for other subsystems/APIs: */
  35    Notifier machine_done;
  36
  37    /* Pointers to devices and objects: */
  38    HotplugHandler *acpi_dev;
  39    ISADevice *rtc;
  40    PCIBus *bus;
  41    FWCfgState *fw_cfg;
  42    qemu_irq *gsi;
  43
  44    /* Configuration options: */
  45    uint64_t max_ram_below_4g;
  46    OnOffAuto vmport;
  47    OnOffAuto smm;
  48
  49    AcpiNVDIMMState acpi_nvdimm_state;
  50
  51    bool acpi_build_enabled;
  52    bool smbus;
  53    bool sata;
  54    bool pit;
  55
  56    /* RAM information (sizes, addresses, configuration): */
  57    ram_addr_t below_4g_mem_size, above_4g_mem_size;
  58
  59    /* CPU and apic information: */
  60    bool apic_xrupt_override;
  61    unsigned apic_id_limit;
  62    uint16_t boot_cpus;
  63
  64    /* NUMA information: */
  65    uint64_t numa_nodes;
  66    uint64_t *node_mem;
  67
  68    /* Address space used by IOAPIC device. All IOAPIC interrupts
  69     * will be translated to MSI messages in the address space. */
  70    AddressSpace *ioapic_as;
  71};
  72
  73#define PC_MACHINE_ACPI_DEVICE_PROP "acpi-device"
  74#define PC_MACHINE_DEVMEM_REGION_SIZE "device-memory-region-size"
  75#define PC_MACHINE_MAX_RAM_BELOW_4G "max-ram-below-4g"
  76#define PC_MACHINE_VMPORT           "vmport"
  77#define PC_MACHINE_SMM              "smm"
  78#define PC_MACHINE_NVDIMM           "nvdimm"
  79#define PC_MACHINE_NVDIMM_PERSIST   "nvdimm-persistence"
  80#define PC_MACHINE_SMBUS            "smbus"
  81#define PC_MACHINE_SATA             "sata"
  82#define PC_MACHINE_PIT              "pit"
  83
  84/**
  85 * PCMachineClass:
  86 *
  87 * Compat fields:
  88 *
  89 * @enforce_aligned_dimm: check that DIMM's address/size is aligned by
  90 *                        backend's alignment value if provided
  91 * @acpi_data_size: Size of the chunk of memory at the top of RAM
  92 *                  for the BIOS ACPI tables and other BIOS
  93 *                  datastructures.
  94 * @gigabyte_align: Make sure that guest addresses aligned at
  95 *                  1Gbyte boundaries get mapped to host
  96 *                  addresses aligned at 1Gbyte boundaries. This
  97 *                  way we can use 1GByte pages in the host.
  98 *
  99 */
 100struct PCMachineClass {
 101    /*< private >*/
 102    MachineClass parent_class;
 103
 104    /*< public >*/
 105
 106    /* Device configuration: */
 107    bool pci_enabled;
 108    bool kvmclock_enabled;
 109    const char *default_nic_model;
 110
 111    /* Compat options: */
 112
 113    /* ACPI compat: */
 114    bool has_acpi_build;
 115    bool rsdp_in_ram;
 116    int legacy_acpi_table_size;
 117    unsigned acpi_data_size;
 118
 119    /* SMBIOS compat: */
 120    bool smbios_defaults;
 121    bool smbios_legacy_mode;
 122    bool smbios_uuid_encoded;
 123
 124    /* RAM / address space compat: */
 125    bool gigabyte_align;
 126    bool has_reserved_memory;
 127    bool enforce_aligned_dimm;
 128    bool broken_reserved_end;
 129
 130    /* TSC rate migration: */
 131    bool save_tsc_khz;
 132    /* generate legacy CPU hotplug AML */
 133    bool legacy_cpu_hotplug;
 134
 135    /* use DMA capable linuxboot option rom */
 136    bool linuxboot_dma_enabled;
 137};
 138
 139#define TYPE_PC_MACHINE "generic-pc-machine"
 140#define PC_MACHINE(obj) \
 141    OBJECT_CHECK(PCMachineState, (obj), TYPE_PC_MACHINE)
 142#define PC_MACHINE_GET_CLASS(obj) \
 143    OBJECT_GET_CLASS(PCMachineClass, (obj), TYPE_PC_MACHINE)
 144#define PC_MACHINE_CLASS(klass) \
 145    OBJECT_CLASS_CHECK(PCMachineClass, (klass), TYPE_PC_MACHINE)
 146
 147/* i8259.c */
 148
 149extern DeviceState *isa_pic;
 150qemu_irq *i8259_init(ISABus *bus, qemu_irq parent_irq);
 151qemu_irq *kvm_i8259_init(ISABus *bus);
 152int pic_read_irq(DeviceState *d);
 153int pic_get_output(DeviceState *d);
 154
 155/* ioapic.c */
 156
 157/* Global System Interrupts */
 158
 159#define GSI_NUM_PINS IOAPIC_NUM_PINS
 160
 161typedef struct GSIState {
 162    qemu_irq i8259_irq[ISA_NUM_IRQS];
 163    qemu_irq ioapic_irq[IOAPIC_NUM_PINS];
 164} GSIState;
 165
 166void gsi_handler(void *opaque, int n, int level);
 167
 168/* vmport.c */
 169#define TYPE_VMPORT "vmport"
 170typedef uint32_t (VMPortReadFunc)(void *opaque, uint32_t address);
 171
 172static inline void vmport_init(ISABus *bus)
 173{
 174    isa_create_simple(bus, TYPE_VMPORT);
 175}
 176
 177void vmport_register(unsigned char command, VMPortReadFunc *func, void *opaque);
 178void vmmouse_get_data(uint32_t *data);
 179void vmmouse_set_data(const uint32_t *data);
 180
 181/* pc.c */
 182extern int fd_bootchk;
 183
 184bool pc_machine_is_smm_enabled(PCMachineState *pcms);
 185void pc_register_ferr_irq(qemu_irq irq);
 186void pc_acpi_smi_interrupt(void *opaque, int irq, int level);
 187
 188void pc_cpus_init(PCMachineState *pcms);
 189void pc_hot_add_cpu(const int64_t id, Error **errp);
 190void pc_acpi_init(const char *default_dsdt);
 191
 192void pc_guest_info_init(PCMachineState *pcms);
 193
 194#define PCI_HOST_PROP_PCI_HOLE_START   "pci-hole-start"
 195#define PCI_HOST_PROP_PCI_HOLE_END     "pci-hole-end"
 196#define PCI_HOST_PROP_PCI_HOLE64_START "pci-hole64-start"
 197#define PCI_HOST_PROP_PCI_HOLE64_END   "pci-hole64-end"
 198#define PCI_HOST_PROP_PCI_HOLE64_SIZE  "pci-hole64-size"
 199#define PCI_HOST_BELOW_4G_MEM_SIZE     "below-4g-mem-size"
 200#define PCI_HOST_ABOVE_4G_MEM_SIZE     "above-4g-mem-size"
 201
 202
 203void pc_pci_as_mapping_init(Object *owner, MemoryRegion *system_memory,
 204                            MemoryRegion *pci_address_space);
 205
 206void xen_load_linux(PCMachineState *pcms);
 207void pc_memory_init(PCMachineState *pcms,
 208                    MemoryRegion *system_memory,
 209                    MemoryRegion *rom_memory,
 210                    MemoryRegion **ram_memory);
 211uint64_t pc_pci_hole64_start(void);
 212qemu_irq pc_allocate_cpu_irq(void);
 213DeviceState *pc_vga_init(ISABus *isa_bus, PCIBus *pci_bus);
 214void pc_basic_device_init(ISABus *isa_bus, qemu_irq *gsi,
 215                          ISADevice **rtc_state,
 216                          bool create_fdctrl,
 217                          bool no_vmport,
 218                          bool has_pit,
 219                          uint32_t hpet_irqs);
 220void pc_init_ne2k_isa(ISABus *bus, NICInfo *nd);
 221void pc_cmos_init(PCMachineState *pcms,
 222                  BusState *ide0, BusState *ide1,
 223                  ISADevice *s);
 224void pc_nic_init(PCMachineClass *pcmc, ISABus *isa_bus, PCIBus *pci_bus);
 225void pc_pci_device_init(PCIBus *pci_bus);
 226
 227typedef void (*cpu_set_smm_t)(int smm, void *arg);
 228
 229void ioapic_init_gsi(GSIState *gsi_state, const char *parent_name);
 230
 231ISADevice *pc_find_fdc0(void);
 232int cmos_get_fd_drive_type(FloppyDriveType fd0);
 233
 234#define FW_CFG_IO_BASE     0x510
 235
 236#define PORT92_A20_LINE "a20"
 237
 238/* acpi_piix.c */
 239
 240I2CBus *piix4_pm_init(PCIBus *bus, int devfn, uint32_t smb_io_base,
 241                      qemu_irq sci_irq, qemu_irq smi_irq,
 242                      int smm_enabled, DeviceState **piix4_pm);
 243
 244/* hpet.c */
 245extern int no_hpet;
 246
 247/* piix_pci.c */
 248struct PCII440FXState;
 249typedef struct PCII440FXState PCII440FXState;
 250
 251#define TYPE_I440FX_PCI_HOST_BRIDGE "i440FX-pcihost"
 252#define TYPE_I440FX_PCI_DEVICE "i440FX"
 253
 254#define TYPE_IGD_PASSTHROUGH_I440FX_PCI_DEVICE "igd-passthrough-i440FX"
 255
 256/*
 257 * Reset Control Register: PCI-accessible ISA-Compatible Register at address
 258 * 0xcf9, provided by the PCI/ISA bridge (PIIX3 PCI function 0, 8086:7000).
 259 */
 260#define RCR_IOPORT 0xcf9
 261
 262PCIBus *i440fx_init(const char *host_type, const char *pci_type,
 263                    PCII440FXState **pi440fx_state, int *piix_devfn,
 264                    ISABus **isa_bus, qemu_irq *pic,
 265                    MemoryRegion *address_space_mem,
 266                    MemoryRegion *address_space_io,
 267                    ram_addr_t ram_size,
 268                    ram_addr_t below_4g_mem_size,
 269                    ram_addr_t above_4g_mem_size,
 270                    MemoryRegion *pci_memory,
 271                    MemoryRegion *ram_memory);
 272
 273PCIBus *find_i440fx(void);
 274/* piix4.c */
 275extern PCIDevice *piix4_dev;
 276int piix4_init(PCIBus *bus, ISABus **isa_bus, int devfn);
 277
 278/* pc_sysfw.c */
 279void pc_system_firmware_init(MemoryRegion *rom_memory,
 280                             bool isapc_ram_fw);
 281
 282/* acpi-build.c */
 283void pc_madt_cpu_entry(AcpiDeviceIf *adev, int uid,
 284                       const CPUArchIdList *apic_ids, GArray *entry);
 285
 286/* e820 types */
 287#define E820_RAM        1
 288#define E820_RESERVED   2
 289#define E820_ACPI       3
 290#define E820_NVS        4
 291#define E820_UNUSABLE   5
 292
 293int e820_add_entry(uint64_t, uint64_t, uint32_t);
 294int e820_get_num_entries(void);
 295bool e820_get_entry(int, uint32_t, uint64_t *, uint64_t *);
 296
 297#define PC_COMPAT_3_0 \
 298    HW_COMPAT_3_0 \
 299    {\
 300        .driver   = TYPE_X86_CPU,\
 301        .property = "x-hv-synic-kvm-only",\
 302        .value    = "on",\
 303    },{\
 304        .driver   = "Skylake-Server" "-" TYPE_X86_CPU,\
 305        .property = "pku",\
 306        .value    = "off",\
 307    },{\
 308        .driver   = "Skylake-Server-IBRS" "-" TYPE_X86_CPU,\
 309        .property = "pku",\
 310        .value    = "off",\
 311    },
 312
 313#define PC_COMPAT_2_12 \
 314    HW_COMPAT_2_12 \
 315    {\
 316        .driver   = TYPE_X86_CPU,\
 317        .property = "legacy-cache",\
 318        .value    = "on",\
 319    },{\
 320        .driver   = TYPE_X86_CPU,\
 321        .property = "topoext",\
 322        .value    = "off",\
 323    },{\
 324        .driver   = "EPYC-" TYPE_X86_CPU,\
 325        .property = "xlevel",\
 326        .value    = stringify(0x8000000a),\
 327    },{\
 328        .driver   = "EPYC-IBPB-" TYPE_X86_CPU,\
 329        .property = "xlevel",\
 330        .value    = stringify(0x8000000a),\
 331    },
 332
 333#define PC_COMPAT_2_11 \
 334    HW_COMPAT_2_11 \
 335    {\
 336        .driver   = TYPE_X86_CPU,\
 337        .property = "x-migrate-smi-count",\
 338        .value    = "off",\
 339    },{\
 340        .driver   = "Skylake-Server" "-" TYPE_X86_CPU,\
 341        .property = "clflushopt",\
 342        .value    = "off",\
 343    },
 344
 345#define PC_COMPAT_2_10 \
 346    HW_COMPAT_2_10 \
 347    {\
 348        .driver   = TYPE_X86_CPU,\
 349        .property = "x-hv-max-vps",\
 350        .value    = "0x40",\
 351    },{\
 352        .driver   = "i440FX-pcihost",\
 353        .property = "x-pci-hole64-fix",\
 354        .value    = "off",\
 355    },{\
 356        .driver   = "q35-pcihost",\
 357        .property = "x-pci-hole64-fix",\
 358        .value    = "off",\
 359    },
 360
 361#define PC_COMPAT_2_9 \
 362    HW_COMPAT_2_9 \
 363    {\
 364        .driver   = "mch",\
 365        .property = "extended-tseg-mbytes",\
 366        .value    = stringify(0),\
 367    },\
 368
 369#define PC_COMPAT_2_8 \
 370    HW_COMPAT_2_8 \
 371    {\
 372        .driver   = TYPE_X86_CPU,\
 373        .property = "tcg-cpuid",\
 374        .value    = "off",\
 375    },\
 376    {\
 377        .driver   = "kvmclock",\
 378        .property = "x-mach-use-reliable-get-clock",\
 379        .value    = "off",\
 380    },\
 381    {\
 382        .driver   = "ICH9-LPC",\
 383        .property = "x-smi-broadcast",\
 384        .value    = "off",\
 385    },\
 386    {\
 387        .driver   = TYPE_X86_CPU,\
 388        .property = "vmware-cpuid-freq",\
 389        .value    = "off",\
 390    },\
 391    {\
 392        .driver   = "Haswell-" TYPE_X86_CPU,\
 393        .property = "stepping",\
 394        .value    = "1",\
 395    },
 396
 397#define PC_COMPAT_2_7 \
 398    HW_COMPAT_2_7 \
 399    {\
 400        .driver   = TYPE_X86_CPU,\
 401        .property = "l3-cache",\
 402        .value    = "off",\
 403    },\
 404    {\
 405        .driver   = TYPE_X86_CPU,\
 406        .property = "full-cpuid-auto-level",\
 407        .value    = "off",\
 408    },\
 409    {\
 410        .driver   = "Opteron_G3" "-" TYPE_X86_CPU,\
 411        .property = "family",\
 412        .value    = "15",\
 413    },\
 414    {\
 415        .driver   = "Opteron_G3" "-" TYPE_X86_CPU,\
 416        .property = "model",\
 417        .value    = "6",\
 418    },\
 419    {\
 420        .driver   = "Opteron_G3" "-" TYPE_X86_CPU,\
 421        .property = "stepping",\
 422        .value    = "1",\
 423    },\
 424    {\
 425        .driver   = "isa-pcspk",\
 426        .property = "migrate",\
 427        .value    = "off",\
 428    },
 429
 430#define PC_COMPAT_2_6 \
 431    HW_COMPAT_2_6 \
 432    {\
 433        .driver   = TYPE_X86_CPU,\
 434        .property = "cpuid-0xb",\
 435        .value    = "off",\
 436    },{\
 437        .driver   = "vmxnet3",\
 438        .property = "romfile",\
 439        .value    = "",\
 440    },\
 441    {\
 442        .driver = TYPE_X86_CPU,\
 443        .property = "fill-mtrr-mask",\
 444        .value = "off",\
 445    },\
 446    {\
 447        .driver   = "apic-common",\
 448        .property = "legacy-instance-id",\
 449        .value    = "on",\
 450    },
 451
 452#define PC_COMPAT_2_5 \
 453    HW_COMPAT_2_5
 454
 455/* Helper for setting model-id for CPU models that changed model-id
 456 * depending on QEMU versions up to QEMU 2.4.
 457 */
 458#define PC_CPU_MODEL_IDS(v) \
 459    {\
 460        .driver   = "qemu32-" TYPE_X86_CPU,\
 461        .property = "model-id",\
 462        .value    = "QEMU Virtual CPU version " v,\
 463    },\
 464    {\
 465        .driver   = "qemu64-" TYPE_X86_CPU,\
 466        .property = "model-id",\
 467        .value    = "QEMU Virtual CPU version " v,\
 468    },\
 469    {\
 470        .driver   = "athlon-" TYPE_X86_CPU,\
 471        .property = "model-id",\
 472        .value    = "QEMU Virtual CPU version " v,\
 473    },
 474
 475#define PC_COMPAT_2_4 \
 476    HW_COMPAT_2_4 \
 477    PC_CPU_MODEL_IDS("2.4.0") \
 478    {\
 479        .driver   = "Haswell-" TYPE_X86_CPU,\
 480        .property = "abm",\
 481        .value    = "off",\
 482    },\
 483    {\
 484        .driver   = "Haswell-noTSX-" TYPE_X86_CPU,\
 485        .property = "abm",\
 486        .value    = "off",\
 487    },\
 488    {\
 489        .driver   = "Broadwell-" TYPE_X86_CPU,\
 490        .property = "abm",\
 491        .value    = "off",\
 492    },\
 493    {\
 494        .driver   = "Broadwell-noTSX-" TYPE_X86_CPU,\
 495        .property = "abm",\
 496        .value    = "off",\
 497    },\
 498    {\
 499        .driver   = "host" "-" TYPE_X86_CPU,\
 500        .property = "host-cache-info",\
 501        .value    = "on",\
 502    },\
 503    {\
 504        .driver   = TYPE_X86_CPU,\
 505        .property = "check",\
 506        .value    = "off",\
 507    },\
 508    {\
 509        .driver   = "qemu64" "-" TYPE_X86_CPU,\
 510        .property = "sse4a",\
 511        .value    = "on",\
 512    },\
 513    {\
 514        .driver   = "qemu64" "-" TYPE_X86_CPU,\
 515        .property = "abm",\
 516        .value    = "on",\
 517    },\
 518    {\
 519        .driver   = "qemu64" "-" TYPE_X86_CPU,\
 520        .property = "popcnt",\
 521        .value    = "on",\
 522    },\
 523    {\
 524        .driver   = "qemu32" "-" TYPE_X86_CPU,\
 525        .property = "popcnt",\
 526        .value    = "on",\
 527    },{\
 528        .driver   = "Opteron_G2" "-" TYPE_X86_CPU,\
 529        .property = "rdtscp",\
 530        .value    = "on",\
 531    },{\
 532        .driver   = "Opteron_G3" "-" TYPE_X86_CPU,\
 533        .property = "rdtscp",\
 534        .value    = "on",\
 535    },{\
 536        .driver   = "Opteron_G4" "-" TYPE_X86_CPU,\
 537        .property = "rdtscp",\
 538        .value    = "on",\
 539    },{\
 540        .driver   = "Opteron_G5" "-" TYPE_X86_CPU,\
 541        .property = "rdtscp",\
 542        .value    = "on",\
 543    },
 544
 545
 546#define PC_COMPAT_2_3 \
 547    HW_COMPAT_2_3 \
 548    PC_CPU_MODEL_IDS("2.3.0") \
 549    {\
 550        .driver   = TYPE_X86_CPU,\
 551        .property = "arat",\
 552        .value    = "off",\
 553    },{\
 554        .driver   = "qemu64" "-" TYPE_X86_CPU,\
 555        .property = "min-level",\
 556        .value    = stringify(4),\
 557    },{\
 558        .driver   = "kvm64" "-" TYPE_X86_CPU,\
 559        .property = "min-level",\
 560        .value    = stringify(5),\
 561    },{\
 562        .driver   = "pentium3" "-" TYPE_X86_CPU,\
 563        .property = "min-level",\
 564        .value    = stringify(2),\
 565    },{\
 566        .driver   = "n270" "-" TYPE_X86_CPU,\
 567        .property = "min-level",\
 568        .value    = stringify(5),\
 569    },{\
 570        .driver   = "Conroe" "-" TYPE_X86_CPU,\
 571        .property = "min-level",\
 572        .value    = stringify(4),\
 573    },{\
 574        .driver   = "Penryn" "-" TYPE_X86_CPU,\
 575        .property = "min-level",\
 576        .value    = stringify(4),\
 577    },{\
 578        .driver   = "Nehalem" "-" TYPE_X86_CPU,\
 579        .property = "min-level",\
 580        .value    = stringify(4),\
 581    },{\
 582        .driver   = "n270" "-" TYPE_X86_CPU,\
 583        .property = "min-xlevel",\
 584        .value    = stringify(0x8000000a),\
 585    },{\
 586        .driver   = "Penryn" "-" TYPE_X86_CPU,\
 587        .property = "min-xlevel",\
 588        .value    = stringify(0x8000000a),\
 589    },{\
 590        .driver   = "Conroe" "-" TYPE_X86_CPU,\
 591        .property = "min-xlevel",\
 592        .value    = stringify(0x8000000a),\
 593    },{\
 594        .driver   = "Nehalem" "-" TYPE_X86_CPU,\
 595        .property = "min-xlevel",\
 596        .value    = stringify(0x8000000a),\
 597    },{\
 598        .driver   = "Westmere" "-" TYPE_X86_CPU,\
 599        .property = "min-xlevel",\
 600        .value    = stringify(0x8000000a),\
 601    },{\
 602        .driver   = "SandyBridge" "-" TYPE_X86_CPU,\
 603        .property = "min-xlevel",\
 604        .value    = stringify(0x8000000a),\
 605    },{\
 606        .driver   = "IvyBridge" "-" TYPE_X86_CPU,\
 607        .property = "min-xlevel",\
 608        .value    = stringify(0x8000000a),\
 609    },{\
 610        .driver   = "Haswell" "-" TYPE_X86_CPU,\
 611        .property = "min-xlevel",\
 612        .value    = stringify(0x8000000a),\
 613    },{\
 614        .driver   = "Haswell-noTSX" "-" TYPE_X86_CPU,\
 615        .property = "min-xlevel",\
 616        .value    = stringify(0x8000000a),\
 617    },{\
 618        .driver   = "Broadwell" "-" TYPE_X86_CPU,\
 619        .property = "min-xlevel",\
 620        .value    = stringify(0x8000000a),\
 621    },{\
 622        .driver   = "Broadwell-noTSX" "-" TYPE_X86_CPU,\
 623        .property = "min-xlevel",\
 624        .value    = stringify(0x8000000a),\
 625    },{\
 626        .driver = TYPE_X86_CPU,\
 627        .property = "kvm-no-smi-migration",\
 628        .value    = "on",\
 629    },
 630
 631#define PC_COMPAT_2_2 \
 632    HW_COMPAT_2_2 \
 633    PC_CPU_MODEL_IDS("2.2.0") \
 634    {\
 635        .driver = "kvm64" "-" TYPE_X86_CPU,\
 636        .property = "vme",\
 637        .value = "off",\
 638    },\
 639    {\
 640        .driver = "kvm32" "-" TYPE_X86_CPU,\
 641        .property = "vme",\
 642        .value = "off",\
 643    },\
 644    {\
 645        .driver = "Conroe" "-" TYPE_X86_CPU,\
 646        .property = "vme",\
 647        .value = "off",\
 648    },\
 649    {\
 650        .driver = "Penryn" "-" TYPE_X86_CPU,\
 651        .property = "vme",\
 652        .value = "off",\
 653    },\
 654    {\
 655        .driver = "Nehalem" "-" TYPE_X86_CPU,\
 656        .property = "vme",\
 657        .value = "off",\
 658    },\
 659    {\
 660        .driver = "Westmere" "-" TYPE_X86_CPU,\
 661        .property = "vme",\
 662        .value = "off",\
 663    },\
 664    {\
 665        .driver = "SandyBridge" "-" TYPE_X86_CPU,\
 666        .property = "vme",\
 667        .value = "off",\
 668    },\
 669    {\
 670        .driver = "Haswell" "-" TYPE_X86_CPU,\
 671        .property = "vme",\
 672        .value = "off",\
 673    },\
 674    {\
 675        .driver = "Broadwell" "-" TYPE_X86_CPU,\
 676        .property = "vme",\
 677        .value = "off",\
 678    },\
 679    {\
 680        .driver = "Opteron_G1" "-" TYPE_X86_CPU,\
 681        .property = "vme",\
 682        .value = "off",\
 683    },\
 684    {\
 685        .driver = "Opteron_G2" "-" TYPE_X86_CPU,\
 686        .property = "vme",\
 687        .value = "off",\
 688    },\
 689    {\
 690        .driver = "Opteron_G3" "-" TYPE_X86_CPU,\
 691        .property = "vme",\
 692        .value = "off",\
 693    },\
 694    {\
 695        .driver = "Opteron_G4" "-" TYPE_X86_CPU,\
 696        .property = "vme",\
 697        .value = "off",\
 698    },\
 699    {\
 700        .driver = "Opteron_G5" "-" TYPE_X86_CPU,\
 701        .property = "vme",\
 702        .value = "off",\
 703    },\
 704    {\
 705        .driver = "Haswell" "-" TYPE_X86_CPU,\
 706        .property = "f16c",\
 707        .value = "off",\
 708    },\
 709    {\
 710        .driver = "Haswell" "-" TYPE_X86_CPU,\
 711        .property = "rdrand",\
 712        .value = "off",\
 713    },\
 714    {\
 715        .driver = "Broadwell" "-" TYPE_X86_CPU,\
 716        .property = "f16c",\
 717        .value = "off",\
 718    },\
 719    {\
 720        .driver = "Broadwell" "-" TYPE_X86_CPU,\
 721        .property = "rdrand",\
 722        .value = "off",\
 723    },
 724
 725#define PC_COMPAT_2_1 \
 726    HW_COMPAT_2_1 \
 727    PC_CPU_MODEL_IDS("2.1.0") \
 728    {\
 729        .driver = "coreduo" "-" TYPE_X86_CPU,\
 730        .property = "vmx",\
 731        .value = "on",\
 732    },\
 733    {\
 734        .driver = "core2duo" "-" TYPE_X86_CPU,\
 735        .property = "vmx",\
 736        .value = "on",\
 737    },
 738
 739#define PC_COMPAT_2_0 \
 740    PC_CPU_MODEL_IDS("2.0.0") \
 741    {\
 742        .driver   = "virtio-scsi-pci",\
 743        .property = "any_layout",\
 744        .value    = "off",\
 745    },{\
 746        .driver   = "PIIX4_PM",\
 747        .property = "memory-hotplug-support",\
 748        .value    = "off",\
 749    },\
 750    {\
 751        .driver   = "apic",\
 752        .property = "version",\
 753        .value    = stringify(0x11),\
 754    },\
 755    {\
 756        .driver   = "nec-usb-xhci",\
 757        .property = "superspeed-ports-first",\
 758        .value    = "off",\
 759    },\
 760    {\
 761        .driver   = "nec-usb-xhci",\
 762        .property = "force-pcie-endcap",\
 763        .value    = "on",\
 764    },\
 765    {\
 766        .driver   = "pci-serial",\
 767        .property = "prog_if",\
 768        .value    = stringify(0),\
 769    },\
 770    {\
 771        .driver   = "pci-serial-2x",\
 772        .property = "prog_if",\
 773        .value    = stringify(0),\
 774    },\
 775    {\
 776        .driver   = "pci-serial-4x",\
 777        .property = "prog_if",\
 778        .value    = stringify(0),\
 779    },\
 780    {\
 781        .driver   = "virtio-net-pci",\
 782        .property = "guest_announce",\
 783        .value    = "off",\
 784    },\
 785    {\
 786        .driver   = "ICH9-LPC",\
 787        .property = "memory-hotplug-support",\
 788        .value    = "off",\
 789    },{\
 790        .driver   = "xio3130-downstream",\
 791        .property = COMPAT_PROP_PCP,\
 792        .value    = "off",\
 793    },{\
 794        .driver   = "ioh3420",\
 795        .property = COMPAT_PROP_PCP,\
 796        .value    = "off",\
 797    },
 798
 799#define PC_COMPAT_1_7 \
 800    PC_CPU_MODEL_IDS("1.7.0") \
 801    {\
 802        .driver   = TYPE_USB_DEVICE,\
 803        .property = "msos-desc",\
 804        .value    = "no",\
 805    },\
 806    {\
 807        .driver   = "PIIX4_PM",\
 808        .property = "acpi-pci-hotplug-with-bridge-support",\
 809        .value    = "off",\
 810    },\
 811    {\
 812        .driver   = "hpet",\
 813        .property = HPET_INTCAP,\
 814        .value    = stringify(4),\
 815    },
 816
 817#define PC_COMPAT_1_6 \
 818    PC_CPU_MODEL_IDS("1.6.0") \
 819    {\
 820        .driver   = "e1000",\
 821        .property = "mitigation",\
 822        .value    = "off",\
 823    },{\
 824        .driver   = "qemu64-" TYPE_X86_CPU,\
 825        .property = "model",\
 826        .value    = stringify(2),\
 827    },{\
 828        .driver   = "qemu32-" TYPE_X86_CPU,\
 829        .property = "model",\
 830        .value    = stringify(3),\
 831    },{\
 832        .driver   = "i440FX-pcihost",\
 833        .property = "short_root_bus",\
 834        .value    = stringify(1),\
 835    },{\
 836        .driver   = "q35-pcihost",\
 837        .property = "short_root_bus",\
 838        .value    = stringify(1),\
 839    },
 840
 841#define PC_COMPAT_1_5 \
 842    PC_CPU_MODEL_IDS("1.5.0") \
 843    {\
 844        .driver   = "Conroe-" TYPE_X86_CPU,\
 845        .property = "model",\
 846        .value    = stringify(2),\
 847    },{\
 848        .driver   = "Conroe-" TYPE_X86_CPU,\
 849        .property = "min-level",\
 850        .value    = stringify(2),\
 851    },{\
 852        .driver   = "Penryn-" TYPE_X86_CPU,\
 853        .property = "model",\
 854        .value    = stringify(2),\
 855    },{\
 856        .driver   = "Penryn-" TYPE_X86_CPU,\
 857        .property = "min-level",\
 858        .value    = stringify(2),\
 859    },{\
 860        .driver   = "Nehalem-" TYPE_X86_CPU,\
 861        .property = "model",\
 862        .value    = stringify(2),\
 863    },{\
 864        .driver   = "Nehalem-" TYPE_X86_CPU,\
 865        .property = "min-level",\
 866        .value    = stringify(2),\
 867    },{\
 868        .driver   = "virtio-net-pci",\
 869        .property = "any_layout",\
 870        .value    = "off",\
 871    },{\
 872        .driver = TYPE_X86_CPU,\
 873        .property = "pmu",\
 874        .value = "on",\
 875    },{\
 876        .driver   = "i440FX-pcihost",\
 877        .property = "short_root_bus",\
 878        .value    = stringify(0),\
 879    },{\
 880        .driver   = "q35-pcihost",\
 881        .property = "short_root_bus",\
 882        .value    = stringify(0),\
 883    },
 884
 885#define PC_COMPAT_1_4 \
 886    PC_CPU_MODEL_IDS("1.4.0") \
 887    {\
 888        .driver   = "scsi-hd",\
 889        .property = "discard_granularity",\
 890        .value    = stringify(0),\
 891    },{\
 892        .driver   = "scsi-cd",\
 893        .property = "discard_granularity",\
 894        .value    = stringify(0),\
 895    },{\
 896        .driver   = "scsi-disk",\
 897        .property = "discard_granularity",\
 898        .value    = stringify(0),\
 899    },{\
 900        .driver   = "ide-hd",\
 901        .property = "discard_granularity",\
 902        .value    = stringify(0),\
 903    },{\
 904        .driver   = "ide-cd",\
 905        .property = "discard_granularity",\
 906        .value    = stringify(0),\
 907    },{\
 908        .driver   = "ide-drive",\
 909        .property = "discard_granularity",\
 910        .value    = stringify(0),\
 911    },{\
 912        .driver   = "virtio-blk-pci",\
 913        .property = "discard_granularity",\
 914        .value    = stringify(0),\
 915    },{\
 916        .driver   = "virtio-serial-pci",\
 917        .property = "vectors",\
 918        /* DEV_NVECTORS_UNSPECIFIED as a uint32_t string */\
 919        .value    = stringify(0xFFFFFFFF),\
 920    },{ \
 921        .driver   = "virtio-net-pci", \
 922        .property = "ctrl_guest_offloads", \
 923        .value    = "off", \
 924    },{\
 925        .driver   = "e1000",\
 926        .property = "romfile",\
 927        .value    = "pxe-e1000.rom",\
 928    },{\
 929        .driver   = "ne2k_pci",\
 930        .property = "romfile",\
 931        .value    = "pxe-ne2k_pci.rom",\
 932    },{\
 933        .driver   = "pcnet",\
 934        .property = "romfile",\
 935        .value    = "pxe-pcnet.rom",\
 936    },{\
 937        .driver   = "rtl8139",\
 938        .property = "romfile",\
 939        .value    = "pxe-rtl8139.rom",\
 940    },{\
 941        .driver   = "virtio-net-pci",\
 942        .property = "romfile",\
 943        .value    = "pxe-virtio.rom",\
 944    },{\
 945        .driver   = "486-" TYPE_X86_CPU,\
 946        .property = "model",\
 947        .value    = stringify(0),\
 948    },\
 949    {\
 950        .driver = "n270" "-" TYPE_X86_CPU,\
 951        .property = "movbe",\
 952        .value = "off",\
 953    },\
 954    {\
 955        .driver = "Westmere" "-" TYPE_X86_CPU,\
 956        .property = "pclmulqdq",\
 957        .value = "off",\
 958    },
 959
 960#define DEFINE_PC_MACHINE(suffix, namestr, initfn, optsfn) \
 961    static void pc_machine_##suffix##_class_init(ObjectClass *oc, void *data) \
 962    { \
 963        MachineClass *mc = MACHINE_CLASS(oc); \
 964        optsfn(mc); \
 965        mc->init = initfn; \
 966    } \
 967    static const TypeInfo pc_machine_type_##suffix = { \
 968        .name       = namestr TYPE_MACHINE_SUFFIX, \
 969        .parent     = TYPE_PC_MACHINE, \
 970        .class_init = pc_machine_##suffix##_class_init, \
 971    }; \
 972    static void pc_machine_init_##suffix(void) \
 973    { \
 974        type_register(&pc_machine_type_##suffix); \
 975    } \
 976    type_init(pc_machine_init_##suffix)
 977
 978extern void igd_passthrough_isa_bridge_create(PCIBus *bus, uint16_t gpu_dev_id);
 979#endif
 980