pc.h 25.6 KB
Newer Older
P
pbrook 已提交
1 2
#ifndef HW_PC_H
#define HW_PC_H
A
aliguori 已提交
3 4

#include "qemu-common.h"
5
#include "exec/memory.h"
6
#include "hw/boards.h"
P
Paolo Bonzini 已提交
7 8
#include "hw/isa/isa.h"
#include "hw/block/fdc.h"
P
Paolo Bonzini 已提交
9
#include "net/net.h"
P
Paolo Bonzini 已提交
10
#include "hw/i386/ioapic.h"
A
aliguori 已提交
11

12
#include "qemu/range.h"
M
Michael S. Tsirkin 已提交
13 14 15
#include "qemu/bitmap.h"
#include "sysemu/sysemu.h"
#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 22
#define HPET_INTCAP "hpet-intcap"

23 24
/**
 * PCMachineState:
25
 * @acpi_dev: link to ACPI PM device that performs ACPI hotplug handling
26
 * @boot_cpus: number of present VCPUs
27
 */
28 29 30
struct PCMachineState {
    /*< private >*/
    MachineState parent_obj;
31 32

    /* <public> */
33 34

    /* State for other subsystems/APIs: */
35
    MemoryHotplugState hotplug_memory;
36
    Notifier machine_done;
37

38
    /* Pointers to devices and objects: */
39
    HotplugHandler *acpi_dev;
G
Gu Zheng 已提交
40
    ISADevice *rtc;
41
    PCIBus *bus;
42
    FWCfgState *fw_cfg;
M
Marc-André Lureau 已提交
43
    qemu_irq *gsi;
44

45
    /* Configuration options: */
46
    uint64_t max_ram_below_4g;
47
    OnOffAuto vmport;
P
Paolo Bonzini 已提交
48
    OnOffAuto smm;
49 50

    AcpiNVDIMMState acpi_nvdimm_state;
51

52
    bool acpi_build_enabled;
C
Chao Peng 已提交
53
    bool smbus;
C
Chao Peng 已提交
54
    bool sata;
C
Chao Peng 已提交
55
    bool pit;
56

57
    /* RAM information (sizes, addresses, configuration): */
58
    ram_addr_t below_4g_mem_size, above_4g_mem_size;
59 60 61 62

    /* CPU and apic information: */
    bool apic_xrupt_override;
    unsigned apic_id_limit;
63
    uint16_t boot_cpus;
64 65 66 67

    /* NUMA information: */
    uint64_t numa_nodes;
    uint64_t *node_mem;
68 69 70 71

    /* Address space used by IOAPIC device. All IOAPIC interrupts
     * will be translated to MSI messages in the address space. */
    AddressSpace *ioapic_as;
72 73
};

74
#define PC_MACHINE_ACPI_DEVICE_PROP "acpi-device"
75
#define PC_MACHINE_MEMHP_REGION_SIZE "hotplug-memory-region-size"
76
#define PC_MACHINE_MAX_RAM_BELOW_4G "max-ram-below-4g"
77
#define PC_MACHINE_VMPORT           "vmport"
P
Paolo Bonzini 已提交
78
#define PC_MACHINE_SMM              "smm"
79
#define PC_MACHINE_NVDIMM           "nvdimm"
C
Chao Peng 已提交
80
#define PC_MACHINE_SMBUS            "smbus"
C
Chao Peng 已提交
81
#define PC_MACHINE_SATA             "sata"
C
Chao Peng 已提交
82
#define PC_MACHINE_PIT              "pit"
83

84 85
/**
 * PCMachineClass:
86 87 88
 *
 * Methods:
 *
89
 * @get_hotplug_handler: pointer to parent class callback @get_hotplug_handler
90 91 92
 *
 * Compat fields:
 *
93 94
 * @enforce_aligned_dimm: check that DIMM's address/size is aligned by
 *                        backend's alignment value if provided
95 96 97 98 99 100 101 102
 * @acpi_data_size: Size of the chunk of memory at the top of RAM
 *                  for the BIOS ACPI tables and other BIOS
 *                  datastructures.
 * @gigabyte_align: 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.
 *
103
 */
104 105 106
struct PCMachineClass {
    /*< private >*/
    MachineClass parent_class;
107 108

    /*< public >*/
109 110

    /* Methods: */
111 112
    HotplugHandler *(*get_hotplug_handler)(MachineState *machine,
                                           DeviceState *dev);
113

114
    /* Device configuration: */
115
    bool pci_enabled;
116 117 118 119 120
    bool kvmclock_enabled;

    /* Compat options: */

