qemu-devel
[Top][All Lists]
Advanced

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

[Qemu-devel] [PATCH] Sparc32/PPC: convert escc to qdev


From: Blue Swirl
Subject: [Qemu-devel] [PATCH] Sparc32/PPC: convert escc to qdev
Date: Mon, 13 Jul 2009 22:32:30 +0300

Hi,

This patch would convert escc to qdev. Sparc32 works fine, but there
is a problem with PPC, it crashes when the device is remapped by
macio.c.

Any ideas?

(qemu)
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7fc64110f700 (LWP 9719)]
subpage_register (mmio=0x2954020, start=<value optimized out>,
    end=<value optimized out>, memory=0x1024600, region_offset=0x0)
    at /src/qemu/exec.c:2946
2946                if (io_mem_read[memory][i]) {
(gdb) bt
#0  subpage_register (mmio=0x2954020, start=<value optimized out>,
    end=<value optimized out>, memory=0x1024600, region_offset=0x0)
    at /src/qemu/exec.c:2946
#1  0x00000000004b51a8 in subpage_init (base=0x80013000, phys=0x273b130,
    orig_memory=0x8123000, region_offset=0x0) at /src/qemu/exec.c:2977
#2  0x00000000004b5403 in cpu_register_physical_memory_offset (
    start_addr=0x80013000, size=0x40, phys_offset=0x10,
    region_offset=0x80013000) at /src/qemu/exec.c:2367
#3  0x0000000000597528 in sysbus_mmio_map (dev=0x266c010, n=0x0,
    addr=0x80813000) at /src/qemu/cpu-common.h:33
#4  0x0000000000445b54 in macio_map (pci_dev=<value optimized out>,
    region_num=<value optimized out>, addr=0x80800000, size=0x210eaa60,
    type=0x0) at /src/qemu/hw/macio.c:66
#5  0x00000000004141e7 in pci_update_mappings (d=0x2671010)
    at /src/qemu/hw/pci.c:495
#6  0x0000000000414373 in pci_default_write_config (d=0x2994048, addr=0x14,
    val=0x0, l=0x2974028) at /src/qemu/hw/pci.c:542
#7  0x0000000041aba675 in ?? ()
#8  0x00007fc600000000 in ?? ()
#9  0x00007fff4923b594 in ?? ()
#10 0x00000000fff0e4b4 in ?? ()
#11 0x0000000000000001 in ?? ()
#12 0x0000000000000000 in ?? ()

---
 hw/escc.c         |  156 ++++++++++++++++++++++++++++++++--------------------
 hw/escc.h         |    6 +-
 hw/macio.c        |   12 ++--
 hw/ppc_mac.h      |    4 +-
 hw/ppc_newworld.c |    9 ++--
 hw/ppc_oldworld.c |    9 ++--
 6 files changed, 118 insertions(+), 78 deletions(-)

diff --git a/hw/escc.c b/hw/escc.c
index 66afbb9..1e0fcb9 100644
--- a/hw/escc.c
+++ b/hw/escc.c
@@ -21,7 +21,9 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  * THE SOFTWARE.
  */
+
 #include "hw.h"
+#include "sysbus.h"
 #include "escc.h"
 #include "qemu-char.h"
 #include "console.h"
@@ -114,6 +116,7 @@ typedef struct ChannelState {
 } ChannelState;

 struct SerialState {
+    SysBusDevice busdev;
     struct ChannelState chn[2];
     int it_shift;
 };
@@ -719,48 +722,30 @@ static int escc_load(QEMUFile *f, void *opaque,
int version_id)

 }

