pc_piix.c 21.0 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
/*
 * QEMU PC System Emulator
 *
 * Copyright (c) 2003-2004 Fabrice Bellard
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

A
Avi Kivity 已提交
25 26
#include <glib.h>

27
#include "hw/hw.h"
28
#include "hw/loader.h"
P
Paolo Bonzini 已提交
29 30
#include "hw/i386/pc.h"
#include "hw/i386/apic.h"
31 32 33
#include "hw/pci/pci.h"
#include "hw/pci/pci_ids.h"
#include "hw/usb.h"
P
Paolo Bonzini 已提交
34
#include "net/net.h"
35 36
#include "hw/boards.h"
#include "hw/ide.h"
37
#include "sysemu/kvm.h"
38
#include "hw/kvm/clock.h"
39
#include "sysemu/sysemu.h"
40
#include "hw/sysbus.h"
41
#include "hw/cpu/icc_bus.h"
42 43
#include "sysemu/arch_init.h"
#include "sysemu/blockdev.h"
P
Paolo Bonzini 已提交
44 45
#include "hw/i2c/smbus.h"
#include "hw/xen/xen.h"
46 47
#include "exec/memory.h"
#include "exec/address-spaces.h"
48
#include "hw/acpi/acpi.h"
49
#include "cpu.h"
A
Anthony PERARD 已提交
50 51 52
#ifdef CONFIG_XEN
#  include <xen/hvm/hvm_info_table.h>
#endif
53 54 55 56 57 58 59

#define MAX_IDE_BUS 2

static const int ide_iobase[MAX_IDE_BUS] = { 0x1f0, 0x170 };
static const int ide_iobase2[MAX_IDE_BUS] = { 0x3f6, 0x376 };
static const int ide_irq[MAX_IDE_BUS] = { 14, 15 };

60
static bool has_pvpanic;
61
static bool has_pci_info = true;
62
static bool has_acpi_build = true;
63

64
/* PC hardware initialisation */
65
static void pc_init1(QEMUMachineInitArgs *args,
66 67
                     int pci_enabled,
                     int kvmclock_enabled)