    /* ACPI compat: */
121 122
    bool has_acpi_build;
    bool rsdp_in_ram;
123 124 125 126
    int legacy_acpi_table_size;
    unsigned acpi_data_size;

    /* SMBIOS compat: */
127 128 129
    bool smbios_defaults;
    bool smbios_legacy_mode;
    bool smbios_uuid_encoded;
130 131

    /* RAM / address space compat: */
132 133
    bool gigabyte_align;
    bool has_reserved_memory;
134
    bool enforce_aligned_dimm;
135
    bool broken_reserved_end;
136 137 138

    /* TSC rate migration: */
    bool save_tsc_khz;
139 140
    /* generate legacy CPU hotplug AML */
    bool legacy_cpu_hotplug;
141 142 143

    /* use DMA capable linuxboot option rom */
    bool linuxboot_dma_enabled;
144 145 146 147 148 149 150 151 152 153
};

#define TYPE_PC_MACHINE "generic-pc-machine"
#define PC_MACHINE(obj) \
    OBJECT_CHECK(PCMachineState, (obj), TYPE_PC_MACHINE)
#define PC_MACHINE_GET_CLASS(obj) \
    OBJECT_GET_CLASS(PCMachineClass, (obj), TYPE_PC_MACHINE)
#define PC_MACHINE_CLASS(klass) \
    OBJECT_CLASS_CHECK(PCMachineClass, (klass), TYPE_PC_MACHINE)

P
pbrook 已提交
154
/* parallel.c */
155 156

void parallel_hds_isa_init(ISABus *bus, int n);
B
Blue Swirl 已提交
157

A
Avi Kivity 已提交
158
bool parallel_mm_init(MemoryRegion *address_space,
A
Avi Kivity 已提交
159
                      hwaddr base, int it_shift, qemu_irq irq,
160
                      Chardev *chr);
P
pbrook 已提交
161 162 163

/* i8259.c */

164
extern DeviceState *isa_pic;
165
qemu_irq *i8259_init(ISABus *bus, qemu_irq parent_irq);
166
qemu_irq *kvm_i8259_init(ISABus *bus);
167 168
int pic_read_irq(DeviceState *d);
int pic_get_output(DeviceState *d);
P
pbrook 已提交
169

P
Pavel Butsykin 已提交
170 171 172
/* ioapic.c */

void kvm_ioapic_dump_state(Monitor *mon, const QDict *qdict);
173
void ioapic_dump_state(Monitor *mon, const QDict *qdict);
P
Pavel Butsykin 已提交
174

J
Jan Kiszka 已提交
175
/* Global System Interrupts */
B
Blue Swirl 已提交
176

J
Jan Kiszka 已提交
177
#define GSI_NUM_PINS IOAPIC_NUM_PINS
178

J
Jan Kiszka 已提交
179
typedef struct GSIState {
180
    qemu_irq i8259_irq[ISA_NUM_IRQS];
J
Jan Kiszka 已提交
181 182 183 184
    qemu_irq ioapic_irq[IOAPIC_NUM_PINS];
} GSIState;

void gsi_handler(void *opaque, int n, int level);
185

P
pbrook 已提交
186
/* vmport.c */
187
#define TYPE_VMPORT "vmport"
188 189
typedef uint32_t (VMPortReadFunc)(void *opaque, uint32_t address);

190
static inline void vmport_init(ISABus *bus)
B
Blue Swirl 已提交
191
{
192
    isa_create_simple(bus, TYPE_VMPORT);
B
Blue Swirl 已提交
193
}
194 195

void vmport_register(unsigned char command, VMPortReadFunc *func, void *opaque);
B
Blue Swirl 已提交
196 197
void vmmouse_get_data(uint32_t *data);
void vmmouse_set_data(const uint32_t *data);
P
pbrook 已提交
198 199

/* pckbd.c */
E
Efimov Vasily 已提交
200
#define I8042_A20_LINE "a20"
P
pbrook 已提交
201 202

void i8042_mm_init(qemu_irq kbd_irq, qemu_irq mouse_irq,
203
                   MemoryRegion *region, ram_addr_t size,
A
Avi Kivity 已提交
204
                   hwaddr mask);
B
Blue Swirl 已提交
205
void i8042_isa_mouse_fake_event(void *opaque);
206
void i8042_setup_a20_line(ISADevice *dev, qemu_irq a20_out);
P
pbrook 已提交
207 208 209 210

/* pc.c */
extern int fd_bootchk;

P
Paolo Bonzini 已提交
211
bool pc_machine_is_smm_enabled(PCMachineState *pcms);
212
void pc_register_ferr_irq(qemu_irq irq);
213 214
void pc_acpi_smi_interrupt(void *opaque, int irq, int level);

