1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25#include "qemu/osdep.h"
26#include CONFIG_DEVICES
27
28#include "qemu/units.h"
29#include "hw/dma/i8257.h"
30#include "hw/loader.h"
31#include "hw/i386/x86.h"
32#include "hw/i386/pc.h"
33#include "hw/i386/apic.h"
34#include "hw/pci-host/i440fx.h"
35#include "hw/southbridge/piix.h"
36#include "hw/display/ramfb.h"
37#include "hw/firmware/smbios.h"
38#include "hw/pci/pci.h"
39#include "hw/pci/pci_ids.h"
40#include "hw/usb.h"
41#include "net/net.h"
42#include "hw/ide/pci.h"
43#include "hw/ide/piix.h"
44#include "hw/irq.h"
45#include "sysemu/kvm.h"
46#include "hw/kvm/clock.h"
47#include "hw/sysbus.h"
48#include "hw/i2c/smbus_eeprom.h"
49#include "hw/xen/xen-x86.h"
50#include "exec/memory.h"
51#include "hw/acpi/acpi.h"
52#include "hw/acpi/piix4.h"
53#include "qapi/error.h"
54#include "qemu/error-report.h"
55#include "sysemu/xen.h"
56#ifdef CONFIG_XEN
57#include <xen/hvm/hvm_info_table.h>
58#include "hw/xen/xen_pt.h"
59#endif
60#include "migration/global_state.h"
61#include "migration/misc.h"
62#include "sysemu/numa.h"
63#include "hw/hyperv/vmbus-bridge.h"
64#include "hw/mem/nvdimm.h"
65#include "hw/i386/acpi-build.h"
66#include "kvm/kvm-cpu.h"
67
68#define MAX_IDE_BUS 2
69
70#ifdef CONFIG_IDE_ISA
71static const int ide_iobase[MAX_IDE_BUS] = { 0x1f0, 0x170 };
72static const int ide_iobase2[MAX_IDE_BUS] = { 0x3f6, 0x376 };
73static const int ide_irq[MAX_IDE_BUS] = { 14, 15 };
74#endif
75
76
77static void pc_init1(MachineState *machine,
78 const char *host_type, const char *pci_type)
79{
80 PCMachineState *pcms = PC_MACHINE(machine);
81 PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms);
82 X86MachineState *x86ms = X86_MACHINE(machine);
83 MemoryRegion *system_memory = get_system_memory();
84 MemoryRegion *system_io = get_system_io();
85 PCIBus *pci_bus;
86 ISABus *isa_bus;
87 int piix3_devfn = -1;
88 qemu_irq smi_irq;
89 GSIState *gsi_state;
90 BusState *idebus[MAX_IDE_BUS];
91 ISADevice *rtc_state;
92 MemoryRegion *ram_memory;
93 MemoryRegion *pci_memory;
94 MemoryRegion *rom_memory;
95 ram_addr_t lowmem;
96 uint64_t hole64_size;
97 DeviceState *i440fx_host;
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130 if (xen_enabled()) {
131 xen_hvm_init_pc(pcms, &ram_memory);
132 } else {
133 if (!pcms->max_ram_below_4g) {
134 pcms->max_ram_below_4g = 0xe0000000;
135 }
136 lowmem = pcms->max_ram_below_4g;
137 if (machine->ram_size >= pcms->max_ram_below_4g) {
138 if (pcmc->gigabyte_align) {
139 if (lowmem > 0xc0000000) {
140 lowmem = 0xc0000000;
141 }
142 if (lowmem & (1 * GiB - 1)) {
143 warn_report("Large machine and max_ram_below_4g "
144 "(%" PRIu64 ") not a multiple of 1G; "
145 "possible bad performance.",
146 pcms->max_ram_below_4g);
147 }
148 }
149 }
150
151 if (machine->ram_size >= lowmem) {
152 x86ms->above_4g_mem_size = machine->ram_size - lowmem;
153 x86ms->below_4g_mem_size = lowmem;
154 } else {
155 x86ms->above_4g_mem_size = 0;
156 x86ms->below_4g_mem_size = machine->ram_size;
157 }
158 }
159
160 pc_machine_init_sgx_epc(pcms);
161 x86_cpus_init(x86ms, pcmc->default_cpu_version);
162
163 if (pcmc->kvmclock_enabled) {
164 kvmclock_create(pcmc->kvmclock_create_always);
165 }
166
167 if (pcmc->pci_enabled) {
168 pci_memory = g_new(MemoryRegion, 1);
169 memory_region_init(pci_memory, NULL, "pci", UINT64_MAX);
170 rom_memory = pci_memory;
171 i440fx_host = qdev_new(host_type);
172 hole64_size = object_property_get_uint(OBJECT(i440fx_host),
173 PCI_HOST_PROP_PCI_HOLE64_SIZE,
174 &error_abort);
175 } else {
176 pci_memory = NULL;
177 rom_memory = system_memory;
178 i440fx_host = NULL;
179 hole64_size = 0;
180 }
181
182 pc_guest_info_init(pcms);
183
184 if (pcmc->smbios_defaults) {
185 MachineClass *mc = MACHINE_GET_CLASS(machine);
186
187 smbios_set_defaults("QEMU", "Standard PC (i440FX + PIIX, 1996)",
188 mc->name, pcmc->smbios_legacy_mode,
189 pcmc->smbios_uuid_encoded,
190 pcms->smbios_entry_point_type);
191 }
192
193
194 if (!xen_enabled()) {
195 pc_memory_init(pcms, system_memory,
196 rom_memory, &ram_memory, hole64_size);
197 } else {
198 pc_system_flash_cleanup_unused(pcms);
199 if (machine->kernel_filename != NULL) {
200
201 xen_load_linux(pcms);
202 }
203 }
204
205 gsi_state = pc_gsi_create(&x86ms->gsi, pcmc->pci_enabled);
206
207 if (pcmc->pci_enabled) {
208 PIIX3State *piix3;
209 PCIDevice *pci_dev;
210 const char *type = xen_enabled() ? TYPE_PIIX3_XEN_DEVICE
211 : TYPE_PIIX3_DEVICE;
212
213 pci_bus = i440fx_init(pci_type,
214 i440fx_host,
215 system_memory, system_io, machine->ram_size,
216 x86ms->below_4g_mem_size,
217 x86ms->above_4g_mem_size,
218 pci_memory, ram_memory);
219 pcms->bus = pci_bus;
220
221 pci_dev = pci_create_simple_multifunction(pci_bus, -1, true, type);
222 piix3 = PIIX3_PCI_DEVICE(pci_dev);
223 piix3->pic = x86ms->gsi;
224 piix3_devfn = piix3->dev.devfn;
225 isa_bus = ISA_BUS(qdev_get_child_bus(DEVICE(piix3), "isa.0"));
226 } else {
227 pci_bus = NULL;
228 isa_bus = isa_bus_new(NULL, get_system_memory(), system_io,
229 &error_abort);
230 i8257_dma_init(isa_bus, 0);
231 pcms->hpet_enabled = false;
232 }
233 isa_bus_irqs(isa_bus, x86ms->gsi);
234
235 if (x86ms->pic == ON_OFF_AUTO_ON || x86ms->pic == ON_OFF_AUTO_AUTO) {
236 pc_i8259_create(isa_bus, gsi_state->i8259_irq);
237 }
238
239 if (pcmc->pci_enabled) {
240 ioapic_init_gsi(gsi_state, "i440fx");
241 }
242
243 if (tcg_enabled()) {
244 x86_register_ferr_irq(x86ms->gsi[13]);
245 }
246
247 pc_vga_init(isa_bus, pcmc->pci_enabled ? pci_bus : NULL);
248
249 assert(pcms->vmport != ON_OFF_AUTO__MAX);
250 if (pcms->vmport == ON_OFF_AUTO_AUTO) {
251 pcms->vmport = xen_enabled() ? ON_OFF_AUTO_OFF : ON_OFF_AUTO_ON;
252 }
253
254
255 pc_basic_device_init(pcms, isa_bus, x86ms->gsi, &rtc_state, true,
256 0x4);
257
258 pc_nic_init(pcmc, isa_bus, pci_bus);
259
260 if (pcmc->pci_enabled) {
261 PCIDevice *dev;
262
263 dev = pci_create_simple(pci_bus, piix3_devfn + 1, TYPE_PIIX3_IDE);
264 pci_ide_create_devs(dev);
265 idebus[0] = qdev_get_child_bus(&dev->qdev, "ide.0");
266 idebus[1] = qdev_get_child_bus(&dev->qdev, "ide.1");
267 pc_cmos_init(pcms, idebus[0], idebus[1], rtc_state);
268 }
269#ifdef CONFIG_IDE_ISA
270 else {
271 DriveInfo *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
272 int i;
273
274 ide_drive_get(hd, ARRAY_SIZE(hd));
275 for (i = 0; i < MAX_IDE_BUS; i++) {
276 ISADevice *dev;
277 char busname[] = "ide.0";
278 dev = isa_ide_init(isa_bus, ide_iobase[i], ide_iobase2[i],
279 ide_irq[i],
280 hd[MAX_IDE_DEVS * i], hd[MAX_IDE_DEVS * i + 1]);
281
282
283
284
285 busname[4] = '0' + i;
286 idebus[i] = qdev_get_child_bus(DEVICE(dev), busname);
287 }
288 pc_cmos_init(pcms, idebus[0], idebus[1], rtc_state);
289 }
290#endif
291
292 if (pcmc->pci_enabled && machine_usb(machine)) {
293 pci_create_simple(pci_bus, piix3_devfn + 2, "piix3-usb-uhci");
294 }
295
296 if (pcmc->pci_enabled && x86_machine_is_acpi_enabled(X86_MACHINE(pcms))) {
297 PCIDevice *piix4_pm;
298
299 smi_irq = qemu_allocate_irq(pc_acpi_smi_interrupt, first_cpu, 0);
300 piix4_pm = pci_new(piix3_devfn + 3, TYPE_PIIX4_PM);
301 qdev_prop_set_uint32(DEVICE(piix4_pm), "smb_io_base", 0xb100);
302 qdev_prop_set_bit(DEVICE(piix4_pm), "smm-enabled",
303 x86_machine_is_smm_enabled(x86ms));
304 pci_realize_and_unref(piix4_pm, pci_bus, &error_fatal);
305
306 qdev_connect_gpio_out(DEVICE(piix4_pm), 0, x86ms->gsi[9]);
307 qdev_connect_gpio_out_named(DEVICE(piix4_pm), "smi-irq", 0, smi_irq);
308 pcms->smbus = I2C_BUS(qdev_get_child_bus(DEVICE(piix4_pm), "i2c"));
309
310 smbus_eeprom_init(pcms->smbus, 8, NULL, 0);
311
312 object_property_add_link(OBJECT(machine), PC_MACHINE_ACPI_DEVICE_PROP,
313 TYPE_HOTPLUG_HANDLER,
314 (Object **)&x86ms->acpi_dev,
315 object_property_allow_set_link,
316 OBJ_PROP_LINK_STRONG);
317 object_property_set_link(OBJECT(machine), PC_MACHINE_ACPI_DEVICE_PROP,
318 OBJECT(piix4_pm), &error_abort);
319 }
320
321 if (machine->nvdimms_state->is_enabled) {
322 nvdimm_init_acpi_state(machine->nvdimms_state, system_io,
323 x86_nvdimm_acpi_dsmio,
324 x86ms->fw_cfg, OBJECT(pcms));
325 }
326}
327
328
329
330
331
332
333
334
335static void pc_compat_2_3_fn(MachineState *machine)
336{
337 X86MachineState *x86ms = X86_MACHINE(machine);
338 if (kvm_enabled()) {
339 x86ms->smm = ON_OFF_AUTO_OFF;
340 }
341}
342
343static void pc_compat_2_2_fn(MachineState *machine)
344{
345 pc_compat_2_3_fn(machine);
346}
347
348static void pc_compat_2_1_fn(MachineState *machine)
349{
350 pc_compat_2_2_fn(machine);
351 x86_cpu_change_kvm_default("svm", NULL);
352}
353
354static void pc_compat_2_0_fn(MachineState *machine)
355{
356 pc_compat_2_1_fn(machine);
357}
358
359static void pc_compat_1_7_fn(MachineState *machine)
360{
361 pc_compat_2_0_fn(machine);
362 x86_cpu_change_kvm_default("x2apic", NULL);
363}
364
365static void pc_compat_1_6_fn(MachineState *machine)
366{
367 pc_compat_1_7_fn(machine);
368}
369
370static void pc_compat_1_5_fn(MachineState *machine)
371{
372 pc_compat_1_6_fn(machine);
373}
374
375static void pc_compat_1_4_fn(MachineState *machine)
376{
377 pc_compat_1_5_fn(machine);
378}
379
380#ifdef CONFIG_ISAPC
381static void pc_init_isa(MachineState *machine)
382{
383 pc_init1(machine, TYPE_I440FX_PCI_HOST_BRIDGE, TYPE_I440FX_PCI_DEVICE);
384}
385#endif
386
387#ifdef CONFIG_XEN
388static void pc_xen_hvm_init_pci(MachineState *machine)
389{
390 const char *pci_type = xen_igd_gfx_pt_enabled() ?
391 TYPE_IGD_PASSTHROUGH_I440FX_PCI_DEVICE : TYPE_I440FX_PCI_DEVICE;
392
393 pc_init1(machine,
394 TYPE_I440FX_PCI_HOST_BRIDGE,
395 pci_type);
396}
397
398static void pc_xen_hvm_init(MachineState *machine)
399{
400 PCMachineState *pcms = PC_MACHINE(machine);
401
402 if (!xen_enabled()) {
403 error_report("xenfv machine requires the xen accelerator");
404 exit(1);
405 }
406
407 pc_xen_hvm_init_pci(machine);
408 xen_igd_reserve_slot(pcms->bus);
409 pci_create_simple(pcms->bus, -1, "xen-platform");
410}
411#endif
412
413#define DEFINE_I440FX_MACHINE(suffix, name, compatfn, optionfn) \
414 static void pc_init_##suffix(MachineState *machine) \
415 { \
416 void (*compat)(MachineState *m) = (compatfn); \
417 if (compat) { \
418 compat(machine); \
419 } \
420 pc_init1(machine, TYPE_I440FX_PCI_HOST_BRIDGE, \
421 TYPE_I440FX_PCI_DEVICE); \
422 } \
423 DEFINE_PC_MACHINE(suffix, name, pc_init_##suffix, optionfn)
424
425static void pc_i440fx_machine_options(MachineClass *m)
426{
427 PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
428 pcmc->default_nic_model = "e1000";
429 pcmc->pci_root_uid = 0;
430
431 m->family = "pc_piix";
432 m->desc = "Standard PC (i440FX + PIIX, 1996)";
433 m->default_machine_opts = "firmware=bios-256k.bin";
434 m->default_display = "std";
435 machine_class_allow_dynamic_sysbus_dev(m, TYPE_RAMFB_DEVICE);
436 machine_class_allow_dynamic_sysbus_dev(m, TYPE_VMBUS_BRIDGE);
437}
438
439static void pc_i440fx_7_2_machine_options(MachineClass *m)
440{
441 PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
442 pc_i440fx_machine_options(m);
443 m->alias = "pc";
444 m->is_default = true;
445 pcmc->default_cpu_version = 1;
446}
447
448DEFINE_I440FX_MACHINE(v7_2, "pc-i440fx-7.2", NULL,
449 pc_i440fx_7_2_machine_options);
450
451static void pc_i440fx_7_1_machine_options(MachineClass *m)
452{
453 pc_i440fx_7_2_machine_options(m);
454 m->alias = NULL;
455 m->is_default = false;
456 compat_props_add(m->compat_props, hw_compat_7_1, hw_compat_7_1_len);
457 compat_props_add(m->compat_props, pc_compat_7_1, pc_compat_7_1_len);
458}
459
460DEFINE_I440FX_MACHINE(v7_1, "pc-i440fx-7.1", NULL,
461 pc_i440fx_7_1_machine_options);
462
463static void pc_i440fx_7_0_machine_options(MachineClass *m)
464{
465 PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
466 pc_i440fx_7_1_machine_options(m);
467 m->alias = NULL;
468 m->is_default = false;
469 pcmc->enforce_amd_1tb_hole = false;
470 compat_props_add(m->compat_props, hw_compat_7_0, hw_compat_7_0_len);
471 compat_props_add(m->compat_props, pc_compat_7_0, pc_compat_7_0_len);
472}
473
474DEFINE_I440FX_MACHINE(v7_0, "pc-i440fx-7.0", NULL,
475 pc_i440fx_7_0_machine_options);
476
477static void pc_i440fx_6_2_machine_options(MachineClass *m)
478{
479 pc_i440fx_7_0_machine_options(m);
480 m->alias = NULL;
481 m->is_default = false;
482 compat_props_add(m->compat_props, hw_compat_6_2, hw_compat_6_2_len);
483 compat_props_add(m->compat_props, pc_compat_6_2, pc_compat_6_2_len);
484}
485
486DEFINE_I440FX_MACHINE(v6_2, "pc-i440fx-6.2", NULL,
487 pc_i440fx_6_2_machine_options);
488
489static void pc_i440fx_6_1_machine_options(MachineClass *m)
490{
491 pc_i440fx_6_2_machine_options(m);
492 m->alias = NULL;
493 m->is_default = false;
494 compat_props_add(m->compat_props, hw_compat_6_1, hw_compat_6_1_len);
495 compat_props_add(m->compat_props, pc_compat_6_1, pc_compat_6_1_len);
496 m->smp_props.prefer_sockets = true;
497}
498
499DEFINE_I440FX_MACHINE(v6_1, "pc-i440fx-6.1", NULL,
500 pc_i440fx_6_1_machine_options);
501
502static void pc_i440fx_6_0_machine_options(MachineClass *m)
503{
504 pc_i440fx_6_1_machine_options(m);
505 m->alias = NULL;
506 m->is_default = false;
507 compat_props_add(m->compat_props, hw_compat_6_0, hw_compat_6_0_len);
508 compat_props_add(m->compat_props, pc_compat_6_0, pc_compat_6_0_len);
509}
510
511DEFINE_I440FX_MACHINE(v6_0, "pc-i440fx-6.0", NULL,
512 pc_i440fx_6_0_machine_options);
513
514static void pc_i440fx_5_2_machine_options(MachineClass *m)
515{
516 pc_i440fx_6_0_machine_options(m);
517 m->alias = NULL;
518 m->is_default = false;
519 compat_props_add(m->compat_props, hw_compat_5_2, hw_compat_5_2_len);
520 compat_props_add(m->compat_props, pc_compat_5_2, pc_compat_5_2_len);
521}
522
523DEFINE_I440FX_MACHINE(v5_2, "pc-i440fx-5.2", NULL,
524 pc_i440fx_5_2_machine_options);
525
526static void pc_i440fx_5_1_machine_options(MachineClass *m)
527{
528 PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
529
530 pc_i440fx_5_2_machine_options(m);
531 m->alias = NULL;
532 m->is_default = false;
533 compat_props_add(m->compat_props, hw_compat_5_1, hw_compat_5_1_len);
534 compat_props_add(m->compat_props, pc_compat_5_1, pc_compat_5_1_len);
535 pcmc->kvmclock_create_always = false;
536 pcmc->pci_root_uid = 1;
537}
538
539DEFINE_I440FX_MACHINE(v5_1, "pc-i440fx-5.1", NULL,
540 pc_i440fx_5_1_machine_options);
541
542static void pc_i440fx_5_0_machine_options(MachineClass *m)
543{
544 pc_i440fx_5_1_machine_options(m);
545 m->alias = NULL;
546 m->is_default = false;
547 m->numa_mem_supported = true;
548 compat_props_add(m->compat_props, hw_compat_5_0, hw_compat_5_0_len);
549 compat_props_add(m->compat_props, pc_compat_5_0, pc_compat_5_0_len);
550 m->auto_enable_numa_with_memdev = false;
551}
552
553DEFINE_I440FX_MACHINE(v5_0, "pc-i440fx-5.0", NULL,
554 pc_i440fx_5_0_machine_options);
555
556static void pc_i440fx_4_2_machine_options(MachineClass *m)
557{
558 pc_i440fx_5_0_machine_options(m);
559 m->alias = NULL;
560 m->is_default = false;
561 compat_props_add(m->compat_props, hw_compat_4_2, hw_compat_4_2_len);
562 compat_props_add(m->compat_props, pc_compat_4_2, pc_compat_4_2_len);
563}
564
565DEFINE_I440FX_MACHINE(v4_2, "pc-i440fx-4.2", NULL,
566 pc_i440fx_4_2_machine_options);
567
568static void pc_i440fx_4_1_machine_options(MachineClass *m)
569{
570 pc_i440fx_4_2_machine_options(m);
571 m->alias = NULL;
572 m->is_default = false;
573 compat_props_add(m->compat_props, hw_compat_4_1, hw_compat_4_1_len);
574 compat_props_add(m->compat_props, pc_compat_4_1, pc_compat_4_1_len);
575}
576
577DEFINE_I440FX_MACHINE(v4_1, "pc-i440fx-4.1", NULL,
578 pc_i440fx_4_1_machine_options);
579
580static void pc_i440fx_4_0_machine_options(MachineClass *m)
581{
582 PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
583 pc_i440fx_4_1_machine_options(m);
584 m->alias = NULL;
585 m->is_default = false;
586 pcmc->default_cpu_version = CPU_VERSION_LEGACY;
587 compat_props_add(m->compat_props, hw_compat_4_0, hw_compat_4_0_len);
588 compat_props_add(m->compat_props, pc_compat_4_0, pc_compat_4_0_len);
589}
590
591DEFINE_I440FX_MACHINE(v4_0, "pc-i440fx-4.0", NULL,
592 pc_i440fx_4_0_machine_options);
593
594static void pc_i440fx_3_1_machine_options(MachineClass *m)
595{
596 PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
597
598 pc_i440fx_4_0_machine_options(m);
599 m->is_default = false;
600 m->smbus_no_migration_support = true;
601 m->alias = NULL;
602 pcmc->pvh_enabled = false;
603 compat_props_add(m->compat_props, hw_compat_3_1, hw_compat_3_1_len);
604 compat_props_add(m->compat_props, pc_compat_3_1, pc_compat_3_1_len);
605}
606
607DEFINE_I440FX_MACHINE(v3_1, "pc-i440fx-3.1", NULL,
608 pc_i440fx_3_1_machine_options);
609
610static void pc_i440fx_3_0_machine_options(MachineClass *m)
611{
612 pc_i440fx_3_1_machine_options(m);
613 compat_props_add(m->compat_props, hw_compat_3_0, hw_compat_3_0_len);
614 compat_props_add(m->compat_props, pc_compat_3_0, pc_compat_3_0_len);
615}
616
617DEFINE_I440FX_MACHINE(v3_0, "pc-i440fx-3.0", NULL,
618 pc_i440fx_3_0_machine_options);
619
620static void pc_i440fx_2_12_machine_options(MachineClass *m)
621{
622 pc_i440fx_3_0_machine_options(m);
623 compat_props_add(m->compat_props, hw_compat_2_12, hw_compat_2_12_len);
624 compat_props_add(m->compat_props, pc_compat_2_12, pc_compat_2_12_len);
625}
626
627DEFINE_I440FX_MACHINE(v2_12, "pc-i440fx-2.12", NULL,
628 pc_i440fx_2_12_machine_options);
629
630static void pc_i440fx_2_11_machine_options(MachineClass *m)
631{
632 pc_i440fx_2_12_machine_options(m);
633 compat_props_add(m->compat_props, hw_compat_2_11, hw_compat_2_11_len);
634 compat_props_add(m->compat_props, pc_compat_2_11, pc_compat_2_11_len);
635}
636
637DEFINE_I440FX_MACHINE(v2_11, "pc-i440fx-2.11", NULL,
638 pc_i440fx_2_11_machine_options);
639
640static void pc_i440fx_2_10_machine_options(MachineClass *m)
641{
642 pc_i440fx_2_11_machine_options(m);
643 compat_props_add(m->compat_props, hw_compat_2_10, hw_compat_2_10_len);
644 compat_props_add(m->compat_props, pc_compat_2_10, pc_compat_2_10_len);
645 m->auto_enable_numa_with_memhp = false;
646}
647
648DEFINE_I440FX_MACHINE(v2_10, "pc-i440fx-2.10", NULL,
649 pc_i440fx_2_10_machine_options);
650
651static void pc_i440fx_2_9_machine_options(MachineClass *m)
652{
653 pc_i440fx_2_10_machine_options(m);
654 compat_props_add(m->compat_props, hw_compat_2_9, hw_compat_2_9_len);
655 compat_props_add(m->compat_props, pc_compat_2_9, pc_compat_2_9_len);
656}
657
658DEFINE_I440FX_MACHINE(v2_9, "pc-i440fx-2.9", NULL,
659 pc_i440fx_2_9_machine_options);
660
661static void pc_i440fx_2_8_machine_options(MachineClass *m)
662{
663 pc_i440fx_2_9_machine_options(m);
664 compat_props_add(m->compat_props, hw_compat_2_8, hw_compat_2_8_len);
665 compat_props_add(m->compat_props, pc_compat_2_8, pc_compat_2_8_len);
666}
667
668DEFINE_I440FX_MACHINE(v2_8, "pc-i440fx-2.8", NULL,
669 pc_i440fx_2_8_machine_options);
670
671static void pc_i440fx_2_7_machine_options(MachineClass *m)
672{
673 pc_i440fx_2_8_machine_options(m);
674 compat_props_add(m->compat_props, hw_compat_2_7, hw_compat_2_7_len);
675 compat_props_add(m->compat_props, pc_compat_2_7, pc_compat_2_7_len);
676}
677
678DEFINE_I440FX_MACHINE(v2_7, "pc-i440fx-2.7", NULL,
679 pc_i440fx_2_7_machine_options);
680
681static void pc_i440fx_2_6_machine_options(MachineClass *m)
682{
683 X86MachineClass *x86mc = X86_MACHINE_CLASS(m);
684 PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
685
686 pc_i440fx_2_7_machine_options(m);
687 pcmc->legacy_cpu_hotplug = true;
688 x86mc->fwcfg_dma_enabled = false;
689 compat_props_add(m->compat_props, hw_compat_2_6, hw_compat_2_6_len);
690 compat_props_add(m->compat_props, pc_compat_2_6, pc_compat_2_6_len);
691}
692
693DEFINE_I440FX_MACHINE(v2_6, "pc-i440fx-2.6", NULL,
694 pc_i440fx_2_6_machine_options);
695
696static void pc_i440fx_2_5_machine_options(MachineClass *m)
697{
698 X86MachineClass *x86mc = X86_MACHINE_CLASS(m);
699
700 pc_i440fx_2_6_machine_options(m);
701 x86mc->save_tsc_khz = false;
702 m->legacy_fw_cfg_order = 1;
703 compat_props_add(m->compat_props, hw_compat_2_5, hw_compat_2_5_len);
704 compat_props_add(m->compat_props, pc_compat_2_5, pc_compat_2_5_len);
705}
706
707DEFINE_I440FX_MACHINE(v2_5, "pc-i440fx-2.5", NULL,
708 pc_i440fx_2_5_machine_options);
709
710static void pc_i440fx_2_4_machine_options(MachineClass *m)
711{
712 PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
713
714 pc_i440fx_2_5_machine_options(m);
715 m->hw_version = "2.4.0";
716 pcmc->broken_reserved_end = true;
717 compat_props_add(m->compat_props, hw_compat_2_4, hw_compat_2_4_len);
718 compat_props_add(m->compat_props, pc_compat_2_4, pc_compat_2_4_len);
719}
720
721DEFINE_I440FX_MACHINE(v2_4, "pc-i440fx-2.4", NULL,
722 pc_i440fx_2_4_machine_options)
723
724static void pc_i440fx_2_3_machine_options(MachineClass *m)
725{
726 pc_i440fx_2_4_machine_options(m);
727 m->hw_version = "2.3.0";
728 compat_props_add(m->compat_props, hw_compat_2_3, hw_compat_2_3_len);
729 compat_props_add(m->compat_props, pc_compat_2_3, pc_compat_2_3_len);
730}
731
732DEFINE_I440FX_MACHINE(v2_3, "pc-i440fx-2.3", pc_compat_2_3_fn,
733 pc_i440fx_2_3_machine_options);
734
735static void pc_i440fx_2_2_machine_options(MachineClass *m)
736{
737 PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
738
739 pc_i440fx_2_3_machine_options(m);
740 m->hw_version = "2.2.0";
741 m->default_machine_opts = "firmware=bios-256k.bin,suppress-vmdesc=on";
742 compat_props_add(m->compat_props, hw_compat_2_2, hw_compat_2_2_len);
743 compat_props_add(m->compat_props, pc_compat_2_2, pc_compat_2_2_len);
744 pcmc->rsdp_in_ram = false;
745}
746
747DEFINE_I440FX_MACHINE(v2_2, "pc-i440fx-2.2", pc_compat_2_2_fn,
748 pc_i440fx_2_2_machine_options);
749
750static void pc_i440fx_2_1_machine_options(MachineClass *m)
751{
752 PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
753
754 pc_i440fx_2_2_machine_options(m);
755 m->hw_version = "2.1.0";
756 m->default_display = NULL;
757 compat_props_add(m->compat_props, hw_compat_2_1, hw_compat_2_1_len);
758 compat_props_add(m->compat_props, pc_compat_2_1, pc_compat_2_1_len);
759 pcmc->smbios_uuid_encoded = false;
760 pcmc->enforce_aligned_dimm = false;
761}
762
763DEFINE_I440FX_MACHINE(v2_1, "pc-i440fx-2.1", pc_compat_2_1_fn,
764 pc_i440fx_2_1_machine_options);
765
766static void pc_i440fx_2_0_machine_options(MachineClass *m)
767{
768 PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
769
770 pc_i440fx_2_1_machine_options(m);
771 m->hw_version = "2.0.0";
772 compat_props_add(m->compat_props, pc_compat_2_0, pc_compat_2_0_len);
773 pcmc->smbios_legacy_mode = true;
774 pcmc->has_reserved_memory = false;
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791 pcmc->legacy_acpi_table_size = 6652;
792 pcmc->acpi_data_size = 0x10000;
793}
794
795DEFINE_I440FX_MACHINE(v2_0, "pc-i440fx-2.0", pc_compat_2_0_fn,
796 pc_i440fx_2_0_machine_options);
797
798static void pc_i440fx_1_7_machine_options(MachineClass *m)
799{
800 PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
801
802 pc_i440fx_2_0_machine_options(m);
803 m->hw_version = "1.7.0";
804 m->default_machine_opts = NULL;
805 m->option_rom_has_mr = true;
806 m->deprecation_reason = "old and unattended - use a newer version instead";
807 compat_props_add(m->compat_props, pc_compat_1_7, pc_compat_1_7_len);
808 pcmc->smbios_defaults = false;
809 pcmc->gigabyte_align = false;
810 pcmc->legacy_acpi_table_size = 6414;
811}
812
813DEFINE_I440FX_MACHINE(v1_7, "pc-i440fx-1.7", pc_compat_1_7_fn,
814 pc_i440fx_1_7_machine_options);
815
816static void pc_i440fx_1_6_machine_options(MachineClass *m)
817{
818 PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
819
820 pc_i440fx_1_7_machine_options(m);
821 m->hw_version = "1.6.0";
822 m->rom_file_has_mr = false;
823 compat_props_add(m->compat_props, pc_compat_1_6, pc_compat_1_6_len);
824 pcmc->has_acpi_build = false;
825}
826
827DEFINE_I440FX_MACHINE(v1_6, "pc-i440fx-1.6", pc_compat_1_6_fn,
828 pc_i440fx_1_6_machine_options);
829
830static void pc_i440fx_1_5_machine_options(MachineClass *m)
831{
832 pc_i440fx_1_6_machine_options(m);
833 m->hw_version = "1.5.0";
834 compat_props_add(m->compat_props, pc_compat_1_5, pc_compat_1_5_len);
835}
836
837DEFINE_I440FX_MACHINE(v1_5, "pc-i440fx-1.5", pc_compat_1_5_fn,
838 pc_i440fx_1_5_machine_options);
839
840static void pc_i440fx_1_4_machine_options(MachineClass *m)
841{
842 pc_i440fx_1_5_machine_options(m);
843 m->hw_version = "1.4.0";
844 compat_props_add(m->compat_props, pc_compat_1_4, pc_compat_1_4_len);
845}
846
847DEFINE_I440FX_MACHINE(v1_4, "pc-i440fx-1.4", pc_compat_1_4_fn,
848 pc_i440fx_1_4_machine_options);
849
850#ifdef CONFIG_ISAPC
851static void isapc_machine_options(MachineClass *m)
852{
853 PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
854 m->desc = "ISA-only PC";
855 m->max_cpus = 1;
856 m->option_rom_has_mr = true;
857 m->rom_file_has_mr = false;
858 pcmc->pci_enabled = false;
859 pcmc->has_acpi_build = false;
860 pcmc->smbios_defaults = false;
861 pcmc->gigabyte_align = false;
862 pcmc->smbios_legacy_mode = true;
863 pcmc->has_reserved_memory = false;
864 pcmc->default_nic_model = "ne2k_isa";
865 m->default_cpu_type = X86_CPU_TYPE_NAME("486");
866}
867
868DEFINE_PC_MACHINE(isapc, "isapc", pc_init_isa,
869 isapc_machine_options);
870#endif
871
872#ifdef CONFIG_XEN
873static void xenfv_4_2_machine_options(MachineClass *m)
874{
875 pc_i440fx_4_2_machine_options(m);
876 m->desc = "Xen Fully-virtualized PC";
877 m->max_cpus = HVM_MAX_VCPUS;
878 m->default_machine_opts = "accel=xen,suppress-vmdesc=on";
879}
880
881DEFINE_PC_MACHINE(xenfv_4_2, "xenfv-4.2", pc_xen_hvm_init,
882 xenfv_4_2_machine_options);
883
884static void xenfv_3_1_machine_options(MachineClass *m)
885{
886 pc_i440fx_3_1_machine_options(m);
887 m->desc = "Xen Fully-virtualized PC";
888 m->alias = "xenfv";
889 m->max_cpus = HVM_MAX_VCPUS;
890 m->default_machine_opts = "accel=xen,suppress-vmdesc=on";
891}
892
893DEFINE_PC_MACHINE(xenfv, "xenfv-3.1", pc_xen_hvm_init,
894 xenfv_3_1_machine_options);
895#endif
896