qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH] Add VMware machine


From: Hervé Poussineau
Subject: [Qemu-devel] [PATCH] Add VMware machine
Date: Sun, 24 Aug 2008 18:16:11 +0200
User-agent: Thunderbird 2.0.0.16 (Windows/20080708)

Hi,

Attached patch adds a 'vmware' machine type.
This one automatically uses VMware display card, and enables VMware mouse.
In non VMware machine types (ie 'pc' and 'isapc' types), VMware backdoor
and VMware mouse are disabled [1]

I added an enum with PC types in pc.c . This system can be extended
later to add more PC types.

Please comment.

Hervé

[1] This has the same effect that the switch '-no-vmport' proposed by
Ian Kirk in http://marc.info/?l=qemu-devel&m=121957847306185&w=2
Index: hw/boards.h
===================================================================
--- hw/boards.h (revision 5075)
+++ hw/boards.h (working copy)
@@ -29,6 +29,7 @@
 /* pc.c */
 extern QEMUMachine pc_machine;
 extern QEMUMachine isapc_machine;
+extern QEMUMachine vmware_machine;
 
 /* ppc.c */
 extern QEMUMachine prep_machine;
Index: hw/pc.c
===================================================================
--- hw/pc.c     (revision 5075)
+++ hw/pc.c     (working copy)
@@ -53,6 +53,12 @@
 static IOAPICState *ioapic;
 static PCIDevice *i440fx_state;
 
+typedef enum pc_model {
+    MODEL_ISA = 0,
+    MODEL_PCI = 1,
+    MODEL_VMWARE = 2,
+} pc_model;
+
 static void ioport80_write(void *opaque, uint32_t addr, uint32_t data)
 {
 }
@@ -721,14 +727,14 @@
                      const char *boot_device, DisplayState *ds,
                      const char *kernel_filename, const char *kernel_cmdline,
                      const char *initrd_filename,
-                     int pci_enabled, const char *cpu_model)
+                     pc_model model, const char *cpu_model)
 {
     char buf[1024];
     int ret, linux_boot, i;
     ram_addr_t ram_addr, vga_ram_addr, bios_offset, vga_bios_offset;
     ram_addr_t below_4g_mem_size, above_4g_mem_size = 0;
     int bios_size, isa_bios_size, vga_bios_size;
-    PCIBus *pci_bus;
+    PCIBus *pci_bus = NULL;
     int piix3_devfn = -1;
     CPUState *env;
     NICInfo *nd;
@@ -769,12 +775,14 @@
             env->cpuid_features |= CPUID_APIC;
         }
         qemu_register_reset(main_cpu_reset, env);
-        if (pci_enabled) {
+        if (model != MODEL_ISA) {
             apic_init(env);
         }
     }
 
-    vmport_init();
+    /* VMware backdoor */
+    if (model == MODEL_VMWARE)
+        vmport_init();
 
     /* allocate RAM */
     ram_addr = qemu_ram_alloc(ram_size);
@@ -880,11 +888,15 @@
     i8259 = i8259_init(cpu_irq[0]);
     ferr_irq = i8259[13];
 