215
void pc_cpus_init(PCMachineState *pcms);
216
void pc_hot_add_cpu(const int64_t id, Error **errp);
G
Gerd Hoffmann 已提交
217
void pc_acpi_init(const char *default_dsdt);
218

219
void pc_guest_info_init(PCMachineState *pcms);
220

221 222 223 224 225
#define PCI_HOST_PROP_PCI_HOLE_START   "pci-hole-start"
#define PCI_HOST_PROP_PCI_HOLE_END     "pci-hole-end"
#define PCI_HOST_PROP_PCI_HOLE64_START "pci-hole64-start"
#define PCI_HOST_PROP_PCI_HOLE64_END   "pci-hole64-end"
#define PCI_HOST_PROP_PCI_HOLE64_SIZE  "pci-hole64-size"
226 227
#define PCI_HOST_BELOW_4G_MEM_SIZE     "below-4g-mem-size"
#define PCI_HOST_ABOVE_4G_MEM_SIZE     "above-4g-mem-size"
228

229

230 231
void pc_pci_as_mapping_init(Object *owner, MemoryRegion *system_memory,
                            MemoryRegion *pci_address_space);
232

233
void xen_load_linux(PCMachineState *pcms);
234 235 236 237
void pc_memory_init(PCMachineState *pcms,
                    MemoryRegion *system_memory,
                    MemoryRegion *rom_memory,
                    MemoryRegion **ram_memory);
238
uint64_t pc_pci_hole64_start(void);
239
qemu_irq pc_allocate_cpu_irq(void);
240 241
DeviceState *pc_vga_init(ISABus *isa_bus, PCIBus *pci_bus);
void pc_basic_device_init(ISABus *isa_bus, qemu_irq *gsi,
242
                          ISADevice **rtc_state,
243
                          bool create_fdctrl,
244
                          bool no_vmport,
C
Chao Peng 已提交
245
                          bool has_pit,
246
                          uint32_t hpet_irqs);
247
void pc_init_ne2k_isa(ISABus *bus, NICInfo *nd);
248
void pc_cmos_init(PCMachineState *pcms,
249
                  BusState *ide0, BusState *ide1,
B
Blue Swirl 已提交
250
                  ISADevice *s);
251
void pc_nic_init(ISABus *isa_bus, PCIBus *pci_bus);
252
void pc_pci_device_init(PCIBus *pci_bus);
253

254 255
typedef void (*cpu_set_smm_t)(int smm, void *arg);

256 257
void ioapic_init_gsi(GSIState *gsi_state, const char *parent_name);

258
ISADevice *pc_find_fdc0(void);
259
int cmos_get_fd_drive_type(FloppyDriveType fd0);
260

261 262
#define FW_CFG_IO_BASE     0x510

E
Efimov Vasily 已提交
263 264
#define PORT92_A20_LINE "a20"

265
/* acpi_piix.c */
B
Blue Swirl 已提交
266

A
Andreas Färber 已提交
267 268
I2CBus *piix4_pm_init(PCIBus *bus, int devfn, uint32_t smb_io_base,
                      qemu_irq sci_irq, qemu_irq smi_irq,
269
                      int smm_enabled, DeviceState **piix4_pm);
P
pbrook 已提交
270

A
aliguori 已提交
271 272 273
/* hpet.c */
extern int no_hpet;

P
pbrook 已提交
274
/* piix_pci.c */
275 276 277
struct PCII440FXState;
typedef struct PCII440FXState PCII440FXState;

278 279 280
#define TYPE_I440FX_PCI_HOST_BRIDGE "i440FX-pcihost"
#define TYPE_I440FX_PCI_DEVICE "i440FX"

281 282
#define TYPE_IGD_PASSTHROUGH_I440FX_PCI_DEVICE "igd-passthrough-i440FX"

283 284 285 286 287 288
/*
 * Reset Control Register: PCI-accessible ISA-Compatible Register at address
 * 0xcf9, provided by the PCI/ISA bridge (PIIX3 PCI function 0, 8086:7000).
 */
#define RCR_IOPORT 0xcf9

289 290
PCIBus *i440fx_init(const char *host_type, const char *pci_type,
                    PCII440FXState **pi440fx_state, int *piix_devfn,
291
                    ISABus **isa_bus, qemu_irq *pic,
292 293
                    MemoryRegion *address_space_mem,
                    MemoryRegion *address_space_io,
A
Avi Kivity 已提交
294
                    ram_addr_t ram_size,
G
Gerd Hoffmann 已提交
295
                    ram_addr_t below_4g_mem_size,
296
                    ram_addr_t above_4g_mem_size,
A
Avi Kivity 已提交
297 298
                    MemoryRegion *pci_memory,
                    MemoryRegion *ram_memory);