68
{
69 70
    MemoryRegion *system_memory = get_system_memory();
    MemoryRegion *system_io = get_system_io();
71 72 73
    int i;
    ram_addr_t below_4g_mem_size, above_4g_mem_size;
    PCIBus *pci_bus;
74
    ISABus *isa_bus;
75 76 77
    PCII440FXState *i440fx_state;
    int piix3_devfn = -1;
    qemu_irq *cpu_irq;
J
Jan Kiszka 已提交
78
    qemu_irq *gsi;
79 80
    qemu_irq *i8259;
    qemu_irq *smi_irq;
J
Jan Kiszka 已提交
81
    GSIState *gsi_state;
82
    DriveInfo *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
83
    BusState *idebus[MAX_IDE_BUS];
84
    ISADevice *rtc_state;
K
Kevin Wolf 已提交
85
    ISADevice *floppy;
A
Avi Kivity 已提交
86 87
    MemoryRegion *ram_memory;
    MemoryRegion *pci_memory;
88
    MemoryRegion *rom_memory;
89
    DeviceState *icc_bridge;
L
Laszlo Ersek 已提交
90
    FWCfgState *fw_cfg = NULL;
91
    PcGuestInfo *guest_info;
92

93
    if (xen_enabled() && xen_hvm_init(&ram_memory) != 0) {
94 95 96 97
        fprintf(stderr, "xen hardware virtual machine initialisation failed\n");
        exit(1);
    }

98 99 100 101
    icc_bridge = qdev_create(NULL, TYPE_ICC_BRIDGE);
    object_property_add_child(qdev_get_machine(), "icc-bridge",
                              OBJECT(icc_bridge), NULL);

102
    pc_cpus_init(args->cpu_model, icc_bridge);
103

104
    if (kvm_enabled() && kvmclock_enabled) {
105 106 107
        kvmclock_create();
    }

108 109
    if (args->ram_size >= 0xe0000000) {
        above_4g_mem_size = args->ram_size - 0xe0000000;
110
        below_4g_mem_size = 0xe0000000;
111 112
    } else {
        above_4g_mem_size = 0;
113
        below_4g_mem_size = args->ram_size;
114 115
    }

116 117
    if (pci_enabled) {
        pci_memory = g_new(MemoryRegion, 1);
118
        memory_region_init(pci_memory, NULL, "pci", INT64_MAX);
119 120 121 122 123
        rom_memory = pci_memory;
    } else {
        pci_memory = NULL;
        rom_memory = system_memory;
    }
A
Avi Kivity 已提交
124

125
    guest_info = pc_guest_info_init(below_4g_mem_size, above_4g_mem_size);
126 127 128

    guest_info->has_acpi_build = has_acpi_build;

129
    guest_info->has_pci_info = has_pci_info;
130
    guest_info->isapc_ram_fw = !pci_enabled;
131

132
    /* allocate ram and load rom/bios */
A
Anthony PERARD 已提交
133
    if (!xen_enabled()) {
134
        fw_cfg = pc_memory_init(system_memory,
135 136
                       args->kernel_filename, args->kernel_cmdline,
                       args->initrd_filename,
A
Avi Kivity 已提交
137
                       below_4g_mem_size, above_4g_mem_size,
138
                       rom_memory, &ram_memory, guest_info);
A
Anthony PERARD 已提交
139
    }
140

J
Jan Kiszka 已提交
141
    gsi_state = g_malloc0(sizeof(*gsi_state));
142
    if (kvm_irqchip_in_kernel()) {
143 144
        kvm_pc_setup_irq_routing(pci_enabled);
        gsi = qemu_allocate_irqs(kvm_pc_gsi_handler, gsi_state,
145 146 147 148
                                 GSI_NUM_PINS);
    } else {
        gsi = qemu_allocate_irqs(gsi_handler, gsi_state, GSI_NUM_PINS);
    }
149 150

    if (pci_enabled) {
151
        pci_bus = i440fx_init(&i440fx_state, &piix3_devfn, &isa_bus, gsi,
152
                              system_memory, system_io, args->ram_size,
A
Avi Kivity 已提交
153 154
                              below_4g_mem_size,
                              0x100000000ULL - below_4g_mem_size,
155
                              above_4g_mem_size,
A
Avi Kivity 已提交
156
                              pci_memory, ram_memory);
157 158
    } else {
        pci_bus = NULL;
I
Isaku Yamahata 已提交
159
        i440fx_state = NULL;
160
        isa_bus = isa_bus_new(NULL, system_io);
J
Jan Kiszka 已提交
161
        no_hpet = 1;
162
    }
163
    isa_bus_irqs(isa_bus, gsi);
164

165
    if (kvm_irqchip_in_kernel()) {
166 167 168 169
        i8259 = kvm_i8259_init(isa_bus);
    } else if (xen_enabled()) {
        i8259 = xen_interrupt_controller_init();
    } else {
170
        cpu_irq = pc_allocate_cpu_irq();
171
        i8259 = i8259_init(isa_bus, cpu_irq[0]);
172 173
    }

174 175 176
    for (i = 0; i < ISA_NUM_IRQS; i++) {
        gsi_state->i8259_irq[i] = i8259[i];
    }
177
    if (pci_enabled) {
178
        ioapic_init_gsi(gsi_state, "i440fx");
179
    }
180
    qdev_init_nofail(icc_bridge);
181

J
Jan Kiszka 已提交
182
    pc_register_ferr_irq(gsi[13]);
183

184
    pc_vga_init(isa_bus, pci_enabled ? pci_bus : NULL);
185

186
    /* init basic PC hardware */
187
    pc_basic_device_init(isa_bus, gsi, &rtc_state, &floppy, xen_enabled());
188

189
    pc_nic_init(isa_bus, pci_bus);
190

191
    ide_drive_get(hd, MAX_IDE_BUS);
192
    if (pci_enabled) {
193
        PCIDevice *dev;
194 195 196 197 198
        if (xen_enabled()) {
            dev = pci_piix3_xen_ide_init(pci_bus, hd, piix3_devfn + 1);
        } else {
            dev = pci_piix3_ide_init(pci_bus, hd, piix3_devfn + 1);
        }
199 200
        idebus[0] = qdev_get_child_bus(&dev->qdev, "ide.0");
        idebus[1] = qdev_get_child_bus(&dev->qdev, "ide.1");
201 202
    } else {
        for(i = 0; i < MAX_IDE_BUS; i++) {
203
            ISADevice *dev;
204 205
            dev = isa_ide_init(isa_bus, ide_iobase[i], ide_iobase2[i],
                               ide_irq[i],
206
                               hd[MAX_IDE_DEVS * i], hd[MAX_IDE_DEVS * i + 1]);
A
Andreas Färber 已提交
207
            idebus[i] = qdev_get_child_bus(DEVICE(dev), "ide.0");
208 209 210
        }
    }

211
    pc_cmos_init(below_4g_mem_size, above_4g_mem_size, args->boot_order,
K
Kevin Wolf 已提交
212
                 floppy, idebus[0], idebus[1], rtc_state);
213

214
    if (pci_enabled && usb_enabled(false)) {
215
        pci_create_simple(pci_bus, piix3_devfn + 2, "piix3-usb-uhci");
216 217 218 219 220
    }

    if (pci_enabled && acpi_enabled) {
        i2c_bus *smbus;

221
        smi_irq = qemu_allocate_irqs(pc_acpi_smi_interrupt, first_cpu, 1);
222 223
        /* TODO: Populate SPD eeprom data.  */
        smbus = piix4_pm_init(pci_bus, piix3_devfn + 3, 0xb100,
224
                              gsi[9], *smi_irq,
225
                              kvm_enabled(), fw_cfg);
226
        smbus_eeprom_init(smbus, 8, NULL, 0);
227 228 229 230 231
    }

    if (pci_enabled) {
        pc_pci_device_init(pci_bus);
    }
232 233 234 235

    if (has_pvpanic) {
        pvpanic_init(isa_bus);
    }
236 237
}