-    if (pci_enabled) {
+    /* PCI bus */
+    switch (model) {
+    case MODEL_PCI:
+    case MODEL_VMWARE:
         pci_bus = i440fx_init(&i440fx_state, i8259);
         piix3_devfn = piix3_init(pci_bus, -1);
-    } else {
-        pci_bus = NULL;
+        break;
+    default:
+        break;
     }
 
     /* init basic PC hardware */
@@ -892,29 +904,38 @@
 
     register_ioport_write(0xf0, 1, 1, ioportF0_write, NULL);
 
-    if (cirrus_vga_enabled) {
-        if (pci_enabled) {
+    /* Graphic card */
+    switch (model) {
+    case MODEL_ISA:
+        if (cirrus_vga_enabled) {
+            isa_cirrus_vga_init(ds, phys_ram_base + vga_ram_addr,
+                                vga_ram_addr, vga_ram_size);
+        } else if (vmsvga_enabled) {
+            fprintf(stderr, "%s: vmware_vga: no PCI bus\n", __FUNCTION__);
+        } else {
+            isa_vga_init(ds, phys_ram_base + vga_ram_addr,
+                         vga_ram_addr, vga_ram_size);
+        }
+        break;
+    case MODEL_PCI:
+        if (cirrus_vga_enabled) {
             pci_cirrus_vga_init(pci_bus,
                                 ds, phys_ram_base + vga_ram_addr,
                                 vga_ram_addr, vga_ram_size);
-        } else {
-            isa_cirrus_vga_init(ds, phys_ram_base + vga_ram_addr,
-                                vga_ram_addr, vga_ram_size);
-        }
-    } else if (vmsvga_enabled) {
-        if (pci_enabled)
+        } else if (vmsvga_enabled) {
             pci_vmsvga_init(pci_bus, ds, phys_ram_base + vga_ram_addr,
                             vga_ram_addr, vga_ram_size);
-        else
-            fprintf(stderr, "%s: vmware_vga: no PCI bus\n", __FUNCTION__);
-    } else {
-        if (pci_enabled) {
+        } else {
             pci_vga_init(pci_bus, ds, phys_ram_base + vga_ram_addr,
                          vga_ram_addr, vga_ram_size, 0, 0);
-        } else {
-            isa_vga_init(ds, phys_ram_base + vga_ram_addr,
-                         vga_ram_addr, vga_ram_size);
         }
+        break;
+    case MODEL_VMWARE:
+        pci_vmsvga_init(pci_bus, ds, phys_ram_base + vga_ram_addr,
+                        vga_ram_addr, vga_ram_size);
+        break;
+    default:
+        break;
     }
 
     rtc_state = rtc_init(0x70, i8259[8]);
@@ -924,12 +945,12 @@
     register_ioport_read(0x92, 1, 1, ioport92_read, NULL);
     register_ioport_write(0x92, 1, 1, ioport92_write, NULL);
 
-    if (pci_enabled) {
+    if (model != MODEL_ISA) {
         ioapic = ioapic_init();
     }
     pit = pit_init(0x40, i8259[0]);
     pcspk_init(pit);
-    if (pci_enabled) {
+    if (model != MODEL_ISA) {
         pic_set_alt_irq_func(isa_pic, ioapic_set_irq, ioapic);
     }
 
@@ -947,56 +968,61 @@
         }
     }
 
+    /* Network cards */
     for(i = 0; i < nb_nics; i++) {
         nd = &nd_table[i];
         if (!nd->model) {
-            if (pci_enabled) {
+            if (pci_bus)
                 nd->model = "ne2k_pci";
-            } else {
+            else
                 nd->model = "ne2k_isa";
-            }
         }
-        if (strcmp(nd->model, "ne2k_isa") == 0) {
+        if (strcmp(nd->model, "?") == 0) {
+            fprintf(stderr, "qemu: Supported ISA NICs: ne2k_isa\n");
+            if (pci_bus)
+                pci_nic_init(pci_bus, nd, -1);
+            exit(1);
+        } else if (strcmp(nd->model, "ne2k_isa") == 0) {
             pc_init_ne2k_isa(nd, i8259);
-        } else if (pci_enabled) {
-            if (strcmp(nd->model, "?") == 0)
-                fprintf(stderr, "qemu: Supported ISA NICs: ne2k_isa\n");
+        } else if (pci_bus) {
             pci_nic_init(pci_bus, nd, -1);
-        } else if (strcmp(nd->model, "?") == 0) {
-            fprintf(stderr, "qemu: Supported ISA NICs: ne2k_isa\n");
-            exit(1);
         } else {
             fprintf(stderr, "qemu: Unsupported NIC: %s\n", nd->model);
             exit(1);
         }
     }
 
+    /* IDE devices */
     if (drive_get_max_bus(IF_IDE) >= MAX_IDE_BUS) {
         fprintf(stderr, "qemu: too many IDE bus\n");
         exit(1);
     }
-
-    for(i = 0; i < MAX_IDE_BUS * MAX_IDE_DEVS; i++) {
+    for (i = 0; i < MAX_IDE_BUS * MAX_IDE_DEVS; i++) {
         index = drive_get_index(IF_IDE, i / MAX_IDE_DEVS, i % MAX_IDE_DEVS);
-       if (index != -1)
-           hd[i] = drives_table[index].bdrv;
-       else
-           hd[i] = NULL;
+        hd[i] = (index == -1) ? NULL : drives_table[index].bdrv;
     }
-
-    if (pci_enabled) {
+    switch (model) {
+    case MODEL_ISA:
+        for (i = 0; i < MAX_IDE_BUS; i++)
+            isa_ide_init(ide_iobase[i], ide_iobase2[i], i8259[ide_irq[i]],
+                         hd[MAX_IDE_DEVS * i], hd[MAX_IDE_DEVS * i + 1]);
+        break;
+    case MODEL_PCI:
+    case MODEL_VMWARE:
         pci_piix3_ide_init(pci_bus, hd, piix3_devfn + 1, i8259);
-    } else {
-        for(i = 0; i < MAX_IDE_BUS; i++) {
-            isa_ide_init(ide_iobase[i], ide_iobase2[i], i8259[ide_irq[i]],
-                        hd[MAX_IDE_DEVS * i], hd[MAX_IDE_DEVS * i + 1]);
-        }
+    default:
+        break;
     }
 
-    i8042_init(i8259[1], i8259[12], 0x60);
+    /* Keyboard/mouse */
+    if (model != MODEL_VMWARE)
+        i8042_init(i8259[1], i8259[12], 0x60, 0);
+    else
+        i8042_init(i8259[1], i8259[12], 0x60, 1);
+
     DMA_init(0);
 #ifdef HAS_AUDIO
-    audio_init(pci_enabled ? pci_bus : NULL, i8259);
+    audio_init(pci_bus, i8259);
 #endif
 
     for(i = 0; i < MAX_FD; i++) {
@@ -1010,11 +1036,11 @@
 
     cmos_init(below_4g_mem_size, above_4g_mem_size, boot_device, hd);
 
-    if (pci_enabled && usb_enabled) {
+    if (pci_bus && usb_enabled) {
         usb_uhci_piix3_init(pci_bus, piix3_devfn + 2);
     }
 
-    if (pci_enabled && acpi_enabled) {
+    if (pci_bus && acpi_enabled) {
         uint8_t *eeprom_buf = qemu_mallocz(8 * 256); /* XXX: make this 
persistent */
         i2c_bus *smbus;
 
@@ -1029,7 +1055,7 @@
         i440fx_init_memory_mappings(i440fx_state);
     }
 
-    if (pci_enabled) {
+    if (pci_bus) {
        int max_bus;
         int bus, unit;
         void *scsi;
@@ -1057,7 +1083,7 @@
 {
     pc_init1(ram_size, vga_ram_size, boot_device, ds,
              kernel_filename, kernel_cmdline,
-             initrd_filename, 1, cpu_model);
+             initrd_filename, MODEL_PCI, cpu_model);
 }
 
 static void pc_init_isa(ram_addr_t ram_size, int vga_ram_size,
@@ -1069,9 +1095,21 @@
 {
     pc_init1(ram_size, vga_ram_size, boot_device, ds,
              kernel_filename, kernel_cmdline,
-             initrd_filename, 0, cpu_model);
+             initrd_filename, MODEL_ISA, cpu_model);
 }
 
+static void pc_init_vmware(ram_addr_t ram_size, int vga_ram_size,
+                           const char *boot_device, DisplayState *ds,
+                           const char *kernel_filename,
+                           const char *kernel_cmdline,
+                           const char *initrd_filename,
+                           const char *cpu_model)
+{
+    pc_init1(ram_size, vga_ram_size, boot_device, ds,
+             kernel_filename, kernel_cmdline,
+             initrd_filename, MODEL_VMWARE, cpu_model);
+}
+
 QEMUMachine pc_machine = {
     .name = "pc",
     .desc = "Standard PC",
@@ -1085,3 +1123,10 @@
     .init = pc_init_isa,
     .ram_require = VGA_RAM_SIZE + PC_MAX_BIOS_SIZE,
 };
+
+QEMUMachine vmware_machine = {
+    .name = "vmware",
+    .desc = "VMWare PC",
+    .init = pc_init_vmware,
+    .ram_require = VGA_RAM_SIZE + PC_MAX_BIOS_SIZE,
+};
Index: hw/pc.h
===================================================================
--- hw/pc.h     (revision 5075)
+++ hw/pc.h     (working copy)
@@ -69,7 +69,8 @@
 
 /* pckbd.c */
 
-void i8042_init(qemu_irq kbd_irq, qemu_irq mouse_irq, uint32_t io_base);
+void i8042_init(qemu_irq kbd_irq, qemu_irq mouse_irq, uint32_t io_base,
+                int vmmouse);
 void i8042_mm_init(qemu_irq kbd_irq, qemu_irq mouse_irq,
                    target_phys_addr_t base, int it_shift);
 
Index: hw/pckbd.c
===================================================================
--- hw/pckbd.c  (revision 5075)
+++ hw/pckbd.c  (working copy)
@@ -365,7 +365,8 @@
     return 0;
 }
 
-void i8042_init(qemu_irq kbd_irq, qemu_irq mouse_irq, uint32_t io_base)
+void i8042_init(qemu_irq kbd_irq, qemu_irq mouse_irq, uint32_t io_base,
+                int vmmouse)
 {
     KBDState *s = &kbd_state;
 
@@ -382,7 +383,8 @@
     s->kbd = ps2_kbd_init(kbd_update_kbd_irq, s);
     s->mouse = ps2_mouse_init(kbd_update_aux_irq, s);
 #ifdef TARGET_I386
-    vmmouse_init(s->mouse);
+    if (vmmouse)
+        vmmouse_init(s->mouse);
 #endif
     qemu_register_reset(kbd_reset, s);
 }
@@ -446,8 +448,5 @@
 
     s->kbd = ps2_kbd_init(kbd_update_kbd_irq, s);
     s->mouse = ps2_mouse_init(kbd_update_aux_irq, s);
-#ifdef TARGET_I386
-    vmmouse_init(s->mouse);
-#endif
     qemu_register_reset(kbd_reset, s);
 }
Index: target-i386/machine.c
===================================================================
--- target-i386/machine.c       (revision 5074)
+++ target-i386/machine.c       (working copy)
@@ -9,6 +9,7 @@
 {
     qemu_register_machine(&pc_machine);
     qemu_register_machine(&isapc_machine);
+    qemu_register_machine(&vmware_machine);
 }
 
 static void cpu_put_seg(QEMUFile *f, SegmentCache *dt)
Index: vl.c
===================================================================
--- vl.c        (revision 5074)
+++ vl.c        (working copy)
@@ -8632,6 +8632,7 @@
                 vmsvga_enabled = 0;
                 break;
             case QEMU_OPTION_vmsvga:
+                printf("qemu: you should use 'vmware' machine type instead 
(see -M option)\n");
                 cirrus_vga_enabled = 0;
                 vmsvga_enabled = 1;
                 break;

reply via email to

[Prev in Thread] Current Thread [Next in Thread]