P
pbrook 已提交
299

M
Michael S. Tsirkin 已提交
300
PCIBus *find_i440fx(void);
301
/* piix4.c */
302
extern PCIDevice *piix4_dev;
303
int piix4_init(PCIBus *bus, ISABus **isa_bus, int devfn);
P
pbrook 已提交
304

305
/* pc_sysfw.c */
306 307
void pc_system_firmware_init(MemoryRegion *rom_memory,
                             bool isapc_ram_fw);
308

309
/* pvpanic.c */
310
uint16_t pvpanic_port(void);
311

312 313
/* acpi-build.c */
void pc_madt_cpu_entry(AcpiDeviceIf *adev, int uid,
314
                       const CPUArchIdList *apic_ids, GArray *entry);
315

J
Jes Sorensen 已提交
316 317 318 319 320 321 322 323
/* e820 types */
#define E820_RAM        1
#define E820_RESERVED   2
#define E820_ACPI       3
#define E820_NVS        4
#define E820_UNUSABLE   5

int e820_add_entry(uint64_t, uint64_t, uint32_t);
324 325
int e820_get_num_entries(void);
bool e820_get_entry(int, uint32_t, uint64_t *, uint64_t *);
J
Jes Sorensen 已提交
326

M
Marcel Apfelbaum 已提交
327 328
#define PC_COMPAT_2_10 \
    HW_COMPAT_2_10 \
329 330 331 332
    {\
        .driver   = TYPE_X86_CPU,\
        .property = "x-hv-max-vps",\
        .value    = "0x40",\
333 334 335 336 337 338 339 340
    },{\
        .driver   = "i440FX-pcihost",\
        .property = "x-pci-hole64-fix",\
        .value    = "off",\
    },{\
        .driver   = "q35-pcihost",\
        .property = "x-pci-hole64-fix",\
        .value    = "off",\
341
    },
M
Marcel Apfelbaum 已提交
342

P
Peter Xu 已提交
343 344
#define PC_COMPAT_2_9 \
    HW_COMPAT_2_9 \
345 346 347 348 349
    {\
        .driver   = "mch",\
        .property = "extended-tseg-mbytes",\
        .value    = stringify(0),\
    },\
P
Peter Xu 已提交
350

351
#define PC_COMPAT_2_8 \
352
    HW_COMPAT_2_8 \
353 354 355 356 357
    {\
        .driver   = TYPE_X86_CPU,\
        .property = "tcg-cpuid",\
        .value    = "off",\
    },\
358 359 360 361 362
    {\
        .driver   = "kvmclock",\
        .property = "x-mach-use-reliable-get-clock",\
        .value    = "off",\
    },\
363 364 365 366 367
    {\
        .driver   = "ICH9-LPC",\
        .property = "x-smi-broadcast",\
        .value    = "off",\
    },\
368 369 370 371
    {\
        .driver   = TYPE_X86_CPU,\
        .property = "vmware-cpuid-freq",\
        .value    = "off",\
372 373 374 375 376
    },\
    {\
        .driver   = "Haswell-" TYPE_X86_CPU,\
        .property = "stepping",\
        .value    = "1",\
377
    },
378 379 380

#define PC_COMPAT_2_7 \
    HW_COMPAT_2_7 \
381 382 383 384
    {\
        .driver   = TYPE_X86_CPU,\
        .property = "l3-cache",\
        .value    = "off",\
385 386 387 388 389
    },\
    {\
        .driver   = TYPE_X86_CPU,\
        .property = "full-cpuid-auto-level",\
        .value    = "off",\
390 391 392 393 394 395 396 397 398 399 400 401 402 403 404
    },\
    {\
        .driver   = "Opteron_G3" "-" TYPE_X86_CPU,\
        .property = "family",\
        .value    = "15",\
    },\
    {\
        .driver   = "Opteron_G3" "-" TYPE_X86_CPU,\
        .property = "model",\
        .value    = "6",\
    },\
    {\
        .driver   = "Opteron_G3" "-" TYPE_X86_CPU,\
        .property = "stepping",\
        .value    = "1",\
405 406 407 408 409
    },\
    {\
        .driver   = "isa-pcspk",\
        .property = "migrate",\
        .value    = "off",\
410 411
    },