238
static void pc_init_pci(QEMUMachineInitArgs *args)
239
{
240
    pc_init1(args, 1, 1);
241 242
}

243
static void pc_compat_1_6(QEMUMachineInitArgs *args)
244 245
{
    has_pci_info = false;
246
    rom_file_in_ram = false;
247
    has_acpi_build = false;
248 249
}

250
static void pc_compat_1_5(QEMUMachineInitArgs *args)
251
{
252
    pc_compat_1_6(args);
A
Anthony Liguori 已提交
253
    has_pvpanic = true;
254 255
}

256
static void pc_compat_1_4(QEMUMachineInitArgs *args)
257
{
258 259
    pc_compat_1_5(args);
    has_pvpanic = false;
B
Borislav Petkov 已提交
260
    x86_cpu_compat_set_features("n270", FEAT_1_ECX, 0, CPUID_EXT_MOVBE);
261
    x86_cpu_compat_set_features("Westmere", FEAT_1_ECX, 0, CPUID_EXT_PCLMULQDQ);
262 263
}

264
static void pc_compat_1_3(QEMUMachineInitArgs *args)
265
{
266
    pc_compat_1_4(args);
267
    enable_compat_apic_id_mode();
268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298
}

/* PC compat function for pc-0.14 to pc-1.2 */
static void pc_compat_1_2(QEMUMachineInitArgs *args)
{
    pc_compat_1_3(args);
    disable_kvm_pv_eoi();
}

static void pc_init_pci_1_6(QEMUMachineInitArgs *args)
{
    pc_compat_1_6(args);
    pc_init_pci(args);
}

