From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1Mnrxz-0000gN-OI for qemu-devel@nongnu.org; Wed, 16 Sep 2009 06:42:27 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1Mnrxu-0000ZP-1T for qemu-devel@nongnu.org; Wed, 16 Sep 2009 06:42:26 -0400 Received: from [199.232.76.173] (port=37505 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Mnrxt-0000ZB-O6 for qemu-devel@nongnu.org; Wed, 16 Sep 2009 06:42:21 -0400 Received: from mx1.redhat.com ([209.132.183.28]:57690) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1Mnrxs-0007Cd-DQ for qemu-devel@nongnu.org; Wed, 16 Sep 2009 06:42:20 -0400 Date: Wed, 16 Sep 2009 13:40:27 +0300 From: "Michael S. Tsirkin" Message-ID: <20090916104026.GB4446@redhat.com> References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: Subject: [Qemu-devel] [PATCHv2 1/4] qemu/qdev: type safety in reset handler List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Paul Brook , Avi Kivity , qemu-devel@nongnu.org, Carsten Otte , Christian Borntraeger , kraxel@redhat.com, markmc@redhat.com Add type safety to qdev reset handlers, by declaring them as DeviceState * rather than void *. Signed-off-by: Michael S. Tsirkin --- hw/qdev.c | 13 +++++++++---- hw/qdev.h | 3 ++- hw/rtl8139.c | 10 +++++----- hw/tcx.c | 6 +++--- 4 files changed, 19 insertions(+), 13 deletions(-) diff --git a/hw/qdev.c b/hw/qdev.c index 43b1beb..79a5bf5 100644 --- a/hw/qdev.c +++ b/hw/qdev.c @@ -209,6 +209,13 @@ DeviceState *qdev_device_add(QemuOpts *opts) return qdev; } +static void qdev_reset(void *opaque) +{ + DeviceState *dev = opaque; + if (dev->info->reset) + dev->info->reset(dev); +} + /* Initialize a device. Device properties should be set before calling this function. IRQs and MMIO regions should be connected/mapped after calling this function. */ @@ -219,8 +226,7 @@ int qdev_init(DeviceState *dev) rc = dev->info->init(dev, dev->info); if (rc < 0) return rc; - if (dev->info->reset) - qemu_register_reset(dev->info->reset, dev); + qemu_register_reset(qdev_reset, dev); if (dev->info->vmsd) vmstate_register(-1, dev->info->vmsd, dev); return 0; @@ -233,8 +239,7 @@ void qdev_free(DeviceState *dev) if (dev->info->vmsd) vmstate_unregister(dev->info->vmsd, dev); #endif - if (dev->info->reset) - qemu_unregister_reset(dev->info->reset, dev); + qemu_unregister_reset(qdev_reset, dev); QLIST_REMOVE(dev, sibling); qemu_free(dev); } diff --git a/hw/qdev.h b/hw/qdev.h index 623ded5..61a252c 100644 --- a/hw/qdev.h +++ b/hw/qdev.h @@ -100,6 +100,7 @@ BusState *qdev_get_child_bus(DeviceState *dev, const char *name); /*** Device API. ***/ typedef int (*qdev_initfn)(DeviceState *dev, DeviceInfo *info); +typedef void (*qdev_resetfn)(DeviceState *dev); struct DeviceInfo { const char *name; @@ -110,7 +111,7 @@ struct DeviceInfo { int no_user; /* callbacks */ - QEMUResetHandler *reset; + qdev_resetfn reset; /* device state */ const VMStateDescription *vmsd; diff --git a/hw/rtl8139.c b/hw/rtl8139.c index 83cb1ff..59c4b6f 100644 --- a/hw/rtl8139.c +++ b/hw/rtl8139.c @@ -1173,9 +1173,9 @@ static void rtl8139_reset_rxring(RTL8139State *s, uint32_t bufferSize) s->RxBufAddr = 0; } -static void rtl8139_reset(void *opaque) +static void rtl8139_reset(DeviceState *d) { - RTL8139State *s = opaque; + RTL8139State *s = container_of(d, RTL8139State, dev.qdev); int i; /* restore MAC address */ @@ -1371,7 +1371,7 @@ static void rtl8139_ChipCmd_write(RTL8139State *s, uint32_t val) if (val & CmdReset) { DEBUG_PRINT(("RTL8139: ChipCmd reset\n")); - rtl8139_reset(s); + rtl8139_reset(&s->dev.qdev); } if (val & CmdRxEnb) { @@ -1544,7 +1544,7 @@ static void rtl8139_Cfg9346_write(RTL8139State *s, uint32_t val) } else if (opmode == 0x40) { /* Reset. */ val = 0; - rtl8139_reset(s); + rtl8139_reset(&s->dev.qdev); } s->Cfg9346 = val; @@ -3466,7 +3466,7 @@ static int pci_rtl8139_init(PCIDevice *dev) PCI_ADDRESS_SPACE_MEM, rtl8139_mmio_map); qdev_get_macaddr(&dev->qdev, s->macaddr); - rtl8139_reset(s); + rtl8139_reset(&s->dev.qdev); s->vc = qdev_get_vlan_client(&dev->qdev, rtl8139_can_receive, rtl8139_receive, NULL, rtl8139_cleanup, s); diff --git a/hw/tcx.c b/hw/tcx.c index 012d01b..e996973 100644 --- a/hw/tcx.c +++ b/hw/tcx.c @@ -411,9 +411,9 @@ static const VMStateDescription vmstate_tcx = { } }; -static void tcx_reset(void *opaque) +static void tcx_reset(DeviceState *d) { - TCXState *s = opaque; + TCXState *s = container_of(d, TCXState, busdev.qdev); /* Initialize palette */ memset(s->r, 0, 256); @@ -560,7 +560,7 @@ static int tcx_init1(SysBusDevice *dev) tcx_screen_dump, NULL, s); } - tcx_reset(s); + tcx_reset(&s->busdev.qdev); qemu_console_resize(s->ds, s->width, s->height); return 0; } -- 1.6.2.5