I
Igor Mammedov 已提交
412
#define PC_COMPAT_2_6 \
413 414 415 416 417
    HW_COMPAT_2_6 \
    {\
        .driver   = TYPE_X86_CPU,\
        .property = "cpuid-0xb",\
        .value    = "off",\
G
Gerd Hoffmann 已提交
418 419 420 421
    },{\
        .driver   = "vmxnet3",\
        .property = "romfile",\
        .value    = "",\
422 423 424 425 426
    },\
    {\
        .driver = TYPE_X86_CPU,\
        .property = "fill-mtrr-mask",\
        .value = "off",\
427 428
    },\
    {\
429
        .driver   = "apic-common",\
430 431
        .property = "legacy-instance-id",\
        .value    = "on",\
432
    },
I
Igor Mammedov 已提交
433

E
Eduardo Habkost 已提交
434 435 436
#define PC_COMPAT_2_5 \
    HW_COMPAT_2_5

437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456
/* Helper for setting model-id for CPU models that changed model-id
 * depending on QEMU versions up to QEMU 2.4.
 */
#define PC_CPU_MODEL_IDS(v) \
    {\
        .driver   = "qemu32-" TYPE_X86_CPU,\
        .property = "model-id",\
        .value    = "QEMU Virtual CPU version " v,\
    },\
    {\
        .driver   = "qemu64-" TYPE_X86_CPU,\
        .property = "model-id",\
        .value    = "QEMU Virtual CPU version " v,\
    },\
    {\
        .driver   = "athlon-" TYPE_X86_CPU,\
        .property = "model-id",\
        .value    = "QEMU Virtual CPU version " v,\
    },

457
#define PC_COMPAT_2_4 \
458
    HW_COMPAT_2_4 \
459
    PC_CPU_MODEL_IDS("2.4.0") \
460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525
    {\
        .driver   = "Haswell-" TYPE_X86_CPU,\
        .property = "abm",\
        .value    = "off",\
    },\
    {\
        .driver   = "Haswell-noTSX-" TYPE_X86_CPU,\
        .property = "abm",\
        .value    = "off",\
    },\
    {\
        .driver   = "Broadwell-" TYPE_X86_CPU,\
        .property = "abm",\
        .value    = "off",\
    },\
    {\
        .driver   = "Broadwell-noTSX-" TYPE_X86_CPU,\
        .property = "abm",\
        .value    = "off",\
    },\
    {\
        .driver   = "host" "-" TYPE_X86_CPU,\
        .property = "host-cache-info",\
        .value    = "on",\
    },\
    {\
        .driver   = TYPE_X86_CPU,\
        .property = "check",\
        .value    = "off",\
    },\
    {\
        .driver   = "qemu64" "-" TYPE_X86_CPU,\
        .property = "sse4a",\
        .value    = "on",\
    },\
    {\
        .driver   = "qemu64" "-" TYPE_X86_CPU,\
        .property = "abm",\
        .value    = "on",\
    },\
    {\
        .driver   = "qemu64" "-" TYPE_X86_CPU,\
        .property = "popcnt",\
        .value    = "on",\
    },\
    {\
        .driver   = "qemu32" "-" TYPE_X86_CPU,\
        .property = "popcnt",\
        .value    = "on",\
    },{\
        .driver   = "Opteron_G2" "-" TYPE_X86_CPU,\
        .property = "rdtscp",\
        .value    = "on",\
    },{\
        .driver   = "Opteron_G3" "-" TYPE_X86_CPU,\
        .property = "rdtscp",\
        .value    = "on",\
    },{\
        .driver   = "Opteron_G4" "-" TYPE_X86_CPU,\
        .property = "rdtscp",\
        .value    = "on",\
    },{\
        .driver   = "Opteron_G5" "-" TYPE_X86_CPU,\
        .property = "rdtscp",\
        .value    = "on",\
    },
526

527

528
#define PC_COMPAT_2_3 \
529
    HW_COMPAT_2_3 \
530
    PC_CPU_MODEL_IDS("2.3.0") \