static void pc_init_pci_1_5(QEMUMachineInitArgs *args)
{
    pc_compat_1_5(args);
    pc_init_pci(args);
}

static void pc_init_pci_1_4(QEMUMachineInitArgs *args)
{
    pc_compat_1_4(args);
    pc_init_pci(args);
}

static void pc_init_pci_1_3(QEMUMachineInitArgs *args)
{
    pc_compat_1_3(args);
    pc_init_pci(args);
299 300
}

E
Eduardo Habkost 已提交
301
/* PC machine init function for pc-0.14 to pc-1.2 */
302
static void pc_init_pci_1_2(QEMUMachineInitArgs *args)
303
{
304 305
    pc_compat_1_2(args);
    pc_init_pci(args);
306 307
}

308
/* PC init function for pc-0.10 to pc-0.13, and reused by xenfv */
309
static void pc_init_pci_no_kvmclock(QEMUMachineInitArgs *args)
310
{
311
    has_pci_info = false;
312
    disable_kvm_pv_eoi();
313
    enable_compat_apic_id_mode();
314
    pc_init1(args, 1, 0);
315 316
}

317
static void pc_init_isa(QEMUMachineInitArgs *args)
318
{
319
    has_pci_info = false;
320 321 322
    if (!args->cpu_model) {
        args->cpu_model = "486";
    }
323
    disable_kvm_pv_eoi();
324
    enable_compat_apic_id_mode();
325
    pc_init1(args, 0, 1);
326 327
}

A
Anthony PERARD 已提交
328
#ifdef CONFIG_XEN
329
static void pc_xen_hvm_init(QEMUMachineInitArgs *args)
A
Anthony PERARD 已提交
330
{
331 332
    PCIBus *bus;

333
    pc_init_pci(args);
334

D
David Gibson 已提交
335
    bus = pci_find_primary_bus();
336 337 338
    if (bus != NULL) {
        pci_create_simple(bus, -1, "xen-platform");
    }
A
Anthony PERARD 已提交
339 340 341
}
#endif

342 343 344 345 346
#define PC_I440FX_MACHINE_OPTIONS \
    PC_DEFAULT_MACHINE_OPTIONS, \
    .desc = "Standard PC (i440FX + PIIX, 1996)", \
    .hot_add_cpu = pc_hot_add_cpu

347 348 349 350 351 352 353 354 355
#define PC_I440FX_1_7_MACHINE_OPTIONS PC_I440FX_MACHINE_OPTIONS
static QEMUMachine pc_i440fx_machine_v1_7 = {
    PC_I440FX_1_7_MACHINE_OPTIONS,
    .name = "pc-i440fx-1.7",
    .alias = "pc",
    .init = pc_init_pci,
    .is_default = 1,
};

356 357
#define PC_I440FX_1_6_MACHINE_OPTIONS PC_I440FX_MACHINE_OPTIONS

358
static QEMUMachine pc_i440fx_machine_v1_6 = {
359
    PC_I440FX_1_6_MACHINE_OPTIONS,
360
    .name = "pc-i440fx-1.6",
361
    .init = pc_init_pci_1_6,
362 363 364 365
    .compat_props = (GlobalProperty[]) {
        PC_COMPAT_1_6,
        { /* end of list */ }
    },
366 367
};

368
static QEMUMachine pc_i440fx_machine_v1_5 = {
369
    PC_I440FX_1_6_MACHINE_OPTIONS,
370
    .name = "pc-i440fx-1.5",
371
    .init = pc_init_pci_1_5,
372 373 374 375
    .compat_props = (GlobalProperty[]) {
        PC_COMPAT_1_5,
        { /* end of list */ }
    },
376 377
};

378 379 380 381
#define PC_I440FX_1_4_MACHINE_OPTIONS \
    PC_I440FX_1_6_MACHINE_OPTIONS, \
    .hot_add_cpu = NULL

