1 /* 2 * QEMU PC System Emulator 3 * 4 * Copyright (c) 2003-2004 Fabrice Bellard 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a copy 7 * of this software and associated documentation files (the "Software"), to deal 8 * in the Software without restriction, including without limitation the rights 9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 * copies of the Software, and to permit persons to whom the Software is 11 * furnished to do so, subject to the following conditions: 12 * 13 * The above copyright notice and this permission notice shall be included in 14 * all copies or substantial portions of the Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 * THE SOFTWARE. 23 */ 24 25 #include <glib.h> 26 27 #include "hw/hw.h" 28 #include "hw/pc.h" 29 #include "hw/apic.h" 30 #include "hw/pci/pci.h" 31 #include "hw/pci/pci_ids.h" 32 #include "hw/usb.h" 33 #include "net/net.h" 34 #include "hw/boards.h" 35 #include "hw/ide.h" 36 #include "sysemu/kvm.h" 37 #include "hw/kvm/clock.h" 38 #include "sysemu/sysemu.h" 39 #include "hw/sysbus.h" 40 #include "sysemu/arch_init.h" 41 #include "sysemu/blockdev.h" 42 #include "hw/smbus.h" 43 #include "hw/xen.h" 44 #include "exec/memory.h" 45 #include "exec/address-spaces.h" 46 #include "cpu.h" 47 #ifdef CONFIG_XEN 48 # include <xen/hvm/hvm_info_table.h> 49 #endif 50 51 #define MAX_IDE_BUS 2 52 53 static const int ide_iobase[MAX_IDE_BUS] = { 0x1f0, 0x170 }; 54 static const int ide_iobase2[MAX_IDE_BUS] = { 0x3f6, 0x376 }; 55 static const int ide_irq[MAX_IDE_BUS] = { 14, 15 }; 56 57 /* PC hardware initialisation */ 58 static void pc_init1(MemoryRegion *system_memory, 59 MemoryRegion *system_io, 60 ram_addr_t ram_size, 61 const char *boot_device, 62 const char *kernel_filename, 63 const char *kernel_cmdline, 64 const char *initrd_filename, 65 const char *cpu_model, 66 int pci_enabled, 67 int kvmclock_enabled) 68 { 69 int i; 70 ram_addr_t below_4g_mem_size, above_4g_mem_size; 71 PCIBus *pci_bus; 72 ISABus *isa_bus; 73 PCII440FXState *i440fx_state; 74 int piix3_devfn = -1; 75 qemu_irq *cpu_irq; 76 qemu_irq *gsi; 77 qemu_irq *i8259; 78 qemu_irq *smi_irq; 79 GSIState *gsi_state; 80 DriveInfo *hd[MAX_IDE_BUS * MAX_IDE_DEVS]; 81 BusState *idebus[MAX_IDE_BUS]; 82 ISADevice *rtc_state; 83 ISADevice *floppy; 84 MemoryRegion *ram_memory; 85 MemoryRegion *pci_memory; 86 MemoryRegion *rom_memory; 87 void *fw_cfg = NULL; 88 89 pc_cpus_init(cpu_model); 90 pc_acpi_init("acpi-dsdt.aml"); 91 92 if (kvmclock_enabled) { 93 kvmclock_create(); 94 } 95 96 if (ram_size >= 0xe0000000 ) { 97 above_4g_mem_size = ram_size - 0xe0000000; 98 below_4g_mem_size = 0xe0000000; 99 } else { 100 above_4g_mem_size = 0; 101 below_4g_mem_size = ram_size; 102 } 103 104 if (pci_enabled) { 105 pci_memory = g_new(MemoryRegion, 1); 106 memory_region_init(pci_memory, "pci", INT64_MAX); 107 rom_memory = pci_memory; 108 } else { 109 pci_memory = NULL; 110 rom_memory = system_memory; 111 } 112 113 /* allocate ram and load rom/bios */ 114 if (!xen_enabled()) { 115 fw_cfg = pc_memory_init(system_memory, 116 kernel_filename, kernel_cmdline, initrd_filename, 117 below_4g_mem_size, above_4g_mem_size, 118 rom_memory, &ram_memory); 119 } 120 121 gsi_state = g_malloc0(sizeof(*gsi_state)); 122 if (kvm_irqchip_in_kernel()) { 123 kvm_pc_setup_irq_routing(pci_enabled); 124 gsi = qemu_allocate_irqs(kvm_pc_gsi_handler, gsi_state, 125 GSI_NUM_PINS); 126 } else { 127 gsi = qemu_allocate_irqs(gsi_handler, gsi_state, GSI_NUM_PINS); 128 } 129 130 if (pci_enabled) { 131 pci_bus = i440fx_init(&i440fx_state, &piix3_devfn, &isa_bus, gsi, 132 system_memory, system_io, ram_size, 133 below_4g_mem_size, 134 0x100000000ULL - below_4g_mem_size, 135 0x100000000ULL + above_4g_mem_size, 136 (sizeof(hwaddr) == 4 137 ? 0 138 : ((uint64_t)1 << 62)), 139 pci_memory, ram_memory); 140 } else { 141 pci_bus = NULL; 142 i440fx_state = NULL; 143 isa_bus = isa_bus_new(NULL, system_io); 144 no_hpet = 1; 145 } 146 isa_bus_irqs(isa_bus, gsi); 147 148 if (kvm_irqchip_in_kernel()) { 149 i8259 = kvm_i8259_init(isa_bus); 150 } else if (xen_enabled()) { 151 i8259 = xen_interrupt_controller_init(); 152 } else { 153 cpu_irq = pc_allocate_cpu_irq(); 154 i8259 = i8259_init(isa_bus, cpu_irq[0]); 155 } 156 157 for (i = 0; i < ISA_NUM_IRQS; i++) { 158 gsi_state->i8259_irq[i] = i8259[i]; 159 } 160 if (pci_enabled) { 161 ioapic_init_gsi(gsi_state, "i440fx"); 162 } 163 164 pc_register_ferr_irq(gsi[13]); 165 166 pc_vga_init(isa_bus, pci_enabled ? pci_bus : NULL); 167 if (xen_enabled()) { 168 pci_create_simple(pci_bus, -1, "xen-platform"); 169 } 170 171 /* init basic PC hardware */ 172 pc_basic_device_init(isa_bus, gsi, &rtc_state, &floppy, xen_enabled()); 173 174 pc_nic_init(isa_bus, pci_bus); 175 176 ide_drive_get(hd, MAX_IDE_BUS); 177 if (pci_enabled) { 178 PCIDevice *dev; 179 if (xen_enabled()) { 180 dev = pci_piix3_xen_ide_init(pci_bus, hd, piix3_devfn + 1); 181 } else { 182 dev = pci_piix3_ide_init(pci_bus, hd, piix3_devfn + 1); 183 } 184 idebus[0] = qdev_get_child_bus(&dev->qdev, "ide.0"); 185 idebus[1] = qdev_get_child_bus(&dev->qdev, "ide.1"); 186 } else { 187 for(i = 0; i < MAX_IDE_BUS; i++) { 188 ISADevice *dev; 189 dev = isa_ide_init(isa_bus, ide_iobase[i], ide_iobase2[i], 190 ide_irq[i], 191 hd[MAX_IDE_DEVS * i], hd[MAX_IDE_DEVS * i + 1]); 192 idebus[i] = qdev_get_child_bus(&dev->qdev, "ide.0"); 193 } 194 } 195 196 audio_init(isa_bus, pci_enabled ? pci_bus : NULL); 197 198 pc_cmos_init(below_4g_mem_size, above_4g_mem_size, boot_device, 199 floppy, idebus[0], idebus[1], rtc_state); 200 201 if (pci_enabled && usb_enabled(false)) { 202 pci_create_simple(pci_bus, piix3_devfn + 2, "piix3-usb-uhci"); 203 } 204 205 if (pci_enabled && acpi_enabled) { 206 i2c_bus *smbus; 207 208 smi_irq = qemu_allocate_irqs(pc_acpi_smi_interrupt, first_cpu, 1); 209 /* TODO: Populate SPD eeprom data. */ 210 smbus = piix4_pm_init(pci_bus, piix3_devfn + 3, 0xb100, 211 gsi[9], *smi_irq, 212 kvm_enabled(), fw_cfg); 213 smbus_eeprom_init(smbus, 8, NULL, 0); 214 } 215 216 if (pci_enabled) { 217 pc_pci_device_init(pci_bus); 218 } 219 } 220 221 static void pc_init_pci(QEMUMachineInitArgs *args) 222 { 223 ram_addr_t ram_size = args->ram_size; 224 const char *cpu_model = args->cpu_model; 225 const char *kernel_filename = args->kernel_filename; 226 const char *kernel_cmdline = args->kernel_cmdline; 227 const char *initrd_filename = args->initrd_filename; 228 const char *boot_device = args->boot_device; 229 pc_init1(get_system_memory(), 230 get_system_io(), 231 ram_size, boot_device, 232 kernel_filename, kernel_cmdline, 233 initrd_filename, cpu_model, 1, 1); 234 } 235 236 static void pc_init_pci_1_3(QEMUMachineInitArgs *args) 237 { 238 enable_compat_apic_id_mode(); 239 pc_init_pci(args); 240 } 241 242 /* PC machine init function for pc-0.14 to pc-1.2 */ 243 static void pc_init_pci_1_2(QEMUMachineInitArgs *args) 244 { 245 disable_kvm_pv_eoi(); 246 pc_init_pci_1_3(args); 247 } 248 249 /* PC init function for pc-0.10 to pc-0.13, and reused by xenfv */ 250 static void pc_init_pci_no_kvmclock(QEMUMachineInitArgs *args) 251 { 252 ram_addr_t ram_size = args->ram_size; 253 const char *cpu_model = args->cpu_model; 254 const char *kernel_filename = args->kernel_filename; 255 const char *kernel_cmdline = args->kernel_cmdline; 256 const char *initrd_filename = args->initrd_filename; 257 const char *boot_device = args->boot_device; 258 disable_kvm_pv_eoi(); 259 enable_compat_apic_id_mode(); 260 pc_init1(get_system_memory(), 261 get_system_io(), 262 ram_size, boot_device, 263 kernel_filename, kernel_cmdline, 264 initrd_filename, cpu_model, 1, 0); 265 } 266 267 static void pc_init_isa(QEMUMachineInitArgs *args) 268 { 269 ram_addr_t ram_size = args->ram_size; 270 const char *cpu_model = args->cpu_model; 271 const char *kernel_filename = args->kernel_filename; 272 const char *kernel_cmdline = args->kernel_cmdline; 273 const char *initrd_filename = args->initrd_filename; 274 const char *boot_device = args->boot_device; 275 if (cpu_model == NULL) 276 cpu_model = "486"; 277 disable_kvm_pv_eoi(); 278 enable_compat_apic_id_mode(); 279 pc_init1(get_system_memory(), 280 get_system_io(), 281 ram_size, boot_device, 282 kernel_filename, kernel_cmdline, 283 initrd_filename, cpu_model, 0, 1); 284 } 285 286 #ifdef CONFIG_XEN 287 static void pc_xen_hvm_init(QEMUMachineInitArgs *args) 288 { 289 if (xen_hvm_init() != 0) { 290 hw_error("xen hardware virtual machine initialisation failed"); 291 } 292 pc_init_pci_no_kvmclock(args); 293 xen_vcpu_init(); 294 } 295 #endif 296 297 static QEMUMachine pc_i440fx_machine_v1_5 = { 298 .name = "pc-i440fx-1.5", 299 .alias = "pc", 300 .desc = "Standard PC (i440FX + PIIX, 1996)", 301 .init = pc_init_pci, 302 .max_cpus = 255, 303 .is_default = 1, 304 DEFAULT_MACHINE_OPTIONS, 305 }; 306 307 static QEMUMachine pc_i440fx_machine_v1_4 = { 308 .name = "pc-i440fx-1.4", 309 .desc = "Standard PC (i440FX + PIIX, 1996)", 310 .init = pc_init_pci, 311 .max_cpus = 255, 312 .compat_props = (GlobalProperty[]) { 313 PC_COMPAT_1_4, 314 { /* end of list */ } 315 }, 316 DEFAULT_MACHINE_OPTIONS, 317 }; 318 319 #define PC_COMPAT_1_3 \ 320 PC_COMPAT_1_4, \ 321 {\ 322 .driver = "usb-tablet",\ 323 .property = "usb_version",\ 324 .value = stringify(1),\ 325 },{\ 326 .driver = "virtio-net-pci",\ 327 .property = "ctrl_mac_addr",\ 328 .value = "off", \ 329 },{ \ 330 .driver = "virtio-net-pci", \ 331 .property = "mq", \ 332 .value = "off", \ 333 } 334 335 static QEMUMachine pc_machine_v1_3 = { 336 .name = "pc-1.3", 337 .desc = "Standard PC", 338 .init = pc_init_pci_1_3, 339 .max_cpus = 255, 340 .compat_props = (GlobalProperty[]) { 341 PC_COMPAT_1_3, 342 { /* end of list */ } 343 }, 344 DEFAULT_MACHINE_OPTIONS, 345 }; 346 347 #define PC_COMPAT_1_2 \ 348 PC_COMPAT_1_3,\ 349 {\ 350 .driver = "nec-usb-xhci",\ 351 .property = "msi",\ 352 .value = "off",\ 353 },{\ 354 .driver = "nec-usb-xhci",\ 355 .property = "msix",\ 356 .value = "off",\ 357 },{\ 358 .driver = "ivshmem",\ 359 .property = "use64",\ 360 .value = "0",\ 361 },{\ 362 .driver = "qxl",\ 363 .property = "revision",\ 364 .value = stringify(3),\ 365 },{\ 366 .driver = "qxl-vga",\ 367 .property = "revision",\ 368 .value = stringify(3),\ 369 },{\ 370 .driver = "VGA",\ 371 .property = "mmio",\ 372 .value = "off",\ 373 } 374 375 static QEMUMachine pc_machine_v1_2 = { 376 .name = "pc-1.2", 377 .desc = "Standard PC", 378 .init = pc_init_pci_1_2, 379 .max_cpus = 255, 380 .compat_props = (GlobalProperty[]) { 381 PC_COMPAT_1_2, 382 { /* end of list */ } 383 }, 384 DEFAULT_MACHINE_OPTIONS, 385 }; 386 387 #define PC_COMPAT_1_1 \ 388 PC_COMPAT_1_2,\ 389 {\ 390 .driver = "virtio-scsi-pci",\ 391 .property = "hotplug",\ 392 .value = "off",\ 393 },{\ 394 .driver = "virtio-scsi-pci",\ 395 .property = "param_change",\ 396 .value = "off",\ 397 },{\ 398 .driver = "VGA",\ 399 .property = "vgamem_mb",\ 400 .value = stringify(8),\ 401 },{\ 402 .driver = "vmware-svga",\ 403 .property = "vgamem_mb",\ 404 .value = stringify(8),\ 405 },{\ 406 .driver = "qxl-vga",\ 407 .property = "vgamem_mb",\ 408 .value = stringify(8),\ 409 },{\ 410 .driver = "qxl",\ 411 .property = "vgamem_mb",\ 412 .value = stringify(8),\ 413 },{\ 414 .driver = "virtio-blk-pci",\ 415 .property = "config-wce",\ 416 .value = "off",\ 417 } 418 419 static QEMUMachine pc_machine_v1_1 = { 420 .name = "pc-1.1", 421 .desc = "Standard PC", 422 .init = pc_init_pci_1_2, 423 .max_cpus = 255, 424 .compat_props = (GlobalProperty[]) { 425 PC_COMPAT_1_1, 426 { /* end of list */ } 427 }, 428 DEFAULT_MACHINE_OPTIONS, 429 }; 430 431 #define PC_COMPAT_1_0 \ 432 PC_COMPAT_1_1,\ 433 {\ 434 .driver = "pc-sysfw",\ 435 .property = "rom_only",\ 436 .value = stringify(1),\ 437 }, {\ 438 .driver = "isa-fdc",\ 439 .property = "check_media_rate",\ 440 .value = "off",\ 441 }, {\ 442 .driver = "virtio-balloon-pci",\ 443 .property = "class",\ 444 .value = stringify(PCI_CLASS_MEMORY_RAM),\ 445 },{\ 446 .driver = "apic",\ 447 .property = "vapic",\ 448 .value = "off",\ 449 },{\ 450 .driver = TYPE_USB_DEVICE,\ 451 .property = "full-path",\ 452 .value = "no",\ 453 } 454 455 static QEMUMachine pc_machine_v1_0 = { 456 .name = "pc-1.0", 457 .desc = "Standard PC", 458 .init = pc_init_pci_1_2, 459 .max_cpus = 255, 460 .compat_props = (GlobalProperty[]) { 461 PC_COMPAT_1_0, 462 { /* end of list */ } 463 }, 464 .hw_version = "1.0", 465 DEFAULT_MACHINE_OPTIONS, 466 }; 467 468 #define PC_COMPAT_0_15 \ 469 PC_COMPAT_1_0 470 471 static QEMUMachine pc_machine_v0_15 = { 472 .name = "pc-0.15", 473 .desc = "Standard PC", 474 .init = pc_init_pci_1_2, 475 .max_cpus = 255, 476 .compat_props = (GlobalProperty[]) { 477 PC_COMPAT_0_15, 478 { /* end of list */ } 479 }, 480 .hw_version = "0.15", 481 DEFAULT_MACHINE_OPTIONS, 482 }; 483 484 #define PC_COMPAT_0_14 \ 485 PC_COMPAT_0_15,\ 486 {\ 487 .driver = "virtio-blk-pci",\ 488 .property = "event_idx",\ 489 .value = "off",\ 490 },{\ 491 .driver = "virtio-serial-pci",\ 492 .property = "event_idx",\ 493 .value = "off",\ 494 },{\ 495 .driver = "virtio-net-pci",\ 496 .property = "event_idx",\ 497 .value = "off",\ 498 },{\ 499 .driver = "virtio-balloon-pci",\ 500 .property = "event_idx",\ 501 .value = "off",\ 502 } 503 504 static QEMUMachine pc_machine_v0_14 = { 505 .name = "pc-0.14", 506 .desc = "Standard PC", 507 .init = pc_init_pci_1_2, 508 .max_cpus = 255, 509 .compat_props = (GlobalProperty[]) { 510 PC_COMPAT_0_14, 511 { 512 .driver = "qxl", 513 .property = "revision", 514 .value = stringify(2), 515 },{ 516 .driver = "qxl-vga", 517 .property = "revision", 518 .value = stringify(2), 519 }, 520 { /* end of list */ } 521 }, 522 .hw_version = "0.14", 523 DEFAULT_MACHINE_OPTIONS, 524 }; 525 526 #define PC_COMPAT_0_13 \ 527 PC_COMPAT_0_14,\ 528 {\ 529 .driver = TYPE_PCI_DEVICE,\ 530 .property = "command_serr_enable",\ 531 .value = "off",\ 532 },{\ 533 .driver = "AC97",\ 534 .property = "use_broken_id",\ 535 .value = stringify(1),\ 536 } 537 538 static QEMUMachine pc_machine_v0_13 = { 539 .name = "pc-0.13", 540 .desc = "Standard PC", 541 .init = pc_init_pci_no_kvmclock, 542 .max_cpus = 255, 543 .compat_props = (GlobalProperty[]) { 544 PC_COMPAT_0_13, 545 { 546 .driver = "virtio-9p-pci", 547 .property = "vectors", 548 .value = stringify(0), 549 },{ 550 .driver = "VGA", 551 .property = "rombar", 552 .value = stringify(0), 553 },{ 554 .driver = "vmware-svga", 555 .property = "rombar", 556 .value = stringify(0), 557 }, 558 { /* end of list */ } 559 }, 560 .hw_version = "0.13", 561 DEFAULT_MACHINE_OPTIONS, 562 }; 563 564 #define PC_COMPAT_0_12 \ 565 PC_COMPAT_0_13,\ 566 {\ 567 .driver = "virtio-serial-pci",\ 568 .property = "max_ports",\ 569 .value = stringify(1),\ 570 },{\ 571 .driver = "virtio-serial-pci",\ 572 .property = "vectors",\ 573 .value = stringify(0),\ 574 } 575 576 static QEMUMachine pc_machine_v0_12 = { 577 .name = "pc-0.12", 578 .desc = "Standard PC", 579 .init = pc_init_pci_no_kvmclock, 580 .max_cpus = 255, 581 .compat_props = (GlobalProperty[]) { 582 PC_COMPAT_0_12, 583 { 584 .driver = "VGA", 585 .property = "rombar", 586 .value = stringify(0), 587 },{ 588 .driver = "vmware-svga", 589 .property = "rombar", 590 .value = stringify(0), 591 }, 592 { /* end of list */ } 593 }, 594 .hw_version = "0.12", 595 DEFAULT_MACHINE_OPTIONS, 596 }; 597 598 #define PC_COMPAT_0_11 \ 599 PC_COMPAT_0_12,\ 600 {\ 601 .driver = "virtio-blk-pci",\ 602 .property = "vectors",\ 603 .value = stringify(0),\ 604 },{\ 605 .driver = TYPE_PCI_DEVICE,\ 606 .property = "rombar",\ 607 .value = stringify(0),\ 608 } 609 610 static QEMUMachine pc_machine_v0_11 = { 611 .name = "pc-0.11", 612 .desc = "Standard PC, qemu 0.11", 613 .init = pc_init_pci_no_kvmclock, 614 .max_cpus = 255, 615 .compat_props = (GlobalProperty[]) { 616 PC_COMPAT_0_11, 617 { 618 .driver = "ide-drive", 619 .property = "ver", 620 .value = "0.11", 621 },{ 622 .driver = "scsi-disk", 623 .property = "ver", 624 .value = "0.11", 625 }, 626 { /* end of list */ } 627 }, 628 .hw_version = "0.11", 629 DEFAULT_MACHINE_OPTIONS, 630 }; 631 632 static QEMUMachine pc_machine_v0_10 = { 633 .name = "pc-0.10", 634 .desc = "Standard PC, qemu 0.10", 635 .init = pc_init_pci_no_kvmclock, 636 .max_cpus = 255, 637 .compat_props = (GlobalProperty[]) { 638 PC_COMPAT_0_11, 639 { 640 .driver = "virtio-blk-pci", 641 .property = "class", 642 .value = stringify(PCI_CLASS_STORAGE_OTHER), 643 },{ 644 .driver = "virtio-serial-pci", 645 .property = "class", 646 .value = stringify(PCI_CLASS_DISPLAY_OTHER), 647 },{ 648 .driver = "virtio-net-pci", 649 .property = "vectors", 650 .value = stringify(0), 651 },{ 652 .driver = "ide-drive", 653 .property = "ver", 654 .value = "0.10", 655 },{ 656 .driver = "scsi-disk", 657 .property = "ver", 658 .value = "0.10", 659 }, 660 { /* end of list */ } 661 }, 662 .hw_version = "0.10", 663 DEFAULT_MACHINE_OPTIONS, 664 }; 665 666 static QEMUMachine isapc_machine = { 667 .name = "isapc", 668 .desc = "ISA-only PC", 669 .init = pc_init_isa, 670 .max_cpus = 1, 671 .compat_props = (GlobalProperty[]) { 672 { 673 .driver = "pc-sysfw", 674 .property = "rom_only", 675 .value = stringify(1), 676 }, 677 { /* end of list */ } 678 }, 679 DEFAULT_MACHINE_OPTIONS, 680 }; 681 682 #ifdef CONFIG_XEN 683 static QEMUMachine xenfv_machine = { 684 .name = "xenfv", 685 .desc = "Xen Fully-virtualized PC", 686 .init = pc_xen_hvm_init, 687 .max_cpus = HVM_MAX_VCPUS, 688 .default_machine_opts = "accel=xen", 689 DEFAULT_MACHINE_OPTIONS, 690 }; 691 #endif 692 693 static void pc_machine_init(void) 694 { 695 qemu_register_machine(&pc_i440fx_machine_v1_5); 696 qemu_register_machine(&pc_i440fx_machine_v1_4); 697 qemu_register_machine(&pc_machine_v1_3); 698 qemu_register_machine(&pc_machine_v1_2); 699 qemu_register_machine(&pc_machine_v1_1); 700 qemu_register_machine(&pc_machine_v1_0); 701 qemu_register_machine(&pc_machine_v0_15); 702 qemu_register_machine(&pc_machine_v0_14); 703 qemu_register_machine(&pc_machine_v0_13); 704 qemu_register_machine(&pc_machine_v0_12); 705 qemu_register_machine(&pc_machine_v0_11); 706 qemu_register_machine(&pc_machine_v0_10); 707 qemu_register_machine(&isapc_machine); 708 #ifdef CONFIG_XEN 709 qemu_register_machine(&xenfv_machine); 710 #endif 711 } 712 713 machine_init(pc_machine_init); 714