531 532 533 534 535 536
    {\
        .driver   = TYPE_X86_CPU,\
        .property = "arat",\
        .value    = "off",\
    },{\
        .driver   = "qemu64" "-" TYPE_X86_CPU,\
537
        .property = "min-level",\
538 539 540
        .value    = stringify(4),\
    },{\
        .driver   = "kvm64" "-" TYPE_X86_CPU,\
541
        .property = "min-level",\
542 543 544
        .value    = stringify(5),\
    },{\
        .driver   = "pentium3" "-" TYPE_X86_CPU,\
545
        .property = "min-level",\
546 547 548
        .value    = stringify(2),\
    },{\
        .driver   = "n270" "-" TYPE_X86_CPU,\
549
        .property = "min-level",\
550 551 552
        .value    = stringify(5),\
    },{\
        .driver   = "Conroe" "-" TYPE_X86_CPU,\
553
        .property = "min-level",\
554 555 556
        .value    = stringify(4),\
    },{\
        .driver   = "Penryn" "-" TYPE_X86_CPU,\
557
        .property = "min-level",\
558 559 560
        .value    = stringify(4),\
    },{\
        .driver   = "Nehalem" "-" TYPE_X86_CPU,\
561
        .property = "min-level",\
562 563 564
        .value    = stringify(4),\
    },{\
        .driver   = "n270" "-" TYPE_X86_CPU,\
565
        .property = "min-xlevel",\
566 567 568
        .value    = stringify(0x8000000a),\
    },{\
        .driver   = "Penryn" "-" TYPE_X86_CPU,\
569
        .property = "min-xlevel",\
570 571 572
        .value    = stringify(0x8000000a),\
    },{\
        .driver   = "Conroe" "-" TYPE_X86_CPU,\
573
        .property = "min-xlevel",\
574 575 576
        .value    = stringify(0x8000000a),\
    },{\
        .driver   = "Nehalem" "-" TYPE_X86_CPU,\
577
        .property = "min-xlevel",\
578 579 580
        .value    = stringify(0x8000000a),\
    },{\
        .driver   = "Westmere" "-" TYPE_X86_CPU,\
581
        .property = "min-xlevel",\
582 583 584
        .value    = stringify(0x8000000a),\
    },{\
        .driver   = "SandyBridge" "-" TYPE_X86_CPU,\
585
        .property = "min-xlevel",\
586 587 588
        .value    = stringify(0x8000000a),\
    },{\
        .driver   = "IvyBridge" "-" TYPE_X86_CPU,\
589
        .property = "min-xlevel",\
590 591 592
        .value    = stringify(0x8000000a),\
    },{\
        .driver   = "Haswell" "-" TYPE_X86_CPU,\
593
        .property = "min-xlevel",\
594 595 596
        .value    = stringify(0x8000000a),\
    },{\
        .driver   = "Haswell-noTSX" "-" TYPE_X86_CPU,\
597
        .property = "min-xlevel",\
598 599 600
        .value    = stringify(0x8000000a),\
    },{\
        .driver   = "Broadwell" "-" TYPE_X86_CPU,\
601
        .property = "min-xlevel",\
602 603 604
        .value    = stringify(0x8000000a),\
    },{\
        .driver   = "Broadwell-noTSX" "-" TYPE_X86_CPU,\
605
        .property = "min-xlevel",\
606
        .value    = stringify(0x8000000a),\
607 608 609 610
    },{\
        .driver = TYPE_X86_CPU,\
        .property = "kvm-no-smi-migration",\
        .value    = "on",\
611
    },
612 613

#define PC_COMPAT_2_2 \
614
    HW_COMPAT_2_2 \
615
    PC_CPU_MODEL_IDS("2.3.0") \
616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705
    {\
        .driver = "kvm64" "-" TYPE_X86_CPU,\
        .property = "vme",\
        .value = "off",\
    },\
    {\
        .driver = "kvm32" "-" TYPE_X86_CPU,\
        .property = "vme",\
        .value = "off",\
    },\
    {\
        .driver = "Conroe" "-" TYPE_X86_CPU,\
        .property = "vme",\
        .value = "off",\
    },\
    {\
        .driver = "Penryn" "-" TYPE_X86_CPU,\
        .property = "vme",\
        .value = "off",\
    },\
    {\
        .driver = "Nehalem" "-" TYPE_X86_CPU,\
        .property = "vme",\
        .value = "off",\
    },\
    {\
        .driver = "Westmere" "-" TYPE_X86_CPU,\
        .property = "vme",\
        .value = "off",\
    },\
    {\
        .driver = "SandyBridge" "-" TYPE_X86_CPU,\
        .property = "vme",\
        .value = "off",\
    },\
    {\
        .driver = "Haswell" "-" TYPE_X86_CPU,\
        .property = "vme",\
        .value = "off",\
    },\
    {\
        .driver = "Broadwell" "-" TYPE_X86_CPU,\
        .property = "vme",\
        .value = "off",\
    },\
    {\
        .driver = "Opteron_G1" "-" TYPE_X86_CPU,\
        .property = "vme",\
        .value = "off",\
    },\
    {\
        .driver = "Opteron_G2" "-" TYPE_X86_CPU,\
        .property = "vme",\
        .value = "off",\
    },\
    {\
        .driver = "Opteron_G3" "-" TYPE_X86_CPU,\
        .property = "vme",\
        .value = "off",\
    },\
    {\
        .driver = "Opteron_G4" "-" TYPE_X86_CPU,\
        .property = "vme",\
        .value = "off",\
    },\
    {\
        .driver = "Opteron_G5" "-" TYPE_X86_CPU,\
        .property = "vme",\
        .value = "off",\
    },\
    {\
        .driver = "Haswell" "-" TYPE_X86_CPU,\
        .property = "f16c",\
        .value = "off",\
    },\
    {\
        .driver = "Haswell" "-" TYPE_X86_CPU,\
        .property = "rdrand",\
        .value = "off",\
    },\
    {\
        .driver = "Broadwell" "-" TYPE_X86_CPU,\
        .property = "f16c",\
        .value = "off",\
    },\
    {\
        .driver = "Broadwell" "-" TYPE_X86_CPU,\
        .property = "rdrand",\
        .value = "off",\
    },