382
static QEMUMachine pc_i440fx_machine_v1_4 = {
383
    PC_I440FX_1_4_MACHINE_OPTIONS,
384
    .name = "pc-i440fx-1.4",
385
    .init = pc_init_pci_1_4,
386 387 388 389 390 391
    .compat_props = (GlobalProperty[]) {
        PC_COMPAT_1_4,
        { /* end of list */ }
    },
};

392
#define PC_COMPAT_1_3 \
393
	PC_COMPAT_1_4, \
394 395 396 397
        {\
            .driver   = "usb-tablet",\
            .property = "usb_version",\
            .value    = stringify(1),\
398 399 400 401
        },{\
            .driver   = "virtio-net-pci",\
            .property = "ctrl_mac_addr",\
            .value    = "off",      \
402 403 404 405
        },{ \
            .driver   = "virtio-net-pci", \
            .property = "mq", \
            .value    = "off", \
406 407 408 409
        }, {\
            .driver   = "e1000",\
            .property = "autonegotiation",\
            .value    = "off",\
410 411
        }

G
Gerd Hoffmann 已提交
412
static QEMUMachine pc_machine_v1_3 = {
413
    PC_I440FX_1_4_MACHINE_OPTIONS,
G
Gerd Hoffmann 已提交
414
    .name = "pc-1.3",
415
    .init = pc_init_pci_1_3,
G
Gerd Hoffmann 已提交
416
    .compat_props = (GlobalProperty[]) {
417
        PC_COMPAT_1_3,
G
Gerd Hoffmann 已提交
418 419 420 421
        { /* end of list */ }
    },
};

422
#define PC_COMPAT_1_2 \
423
        PC_COMPAT_1_3,\
424 425 426 427 428 429 430 431
        {\
            .driver   = "nec-usb-xhci",\
            .property = "msi",\
            .value    = "off",\
        },{\
            .driver   = "nec-usb-xhci",\
            .property = "msix",\
            .value    = "off",\
G
Gerd Hoffmann 已提交
432 433 434 435
        },{\
            .driver   = "ivshmem",\
            .property = "use64",\
            .value    = "0",\
G
Gerd Hoffmann 已提交
436 437 438 439 440 441 442 443
        },{\
            .driver   = "qxl",\
            .property = "revision",\
            .value    = stringify(3),\
        },{\
            .driver   = "qxl-vga",\
            .property = "revision",\
            .value    = stringify(3),\
G
Gerd Hoffmann 已提交
444 445 446 447
        },{\
            .driver   = "VGA",\
            .property = "mmio",\
            .value    = "off",\
448 449
        }

450 451 452 453
#define PC_I440FX_1_2_MACHINE_OPTIONS \
    PC_I440FX_1_4_MACHINE_OPTIONS, \
    .init = pc_init_pci_1_2

G
Gerd Hoffmann 已提交
454
static QEMUMachine pc_machine_v1_2 = {
455
    PC_I440FX_1_2_MACHINE_OPTIONS,
G
Gerd Hoffmann 已提交
456
    .name = "pc-1.2",
457 458 459 460
    .compat_props = (GlobalProperty[]) {
        PC_COMPAT_1_2,
        { /* end of list */ }
    },
G
Gerd Hoffmann 已提交
461 462
};

G
Gerd Hoffmann 已提交
463
#define PC_COMPAT_1_1 \
464
        PC_COMPAT_1_2,\
G
Gerd Hoffmann 已提交
465
        {\
466 467 468 469 470 471 472 473
            .driver   = "virtio-scsi-pci",\
            .property = "hotplug",\
            .value    = "off",\
        },{\
            .driver   = "virtio-scsi-pci",\
            .property = "param_change",\
            .value    = "off",\
        },{\
G
Gerd Hoffmann 已提交
474 475 476 477 478 479 480 481 482 483 484 485 486 487 488
            .driver   = "VGA",\
            .property = "vgamem_mb",\
            .value    = stringify(8),\
        },{\
            .driver   = "vmware-svga",\
            .property = "vgamem_mb",\
            .value    = stringify(8),\
        },{\
            .driver   = "qxl-vga",\
            .property = "vgamem_mb",\
            .value    = stringify(8),\
        },{\
            .driver   = "qxl",\
            .property = "vgamem_mb",\
            .value    = stringify(8),\
489 490 491 492
        },{\
            .driver   = "virtio-blk-pci",\
            .property = "config-wce",\
            .value    = "off",\
G
Gerd Hoffmann 已提交
493 494
        }

