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/boards.h"
  17#include "hw/compat.h"
  18#include "hw/mem/pc-dimm.h"
  19#include "hw/mem/nvdimm.h"
  20
  21#define HPET_INTCAP "hpet-intcap"
  22
  23#ifdef CONFIG_KVM
  24#define kvm_pit_in_kernel() \
  25    (kvm_irqchip_in_kernel() && !kvm_irqchip_is_split())
  26#define kvm_pic_in_kernel()  \
  27    (kvm_irqchip_in_kernel() && !kvm_irqchip_is_split())
  28#define kvm_ioapic_in_kernel() \
  29    (kvm_irqchip_in_kernel() && !kvm_irqchip_is_split())
  30#else
  31#define kvm_pit_in_kernel()      0
  32#define kvm_pic_in_kernel()      0
  33#define kvm_ioapic_in_kernel()   0
  34#endif
  35
  36/**
  37 * PCMachineState:
  38 * @acpi_dev: link to ACPI PM device that performs ACPI hotplug handling
  39 */
  40struct PCMachineState {
  41    /*< private >*/
  42    MachineState parent_obj;
  43
  44    /* <public> */
  45
  46    /* State for other subsystems/APIs: */
  47    MemoryHotplugState hotplug_memory;
  48    Notifier machine_done;
  49
  50    /* Pointers to devices and objects: */
  51    HotplugHandler *acpi_dev;
  52    ISADevice *rtc;
  53    PCIBus *bus;
  54    FWCfgState *fw_cfg;
  55
  56    /* Configuration options: */
  57    uint64_t max_ram_below_4g;
  58    OnOffAuto vmport;
  59    OnOffAuto smm;
  60
  61    AcpiNVDIMMState acpi_nvdimm_state;
  62
  63    /* RAM information (sizes, addresses, configuration): */
  64    ram_addr_t below_4g_mem_size, above_4g_mem_size;
  65
  66    /* CPU and apic information: */
  67    bool apic_xrupt_override;
  68    unsigned apic_id_limit;
  69    CPUArchIdList *possible_cpus;
  70
  71    /* NUMA information: */
  72    uint64_t numa_nodes;
  73    uint64_t *node_mem;
  74    uint64_t *node_cpu;
  75};
  76
  77#define PC_MACHINE_ACPI_DEVICE_PROP "acpi-device"
  78#define PC_MACHINE_MEMHP_REGION_SIZE "hotplug-memory-region-size"
  79#define PC_MACHINE_MAX_RAM_BELOW_4G "max-ram-below-4g"
  80#define PC_MACHINE_VMPORT           "vmport"
  81#define PC_MACHINE_SMM              "smm"
  82#define PC_MACHINE_NVDIMM           "nvdimm"
  83
  84/**
  85 * PCMachineClass:
  86 *
  87 * Methods:
  88 *
  89 * @get_hotplug_handler: pointer to parent class callback @get_hotplug_handler
  90 *
  91 * Compat fields:
  92 *
  93 * @enforce_aligned_dimm: check that DIMM's address/size is aligned by
  94 *                        backend's alignment value if provided
  95 * @acpi_data_size: Size of the chunk of memory at the top of RAM
  96 *                  for the BIOS ACPI tables and other BIOS
  97 *                  datastructures.
  98 * @gigabyte_align: Make sure that guest addresses aligned at
  99 *                  1Gbyte boundaries get mapped to host
 100 *                  addresses aligned at 1Gbyte boundaries. This
 101 *                  way we can use 1GByte pages in the host.
 102 *
 103 */
 104struct PCMachineClass {
 105    /*< private >*/
 106    MachineClass parent_class;
 107
 108    /*< public >*/
 109
 110    /* Methods: */
 111    HotplugHandler *(*get_hotplug_handler)(MachineState *machine,
 112                                           DeviceState *dev);
 113
 114    /* Device configuration: */
 115    bool pci_enabled;
 116    bool kvmclock_enabled;
 117
 118    /* Compat options: */
 119
 120    /* ACPI compat: */
 121    bool has_acpi_build;
 122    bool rsdp_in_ram;
 123    int legacy_acpi_table_size;
 124    unsigned acpi_data_size;
 125
 126    /* SMBIOS compat: */
 127    bool smbios_defaults;
 128    bool smbios_legacy_mode;
 129    bool smbios_uuid_encoded;
 130
 131    /* RAM / address space compat: */
 132    bool gigabyte_align;
 133    bool has_reserved_memory;
 134    bool enforce_aligned_dimm;
 135    bool broken_reserved_end;
 136
 137    /* TSC rate migration: */
 138    bool save_tsc_khz;
 139};
 140
 141#define TYPE_PC_MACHINE "generic-pc-machine"
 142#define PC_MACHINE(obj) \
 143    OBJECT_CHECK(PCMachineState, (obj), TYPE_PC_MACHINE)
 144#define PC_MACHINE_GET_CLASS(obj) \
 145    OBJECT_GET_CLASS(PCMachineClass, (obj), TYPE_PC_MACHINE)
 146#define PC_MACHINE_CLASS(klass) \
 147    OBJECT_CLASS_CHECK(PCMachineClass, (klass), TYPE_PC_MACHINE)
 148
 149/* PC-style peripherals (also used by other machines).  */
 150
 151typedef struct PcPciInfo {
 152    Range w32;
 153    Range w64;
 154} PcPciInfo;
 155
 156#define ACPI_PM_PROP_S3_DISABLED "disable_s3"
 157#define ACPI_PM_PROP_S4_DISABLED "disable_s4"
 158#define ACPI_PM_PROP_S4_VAL "s4_val"
 159#define ACPI_PM_PROP_SCI_INT "sci_int"
 160#define ACPI_PM_PROP_ACPI_ENABLE_CMD "acpi_enable_cmd"
 161#define ACPI_PM_PROP_ACPI_DISABLE_CMD "acpi_disable_cmd"
 162#define ACPI_PM_PROP_PM_IO_BASE "pm_io_base"
 163#define ACPI_PM_PROP_GPE0_BLK "gpe0_blk"
 164#define ACPI_PM_PROP_GPE0_BLK_LEN "gpe0_blk_len"
 165#define ACPI_PM_PROP_TCO_ENABLED "enable_tco"
 166
 167/* parallel.c */
 168
 169void parallel_hds_isa_init(ISABus *bus, int n);
 170
 171bool parallel_mm_init(MemoryRegion *address_space,
 172                      hwaddr base, int it_shift, qemu_irq irq,
 173                      CharDriverState *chr);
 174
 175/* i8259.c */
 176
 177extern DeviceState *isa_pic;
 178qemu_irq *i8259_init(ISABus *bus, qemu_irq parent_irq);
 179qemu_irq *kvm_i8259_init(ISABus *bus);
 180int pic_read_irq(DeviceState *d);
 181int pic_get_output(DeviceState *d);
 182void hmp_info_pic(Monitor *mon, const QDict *qdict);
 183void hmp_info_irq(Monitor *mon, const QDict *qdict);
 184
 185/* ioapic.c */
 186
 187void kvm_ioapic_dump_state(Monitor *mon, const QDict *qdict);
 188void ioapic_dump_state(Monitor *mon, const QDict *qdict);
 189
 190/* Global System Interrupts */
 191
 192#define GSI_NUM_PINS IOAPIC_NUM_PINS
 193
 194typedef struct GSIState {
 195    qemu_irq i8259_irq[ISA_NUM_IRQS];
 196    qemu_irq ioapic_irq[IOAPIC_NUM_PINS];
 197} GSIState;
 198
 199void gsi_handler(void *opaque, int n, int level);
 200
 201/* vmport.c */
 202typedef uint32_t (VMPortReadFunc)(void *opaque, uint32_t address);
 203
 204static inline void vmport_init(ISABus *bus)
 205{
 206    isa_create_simple(bus, "vmport");
 207}
 208
 209void vmport_register(unsigned char command, VMPortReadFunc *func, void *opaque);
 210void vmmouse_get_data(uint32_t *data);
 211void vmmouse_set_data(const uint32_t *data);
 212
 213/* pckbd.c */
 214
 215void i8042_init(qemu_irq kbd_irq, qemu_irq mouse_irq, uint32_t io_base);
 216void i8042_mm_init(qemu_irq kbd_irq, qemu_irq mouse_irq,
 217                   MemoryRegion *region, ram_addr_t size,
 218                   hwaddr mask);
 219void i8042_isa_mouse_fake_event(void *opaque);
 220void i8042_setup_a20_line(ISADevice *dev, qemu_irq *a20_out);
 221
 222/* pc.c */
 223extern int fd_bootchk;
 224
 225bool pc_machine_is_smm_enabled(PCMachineState *pcms);
 226void pc_register_ferr_irq(qemu_irq irq);
 227void pc_acpi_smi_interrupt(void *opaque, int irq, int level);
 228
 229void pc_cpus_init(PCMachineState *pcms);
 230void pc_hot_add_cpu(const int64_t id, Error **errp);
 231void pc_acpi_init(const char *default_dsdt);
 232
 233void pc_guest_info_init(PCMachineState *pcms);
 234
 235#define PCI_HOST_PROP_PCI_HOLE_START   "pci-hole-start"
 236#define PCI_HOST_PROP_PCI_HOLE_END     "pci-hole-end"
 237#define PCI_HOST_PROP_PCI_HOLE64_START "pci-hole64-start"
 238#define PCI_HOST_PROP_PCI_HOLE64_END   "pci-hole64-end"
 239#define PCI_HOST_PROP_PCI_HOLE64_SIZE  "pci-hole64-size"
 240#define DEFAULT_PCI_HOLE64_SIZE (~0x0ULL)
 241
 242
 243void pc_pci_as_mapping_init(Object *owner, MemoryRegion *system_memory,
 244                            MemoryRegion *pci_address_space);
 245
 246void xen_load_linux(PCMachineState *pcms);
 247void pc_memory_init(PCMachineState *pcms,
 248                    MemoryRegion *system_memory,
 249                    MemoryRegion *rom_memory,
 250                    MemoryRegion **ram_memory);
 251qemu_irq pc_allocate_cpu_irq(void);
 252DeviceState *pc_vga_init(ISABus *isa_bus, PCIBus *pci_bus);
 253void pc_basic_device_init(ISABus *isa_bus, qemu_irq *gsi,
 254                          ISADevice **rtc_state,
 255                          bool create_fdctrl,
 256                          bool no_vmport,
 257                          uint32_t hpet_irqs);
 258void pc_init_ne2k_isa(ISABus *bus, NICInfo *nd);
 259void pc_cmos_init(PCMachineState *pcms,
 260                  BusState *ide0, BusState *ide1,
 261                  ISADevice *s);
 262void pc_nic_init(ISABus *isa_bus, PCIBus *pci_bus);
 263void pc_pci_device_init(PCIBus *pci_bus);
 264
 265typedef void (*cpu_set_smm_t)(int smm, void *arg);
 266
 267void ioapic_init_gsi(GSIState *gsi_state, const char *parent_name);
 268
 269ISADevice *pc_find_fdc0(void);
 270int cmos_get_fd_drive_type(FloppyDriveType fd0);
 271
 272#define FW_CFG_IO_BASE     0x510
 273
 274/* acpi_piix.c */
 275
 276I2CBus *piix4_pm_init(PCIBus *bus, int devfn, uint32_t smb_io_base,
 277                      qemu_irq sci_irq, qemu_irq smi_irq,
 278                      int smm_enabled, DeviceState **piix4_pm);
 279void piix4_smbus_register_device(SMBusDevice *dev, uint8_t addr);
 280
 281/* hpet.c */
 282extern int no_hpet;
 283
 284/* piix_pci.c */
 285struct PCII440FXState;
 286typedef struct PCII440FXState PCII440FXState;
 287
 288#define TYPE_I440FX_PCI_HOST_BRIDGE "i440FX-pcihost"
 289#define TYPE_I440FX_PCI_DEVICE "i440FX"
 290
 291#define TYPE_IGD_PASSTHROUGH_I440FX_PCI_DEVICE "igd-passthrough-i440FX"
 292
 293PCIBus *i440fx_init(const char *host_type, const char *pci_type,
 294                    PCII440FXState **pi440fx_state, int *piix_devfn,
 295                    ISABus **isa_bus, qemu_irq *pic,
 296                    MemoryRegion *address_space_mem,
 297                    MemoryRegion *address_space_io,
 298                    ram_addr_t ram_size,
 299                    ram_addr_t below_4g_mem_size,
 300                    ram_addr_t above_4g_mem_size,
 301                    MemoryRegion *pci_memory,
 302                    MemoryRegion *ram_memory);
 303
 304PCIBus *find_i440fx(void);
 305/* piix4.c */
 306extern PCIDevice *piix4_dev;
 307int piix4_init(PCIBus *bus, ISABus **isa_bus, int devfn);
 308
 309/* vga.c */
 310enum vga_retrace_method {
 311    VGA_RETRACE_DUMB,
 312    VGA_RETRACE_PRECISE
 313};
 314
 315extern enum vga_retrace_method vga_retrace_method;
 316
 317int isa_vga_mm_init(hwaddr vram_base,
 318                    hwaddr ctrl_base, int it_shift,
 319                    MemoryRegion *address_space);
 320
 321/* ne2000.c */
 322static inline bool isa_ne2000_init(ISABus *bus, int base, int irq, NICInfo *nd)
 323{
 324    DeviceState *dev;
 325    ISADevice *isadev;
 326
 327    qemu_check_nic_model(nd, "ne2k_isa");
 328
 329    isadev = isa_try_create(bus, "ne2k_isa");
 330    if (!isadev) {
 331        return false;
 332    }
 333    dev = DEVICE(isadev);
 334    qdev_prop_set_uint32(dev, "iobase", base);
 335    qdev_prop_set_uint32(dev, "irq",    irq);
 336    qdev_set_nic_properties(dev, nd);
 337    qdev_init_nofail(dev);
 338    return true;
 339}
 340
 341/* pc_sysfw.c */
 342void pc_system_firmware_init(MemoryRegion *rom_memory,
 343                             bool isapc_ram_fw);
 344
 345/* pvpanic.c */
 346uint16_t pvpanic_port(void);
 347
 348/* e820 types */
 349#define E820_RAM        1
 350#define E820_RESERVED   2
 351#define E820_ACPI       3
 352#define E820_NVS        4
 353#define E820_UNUSABLE   5
 354
 355int e820_add_entry(uint64_t, uint64_t, uint32_t);
 356int e820_get_num_entries(void);
 357bool e820_get_entry(int, uint32_t, uint64_t *, uint64_t *);
 358
 359#define PC_COMPAT_2_5 \
 360    HW_COMPAT_2_5
 361
 362#define PC_COMPAT_2_4 \
 363    PC_COMPAT_2_5 \
 364    HW_COMPAT_2_4 \
 365    {\
 366        .driver   = "Haswell-" TYPE_X86_CPU,\
 367        .property = "abm",\
 368        .value    = "off",\
 369    },\
 370    {\
 371        .driver   = "Haswell-noTSX-" TYPE_X86_CPU,\
 372        .property = "abm",\
 373        .value    = "off",\
 374    },\
 375    {\
 376        .driver   = "Broadwell-" TYPE_X86_CPU,\
 377        .property = "abm",\
 378        .value    = "off",\
 379    },\
 380    {\
 381        .driver   = "Broadwell-noTSX-" TYPE_X86_CPU,\
 382        .property = "abm",\
 383        .value    = "off",\
 384    },\
 385    {\
 386        .driver   = "host" "-" TYPE_X86_CPU,\
 387        .property = "host-cache-info",\
 388        .value    = "on",\
 389    },\
 390    {\
 391        .driver   = TYPE_X86_CPU,\
 392        .property = "check",\
 393        .value    = "off",\
 394    },\
 395    {\
 396        .driver   = "qemu64" "-" TYPE_X86_CPU,\
 397        .property = "sse4a",\
 398        .value    = "on",\
 399    },\
 400    {\
 401        .driver   = "qemu64" "-" TYPE_X86_CPU,\
 402        .property = "abm",\
 403        .value    = "on",\
 404    },\
 405    {\
 406        .driver   = "qemu64" "-" TYPE_X86_CPU,\
 407        .property = "popcnt",\
 408        .value    = "on",\
 409    },\
 410    {\
 411        .driver   = "qemu32" "-" TYPE_X86_CPU,\
 412        .property = "popcnt",\
 413        .value    = "on",\
 414    },{\
 415        .driver   = "Opteron_G2" "-" TYPE_X86_CPU,\
 416        .property = "rdtscp",\
 417        .value    = "on",\
 418    },{\
 419        .driver   = "Opteron_G3" "-" TYPE_X86_CPU,\
 420        .property = "rdtscp",\
 421        .value    = "on",\
 422    },{\
 423        .driver   = "Opteron_G4" "-" TYPE_X86_CPU,\
 424        .property = "rdtscp",\
 425        .value    = "on",\
 426    },{\
 427        .driver   = "Opteron_G5" "-" TYPE_X86_CPU,\
 428        .property = "rdtscp",\
 429        .value    = "on",\
 430    },
 431
 432
 433#define PC_COMPAT_2_3 \
 434    PC_COMPAT_2_4 \
 435    HW_COMPAT_2_3 \
 436    {\
 437        .driver   = TYPE_X86_CPU,\
 438        .property = "arat",\
 439        .value    = "off",\
 440    },{\
 441        .driver   = "qemu64" "-" TYPE_X86_CPU,\
 442        .property = "level",\
 443        .value    = stringify(4),\
 444    },{\
 445        .driver   = "kvm64" "-" TYPE_X86_CPU,\
 446        .property = "level",\
 447        .value    = stringify(5),\
 448    },{\
 449        .driver   = "pentium3" "-" TYPE_X86_CPU,\
 450        .property = "level",\
 451        .value    = stringify(2),\
 452    },{\
 453        .driver   = "n270" "-" TYPE_X86_CPU,\
 454        .property = "level",\
 455        .value    = stringify(5),\
 456    },{\
 457        .driver   = "Conroe" "-" TYPE_X86_CPU,\
 458        .property = "level",\
 459        .value    = stringify(4),\
 460    },{\
 461        .driver   = "Penryn" "-" TYPE_X86_CPU,\
 462        .property = "level",\
 463        .value    = stringify(4),\
 464    },{\
 465        .driver   = "Nehalem" "-" TYPE_X86_CPU,\
 466        .property = "level",\
 467        .value    = stringify(4),\
 468    },{\
 469        .driver   = "n270" "-" TYPE_X86_CPU,\
 470        .property = "xlevel",\
 471        .value    = stringify(0x8000000a),\
 472    },{\
 473        .driver   = "Penryn" "-" TYPE_X86_CPU,\
 474        .property = "xlevel",\
 475        .value    = stringify(0x8000000a),\
 476    },{\
 477        .driver   = "Conroe" "-" TYPE_X86_CPU,\
 478        .property = "xlevel",\
 479        .value    = stringify(0x8000000a),\
 480    },{\
 481        .driver   = "Nehalem" "-" TYPE_X86_CPU,\
 482        .property = "xlevel",\
 483        .value    = stringify(0x8000000a),\
 484    },{\
 485        .driver   = "Westmere" "-" TYPE_X86_CPU,\
 486        .property = "xlevel",\
 487        .value    = stringify(0x8000000a),\
 488    },{\
 489        .driver   = "SandyBridge" "-" TYPE_X86_CPU,\
 490        .property = "xlevel",\
 491        .value    = stringify(0x8000000a),\
 492    },{\
 493        .driver   = "IvyBridge" "-" TYPE_X86_CPU,\
 494        .property = "xlevel",\
 495        .value    = stringify(0x8000000a),\
 496    },{\
 497        .driver   = "Haswell" "-" TYPE_X86_CPU,\
 498        .property = "xlevel",\
 499        .value    = stringify(0x8000000a),\
 500    },{\
 501        .driver   = "Haswell-noTSX" "-" TYPE_X86_CPU,\
 502        .property = "xlevel",\
 503        .value    = stringify(0x8000000a),\
 504    },{\
 505        .driver   = "Broadwell" "-" TYPE_X86_CPU,\
 506        .property = "xlevel",\
 507        .value    = stringify(0x8000000a),\
 508    },{\
 509        .driver   = "Broadwell-noTSX" "-" TYPE_X86_CPU,\
 510        .property = "xlevel",\
 511        .value    = stringify(0x8000000a),\
 512    },
 513
 514#define PC_COMPAT_2_2 \
 515    PC_COMPAT_2_3 \
 516    HW_COMPAT_2_2 \
 517    {\
 518        .driver = "kvm64" "-" TYPE_X86_CPU,\
 519        .property = "vme",\
 520        .value = "off",\
 521    },\
 522    {\
 523        .driver = "kvm32" "-" TYPE_X86_CPU,\
 524        .property = "vme",\
 525        .value = "off",\
 526    },\
 527    {\
 528        .driver = "Conroe" "-" TYPE_X86_CPU,\
 529        .property = "vme",\
 530        .value = "off",\
 531    },\
 532    {\
 533        .driver = "Penryn" "-" TYPE_X86_CPU,\
 534        .property = "vme",\
 535        .value = "off",\
 536    },\
 537    {\
 538        .driver = "Nehalem" "-" TYPE_X86_CPU,\
 539        .property = "vme",\
 540        .value = "off",\
 541    },\
 542    {\
 543        .driver = "Westmere" "-" TYPE_X86_CPU,\
 544        .property = "vme",\
 545        .value = "off",\
 546    },\
 547    {\
 548        .driver = "SandyBridge" "-" TYPE_X86_CPU,\
 549        .property = "vme",\
 550        .value = "off",\
 551    },\
 552    {\
 553        .driver = "Haswell" "-" TYPE_X86_CPU,\
 554        .property = "vme",\
 555        .value = "off",\
 556    },\
 557    {\
 558        .driver = "Broadwell" "-" TYPE_X86_CPU,\
 559        .property = "vme",\
 560        .value = "off",\
 561    },\
 562    {\
 563        .driver = "Opteron_G1" "-" TYPE_X86_CPU,\
 564        .property = "vme",\
 565        .value = "off",\
 566    },\
 567    {\
 568        .driver = "Opteron_G2" "-" TYPE_X86_CPU,\
 569        .property = "vme",\
 570        .value = "off",\
 571    },\
 572    {\
 573        .driver = "Opteron_G3" "-" TYPE_X86_CPU,\
 574        .property = "vme",\
 575        .value = "off",\
 576    },\
 577    {\
 578        .driver = "Opteron_G4" "-" TYPE_X86_CPU,\
 579        .property = "vme",\
 580        .value = "off",\
 581    },\
 582    {\
 583        .driver = "Opteron_G5" "-" TYPE_X86_CPU,\
 584        .property = "vme",\
 585        .value = "off",\
 586    },\
 587    {\
 588        .driver = "Haswell" "-" TYPE_X86_CPU,\
 589        .property = "f16c",\
 590        .value = "off",\
 591    },\
 592    {\
 593        .driver = "Haswell" "-" TYPE_X86_CPU,\
 594        .property = "rdrand",\
 595        .value = "off",\
 596    },\
 597    {\
 598        .driver = "Broadwell" "-" TYPE_X86_CPU,\
 599        .property = "f16c",\
 600        .value = "off",\
 601    },\
 602    {\
 603        .driver = "Broadwell" "-" TYPE_X86_CPU,\
 604        .property = "rdrand",\
 605        .value = "off",\
 606    },
 607
 608#define PC_COMPAT_2_1 \
 609    PC_COMPAT_2_2 \
 610    HW_COMPAT_2_1 \
 611    {\
 612        .driver = "coreduo" "-" TYPE_X86_CPU,\
 613        .property = "vmx",\
 614        .value = "on",\
 615    },\
 616    {\
 617        .driver = "core2duo" "-" TYPE_X86_CPU,\
 618        .property = "vmx",\
 619        .value = "on",\
 620    },
 621
 622#define PC_COMPAT_2_0 \
 623    PC_COMPAT_2_1 \
 624    {\
 625        .driver   = "virtio-scsi-pci",\
 626        .property = "any_layout",\
 627        .value    = "off",\
 628    },{\
 629        .driver   = "PIIX4_PM",\
 630        .property = "memory-hotplug-support",\
 631        .value    = "off",\
 632    },\
 633    {\
 634        .driver   = "apic",\
 635        .property = "version",\
 636        .value    = stringify(0x11),\
 637    },\
 638    {\
 639        .driver   = "nec-usb-xhci",\
 640        .property = "superspeed-ports-first",\
 641        .value    = "off",\
 642    },\
 643    {\
 644        .driver   = "nec-usb-xhci",\
 645        .property = "force-pcie-endcap",\
 646        .value    = "on",\
 647    },\
 648    {\
 649        .driver   = "pci-serial",\
 650        .property = "prog_if",\
 651        .value    = stringify(0),\
 652    },\
 653    {\
 654        .driver   = "pci-serial-2x",\
 655        .property = "prog_if",\
 656        .value    = stringify(0),\
 657    },\
 658    {\
 659        .driver   = "pci-serial-4x",\
 660        .property = "prog_if",\
 661        .value    = stringify(0),\
 662    },\
 663    {\
 664        .driver   = "virtio-net-pci",\
 665        .property = "guest_announce",\
 666        .value    = "off",\
 667    },\
 668    {\
 669        .driver   = "ICH9-LPC",\
 670        .property = "memory-hotplug-support",\
 671        .value    = "off",\
 672    },{\
 673        .driver   = "xio3130-downstream",\
 674        .property = COMPAT_PROP_PCP,\
 675        .value    = "off",\
 676    },{\
 677        .driver   = "ioh3420",\
 678        .property = COMPAT_PROP_PCP,\
 679        .value    = "off",\
 680    },
 681
 682#define PC_COMPAT_1_7 \
 683    PC_COMPAT_2_0 \
 684    {\
 685        .driver   = TYPE_USB_DEVICE,\
 686        .property = "msos-desc",\
 687        .value    = "no",\
 688    },\
 689    {\
 690        .driver   = "PIIX4_PM",\
 691        .property = "acpi-pci-hotplug-with-bridge-support",\
 692        .value    = "off",\
 693    },\
 694    {\
 695        .driver   = "hpet",\
 696        .property = HPET_INTCAP,\
 697        .value    = stringify(4),\
 698    },
 699
 700#define PC_COMPAT_1_6 \
 701    PC_COMPAT_1_7 \
 702    {\
 703        .driver   = "e1000",\
 704        .property = "mitigation",\
 705        .value    = "off",\
 706    },{\
 707        .driver   = "qemu64-" TYPE_X86_CPU,\
 708        .property = "model",\
 709        .value    = stringify(2),\
 710    },{\
 711        .driver   = "qemu32-" TYPE_X86_CPU,\
 712        .property = "model",\
 713        .value    = stringify(3),\
 714    },{\
 715        .driver   = "i440FX-pcihost",\
 716        .property = "short_root_bus",\
 717        .value    = stringify(1),\
 718    },{\
 719        .driver   = "q35-pcihost",\
 720        .property = "short_root_bus",\
 721        .value    = stringify(1),\
 722    },
 723
 724#define PC_COMPAT_1_5 \
 725    PC_COMPAT_1_6 \
 726    {\
 727        .driver   = "Conroe-" TYPE_X86_CPU,\
 728        .property = "model",\
 729        .value    = stringify(2),\
 730    },{\
 731        .driver   = "Conroe-" TYPE_X86_CPU,\
 732        .property = "level",\
 733        .value    = stringify(2),\
 734    },{\
 735        .driver   = "Penryn-" TYPE_X86_CPU,\
 736        .property = "model",\
 737        .value    = stringify(2),\
 738    },{\
 739        .driver   = "Penryn-" TYPE_X86_CPU,\
 740        .property = "level",\
 741        .value    = stringify(2),\
 742    },{\
 743        .driver   = "Nehalem-" TYPE_X86_CPU,\
 744        .property = "model",\
 745        .value    = stringify(2),\
 746    },{\
 747        .driver   = "Nehalem-" TYPE_X86_CPU,\
 748        .property = "level",\
 749        .value    = stringify(2),\
 750    },{\
 751        .driver   = "virtio-net-pci",\
 752        .property = "any_layout",\
 753        .value    = "off",\
 754    },{\
 755        .driver = TYPE_X86_CPU,\
 756        .property = "pmu",\
 757        .value = "on",\
 758    },{\
 759        .driver   = "i440FX-pcihost",\
 760        .property = "short_root_bus",\
 761        .value    = stringify(0),\
 762    },{\
 763        .driver   = "q35-pcihost",\
 764        .property = "short_root_bus",\
 765        .value    = stringify(0),\
 766    },
 767
 768#define PC_COMPAT_1_4 \
 769    PC_COMPAT_1_5 \
 770    {\
 771        .driver   = "scsi-hd",\
 772        .property = "discard_granularity",\
 773        .value    = stringify(0),\
 774    },{\
 775        .driver   = "scsi-cd",\
 776        .property = "discard_granularity",\
 777        .value    = stringify(0),\
 778    },{\
 779        .driver   = "scsi-disk",\
 780        .property = "discard_granularity",\
 781        .value    = stringify(0),\
 782    },{\
 783        .driver   = "ide-hd",\
 784        .property = "discard_granularity",\
 785        .value    = stringify(0),\
 786    },{\
 787        .driver   = "ide-cd",\
 788        .property = "discard_granularity",\
 789        .value    = stringify(0),\
 790    },{\
 791        .driver   = "ide-drive",\
 792        .property = "discard_granularity",\
 793        .value    = stringify(0),\
 794    },{\
 795        .driver   = "virtio-blk-pci",\
 796        .property = "discard_granularity",\
 797        .value    = stringify(0),\
 798    },{\
 799        .driver   = "virtio-serial-pci",\
 800        .property = "vectors",\
 801        /* DEV_NVECTORS_UNSPECIFIED as a uint32_t string */\
 802        .value    = stringify(0xFFFFFFFF),\
 803    },{ \
 804        .driver   = "virtio-net-pci", \
 805        .property = "ctrl_guest_offloads", \
 806        .value    = "off", \
 807    },{\
 808        .driver   = "e1000",\
 809        .property = "romfile",\
 810        .value    = "pxe-e1000.rom",\
 811    },{\
 812        .driver   = "ne2k_pci",\
 813        .property = "romfile",\
 814        .value    = "pxe-ne2k_pci.rom",\
 815    },{\
 816        .driver   = "pcnet",\
 817        .property = "romfile",\
 818        .value    = "pxe-pcnet.rom",\
 819    },{\
 820        .driver   = "rtl8139",\
 821        .property = "romfile",\
 822        .value    = "pxe-rtl8139.rom",\
 823    },{\
 824        .driver   = "virtio-net-pci",\
 825        .property = "romfile",\
 826        .value    = "pxe-virtio.rom",\
 827    },{\
 828        .driver   = "486-" TYPE_X86_CPU,\
 829        .property = "model",\
 830        .value    = stringify(0),\
 831    },\
 832    {\
 833        .driver = "n270" "-" TYPE_X86_CPU,\
 834        .property = "movbe",\
 835        .value = "off",\
 836    },\
 837    {\
 838        .driver = "Westmere" "-" TYPE_X86_CPU,\
 839        .property = "pclmulqdq",\
 840        .value = "off",\
 841    },
 842
 843#define DEFINE_PC_MACHINE(suffix, namestr, initfn, optsfn) \
 844    static void pc_machine_##suffix##_class_init(ObjectClass *oc, void *data) \
 845    { \
 846        MachineClass *mc = MACHINE_CLASS(oc); \
 847        optsfn(mc); \
 848        mc->name = namestr; \
 849        mc->init = initfn; \
 850    } \
 851    static const TypeInfo pc_machine_type_##suffix = { \
 852        .name       = namestr TYPE_MACHINE_SUFFIX, \
 853        .parent     = TYPE_PC_MACHINE, \
 854        .class_init = pc_machine_##suffix##_class_init, \
 855    }; \
 856    static void pc_machine_init_##suffix(void) \
 857    { \
 858        type_register(&pc_machine_type_##suffix); \
 859    } \
 860    type_init(pc_machine_init_##suffix)
 861
 862extern void igd_passthrough_isa_bridge_create(PCIBus *bus, uint16_t gpu_dev_id);
 863#endif
 864