706 707

#define PC_COMPAT_2_1 \
708
    HW_COMPAT_2_1 \
709
    PC_CPU_MODEL_IDS("2.1.0") \
710 711 712 713 714 715 716 717 718 719
    {\
        .driver = "coreduo" "-" TYPE_X86_CPU,\
        .property = "vmx",\
        .value = "on",\
    },\
    {\
        .driver = "core2duo" "-" TYPE_X86_CPU,\
        .property = "vmx",\
        .value = "on",\
    },
720

721
#define PC_COMPAT_2_0 \
722
    PC_CPU_MODEL_IDS("2.0.0") \
723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779
    {\
        .driver   = "virtio-scsi-pci",\
        .property = "any_layout",\
        .value    = "off",\
    },{\
        .driver   = "PIIX4_PM",\
        .property = "memory-hotplug-support",\
        .value    = "off",\
    },\
    {\
        .driver   = "apic",\
        .property = "version",\
        .value    = stringify(0x11),\
    },\
    {\
        .driver   = "nec-usb-xhci",\
        .property = "superspeed-ports-first",\
        .value    = "off",\
    },\
    {\
        .driver   = "nec-usb-xhci",\
        .property = "force-pcie-endcap",\
        .value    = "on",\
    },\
    {\
        .driver   = "pci-serial",\
        .property = "prog_if",\
        .value    = stringify(0),\
    },\
    {\
        .driver   = "pci-serial-2x",\
        .property = "prog_if",\
        .value    = stringify(0),\
    },\
    {\
        .driver   = "pci-serial-4x",\
        .property = "prog_if",\
        .value    = stringify(0),\
    },\
    {\
        .driver   = "virtio-net-pci",\
        .property = "guest_announce",\
        .value    = "off",\
    },\
    {\
        .driver   = "ICH9-LPC",\
        .property = "memory-hotplug-support",\
        .value    = "off",\
    },{\
        .driver   = "xio3130-downstream",\
        .property = COMPAT_PROP_PCP,\
        .value    = "off",\
    },{\
        .driver   = "ioh3420",\
        .property = COMPAT_PROP_PCP,\
        .value    = "off",\
    },
780

781
#define PC_COMPAT_1_7 \
782
    PC_CPU_MODEL_IDS("1.7.0") \
783 784 785 786 787 788 789 790 791 792 793 794 795 796 797
    {\
        .driver   = TYPE_USB_DEVICE,\
        .property = "msos-desc",\
        .value    = "no",\
    },\
    {\
        .driver   = "PIIX4_PM",\
        .property = "acpi-pci-hotplug-with-bridge-support",\
        .value    = "off",\
    },\
    {\
        .driver   = "hpet",\
        .property = HPET_INTCAP,\
        .value    = stringify(4),\
    },
798

799
#define PC_COMPAT_1_6 \
800
    PC_CPU_MODEL_IDS("1.6.0") \
801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821
    {\
        .driver   = "e1000",\
        .property = "mitigation",\
        .value    = "off",\
    },{\
        .driver   = "qemu64-" TYPE_X86_CPU,\
        .property = "model",\
        .value    = stringify(2),\
    },{\
        .driver   = "qemu32-" TYPE_X86_CPU,\
        .property = "model",\
        .value    = stringify(3),\
    },{\
        .driver   = "i440FX-pcihost",\
        .property = "short_root_bus",\
        .value    = stringify(1),\
    },{\
        .driver   = "q35-pcihost",\
        .property = "short_root_bus",\
        .value    = stringify(1),\
    },
822

823
#define PC_COMPAT_1_5 \
824
    PC_CPU_MODEL_IDS("1.5.0") \