G
Gerd Hoffmann 已提交
495
static QEMUMachine pc_machine_v1_1 = {
496
    PC_I440FX_1_2_MACHINE_OPTIONS,
G
Gerd Hoffmann 已提交
497
    .name = "pc-1.1",
G
Gerd Hoffmann 已提交
498 499 500 501
    .compat_props = (GlobalProperty[]) {
        PC_COMPAT_1_1,
        { /* end of list */ }
    },
G
Gerd Hoffmann 已提交
502 503
};

504
#define PC_COMPAT_1_0 \
G
Gerd Hoffmann 已提交
505
        PC_COMPAT_1_1,\
506
        {\
507
            .driver   = TYPE_ISA_FDC,\
508 509
            .property = "check_media_rate",\
            .value    = "off",\
510 511 512 513
        }, {\
            .driver   = "virtio-balloon-pci",\
            .property = "class",\
            .value    = stringify(PCI_CLASS_MEMORY_RAM),\
514 515 516 517
        },{\
            .driver   = "apic",\
            .property = "vapic",\
            .value    = "off",\
G
Gerd Hoffmann 已提交
518
        },{\
519
            .driver   = TYPE_USB_DEVICE,\
G
Gerd Hoffmann 已提交
520 521
            .property = "full-path",\
            .value    = "no",\
522 523
        }

J
Jordan Justen 已提交
524
static QEMUMachine pc_machine_v1_0 = {
525
    PC_I440FX_1_2_MACHINE_OPTIONS,
J
Jordan Justen 已提交
526
    .name = "pc-1.0",
527
    .compat_props = (GlobalProperty[]) {
528
        PC_COMPAT_1_0,
529 530
        { /* end of list */ }
    },
531
    .hw_version = "1.0",
J
Jordan Justen 已提交
532 533
};

534 535 536
#define PC_COMPAT_0_15 \
        PC_COMPAT_1_0

A
Anthony Liguori 已提交
537
static QEMUMachine pc_machine_v0_15 = {
538
    PC_I440FX_1_2_MACHINE_OPTIONS,
A
Anthony Liguori 已提交
539
    .name = "pc-0.15",
540
    .compat_props = (GlobalProperty[]) {
541
        PC_COMPAT_0_15,
542 543
        { /* end of list */ }
    },
544
    .hw_version = "0.15",
A
Anthony Liguori 已提交
545 546
};

547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566
#define PC_COMPAT_0_14 \
        PC_COMPAT_0_15,\
        {\
            .driver   = "virtio-blk-pci",\
            .property = "event_idx",\
            .value    = "off",\
        },{\
            .driver   = "virtio-serial-pci",\
            .property = "event_idx",\
            .value    = "off",\
        },{\
            .driver   = "virtio-net-pci",\
            .property = "event_idx",\
            .value    = "off",\
        },{\
            .driver   = "virtio-balloon-pci",\
            .property = "event_idx",\
            .value    = "off",\
        }

G
Gerd Hoffmann 已提交
567
static QEMUMachine pc_machine_v0_14 = {
568
    PC_I440FX_1_2_MACHINE_OPTIONS,
G
Gerd Hoffmann 已提交
569
    .name = "pc-0.14",
570
    .compat_props = (GlobalProperty[]) {
571
        PC_COMPAT_0_14, 
572 573 574 575 576 577 578 579
        {
            .driver   = "qxl",
            .property = "revision",
            .value    = stringify(2),
        },{
            .driver   = "qxl-vga",
            .property = "revision",
            .value    = stringify(2),
580
        },
581 582
        { /* end of list */ }
    },
583
    .hw_version = "0.14",
G
Gerd Hoffmann 已提交
584 585
};

