From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1MQRGL-00010z-71 for qemu-devel@nongnu.org; Mon, 13 Jul 2009 15:32:33 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1MQRGK-00010B-FL for qemu-devel@nongnu.org; Mon, 13 Jul 2009 15:32:32 -0400 Received: from [199.232.76.173] (port=55202 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1MQRGK-000106-CL for qemu-devel@nongnu.org; Mon, 13 Jul 2009 15:32:32 -0400 Received: from fg-out-1718.google.com ([72.14.220.159]:41792) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1MQRGJ-0005Nc-Li for qemu-devel@nongnu.org; Mon, 13 Jul 2009 15:32:32 -0400 Received: by fg-out-1718.google.com with SMTP id d23so1031027fga.8 for ; Mon, 13 Jul 2009 12:32:30 -0700 (PDT) MIME-Version: 1.0 Date: Mon, 13 Jul 2009 22:32:30 +0300 Message-ID: From: Blue Swirl Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Subject: [Qemu-devel] [PATCH] Sparc32/PPC: convert escc to qdev List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Paul Brook , qemu-devel 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=, end=, 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=, end=, 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=, region_num=, 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