File qemu-intelmac.patch of Package kvm

#qemu-only -> submit upstream qemu, but improve first:
# undo rather hacky pci_enabled -> model > MODEL_ISA changes
# and replace checks wether to enable newer emulated Mac hardware
# depending in the bits in a bitfield which is passed pc_init1()
# like this: pc_init1(.... , ISA, ...)
#            pc_init1(.... , PCI | IOAPIC | PIIX, ...  
#            pc_init1(.... , PCI | ICH6, LPC, SMC , ...)
Index: qemu/hw/boards.h
===================================================================
--- qemu/hw/boards.h.orig
+++ qemu/hw/boards.h
@@ -23,6 +23,7 @@ int qemu_register_machine(QEMUMachine *m
 extern QEMUMachine bareetraxfs_machine;
 
 /* pc.c */
+extern QEMUMachine mac_machine;
 extern QEMUMachine pc_machine;
 extern QEMUMachine isapc_machine;
 
Index: qemu/hw/pc.c
===================================================================
--- qemu/hw/pc.c.orig
+++ qemu/hw/pc.c
@@ -53,6 +53,12 @@ static PITState *pit;
 static IOAPICState *ioapic;
 static PCIDevice *i440fx_state;
 
+enum pc_model {
+    MODEL_ISA = 0,
+    MODEL_PCI = 1,
+    MODEL_MAC = 2
+};
+
 static void ioport80_write(void *opaque, uint32_t addr, uint32_t data)
 {
 }
@@ -764,7 +770,7 @@ static void pc_init1(ram_addr_t ram_size
                      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)
+                     int model, const char *cpu_model)
 {
     char buf[1024];
     int ret, linux_boot, i;
@@ -790,15 +796,19 @@ static void pc_init1(ram_addr_t ram_size
 
     /* init CPUs */
     if (cpu_model == NULL) {
+        if(model == MODEL_MAC) {
+            cpu_model = "coreduo";
+        } else {
 #ifdef TARGET_X86_64
-        cpu_model = "qemu64";
+            cpu_model = "qemu64";
 #else
-        cpu_model = "qemu32";
+            cpu_model = "qemu32";
 #endif
+        }
     }
     
     for(i = 0; i < smp_cpus; i++) {
-	env = pc_new_cpu(i, cpu_model, pci_enabled);
+	env = pc_new_cpu(i, cpu_model, model > MODEL_ISA);
     }
 
     /* allocate RAM */
@@ -823,8 +833,16 @@ static void pc_init1(ram_addr_t ram_size
     vga_ram_addr = qemu_ram_alloc(vga_ram_size);
 
     /* BIOS load */
-    if (bios_name == NULL)
-        bios_name = BIOS_FILENAME;
+    if (bios_name == NULL) {
+        switch(model) {
+            case MODEL_MAC:
+                bios_name = "bios-mac.bin";
+                break;
+            default:
+                bios_name = BIOS_FILENAME;
+                break;
+        }
+    }
     snprintf(buf, sizeof(buf), "%s/%s", bios_dir, bios_name);
     bios_size = get_image_size(buf);
     if (bios_size <= 0 ||
@@ -938,7 +956,7 @@ static void pc_init1(ram_addr_t ram_size
     i8259 = i8259_init(cpu_irq[0]);
     ferr_irq = i8259[13];
 
-    if (pci_enabled) {
+    if (model > MODEL_ISA) {
         pci_bus = i440fx_init(&i440fx_state, i8259);
         piix3_devfn = piix3_init(pci_bus, -1);
     } else {
@@ -951,7 +969,7 @@ static void pc_init1(ram_addr_t ram_size
     register_ioport_write(0xf0, 1, 1, ioportF0_write, NULL);
 
     if (cirrus_vga_enabled) {
-        if (pci_enabled) {
+        if (model > MODEL_ISA) {
             pci_cirrus_vga_init(pci_bus,
                                 ds, phys_ram_base + vga_ram_addr,
                                 vga_ram_addr, vga_ram_size);
@@ -960,13 +978,13 @@ static void pc_init1(ram_addr_t ram_size
                                 vga_ram_addr, vga_ram_size);
         }
     } else if (vmsvga_enabled) {
-        if (pci_enabled)
+        if (model > MODEL_ISA)
             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) {
+        if (model > MODEL_ISA) {
             pci_vga_init(pci_bus, ds, phys_ram_base + vga_ram_addr,
                          vga_ram_addr, vga_ram_size, 0, 0);
         } else {
@@ -980,12 +998,18 @@ static void pc_init1(ram_addr_t ram_size
     register_ioport_read(0x92, 1, 1, ioport92_read, NULL);
     register_ioport_write(0x92, 1, 1, ioport92_write, NULL);
 
-    if (pci_enabled) {
-        ioapic = ioapic_init();
+    
+    switch(model) {
+        case MODEL_MAC:
+            applesmc_init();
+            lpc_init(pci_bus, piix3_devfn, i8259);
+        case MODEL_PCI:
+            ioapic = ioapic_init();
+            break;
     }
     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);
     }
 
@@ -1005,15 +1029,21 @@ static void pc_init1(ram_addr_t ram_size
     for(i = 0; i < nb_nics; i++) {
         nd = &nd_table[i];
         if (!nd->model) {
-            if (pci_enabled) {
-                nd->model = "rtl8139";
-            } else {
-                nd->model = "ne2k_isa";
+            switch(model) {
+                case MODEL_ISA:
+                    nd->model = "ne2k_isa";
+                    break;
+                case MODEL_MAC:
+                    nd->model = "rtl8139";
+                    break;
+                default:
+                    nd->model = "ne2k_pci";
+                    break;
             }
         }
         if (strcmp(nd->model, "ne2k_isa") == 0) {
             pc_init_ne2k_isa(nd, i8259);
-        } else if (pci_enabled) {
+        } else if (model > MODEL_ISA) {
             if (strcmp(nd->model, "?") == 0)
                 fprintf(stderr, "qemu: Supported ISA NICs: ne2k_isa\n");
             pci_nic_init(pci_bus, nd, -1);
@@ -1045,19 +1075,25 @@ static void pc_init1(ram_addr_t ram_size
 	    hd[i] = NULL;
     }
 
-    if (pci_enabled) {
-        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]);
-        }
+    switch(model) {
+        case MODEL_MAC:
+            pci_ich6_ide_init(pci_bus, hd, piix3_devfn + 1, i8259);
+            break;
+        case MODEL_PCI:
+            pci_piix3_ide_init(pci_bus, hd, piix3_devfn + 1, i8259);
+            break;
+        default:
+            for(i = 0; i < 2; 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;
     }
 
     i8042_init(i8259[1], i8259[12], 0x60);
     DMA_init(0);
 #ifdef HAS_AUDIO
-    audio_init(pci_enabled ? pci_bus : NULL, i8259);
+    audio_init((model > MODEL_ISA) ? pci_bus : NULL, i8259);
 #endif
 
     for(i = 0; i < MAX_FD; i++) {
@@ -1071,11 +1107,11 @@ static void pc_init1(ram_addr_t ram_size
 
     cmos_init(ram_size, above_4g_mem_size, boot_device, hd, smp_cpus);
 
-    if (pci_enabled && usb_enabled) {
+    if ((model > MODEL_ISA) && usb_enabled) {
         usb_uhci_piix3_init(pci_bus, piix3_devfn + 2);
     }
 
-    if (pci_enabled && acpi_enabled) {
+    if ((model > MODEL_ISA) && acpi_enabled) {
         uint8_t *eeprom_buf = qemu_mallocz(8 * 256); /* XXX: make this persistent */
         i2c_bus *smbus;
 
@@ -1090,7 +1126,7 @@ static void pc_init1(ram_addr_t ram_size
         i440fx_init_memory_mappings(i440fx_state);
     }
 
-    if (pci_enabled) {
+    if (model > MODEL_ISA) {
 	int max_bus;
         int bus, unit;
         void *scsi;
@@ -1109,7 +1145,7 @@ static void pc_init1(ram_addr_t ram_size
     }
 
     /* Add virtio block devices */
-    if (pci_enabled) {
+    if (model > MODEL_ISA) {
 	int index;
 	int unit_id = 0;
 
@@ -1133,6 +1169,18 @@ static void pc_init1(ram_addr_t ram_size
     }
 }
 
+static void pc_init_mac(int 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_MAC, cpu_model);
+}
+
 static void pc_init_pci(ram_addr_t ram_size, int vga_ram_size,
                         const char *boot_device, DisplayState *ds,
                         const char *kernel_filename,
@@ -1142,7 +1190,7 @@ static void pc_init_pci(ram_addr_t ram_s
 {
     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,
@@ -1154,7 +1202,7 @@ static void pc_init_isa(ram_addr_t ram_s
 {
     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);
 }
 
 QEMUMachine pc_machine = {
@@ -1163,6 +1211,12 @@ QEMUMachine pc_machine = {
     pc_init_pci,
 };
 
+QEMUMachine mac_machine = {
+    "mac",
+    "Intel-Mac",
+    pc_init_mac,
+};
+
 QEMUMachine isapc_machine = {
     "isapc",
     "ISA-only PC",
Index: qemu/vl.c
===================================================================
--- qemu/vl.c.orig
+++ qemu/vl.c
@@ -8410,6 +8410,7 @@ static void register_machines(void)
 {
 #if defined(TARGET_I386)
     qemu_register_machine(&pc_machine);
+    qemu_register_machine(&mac_machine);
     qemu_register_machine(&isapc_machine);
 #elif defined(TARGET_PPC)
     qemu_register_machine(&heathrow_machine);
openSUSE Build Service is sponsored by