586 587 588
#define PC_COMPAT_0_13 \
        PC_COMPAT_0_14,\
        {\
589
            .driver   = TYPE_PCI_DEVICE,\
590 591 592 593 594 595 596 597
            .property = "command_serr_enable",\
            .value    = "off",\
        },{\
            .driver   = "AC97",\
            .property = "use_broken_id",\
            .value    = stringify(1),\
        }

598 599 600 601
#define PC_I440FX_0_13_MACHINE_OPTIONS \
    PC_I440FX_1_2_MACHINE_OPTIONS, \
    .init = pc_init_pci_no_kvmclock

G
Gerd Hoffmann 已提交
602
static QEMUMachine pc_machine_v0_13 = {
603
    PC_I440FX_0_13_MACHINE_OPTIONS,
G
Gerd Hoffmann 已提交
604
    .name = "pc-0.13",
G
Gerd Hoffmann 已提交
605
    .compat_props = (GlobalProperty[]) {
606
        PC_COMPAT_0_13,
G
Gerd Hoffmann 已提交
607 608 609 610
        {
            .driver   = "virtio-9p-pci",
            .property = "vectors",
            .value    = stringify(0),
611 612 613 614 615 616 617 618
        },{
            .driver   = "VGA",
            .property = "rombar",
            .value    = stringify(0),
        },{
            .driver   = "vmware-svga",
            .property = "rombar",
            .value    = stringify(0),
619
        },
G
Gerd Hoffmann 已提交
620 621
        { /* end of list */ }
    },
622
    .hw_version = "0.13",
G
Gerd Hoffmann 已提交
623 624
};

625 626 627 628 629 630 631 632 633 634
#define PC_COMPAT_0_12 \
        PC_COMPAT_0_13,\
        {\
            .driver   = "virtio-serial-pci",\
            .property = "max_ports",\
            .value    = stringify(1),\
        },{\
            .driver   = "virtio-serial-pci",\
            .property = "vectors",\
            .value    = stringify(0),\
635 636 637 638 639 640 641 642 643 644 645 646
        },{\
            .driver   = "usb-mouse",\
            .property = "serial",\
            .value    = "1",\
        },{\
            .driver   = "usb-tablet",\
            .property = "serial",\
            .value    = "1",\
        },{\
            .driver   = "usb-kbd",\
            .property = "serial",\
            .value    = "1",\
647 648
        }

649
static QEMUMachine pc_machine_v0_12 = {
650
    PC_I440FX_0_13_MACHINE_OPTIONS,
651 652
    .name = "pc-0.12",
    .compat_props = (GlobalProperty[]) {
653
        PC_COMPAT_0_12,
654
        {
655 656 657 658 659 660 661
            .driver   = "VGA",
            .property = "rombar",
            .value    = stringify(0),
        },{
            .driver   = "vmware-svga",
            .property = "rombar",
            .value    = stringify(0),
662
        },
663
        { /* end of list */ }
664 665
    },
    .hw_version = "0.12",
666 667
};

668 669 670 671 672 673
#define PC_COMPAT_0_11 \
        PC_COMPAT_0_12,\
        {\
            .driver   = "virtio-blk-pci",\
            .property = "vectors",\
            .value    = stringify(0),\
674
        },{\
675
            .driver   = TYPE_PCI_DEVICE,\
676 677
            .property = "rombar",\
            .value    = stringify(0),\
678 679
        }