825 826 827 828 829 830
    {\
        .driver   = "Conroe-" TYPE_X86_CPU,\
        .property = "model",\
        .value    = stringify(2),\
    },{\
        .driver   = "Conroe-" TYPE_X86_CPU,\
831
        .property = "min-level",\
832 833 834 835 836 837 838
        .value    = stringify(2),\
    },{\
        .driver   = "Penryn-" TYPE_X86_CPU,\
        .property = "model",\
        .value    = stringify(2),\
    },{\
        .driver   = "Penryn-" TYPE_X86_CPU,\
839
        .property = "min-level",\
840 841 842 843 844 845 846
        .value    = stringify(2),\
    },{\
        .driver   = "Nehalem-" TYPE_X86_CPU,\
        .property = "model",\
        .value    = stringify(2),\
    },{\
        .driver   = "Nehalem-" TYPE_X86_CPU,\
847
        .property = "min-level",\
848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865
        .value    = stringify(2),\
    },{\
        .driver   = "virtio-net-pci",\
        .property = "any_layout",\
        .value    = "off",\
    },{\
        .driver = TYPE_X86_CPU,\
        .property = "pmu",\
        .value = "on",\
    },{\
        .driver   = "i440FX-pcihost",\
        .property = "short_root_bus",\
        .value    = stringify(0),\
    },{\
        .driver   = "q35-pcihost",\
        .property = "short_root_bus",\
        .value    = stringify(0),\
    },
866

867
#define PC_COMPAT_1_4 \
868
    PC_CPU_MODEL_IDS("1.4.0") \
869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940
    {\
        .driver   = "scsi-hd",\
        .property = "discard_granularity",\
        .value    = stringify(0),\
    },{\
        .driver   = "scsi-cd",\
        .property = "discard_granularity",\
        .value    = stringify(0),\
    },{\
        .driver   = "scsi-disk",\
        .property = "discard_granularity",\
        .value    = stringify(0),\
    },{\
        .driver   = "ide-hd",\
        .property = "discard_granularity",\
        .value    = stringify(0),\
    },{\
        .driver   = "ide-cd",\
        .property = "discard_granularity",\
        .value    = stringify(0),\
    },{\
        .driver   = "ide-drive",\
        .property = "discard_granularity",\
        .value    = stringify(0),\
    },{\
        .driver   = "virtio-blk-pci",\
        .property = "discard_granularity",\
        .value    = stringify(0),\
    },{\
        .driver   = "virtio-serial-pci",\
        .property = "vectors",\
        /* DEV_NVECTORS_UNSPECIFIED as a uint32_t string */\
        .value    = stringify(0xFFFFFFFF),\
    },{ \
        .driver   = "virtio-net-pci", \
        .property = "ctrl_guest_offloads", \
        .value    = "off", \
    },{\
        .driver   = "e1000",\
        .property = "romfile",\
        .value    = "pxe-e1000.rom",\
    },{\
        .driver   = "ne2k_pci",\
        .property = "romfile",\
        .value    = "pxe-ne2k_pci.rom",\
    },{\
        .driver   = "pcnet",\
        .property = "romfile",\
        .value    = "pxe-pcnet.rom",\
    },{\
        .driver   = "rtl8139",\
        .property = "romfile",\
        .value    = "pxe-rtl8139.rom",\
    },{\
        .driver   = "virtio-net-pci",\
        .property = "romfile",\
        .value    = "pxe-virtio.rom",\
    },{\
        .driver   = "486-" TYPE_X86_CPU,\
        .property = "model",\
        .value    = stringify(0),\
    },\
    {\
        .driver = "n270" "-" TYPE_X86_CPU,\
        .property = "movbe",\
        .value = "off",\
    },\
    {\
        .driver = "Westmere" "-" TYPE_X86_CPU,\
        .property = "pclmulqdq",\
        .value = "off",\
    },
941

942
#define DEFINE_PC_MACHINE(suffix, namestr, initfn, optsfn) \
943 944 945 946 947 948 949 950 951 952 953
    static void pc_machine_##suffix##_class_init(ObjectClass *oc, void *data) \
    { \
        MachineClass *mc = MACHINE_CLASS(oc); \
        optsfn(mc); \
        mc->init = initfn; \
    } \
    static const TypeInfo pc_machine_type_##suffix = { \
        .name       = namestr TYPE_MACHINE_SUFFIX, \
        .parent     = TYPE_PC_MACHINE, \
        .class_init = pc_machine_##suffix##_class_init, \
    }; \
954 955
    static void pc_machine_init_##suffix(void) \
    { \
956
        type_register(&pc_machine_type_##suffix); \
957
    } \
958
    type_init(pc_machine_init_##suffix)
959

960
extern void igd_passthrough_isa_bridge_create(PCIBus *bus, uint16_t gpu_dev_id);
P
pbrook 已提交
961
#endif