-int escc_init(target_phys_addr_t base, qemu_irq irqA, qemu_irq irqB,
-              CharDriverState *chrA, CharDriverState *chrB,
-              int clock, int it_shift)
+SysBusDevice *escc_init(target_phys_addr_t base, qemu_irq irqA, qemu_irq irqB,
+                        CharDriverState *chrA, CharDriverState *chrB,
+                        int clock, int it_shift)
 {
-    int escc_io_memory, i;
-    SerialState *s;
-
-    s = qemu_mallocz(sizeof(SerialState));
-
-    escc_io_memory = cpu_register_io_memory(escc_mem_read,
-                                            escc_mem_write,
-                                            s);
-    if (base)
-        cpu_register_physical_memory(base, ESCC_SIZE << it_shift,
-                                     escc_io_memory);
-
-    s->it_shift = it_shift;
-    s->chn[0].chr = chrB;
-    s->chn[1].chr = chrA;
-    s->chn[0].disabled = 0;
-    s->chn[1].disabled = 0;
-    s->chn[0].irq = irqB;
-    s->chn[1].irq = irqA;
-
-    for (i = 0; i < 2; i++) {
-        s->chn[i].chn = 1 - i;
-        s->chn[i].type = ser;
-        s->chn[i].clock = clock / 2;
-        if (s->chn[i].chr) {
-            qemu_chr_add_handlers(s->chn[i].chr, serial_can_receive,
-                                  serial_receive1, serial_event, &s->chn[i]);
-        }
+    DeviceState *dev;
+    SysBusDevice *s;
+
+    dev = qdev_create(NULL, "escc");
+    qdev_set_prop_int(dev, "disabled", 0);
+    qdev_set_prop_int(dev, "frequency", clock);
+    qdev_set_prop_int(dev, "it_shift", it_shift);
+    qdev_set_prop_ptr(dev, "chrB", chrB);
+    qdev_set_prop_ptr(dev, "chrA", chrA);
+    qdev_set_prop_int(dev, "chnBtype", ser);
+    qdev_set_prop_int(dev, "chnAtype", ser);
+    qdev_init(dev);
+    s = sysbus_from_qdev(dev);
+    sysbus_connect_irq(s, 0, irqA);
+    sysbus_connect_irq(s, 1, irqB);
+    if (base) {
+        sysbus_mmio_map(s, 0, base);
     }
-    s->chn[0].otherchn = &s->chn[1];
-    s->chn[1].otherchn = &s->chn[0];
-    if (base)
-        register_savevm("escc", base, 2, escc_save, escc_load, s);
-    else
-        register_savevm("escc", -1, 2, escc_save, escc_load, s);
-    qemu_register_reset(escc_reset, s);
-    escc_reset(s);
-    return escc_io_memory;
+
+    return s;
 }

 static const uint8_t keycodes[128] = {
@@ -903,35 +888,86 @@ static void sunmouse_event(void *opaque,
 void slavio_serial_ms_kbd_init(target_phys_addr_t base, qemu_irq irq,
                                int disabled, int clock, int it_shift)
 {
-    int slavio_serial_io_memory, i;
-    SerialState *s;
-
-    s = qemu_mallocz(sizeof(SerialState));
+    DeviceState *dev;
+    SysBusDevice *s;
+
+    dev = qdev_create(NULL, "escc");
+    qdev_set_prop_int(dev, "disabled", disabled);
+    qdev_set_prop_int(dev, "frequency", clock);
+    qdev_set_prop_int(dev, "it_shift", it_shift);
+    qdev_set_prop_ptr(dev, "chrB", NULL);
+    qdev_set_prop_ptr(dev, "chrA", NULL);
+    qdev_set_prop_int(dev, "chnBtype", mouse);
+    qdev_set_prop_int(dev, "chnAtype", kbd);
+    qdev_init(dev);
+    s = sysbus_from_qdev(dev);
+    sysbus_connect_irq(s, 0, irq);
+    sysbus_connect_irq(s, 1, irq);
+    sysbus_mmio_map(s, 0, base);
+}

-    s->it_shift = it_shift;
+static void escc_init1(SysBusDevice *dev)
+{
+    SerialState *s = FROM_SYSBUS(SerialState, dev);
+    int io;
+    unsigned int i;
+    uint32_t clock, disabled;
+
+    s->it_shift = qdev_get_prop_int(&dev->qdev, "it_shift", 0);
+    clock = qdev_get_prop_int(&dev->qdev, "clock", 0);
+    s->chn[0].chr = qdev_get_prop_ptr(&dev->qdev, "chrB");
+    s->chn[1].chr = qdev_get_prop_ptr(&dev->qdev, "chrA");
+    disabled = qdev_get_prop_int(&dev->qdev, "disabled", 0);
+    s->chn[0].disabled = disabled;
+    s->chn[1].disabled = disabled;
     for (i = 0; i < 2; i++) {
-        s->chn[i].irq = irq;
+        sysbus_init_irq(dev, &s->chn[i].irq);
         s->chn[i].chn = 1 - i;
-        s->chn[i].chr = NULL;
         s->chn[i].clock = clock / 2;
+        if (s->chn[i].chr) {
+            qemu_chr_add_handlers(s->chn[i].chr, serial_can_receive,
+                                  serial_receive1, serial_event, &s->chn[i]);
+        }
     }
     s->chn[0].otherchn = &s->chn[1];
     s->chn[1].otherchn = &s->chn[0];
-    s->chn[0].type = mouse;
-    s->chn[1].type = kbd;
-    s->chn[0].disabled = disabled;
-    s->chn[1].disabled = disabled;
+    s->chn[0].type = qdev_get_prop_int(&dev->qdev, "chnBtype", 0);
+    s->chn[1].type = qdev_get_prop_int(&dev->qdev, "chnAtype", 0);

-    slavio_serial_io_memory = cpu_register_io_memory(escc_mem_read,
-                                                     escc_mem_write,
-                                                     s);
-    cpu_register_physical_memory(base, ESCC_SIZE << it_shift,
-                                 slavio_serial_io_memory);
+    io = cpu_register_io_memory(escc_mem_read, escc_mem_write, s);
+    sysbus_init_mmio(dev, ESCC_SIZE << s->it_shift, io);

-    qemu_add_mouse_event_handler(sunmouse_event, &s->chn[0], 0,
-                                 "QEMU Sun Mouse");
-    qemu_add_kbd_event_handler(sunkbd_event, &s->chn[1]);
-    register_savevm("slavio_serial_mouse", base, 2, escc_save, escc_load, s);
+    if (s->chn[0].type == mouse) {
+        qemu_add_mouse_event_handler(sunmouse_event, &s->chn[0], 0,
+                                     "QEMU Sun Mouse");
+    }
+    if (s->chn[1].type == kbd) {
+        qemu_add_kbd_event_handler(sunkbd_event, &s->chn[1]);
+    }
+    register_savevm("escc", -1, 2, escc_save, escc_load, s);
     qemu_register_reset(escc_reset, s);
     escc_reset(s);
 }
+
+static SysBusDeviceInfo escc_info = {
+    .init = escc_init1,
+    .qdev.name  = "escc",
+    .qdev.size  = sizeof(SerialState),
+    .qdev.props = (DevicePropList[]) {
+        {.name = "frequency", .type = PROP_TYPE_INT},
+        {.name = "it_shift", .type = PROP_TYPE_INT},
+        {.name = "disabled", .type = PROP_TYPE_INT},
+        {.name = "chrB", .type = PROP_TYPE_PTR},
+        {.name = "chrA", .type = PROP_TYPE_PTR},
+        {.name = "chnBtype", .type = PROP_TYPE_INT},
+        {.name = "chnAtype", .type = PROP_TYPE_INT},
+        {.name = NULL}
+    }
+};
+
+static void escc_register_devices(void)
+{
+    sysbus_register_withprop(&escc_info);
+}
+
+device_init(escc_register_devices)
diff --git a/hw/escc.h b/hw/escc.h
index 015b9d0..7d814a1 100644
--- a/hw/escc.h
+++ b/hw/escc.h
@@ -1,8 +1,8 @@
 /* escc.c */
 #define ESCC_SIZE 4
-int escc_init(target_phys_addr_t base, qemu_irq irqA, qemu_irq irqB,
-              CharDriverState *chrA, CharDriverState *chrB,
-              int clock, int it_shift);
+SysBusDevice *escc_init(target_phys_addr_t base, qemu_irq irqA, qemu_irq irqB,
+                        CharDriverState *chrA, CharDriverState *chrB,
+                        int clock, int it_shift);

 void slavio_serial_ms_kbd_init(target_phys_addr_t base, qemu_irq irq,
                                int disabled, int clock, int it_shift);
diff --git a/hw/macio.c b/hw/macio.c
index 8cfadfc..7db53ef 100644
--- a/hw/macio.c
+++ b/hw/macio.c
@@ -25,6 +25,7 @@
 #include "hw.h"
 #include "ppc_mac.h"
 #include "pci.h"
+#include "sysbus.h"
 #include "escc.h"

 typedef struct macio_state_t macio_state_t;
@@ -33,7 +34,7 @@ struct macio_state_t {
     int pic_mem_index;
     int dbdma_mem_index;
     int cuda_mem_index;
-    int escc_mem_index;
+    SysBusDevice *escc;
     void *nvram;
     int nb_ide;
     int ide_mem_index[4];
@@ -61,9 +62,8 @@ static void macio_map (PCIDevice *pci_dev, int region_num,
         cpu_register_physical_memory(addr + 0x08000, 0x1000,
                                      macio_state->dbdma_mem_index);
     }
-    if (macio_state->escc_mem_index >= 0) {
-        cpu_register_physical_memory(addr + 0x13000, ESCC_SIZE << 4,
-                                     macio_state->escc_mem_index);
+    if (macio_state->escc) {
+        sysbus_mmio_map(macio_state->escc, 0, addr + 0x13000);
     }
     if (macio_state->cuda_mem_index >= 0) {
         cpu_register_physical_memory(addr + 0x16000, 0x2000,
@@ -81,7 +81,7 @@ static void macio_map (PCIDevice *pci_dev, int region_num,

 void macio_init (PCIBus *bus, int device_id, int is_oldworld, int
pic_mem_index,
                  int dbdma_mem_index, int cuda_mem_index, void *nvram,
-                 int nb_ide, int *ide_mem_index, int escc_mem_index)
+                 int nb_ide, int *ide_mem_index, SysBusDevice *escc)
 {
     PCIDevice *d;
     macio_state_t *macio_state;
@@ -95,7 +95,7 @@ void macio_init (PCIBus *bus, int device_id, int
is_oldworld, int pic_mem_index,
     macio_state->pic_mem_index = pic_mem_index;
     macio_state->dbdma_mem_index = dbdma_mem_index;
     macio_state->cuda_mem_index = cuda_mem_index;
-    macio_state->escc_mem_index = escc_mem_index;
+    macio_state->escc = escc;
     macio_state->nvram = nvram;
     if (nb_ide > 4)
         nb_ide = 4;
diff --git a/hw/ppc_mac.h b/hw/ppc_mac.h
index dc39338..55d2f4a 100644
--- a/hw/ppc_mac.h
+++ b/hw/ppc_mac.h
@@ -25,6 +25,8 @@
 #if !defined(__PPC_MAC_H__)
 #define __PPC_MAC_H__

+#include "sysbus.h"
+
 /* SMP is not enabled, for now */
 #define MAX_CPUS 1

@@ -47,7 +49,7 @@ void cuda_init (int *cuda_mem_index, qemu_irq irq);
 /* MacIO */
 void macio_init (PCIBus *bus, int device_id, int is_oldworld, int
pic_mem_index,
                  int dbdma_mem_index, int cuda_mem_index, void *nvram,
-                 int nb_ide, int *ide_mem_index, int escc_mem_index);
+                 int nb_ide, int *ide_mem_index, SysBusDevice *escc);

 /* NewWorld PowerMac IDE */
 int pmac_ide_init (BlockDriverState **hd_table, qemu_irq irq,
diff --git a/hw/ppc_newworld.c b/hw/ppc_newworld.c
index 4e5043c..e54a854 100644
--- a/hw/ppc_newworld.c
+++ b/hw/ppc_newworld.c
@@ -104,7 +104,8 @@ static void ppc_core99_init (ram_addr_t ram_size,
     int nvram_mem_index;
     int vga_bios_size, bios_size;
     qemu_irq *dummy_irq;
-    int pic_mem_index, dbdma_mem_index, cuda_mem_index, escc_mem_index;
+    int pic_mem_index, dbdma_mem_index, cuda_mem_index;
+    SysBusDevice *escc;
     int ppc_boot_device;
     int index;
     BlockDriverState *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
@@ -300,8 +301,8 @@ static void ppc_core99_init (ram_addr_t ram_size,
     /* XXX: suppress that */
     dummy_irq = i8259_init(NULL);

-    escc_mem_index = escc_init(0x80013000, dummy_irq[4], dummy_irq[5],
-                               serial_hds[0], serial_hds[1], ESCC_CLOCK, 4);
+    escc = escc_init(0x80013000, dummy_irq[4], dummy_irq[5],
+                     serial_hds[0], serial_hds[1], ESCC_CLOCK, 4);

     for(i = 0; i < nb_nics; i++)
         pci_nic_init(&nd_table[i], "ne2k_pci", NULL);
@@ -329,7 +330,7 @@ static void ppc_core99_init (ram_addr_t ram_size,

     macio_init(pci_bus, PCI_DEVICE_ID_APPLE_UNI_N_KEYL, 0, pic_mem_index,
                dbdma_mem_index, cuda_mem_index, NULL, 0, NULL,
-               escc_mem_index);
+               escc);

     if (usb_enabled) {
         usb_ohci_init_pci(pci_bus, 3, -1);
diff --git a/hw/ppc_oldworld.c b/hw/ppc_oldworld.c
index b26e407..26be95c 100644
--- a/hw/ppc_oldworld.c
+++ b/hw/ppc_oldworld.c
@@ -132,7 +132,8 @@ static void ppc_heathrow_init (ram_addr_t ram_size,
     MacIONVRAMState *nvr;
     int vga_bios_size, bios_size;
     int pic_mem_index, nvram_mem_index, dbdma_mem_index, cuda_mem_index;
-    int escc_mem_index, ide_mem_index[2];
+    int ide_mem_index[2];
+    SysBusDevice *escc;
     uint16_t ppc_boot_device;
     BlockDriverState *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
     int index;
@@ -311,8 +312,8 @@ static void ppc_heathrow_init (ram_addr_t ram_size,
     pci_bus = pci_grackle_init(0xfec00000, pic);
     pci_vga_init(pci_bus, vga_bios_offset, vga_bios_size);

-    escc_mem_index = escc_init(0x80013000, pic[0x0f], pic[0x10], serial_hds[0],
-                               serial_hds[1], ESCC_CLOCK, 4);
+    escc = escc_init(0x80013000, pic[0x0f], pic[0x10], serial_hds[0],
+                     serial_hds[1], ESCC_CLOCK, 4);

     for(i = 0; i < nb_nics; i++)
         pci_nic_init(&nd_table[i], "ne2k_pci", NULL);
@@ -363,7 +364,7 @@ static void ppc_heathrow_init (ram_addr_t ram_size,

     macio_init(pci_bus, PCI_DEVICE_ID_APPLE_343S1201, 1, pic_mem_index,
                dbdma_mem_index, cuda_mem_index, nvr, 2, ide_mem_index,
-               escc_mem_index);
+               escc);

     if (usb_enabled) {
         usb_ohci_init_pci(pci_bus, 3, -1);
-- 
1.5.6.5




reply via email to

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