680
static QEMUMachine pc_machine_v0_11 = {
681
    PC_I440FX_0_13_MACHINE_OPTIONS,
682 683
    .name = "pc-0.11",
    .compat_props = (GlobalProperty[]) {
684
        PC_COMPAT_0_11,
685 686 687 688 689 690 691 692
        {
            .driver   = "ide-drive",
            .property = "ver",
            .value    = "0.11",
        },{
            .driver   = "scsi-disk",
            .property = "ver",
            .value    = "0.11",
693
        },
694
        { /* end of list */ }
695 696
    },
    .hw_version = "0.11",
697 698 699
};

static QEMUMachine pc_machine_v0_10 = {
700
    PC_I440FX_0_13_MACHINE_OPTIONS,
701 702
    .name = "pc-0.10",
    .compat_props = (GlobalProperty[]) {
703
        PC_COMPAT_0_11,
704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723
        {
            .driver   = "virtio-blk-pci",
            .property = "class",
            .value    = stringify(PCI_CLASS_STORAGE_OTHER),
        },{
            .driver   = "virtio-serial-pci",
            .property = "class",
            .value    = stringify(PCI_CLASS_DISPLAY_OTHER),
        },{
            .driver   = "virtio-net-pci",
            .property = "vectors",
            .value    = stringify(0),
        },{
            .driver   = "ide-drive",
            .property = "ver",
            .value    = "0.10",
        },{
            .driver   = "scsi-disk",
            .property = "ver",
            .value    = "0.10",
724
        },
725 726
        { /* end of list */ }
    },
727
    .hw_version = "0.10",
728 729 730
};

static QEMUMachine isapc_machine = {
731
    PC_COMMON_MACHINE_OPTIONS,
732 733 734 735
    .name = "isapc",
    .desc = "ISA-only PC",
    .init = pc_init_isa,
    .max_cpus = 1,
736 737 738
    .compat_props = (GlobalProperty[]) {
        { /* end of list */ }
    },
739 740
};

A
Anthony PERARD 已提交
741 742
#ifdef CONFIG_XEN
static QEMUMachine xenfv_machine = {
743
    PC_COMMON_MACHINE_OPTIONS,
A
Anthony PERARD 已提交
744 745 746 747 748
    .name = "xenfv",
    .desc = "Xen Fully-virtualized PC",
    .init = pc_xen_hvm_init,
    .max_cpus = HVM_MAX_VCPUS,
    .default_machine_opts = "accel=xen",
749
    .hot_add_cpu = pc_hot_add_cpu,
A
Anthony PERARD 已提交
750 751 752
};
#endif

753 754
static void pc_machine_init(void)
{
755
    qemu_register_machine(&pc_i440fx_machine_v1_7);
756
    qemu_register_machine(&pc_i440fx_machine_v1_6);
757
    qemu_register_machine(&pc_i440fx_machine_v1_5);
G
Gerd Hoffmann 已提交
758
    qemu_register_machine(&pc_i440fx_machine_v1_4);
G
Gerd Hoffmann 已提交
759
    qemu_register_machine(&pc_machine_v1_3);
G
Gerd Hoffmann 已提交
760
    qemu_register_machine(&pc_machine_v1_2);
J
Jordan Justen 已提交
761
    qemu_register_machine(&pc_machine_v1_1);
G
Gerd Hoffmann 已提交
762
    qemu_register_machine(&pc_machine_v1_0);
A
Anthony Liguori 已提交
763
    qemu_register_machine(&pc_machine_v0_15);
G
Gerd Hoffmann 已提交
764
    qemu_register_machine(&pc_machine_v0_14);
G
Gerd Hoffmann 已提交
765
    qemu_register_machine(&pc_machine_v0_13);
766 767 768 769
    qemu_register_machine(&pc_machine_v0_12);
    qemu_register_machine(&pc_machine_v0_11);
    qemu_register_machine(&pc_machine_v0_10);
    qemu_register_machine(&isapc_machine);
A
Anthony PERARD 已提交
770 771 772
#ifdef CONFIG_XEN
    qemu_register_machine(&xenfv_machine);
#endif
773 774 775
}

machine_init(pc_machine_init);