From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44745) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UkwFV-0000zX-OJ for qemu-devel@nongnu.org; Fri, 07 Jun 2013 08:58:40 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UkwFQ-00085E-6H for qemu-devel@nongnu.org; Fri, 07 Jun 2013 08:58:33 -0400 From: =?UTF-8?q?Andreas=20F=C3=A4rber?= Date: Fri, 7 Jun 2013 14:58:11 +0200 Message-Id: <1370609900-21998-4-git-send-email-afaerber@suse.de> In-Reply-To: <1370609900-21998-1-git-send-email-afaerber@suse.de> References: <1370609900-21998-1-git-send-email-afaerber@suse.de> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] [PATCH v2 03/12] isa: Use realizefn for ISADevice List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Kevin Wolf , Anthony Liguori , anthony@codemonkey.ws, =?UTF-8?q?Andreas=20F=C3=A4rber?= , "Vassili Karpov (malc)" , Stefan Hajnoczi , "open list:PReP" , =?UTF-8?q?Andreas=20F=C3=A4rber?= Drop ISADeviceClass::init and the resulting no-op initfn and let children implement their own realizefn. Adapt error handling. Split off an instance_init where sensible. Signed-off-by: Andreas F=C3=A4rber --- hw/audio/adlib.c | 23 +++++++++++------------ hw/audio/cs4231a.c | 21 ++++++++++++++------- hw/audio/gus.c | 18 +++++++++--------- hw/audio/pcspk.c | 19 ++++++++++++------- hw/audio/sb16.c | 21 ++++++++++++++------- hw/block/fdc.c | 24 ++++++++++++++---------- hw/char/debugcon.c | 23 ++++++++++++++--------- hw/char/parallel.c | 29 +++++++++++++++++------------ hw/char/serial-isa.c | 20 +++++++++++--------- hw/char/serial-pci.c | 17 +++++++++++++++-- hw/char/serial.c | 22 +++++++++++++++++----- hw/display/cirrus_vga.c | 12 ++++++------ hw/display/vga-isa.c | 17 ++++++++--------- hw/dma/i82374.c | 13 +++++-------- hw/i386/pc.c | 19 +++++++++++++------ hw/ide/isa.c | 16 ++++++++-------- hw/input/pckbd.c | 29 ++++++++++++++++++----------- hw/input/vmmouse.c | 8 +++----- hw/intc/i8259_common.c | 9 +++------ hw/isa/isa-bus.c | 13 ------------- hw/isa/pc87312.c | 12 +++++------- hw/misc/applesmc.c | 10 ++++------ hw/misc/debugexit.c | 10 +++++----- hw/misc/pc-testdev.c | 11 +++++------ hw/misc/pvpanic.c | 19 ++++++++++++------- hw/misc/sga.c | 7 +++---- hw/misc/vmport.c | 10 +++++----- hw/net/ne2000-isa.c | 15 +++++++-------- hw/timer/i8254_common.c | 15 +++++++-------- hw/timer/m48t59.c | 22 +++++++++++++--------- hw/timer/mc146818rtc.c | 18 +++++++++--------- hw/watchdog/wdt_ib700.c | 8 +++----- include/hw/char/serial.h | 2 +- include/hw/isa/isa.h | 1 - 34 files changed, 291 insertions(+), 242 deletions(-) diff --git a/hw/audio/adlib.c b/hw/audio/adlib.c index fc20857..6a7d377 100644 --- a/hw/audio/adlib.c +++ b/hw/audio/adlib.c @@ -283,21 +283,21 @@ static void Adlib_fini (AdlibState *s) AUD_remove_card (&s->card); } =20 -static int Adlib_initfn (ISADevice *dev) +static void adlib_realizefn (DeviceState *dev, Error **errp) { AdlibState *s =3D ADLIB(dev); struct audsettings as; =20 if (glob_adlib) { - dolog ("Cannot create more than 1 adlib device\n"); - return -1; + error_setg (errp, "Cannot create more than 1 adlib device"); + return; } glob_adlib =3D s; =20 #ifdef HAS_YMF262 if (YMF262Init (1, 14318180, s->freq)) { - dolog ("YMF262Init %d failed\n", s->freq); - return -1; + error_setg (errp, "YMF262Init %d failed", s->freq); + return; } else { YMF262SetTimerHandler (0, timer_handler, 0); @@ -306,8 +306,8 @@ static int Adlib_initfn (ISADevice *dev) #else s->opl =3D OPLCreate (OPL_TYPE_YM3812, 3579545, s->freq); if (!s->opl) { - dolog ("OPLCreate %d failed\n", s->freq); - return -1; + error_setg (errp, "OPLCreate %d failed", s->freq); + return; } else { OPLSetTimerHandler (s->opl, timer_handler, 0); @@ -332,7 +332,8 @@ static int Adlib_initfn (ISADevice *dev) ); if (!s->voice) { Adlib_fini (s); - return -1; + error_setg (errp, "Initializing audio voice failed"); + return; } =20 s->samples =3D AUD_get_buffer_size_out (s->voice) >> SHIFT; @@ -346,8 +347,6 @@ static int Adlib_initfn (ISADevice *dev) =20 register_ioport_read (s->port + 8, 2, 1, adlib_read, s); register_ioport_write (s->port + 8, 2, 1, adlib_write, s); - - return 0; } =20 static Property adlib_properties[] =3D { @@ -359,8 +358,8 @@ static Property adlib_properties[] =3D { static void adlib_class_initfn (ObjectClass *klass, void *data) { DeviceClass *dc =3D DEVICE_CLASS (klass); - ISADeviceClass *ic =3D ISA_DEVICE_CLASS (klass); - ic->init =3D Adlib_initfn; + + dc->realize =3D adlib_realizefn; dc->desc =3D ADLIB_DESC; dc->props =3D adlib_properties; } diff --git a/hw/audio/cs4231a.c b/hw/audio/cs4231a.c index d3ce739..605dad4 100644 --- a/hw/audio/cs4231a.c +++ b/hw/audio/cs4231a.c @@ -644,19 +644,25 @@ static const MemoryRegionOps cs_ioport_ops =3D { } }; =20 -static int cs4231a_initfn (ISADevice *dev) +static void cs4231a_initfn (Object *obj) { + CSState *s =3D CS4231A (obj); + + memory_region_init_io (&s->ioports, &cs_ioport_ops, s, "cs4231a", 4)= ; +} + +static void cs4231a_realizefn (DeviceState *dev, Error **errp) +{ + ISADevice *d =3D ISA_DEVICE (dev); CSState *s =3D CS4231A (dev); =20 - isa_init_irq (dev, &s->pic, s->irq); + isa_init_irq (d, &s->pic, s->irq); =20 - memory_region_init_io (&s->ioports, &cs_ioport_ops, s, "cs4231a", 4)= ; - isa_register_ioport (dev, &s->ioports, s->port); + isa_register_ioport (d, &s->ioports, s->port); =20 DMA_register_channel (s->dma, cs_dma_read, s); =20 AUD_register_card ("cs4231a", &s->card); - return 0; } =20 static int cs4231a_init (ISABus *bus) @@ -675,8 +681,8 @@ static Property cs4231a_properties[] =3D { static void cs4231a_class_initfn (ObjectClass *klass, void *data) { DeviceClass *dc =3D DEVICE_CLASS (klass); - ISADeviceClass *ic =3D ISA_DEVICE_CLASS (klass); - ic->init =3D cs4231a_initfn; + + dc->realize =3D cs4231a_realizefn; dc->reset =3D cs4231a_reset; dc->desc =3D "Crystal Semiconductor CS4231A"; dc->vmsd =3D &vmstate_cs4231a; @@ -687,6 +693,7 @@ static const TypeInfo cs4231a_info =3D { .name =3D TYPE_CS4231A, .parent =3D TYPE_ISA_DEVICE, .instance_size =3D sizeof (CSState), + .instance_init =3D cs4231a_initfn, .class_init =3D cs4231a_class_initfn, }; =20 diff --git a/hw/audio/gus.c b/hw/audio/gus.c index e0aea26..f45ed0b 100644 --- a/hw/audio/gus.c +++ b/hw/audio/gus.c @@ -251,8 +251,9 @@ static const MemoryRegionPortio gus_portio_list2[] =3D= { PORTIO_END_OF_LIST (), }; =20 -static int gus_initfn (ISADevice *dev) +static void gus_realizefn (DeviceState *dev, Error **errp) { + ISADevice *d =3D ISA_DEVICE(dev); GUSState *s =3D GUS (dev); struct audsettings as; =20 @@ -274,26 +275,25 @@ static int gus_initfn (ISADevice *dev) =20 if (!s->voice) { AUD_remove_card (&s->card); - return -1; + error_setg(errp, "No voice"); + return; } =20 s->shift =3D 2; s->samples =3D AUD_get_buffer_size_out (s->voice) >> s->shift; s->mixbuf =3D g_malloc0 (s->samples << s->shift); =20 - isa_register_portio_list (dev, s->port, gus_portio_list1, s, "gus"); - isa_register_portio_list (dev, (s->port + 0x100) & 0xf00, + isa_register_portio_list (d, s->port, gus_portio_list1, s, "gus"); + isa_register_portio_list (d, (s->port + 0x100) & 0xf00, gus_portio_list2, s, "gus"); =20 DMA_register_channel (s->emu.gusdma, GUS_read_DMA, s); s->emu.himemaddr =3D s->himem; s->emu.gusdatapos =3D s->emu.himemaddr + 1024 * 1024 + 32; s->emu.opaque =3D s; - isa_init_irq (dev, &s->pic, s->emu.gusirq); + isa_init_irq (d, &s->pic, s->emu.gusirq); =20 AUD_set_active_out (s->voice, 1); - - return 0; } =20 static int GUS_init (ISABus *bus) @@ -313,8 +313,8 @@ static Property gus_properties[] =3D { static void gus_class_initfn (ObjectClass *klass, void *data) { DeviceClass *dc =3D DEVICE_CLASS (klass); - ISADeviceClass *ic =3D ISA_DEVICE_CLASS (klass); - ic->init =3D gus_initfn; + + dc->realize =3D gus_realizefn; dc->desc =3D "Gravis Ultrasound GF1"; dc->vmsd =3D &vmstate_gus; dc->props =3D gus_properties; diff --git a/hw/audio/pcspk.c b/hw/audio/pcspk.c index 3a7285f..5dde0e7 100644 --- a/hw/audio/pcspk.c +++ b/hw/audio/pcspk.c @@ -163,16 +163,21 @@ static const MemoryRegionOps pcspk_io_ops =3D { }, }; =20 -static int pcspk_initfn(ISADevice *dev) +static void pcspk_initfn(Object *obj) { - PCSpkState *s =3D PC_SPEAKER(dev); + PCSpkState *s =3D PC_SPEAKER(obj); =20 memory_region_init_io(&s->ioport, &pcspk_io_ops, s, "elcr", 1); - isa_register_ioport(dev, &s->ioport, s->iobase); +} =20 - pcspk_state =3D s; +static void pcspk_realizefn(DeviceState *dev, Error **errp) +{ + ISADevice *isadev =3D ISA_DEVICE(dev); + PCSpkState *s =3D PC_SPEAKER(dev); =20 - return 0; + isa_register_ioport(isadev, &s->ioport, s->iobase); + + pcspk_state =3D s; } =20 static Property pcspk_properties[] =3D { @@ -184,9 +189,8 @@ static Property pcspk_properties[] =3D { static void pcspk_class_initfn(ObjectClass *klass, void *data) { DeviceClass *dc =3D DEVICE_CLASS(klass); - ISADeviceClass *ic =3D ISA_DEVICE_CLASS(klass); =20 - ic->init =3D pcspk_initfn; + dc->realize =3D pcspk_realizefn; dc->no_user =3D 1; dc->props =3D pcspk_properties; } @@ -195,6 +199,7 @@ static const TypeInfo pcspk_info =3D { .name =3D TYPE_PC_SPEAKER, .parent =3D TYPE_ISA_DEVICE, .instance_size =3D sizeof(PCSpkState), + .instance_init =3D pcspk_initfn, .class_init =3D pcspk_class_initfn, }; =20 diff --git a/hw/audio/sb16.c b/hw/audio/sb16.c index 6ddc0ac..e697bc1 100644 --- a/hw/audio/sb16.c +++ b/hw/audio/sb16.c @@ -1356,12 +1356,19 @@ static const MemoryRegionPortio sb16_ioport_list[= ] =3D { }; =20 =20 -static int sb16_initfn (ISADevice *dev) +static void sb16_initfn (Object *obj) { - SB16State *s =3D SB16 (dev); + SB16State *s =3D SB16 (obj); =20 s->cmd =3D -1; - isa_init_irq (dev, &s->pic, s->irq); +} + +static void sb16_realizefn (DeviceState *dev, Error **errp) +{ + ISADevice *isadev =3D ISA_DEVICE (dev); + SB16State *s =3D SB16 (dev); + + isa_init_irq (isadev, &s->pic, s->irq); =20 s->mixer_regs[0x80] =3D magic_of_irq (s->irq); s->mixer_regs[0x81] =3D (1 << s->dma) | (1 << s->hdma); @@ -1376,14 +1383,13 @@ static int sb16_initfn (ISADevice *dev) dolog ("warning: Could not create auxiliary timer\n"); } =20 - isa_register_portio_list (dev, s->port, sb16_ioport_list, s, "sb16")= ; + isa_register_portio_list (isadev, s->port, sb16_ioport_list, s, "sb1= 6"); =20 DMA_register_channel (s->hdma, SB_read_DMA, s); DMA_register_channel (s->dma, SB_read_DMA, s); s->can_write =3D 1; =20 AUD_register_card ("sb16", &s->card); - return 0; } =20 static int SB16_init (ISABus *bus) @@ -1404,8 +1410,8 @@ static Property sb16_properties[] =3D { static void sb16_class_initfn (ObjectClass *klass, void *data) { DeviceClass *dc =3D DEVICE_CLASS (klass); - ISADeviceClass *ic =3D ISA_DEVICE_CLASS (klass); - ic->init =3D sb16_initfn; + + dc->realize =3D sb16_realizefn; dc->desc =3D "Creative Sound Blaster 16"; dc->vmsd =3D &vmstate_sb16; dc->props =3D sb16_properties; @@ -1415,6 +1421,7 @@ static const TypeInfo sb16_info =3D { .name =3D TYPE_SB16, .parent =3D TYPE_ISA_DEVICE, .instance_size =3D sizeof (SB16State), + .instance_init =3D sb16_initfn, .class_init =3D sb16_class_initfn, }; =20 diff --git a/hw/block/fdc.c b/hw/block/fdc.c index 0888652..79ea625 100644 --- a/hw/block/fdc.c +++ b/hw/block/fdc.c @@ -2117,24 +2117,28 @@ static const MemoryRegionPortio fdc_portio_list[]= =3D { PORTIO_END_OF_LIST(), }; =20 -static int isabus_fdc_init1(ISADevice *dev) +static void isabus_fdc_realize(DeviceState *dev, Error **errp) { + ISADevice *isadev =3D ISA_DEVICE(dev); FDCtrlISABus *isa =3D ISA_FDC(dev); FDCtrl *fdctrl =3D &isa->state; int ret; =20 - isa_register_portio_list(dev, isa->iobase, fdc_portio_list, fdctrl, = "fdc"); + isa_register_portio_list(isadev, isa->iobase, fdc_portio_list, fdctr= l, + "fdc"); =20 - isa_init_irq(dev, &fdctrl->irq, isa->irq); + isa_init_irq(isadev, &fdctrl->irq, isa->irq); fdctrl->dma_chann =3D isa->dma; =20 - qdev_set_legacy_instance_id(&dev->qdev, isa->iobase, 2); + qdev_set_legacy_instance_id(dev, isa->iobase, 2); ret =3D fdctrl_init_common(fdctrl); + if (ret < 0) { + error_setg(errp, "Floppy init failed."); + return; + } =20 - add_boot_device_path(isa->bootindexA, &dev->qdev, "/floppy@0"); - add_boot_device_path(isa->bootindexB, &dev->qdev, "/floppy@1"); - - return ret; + add_boot_device_path(isa->bootindexA, dev, "/floppy@0"); + add_boot_device_path(isa->bootindexB, dev, "/floppy@1"); } =20 static int sysbus_fdc_init1(SysBusDevice *dev) @@ -2203,8 +2207,8 @@ static Property isa_fdc_properties[] =3D { static void isabus_fdc_class_init(ObjectClass *klass, void *data) { DeviceClass *dc =3D DEVICE_CLASS(klass); - ISADeviceClass *ic =3D ISA_DEVICE_CLASS(klass); - ic->init =3D isabus_fdc_init1; + + dc->realize =3D isabus_fdc_realize; dc->fw_name =3D "fdc"; dc->no_user =3D 1; dc->reset =3D fdctrl_external_reset_isa; diff --git a/hw/char/debugcon.c b/hw/char/debugcon.c index 3b0637d..f254841 100644 --- a/hw/char/debugcon.c +++ b/hw/char/debugcon.c @@ -81,27 +81,32 @@ static const MemoryRegionOps debugcon_ops =3D { .endianness =3D DEVICE_LITTLE_ENDIAN, }; =20 -static void debugcon_init_core(DebugconState *s) +static void debugcon_realize_core(DebugconState *s, Error **errp) { if (!s->chr) { - fprintf(stderr, "Can't create debugcon device, empty char device= \n"); - exit(1); + error_setg(errp, "Can't create debugcon device, empty char devic= e"); + return; } =20 qemu_chr_add_handlers(s->chr, NULL, NULL, NULL, s); } =20 -static int debugcon_isa_initfn(ISADevice *dev) +static void debugcon_isa_realizefn(DeviceState *dev, Error **errp) { + ISADevice *d =3D ISA_DEVICE(dev); ISADebugconState *isa =3D ISA_DEBUGCON_DEVICE(dev); DebugconState *s =3D &isa->state; + Error *err =3D NULL; =20 - debugcon_init_core(s); + debugcon_realize_core(s, &err); + if (err !=3D NULL) { + error_propagate(errp, err); + return; + } memory_region_init_io(&s->io, &debugcon_ops, s, TYPE_ISA_DEBUGCON_DEVICE, 1); - memory_region_add_subregion(isa_address_space_io(dev), + memory_region_add_subregion(isa_address_space_io(d), isa->iobase, &s->io); - return 0; } =20 static Property debugcon_isa_properties[] =3D { @@ -114,8 +119,8 @@ static Property debugcon_isa_properties[] =3D { static void debugcon_isa_class_initfn(ObjectClass *klass, void *data) { DeviceClass *dc =3D DEVICE_CLASS(klass); - ISADeviceClass *ic =3D ISA_DEVICE_CLASS(klass); - ic->init =3D debugcon_isa_initfn; + + dc->realize =3D debugcon_isa_realizefn; dc->props =3D debugcon_isa_properties; } =20 diff --git a/hw/char/parallel.c b/hw/char/parallel.c index 8e48284..caa9eb4 100644 --- a/hw/char/parallel.c +++ b/hw/char/parallel.c @@ -477,29 +477,35 @@ static const MemoryRegionPortio isa_parallel_portio= _sw_list[] =3D { PORTIO_END_OF_LIST(), }; =20 -static int parallel_isa_initfn(ISADevice *dev) +static void parallel_isa_realizefn(DeviceState *dev, Error **errp) { static int index; + ISADevice *isadev =3D ISA_DEVICE(dev); ISAParallelState *isa =3D ISA_PARALLEL(dev); ParallelState *s =3D &isa->state; int base; uint8_t dummy; =20 if (!s->chr) { - fprintf(stderr, "Can't create parallel device, empty char device= \n"); - exit(1); + error_setg(errp, "Can't create parallel device, empty char devic= e"); + return; } =20 - if (isa->index =3D=3D -1) + if (isa->index =3D=3D -1) { isa->index =3D index; - if (isa->index >=3D MAX_PARALLEL_PORTS) - return -1; - if (isa->iobase =3D=3D -1) + } + if (isa->index >=3D MAX_PARALLEL_PORTS) { + error_setg(errp, "Max. supported number of parallel ports is %d.= ", + MAX_PARALLEL_PORTS); + return; + } + if (isa->iobase =3D=3D -1) { isa->iobase =3D isa_parallel_io[isa->index]; + } index++; =20 base =3D isa->iobase; - isa_init_irq(dev, &s->irq, isa->isairq); + isa_init_irq(isadev, &s->irq, isa->isairq); qemu_register_reset(parallel_reset, s); =20 if (qemu_chr_fe_ioctl(s->chr, CHR_IOCTL_PP_READ_STATUS, &dummy) =3D=3D= 0) { @@ -507,12 +513,11 @@ static int parallel_isa_initfn(ISADevice *dev) s->status =3D dummy; } =20 - isa_register_portio_list(dev, base, + isa_register_portio_list(isadev, base, (s->hw_driver ? &isa_parallel_portio_hw_list[0] : &isa_parallel_portio_sw_list[0]), s, "parallel"); - return 0; } =20 /* Memory mapped interface */ @@ -599,8 +604,8 @@ static Property parallel_isa_properties[] =3D { static void parallel_isa_class_initfn(ObjectClass *klass, void *data) { DeviceClass *dc =3D DEVICE_CLASS(klass); - ISADeviceClass *ic =3D ISA_DEVICE_CLASS(klass); - ic->init =3D parallel_isa_initfn; + + dc->realize =3D parallel_isa_realizefn; dc->props =3D parallel_isa_properties; } =20 diff --git a/hw/char/serial-isa.c b/hw/char/serial-isa.c index 342b4cc..6e7e0dd 100644 --- a/hw/char/serial-isa.c +++ b/hw/char/serial-isa.c @@ -44,9 +44,10 @@ static const int isa_serial_irq[MAX_SERIAL_PORTS] =3D = { 4, 3, 4, 3 }; =20 -static int serial_isa_initfn(ISADevice *dev) +static void serial_isa_realizefn(DeviceState *dev, Error **errp) { static int index; + ISADevice *isadev =3D ISA_DEVICE(dev); ISASerialState *isa =3D ISA_SERIAL(dev); SerialState *s =3D &isa->state; =20 @@ -54,7 +55,9 @@ static int serial_isa_initfn(ISADevice *dev) isa->index =3D index; } if (isa->index >=3D MAX_SERIAL_PORTS) { - return -1; + error_setg(errp, "Max. supported number of ISA serial ports is %= d.", + MAX_SERIAL_PORTS); + return; } if (isa->iobase =3D=3D -1) { isa->iobase =3D isa_serial_io[isa->index]; @@ -65,13 +68,12 @@ static int serial_isa_initfn(ISADevice *dev) index++; =20 s->baudbase =3D 115200; - isa_init_irq(dev, &s->irq, isa->isairq); - serial_init_core(s); - qdev_set_legacy_instance_id(&dev->qdev, isa->iobase, 3); + isa_init_irq(isadev, &s->irq, isa->isairq); + serial_realize_core(s, errp); + qdev_set_legacy_instance_id(dev, isa->iobase, 3); =20 memory_region_init_io(&s->io, &serial_io_ops, s, "serial", 8); - isa_register_ioport(dev, &s->io, isa->iobase); - return 0; + isa_register_ioport(isadev, &s->io, isa->iobase); } =20 static const VMStateDescription vmstate_isa_serial =3D { @@ -96,8 +98,8 @@ static Property serial_isa_properties[] =3D { static void serial_isa_class_initfn(ObjectClass *klass, void *data) { DeviceClass *dc =3D DEVICE_CLASS(klass); - ISADeviceClass *ic =3D ISA_DEVICE_CLASS(klass); - ic->init =3D serial_isa_initfn; + + dc->realize =3D serial_isa_realizefn; dc->vmsd =3D &vmstate_isa_serial; dc->props =3D serial_isa_properties; } diff --git a/hw/char/serial-pci.c b/hw/char/serial-pci.c index 2138e35..3bec8eb 100644 --- a/hw/char/serial-pci.c +++ b/hw/char/serial-pci.c @@ -27,6 +27,7 @@ =20 #include "hw/char/serial.h" #include "hw/pci/pci.h" +#include "qapi/qmp/qerror.h" =20 #define PCI_SERIAL_MAX_PORTS 4 =20 @@ -49,9 +50,15 @@ static int serial_pci_init(PCIDevice *dev) { PCISerialState *pci =3D DO_UPCAST(PCISerialState, dev, dev); SerialState *s =3D &pci->state; + Error *err =3D NULL; =20 s->baudbase =3D 115200; - serial_init_core(s); + serial_realize_core(s, &err); + if (err !=3D NULL) { + qerror_report_err(err); + error_free(err); + return -1; + } =20 pci->dev.config[PCI_INTERRUPT_PIN] =3D 0x01; s->irq =3D pci->dev.irq[0]; @@ -80,6 +87,7 @@ static int multi_serial_pci_init(PCIDevice *dev) PCIDeviceClass *pc =3D PCI_DEVICE_GET_CLASS(dev); PCIMultiSerialState *pci =3D DO_UPCAST(PCIMultiSerialState, dev, dev= ); SerialState *s; + Error *err =3D NULL; int i; =20 switch (pc->device_id) { @@ -102,7 +110,12 @@ static int multi_serial_pci_init(PCIDevice *dev) for (i =3D 0; i < pci->ports; i++) { s =3D pci->state + i; s->baudbase =3D 115200; - serial_init_core(s); + serial_realize_core(s, &err); + if (err !=3D NULL) { + qerror_report_err(err); + error_free(err); + return -1; + } s->irq =3D pci->irqs[i]; pci->name[i] =3D g_strdup_printf("uart #%d", i+1); memory_region_init_io(&s->io, &serial_io_ops, s, pci->name[i], 8= ); diff --git a/hw/char/serial.c b/hw/char/serial.c index 66b6348..f2701e8 100644 --- a/hw/char/serial.c +++ b/hw/char/serial.c @@ -670,11 +670,11 @@ static void serial_reset(void *opaque) qemu_irq_lower(s->irq); } =20 -void serial_init_core(SerialState *s) +void serial_realize_core(SerialState *s, Error **errp) { if (!s->chr) { - fprintf(stderr, "Can't create serial device, empty char device\n= "); - exit(1); + error_setg(errp, "Can't create serial device, empty char device"= ); + return; } =20 s->modem_status_poll =3D qemu_new_timer_ns(vm_clock, (QEMUTimerCB *)= serial_update_msl, s); @@ -713,13 +713,19 @@ SerialState *serial_init(int base, qemu_irq irq, in= t baudbase, CharDriverState *chr, MemoryRegion *system_io) { SerialState *s; + Error *err =3D NULL; =20 s =3D g_malloc0(sizeof(SerialState)); =20 s->irq =3D irq; s->baudbase =3D baudbase; s->chr =3D chr; - serial_init_core(s); + serial_realize_core(s, &err); + if (err !=3D NULL) { + fprintf(stderr, "%s\n", error_get_pretty(err)); + error_free(err); + exit(1); + } =20 vmstate_register(NULL, base, &vmstate_serial, s); =20 @@ -769,6 +775,7 @@ SerialState *serial_mm_init(MemoryRegion *address_spa= ce, CharDriverState *chr, enum device_endian end= ) { SerialState *s; + Error *err =3D NULL; =20 s =3D g_malloc0(sizeof(SerialState)); =20 @@ -777,7 +784,12 @@ SerialState *serial_mm_init(MemoryRegion *address_sp= ace, s->baudbase =3D baudbase; s->chr =3D chr; =20 - serial_init_core(s); + serial_realize_core(s, &err); + if (err !=3D NULL) { + fprintf(stderr, "%s\n", error_get_pretty(err)); + error_free(err); + exit(1); + } vmstate_register(NULL, base, &vmstate_serial, s); =20 memory_region_init_io(&s->io, &serial_mm_ops[end], s, diff --git a/hw/display/cirrus_vga.c b/hw/display/cirrus_vga.c index a5dbc39..0d9eee8 100644 --- a/hw/display/cirrus_vga.c +++ b/hw/display/cirrus_vga.c @@ -2906,19 +2906,20 @@ static void cirrus_init_common(CirrusVGAState * s= , int device_id, int is_pci, * ***************************************/ =20 -static int vga_initfn(ISADevice *dev) +static void isa_cirrus_vga_realizefn(DeviceState *dev, Error **errp) { + ISADevice *isadev =3D ISA_DEVICE(dev); ISACirrusVGAState *d =3D ISA_CIRRUS_VGA(dev); VGACommonState *s =3D &d->cirrus_vga.vga; =20 vga_common_init(s); cirrus_init_common(&d->cirrus_vga, CIRRUS_ID_CLGD5430, 0, - isa_address_space(dev), isa_address_space_io(dev)= ); - s->con =3D graphic_console_init(DEVICE(dev), s->hw_ops, s); + isa_address_space(isadev), + isa_address_space_io(isadev)); + s->con =3D graphic_console_init(dev, s->hw_ops, s); rom_add_vga(VGABIOS_CIRRUS_FILENAME); /* XXX ISA-LFB support */ /* FIXME not qdev yet */ - return 0; } =20 static Property isa_cirrus_vga_properties[] =3D { @@ -2929,11 +2930,10 @@ static Property isa_cirrus_vga_properties[] =3D { =20 static void isa_cirrus_vga_class_init(ObjectClass *klass, void *data) { - ISADeviceClass *k =3D ISA_DEVICE_CLASS(klass); DeviceClass *dc =3D DEVICE_CLASS(klass); =20 dc->vmsd =3D &vmstate_cirrus_vga; - k->init =3D vga_initfn; + dc->realize =3D isa_cirrus_vga_realizefn; dc->props =3D isa_cirrus_vga_properties; } =20 diff --git a/hw/display/vga-isa.c b/hw/display/vga-isa.c index 9e63b69..d1691a9 100644 --- a/hw/display/vga-isa.c +++ b/hw/display/vga-isa.c @@ -48,30 +48,30 @@ static void vga_isa_reset(DeviceState *dev) vga_common_reset(s); } =20 -static int vga_initfn(ISADevice *dev) +static void vga_isa_realizefn(DeviceState *dev, Error **errp) { + ISADevice *isadev =3D ISA_DEVICE(dev); ISAVGAState *d =3D ISA_VGA(dev); VGACommonState *s =3D &d->state; MemoryRegion *vga_io_memory; const MemoryRegionPortio *vga_ports, *vbe_ports; =20 vga_common_init(s); - s->legacy_address_space =3D isa_address_space(dev); + s->legacy_address_space =3D isa_address_space(isadev); vga_io_memory =3D vga_init_io(s, &vga_ports, &vbe_ports); - isa_register_portio_list(dev, 0x3b0, vga_ports, s, "vga"); + isa_register_portio_list(isadev, 0x3b0, vga_ports, s, "vga"); if (vbe_ports) { - isa_register_portio_list(dev, 0x1ce, vbe_ports, s, "vbe"); + isa_register_portio_list(isadev, 0x1ce, vbe_ports, s, "vbe"); } - memory_region_add_subregion_overlap(isa_address_space(dev), + memory_region_add_subregion_overlap(isa_address_space(isadev), isa_mem_base + 0x000a0000, vga_io_memory, 1); memory_region_set_coalescing(vga_io_memory); s->con =3D graphic_console_init(DEVICE(dev), s->hw_ops, s); =20 - vga_init_vbe(s, isa_address_space(dev)); + vga_init_vbe(s, isa_address_space(isadev)); /* ROM BIOS */ rom_add_vga(VGABIOS_FILENAME); - return 0; } =20 static Property vga_isa_properties[] =3D { @@ -82,9 +82,8 @@ static Property vga_isa_properties[] =3D { static void vga_isa_class_initfn(ObjectClass *klass, void *data) { DeviceClass *dc =3D DEVICE_CLASS(klass); - ISADeviceClass *ic =3D ISA_DEVICE_CLASS(klass); =20 - ic->init =3D vga_initfn; + dc->realize =3D vga_isa_realizefn; dc->reset =3D vga_isa_reset; dc->vmsd =3D &vmstate_vga_common; dc->props =3D vga_isa_properties; diff --git a/hw/dma/i82374.c b/hw/dma/i82374.c index f3d1924..6192780 100644 --- a/hw/dma/i82374.c +++ b/hw/dma/i82374.c @@ -98,7 +98,7 @@ static uint32_t i82374_read_descriptor(void *opaque, ui= nt32_t nport) return val; } =20 -static void i82374_init(I82374State *s) +static void i82374_realize(I82374State *s, Error **errp) { DMA_init(1, &s->out); memset(s->commands, 0, sizeof(s->commands)); @@ -124,7 +124,7 @@ static const VMStateDescription vmstate_isa_i82374 =3D= { }, }; =20 -static int i82374_isa_init(ISADevice *dev) +static void i82374_isa_realize(DeviceState *dev, Error **errp) { ISAi82374State *isa =3D I82374(dev); I82374State *s =3D &isa->state; @@ -135,11 +135,9 @@ static int i82374_isa_init(ISADevice *dev) register_ioport_write(isa->iobase + 0x20, 0x20, 1, i82374_write_desc= riptor, s); register_ioport_read(isa->iobase + 0x20, 0x20, 1, i82374_read_descri= ptor, s); =20 - i82374_init(s); + i82374_realize(s, errp); =20 - qdev_init_gpio_out(&dev->qdev, &s->out, 1); - - return 0; + qdev_init_gpio_out(dev, &s->out, 1); } =20 static Property i82374_properties[] =3D { @@ -149,10 +147,9 @@ static Property i82374_properties[] =3D { =20 static void i82374_class_init(ObjectClass *klass, void *data) { - ISADeviceClass *k =3D ISA_DEVICE_CLASS(klass); DeviceClass *dc =3D DEVICE_CLASS(klass); =20 - k->init =3D i82374_isa_init; + dc->realize =3D i82374_isa_realize; dc->vmsd =3D &vmstate_isa_i82374; dc->props =3D i82374_properties; } diff --git a/hw/i386/pc.c b/hw/i386/pc.c index 4844a6b..e9c91e4 100644 --- a/hw/i386/pc.c +++ b/hw/i386/pc.c @@ -522,23 +522,29 @@ static const MemoryRegionOps port92_ops =3D { .endianness =3D DEVICE_LITTLE_ENDIAN, }; =20 -static int port92_initfn(ISADevice *dev) +static void port92_initfn(Object *obj) { - Port92State *s =3D PORT92(dev); + Port92State *s =3D PORT92(obj); =20 memory_region_init_io(&s->io, &port92_ops, s, "port92", 1); - isa_register_ioport(dev, &s->io, 0x92); =20 s->outport =3D 0; - return 0; +} + +static void port92_realizefn(DeviceState *dev, Error **errp) +{ + ISADevice *isadev =3D ISA_DEVICE(dev); + Port92State *s =3D PORT92(dev); + + isa_register_ioport(isadev, &s->io, 0x92); } =20 static void port92_class_initfn(ObjectClass *klass, void *data) { DeviceClass *dc =3D DEVICE_CLASS(klass); - ISADeviceClass *ic =3D ISA_DEVICE_CLASS(klass); - ic->init =3D port92_initfn; + dc->no_user =3D 1; + dc->realize =3D port92_realizefn; dc->reset =3D port92_reset; dc->vmsd =3D &vmstate_port92_isa; } @@ -547,6 +553,7 @@ static const TypeInfo port92_info =3D { .name =3D TYPE_PORT92, .parent =3D TYPE_ISA_DEVICE, .instance_size =3D sizeof(Port92State), + .instance_init =3D port92_initfn, .class_init =3D port92_class_initfn, }; =20 diff --git a/hw/ide/isa.c b/hw/ide/isa.c index 369a7fa..7243c82 100644 --- a/hw/ide/isa.c +++ b/hw/ide/isa.c @@ -65,16 +65,16 @@ static const VMStateDescription vmstate_ide_isa =3D { } }; =20 -static int isa_ide_initfn(ISADevice *dev) +static void isa_ide_realizefn(DeviceState *dev, Error **errp) { + ISADevice *isadev =3D ISA_DEVICE(dev); ISAIDEState *s =3D ISA_IDE(dev); =20 - ide_bus_new(&s->bus, DEVICE(dev), 0, 2); - ide_init_ioport(&s->bus, dev, s->iobase, s->iobase2); - isa_init_irq(dev, &s->irq, s->isairq); + ide_bus_new(&s->bus, dev, 0, 2); + ide_init_ioport(&s->bus, isadev, s->iobase, s->iobase2); + isa_init_irq(isadev, &s->irq, s->isairq); ide_init2(&s->bus, s->irq); - vmstate_register(&dev->qdev, 0, &vmstate_ide_isa, s); - return 0; + vmstate_register(dev, 0, &vmstate_ide_isa, s); }; =20 ISADevice *isa_ide_init(ISABus *bus, int iobase, int iobase2, int isairq= , @@ -113,8 +113,8 @@ static Property isa_ide_properties[] =3D { static void isa_ide_class_initfn(ObjectClass *klass, void *data) { DeviceClass *dc =3D DEVICE_CLASS(klass); - ISADeviceClass *ic =3D ISA_DEVICE_CLASS(klass); - ic->init =3D isa_ide_initfn; + + dc->realize =3D isa_ide_realizefn; dc->fw_name =3D "ide"; dc->reset =3D isa_ide_reset; dc->props =3D isa_ide_properties; diff --git a/hw/input/pckbd.c b/hw/input/pckbd.c index 17a5614..fff0a4d 100644 --- a/hw/input/pckbd.c +++ b/hw/input/pckbd.c @@ -489,31 +489,37 @@ static const MemoryRegionOps i8042_cmd_ops =3D { .endianness =3D DEVICE_LITTLE_ENDIAN, }; =20 -static int i8042_initfn(ISADevice *dev) +static void i8042_initfn(Object *obj) { - ISAKBDState *isa_s =3D I8042(dev); + ISAKBDState *isa_s =3D I8042(obj); KBDState *s =3D &isa_s->kbd; =20 - isa_init_irq(dev, &s->irq_kbd, 1); - isa_init_irq(dev, &s->irq_mouse, 12); - memory_region_init_io(isa_s->io + 0, &i8042_data_ops, s, "i8042-data= ", 1); - isa_register_ioport(dev, isa_s->io + 0, 0x60); - memory_region_init_io(isa_s->io + 1, &i8042_cmd_ops, s, "i8042-cmd",= 1); - isa_register_ioport(dev, isa_s->io + 1, 0x64); +} + +static void i8042_realizefn(DeviceState *dev, Error **errp) +{ + ISADevice *isadev =3D ISA_DEVICE(dev); + ISAKBDState *isa_s =3D I8042(dev); + KBDState *s =3D &isa_s->kbd; + + isa_init_irq(isadev, &s->irq_kbd, 1); + isa_init_irq(isadev, &s->irq_mouse, 12); + + isa_register_ioport(isadev, isa_s->io + 0, 0x60); + isa_register_ioport(isadev, isa_s->io + 1, 0x64); =20 s->kbd =3D ps2_kbd_init(kbd_update_kbd_irq, s); s->mouse =3D ps2_mouse_init(kbd_update_aux_irq, s); qemu_register_reset(kbd_reset, s); - return 0; } =20 static void i8042_class_initfn(ObjectClass *klass, void *data) { DeviceClass *dc =3D DEVICE_CLASS(klass); - ISADeviceClass *ic =3D ISA_DEVICE_CLASS(klass); - ic->init =3D i8042_initfn; + + dc->realize =3D i8042_realizefn; dc->no_user =3D 1; dc->vmsd =3D &vmstate_kbd_isa; } @@ -522,6 +528,7 @@ static const TypeInfo i8042_info =3D { .name =3D TYPE_I8042, .parent =3D TYPE_ISA_DEVICE, .instance_size =3D sizeof(ISAKBDState), + .instance_init =3D i8042_initfn, .class_init =3D i8042_class_initfn, }; =20 diff --git a/hw/input/vmmouse.c b/hw/input/vmmouse.c index a610738..abd032b 100644 --- a/hw/input/vmmouse.c +++ b/hw/input/vmmouse.c @@ -261,7 +261,7 @@ static void vmmouse_reset(DeviceState *d) vmmouse_disable(s); } =20 -static int vmmouse_initfn(ISADevice *dev) +static void vmmouse_realizefn(DeviceState *dev, Error **errp) { VMMouseState *s =3D VMMOUSE(dev); =20 @@ -270,8 +270,6 @@ static int vmmouse_initfn(ISADevice *dev) vmport_register(VMMOUSE_STATUS, vmmouse_ioport_read, s); vmport_register(VMMOUSE_COMMAND, vmmouse_ioport_read, s); vmport_register(VMMOUSE_DATA, vmmouse_ioport_read, s); - - return 0; } =20 static Property vmmouse_properties[] =3D { @@ -282,8 +280,8 @@ static Property vmmouse_properties[] =3D { static void vmmouse_class_initfn(ObjectClass *klass, void *data) { DeviceClass *dc =3D DEVICE_CLASS(klass); - ISADeviceClass *ic =3D ISA_DEVICE_CLASS(klass); - ic->init =3D vmmouse_initfn; + + dc->realize =3D vmmouse_realizefn; dc->no_user =3D 1; dc->reset =3D vmmouse_reset; dc->vmsd =3D &vmstate_vmmouse; diff --git a/hw/intc/i8259_common.c b/hw/intc/i8259_common.c index c2ba6a5..a3dee38 100644 --- a/hw/intc/i8259_common.c +++ b/hw/intc/i8259_common.c @@ -66,7 +66,7 @@ static int pic_dispatch_post_load(void *opaque, int ver= sion_id) return 0; } =20 -static int pic_init_common(ISADevice *dev) +static void pic_common_realize(DeviceState *dev, Error **errp) { PICCommonState *s =3D PIC_COMMON(dev); PICCommonClass *info =3D PIC_COMMON_GET_CLASS(s); @@ -78,9 +78,7 @@ static int pic_init_common(ISADevice *dev) isa_register_ioport(NULL, &s->elcr_io, s->elcr_addr); } =20 - qdev_set_legacy_instance_id(DEVICE(dev), s->iobase, 1); - - return 0; + qdev_set_legacy_instance_id(dev, s->iobase, 1); } =20 ISADevice *i8259_init_chip(const char *name, ISABus *bus, bool master) @@ -135,13 +133,12 @@ static Property pic_properties_common[] =3D { =20 static void pic_common_class_init(ObjectClass *klass, void *data) { - ISADeviceClass *ic =3D ISA_DEVICE_CLASS(klass); DeviceClass *dc =3D DEVICE_CLASS(klass); =20 dc->vmsd =3D &vmstate_pic_common; dc->no_user =3D 1; dc->props =3D pic_properties_common; - ic->init =3D pic_init_common; + dc->realize =3D pic_common_realize; } =20 static const TypeInfo pic_common_type =3D { diff --git a/hw/isa/isa-bus.c b/hw/isa/isa-bus.c index 7860b17..f12b15d 100644 --- a/hw/isa/isa-bus.c +++ b/hw/isa/isa-bus.c @@ -119,18 +119,6 @@ void isa_register_portio_list(ISADevice *dev, uint16= _t start, portio_list_add(piolist, isabus->address_space_io, start); } =20 -static int isa_qdev_init(DeviceState *qdev) -{ - ISADevice *dev =3D ISA_DEVICE(qdev); - ISADeviceClass *klass =3D ISA_DEVICE_GET_CLASS(dev); - - if (klass->init) { - return klass->init(dev); - } - - return 0; -} - static void isa_device_init(Object *obj) { ISADevice *dev =3D ISA_DEVICE(obj); @@ -230,7 +218,6 @@ static const TypeInfo isabus_bridge_info =3D { static void isa_device_class_init(ObjectClass *klass, void *data) { DeviceClass *k =3D DEVICE_CLASS(klass); - k->init =3D isa_qdev_init; k->bus_type =3D TYPE_ISA_BUS; } =20 diff --git a/hw/isa/pc87312.c b/hw/isa/pc87312.c index 82f7c80..cc426df 100644 --- a/hw/isa/pc87312.c +++ b/hw/isa/pc87312.c @@ -264,7 +264,7 @@ static void pc87312_reset(DeviceState *d) pc87312_soft_reset(s); } =20 -static int pc87312_init(ISADevice *dev) +static void pc87312_realize(DeviceState *dev, Error **errp) { PC87312State *s; DeviceState *d; @@ -276,9 +276,10 @@ static int pc87312_init(ISADevice *dev) int i; =20 s =3D PC87312(dev); - bus =3D isa_bus_from_device(dev); + isa =3D ISA_DEVICE(dev); + bus =3D isa_bus_from_device(isa); + isa_register_ioport(isa, &s->io, s->iobase); pc87312_hard_reset(s); - isa_register_ioport(dev, &s->io, s->iobase); =20 if (is_parallel_enabled(s)) { chr =3D parallel_hds[0]; @@ -345,8 +346,6 @@ static int pc87312_init(ISADevice *dev) s->ide.dev =3D isa; trace_pc87312_info_ide(get_ide_iobase(s)); } - - return 0; } =20 static void pc87312_initfn(Object *obj) @@ -378,9 +377,8 @@ static Property pc87312_properties[] =3D { static void pc87312_class_init(ObjectClass *klass, void *data) { DeviceClass *dc =3D DEVICE_CLASS(klass); - ISADeviceClass *ic =3D ISA_DEVICE_CLASS(klass); =20 - ic->init =3D pc87312_init; + dc->realize =3D pc87312_realize; dc->reset =3D pc87312_reset; dc->vmsd =3D &vmstate_pc87312; dc->props =3D pc87312_properties; diff --git a/hw/misc/applesmc.c b/hw/misc/applesmc.c index 78904a8..46f4fbd 100644 --- a/hw/misc/applesmc.c +++ b/hw/misc/applesmc.c @@ -201,7 +201,7 @@ static void qdev_applesmc_isa_reset(DeviceState *dev) applesmc_add_key(s, "MSSD", 1, "\0x3"); } =20 -static int applesmc_isa_init(ISADevice *dev) +static void applesmc_isa_realize(DeviceState *dev, Error **errp) { AppleSMCState *s =3D APPLE_SMC(dev); =20 @@ -220,9 +220,7 @@ static int applesmc_isa_init(ISADevice *dev) } =20 QLIST_INIT(&s->data_def); - qdev_applesmc_isa_reset(&dev->qdev); - - return 0; + qdev_applesmc_isa_reset(dev); } =20 static Property applesmc_isa_properties[] =3D { @@ -235,8 +233,8 @@ static Property applesmc_isa_properties[] =3D { static void qdev_applesmc_class_init(ObjectClass *klass, void *data) { DeviceClass *dc =3D DEVICE_CLASS(klass); - ISADeviceClass *ic =3D ISA_DEVICE_CLASS(klass); - ic->init =3D applesmc_isa_init; + + dc->realize =3D applesmc_isa_realize; dc->reset =3D qdev_applesmc_isa_reset; dc->props =3D applesmc_isa_properties; } diff --git a/hw/misc/debugexit.c b/hw/misc/debugexit.c index 59bed5b..ee254e4 100644 --- a/hw/misc/debugexit.c +++ b/hw/misc/debugexit.c @@ -35,15 +35,15 @@ static const MemoryRegionOps debug_exit_ops =3D { .endianness =3D DEVICE_LITTLE_ENDIAN, }; =20 -static int debug_exit_initfn(ISADevice *dev) +static void debug_exit_realizefn(DeviceState *d, Error **errp) { - ISADebugExitState *isa =3D ISA_DEBUG_EXIT_DEVICE(dev); + ISADevice *dev =3D ISA_DEVICE(d); + ISADebugExitState *isa =3D ISA_DEBUG_EXIT_DEVICE(d); =20 memory_region_init_io(&isa->io, &debug_exit_ops, isa, TYPE_ISA_DEBUG_EXIT_DEVICE, isa->iosize); memory_region_add_subregion(isa_address_space_io(dev), isa->iobase, &isa->io); - return 0; } =20 static Property debug_exit_properties[] =3D { @@ -55,8 +55,8 @@ static Property debug_exit_properties[] =3D { static void debug_exit_class_initfn(ObjectClass *klass, void *data) { DeviceClass *dc =3D DEVICE_CLASS(klass); - ISADeviceClass *ic =3D ISA_DEVICE_CLASS(klass); - ic->init =3D debug_exit_initfn; + + dc->realize =3D debug_exit_realizefn; dc->props =3D debug_exit_properties; } =20 diff --git a/hw/misc/pc-testdev.c b/hw/misc/pc-testdev.c index 32df175..e6707d6 100644 --- a/hw/misc/pc-testdev.c +++ b/hw/misc/pc-testdev.c @@ -142,9 +142,10 @@ static const MemoryRegionOps test_iomem_ops =3D { .endianness =3D DEVICE_LITTLE_ENDIAN, }; =20 -static int init_test_device(ISADevice *isa) +static void testdev_realizefn(DeviceState *d, Error **errp) { - PCTestdev *dev =3D TESTDEV(isa); + ISADevice *isa =3D ISA_DEVICE(d); + PCTestdev *dev =3D TESTDEV(d); MemoryRegion *mem =3D isa_address_space(isa); MemoryRegion *io =3D isa_address_space_io(isa); =20 @@ -161,15 +162,13 @@ static int init_test_device(ISADevice *isa) memory_region_add_subregion(io, 0xe4, &dev->flush); memory_region_add_subregion(io, 0x2000, &dev->irq); memory_region_add_subregion(mem, 0xff000000, &dev->iomem); - - return 0; } =20 static void testdev_class_init(ObjectClass *klass, void *data) { - ISADeviceClass *k =3D ISA_DEVICE_CLASS(klass); + DeviceClass *dc =3D DEVICE_CLASS(klass); =20 - k->init =3D init_test_device; + dc->realize =3D testdev_realizefn; } =20 static const TypeInfo testdev_info =3D { diff --git a/hw/misc/pvpanic.c b/hw/misc/pvpanic.c index 910e44f..060099b 100644 --- a/hw/misc/pvpanic.c +++ b/hw/misc/pvpanic.c @@ -86,14 +86,21 @@ static const MemoryRegionOps pvpanic_ops =3D { }, }; =20 -static int pvpanic_isa_initfn(ISADevice *dev) +static void pvpanic_isa_initfn(Object *obj) { + PVPanicState *s =3D ISA_PVPANIC_DEVICE(obj); + + memory_region_init_io(&s->io, &pvpanic_ops, s, "pvpanic", 1); +} + +static void pvpanic_isa_realizefn(DeviceState *dev, Error **errp) +{ + ISADevice *d =3D ISA_DEVICE(dev); PVPanicState *s =3D ISA_PVPANIC_DEVICE(dev); static bool port_configured; FWCfgState *fw_cfg; =20 - memory_region_init_io(&s->io, &pvpanic_ops, s, "pvpanic", 1); - isa_register_ioport(dev, &s->io, s->ioport); + isa_register_ioport(d, &s->io, s->ioport); =20 if (!port_configured) { fw_cfg =3D fw_cfg_find(); @@ -104,8 +111,6 @@ static int pvpanic_isa_initfn(ISADevice *dev) port_configured =3D true; } } - - return 0; } =20 int pvpanic_init(ISABus *bus) @@ -122,9 +127,8 @@ static Property pvpanic_isa_properties[] =3D { static void pvpanic_isa_class_init(ObjectClass *klass, void *data) { DeviceClass *dc =3D DEVICE_CLASS(klass); - ISADeviceClass *ic =3D ISA_DEVICE_CLASS(klass); =20 - ic->init =3D pvpanic_isa_initfn; + dc->realize =3D pvpanic_isa_realizefn; dc->no_user =3D 1; dc->props =3D pvpanic_isa_properties; } @@ -133,6 +137,7 @@ static TypeInfo pvpanic_isa_info =3D { .name =3D TYPE_ISA_PVPANIC_DEVICE, .parent =3D TYPE_ISA_DEVICE, .instance_size =3D sizeof(PVPanicState), + .instance_init =3D pvpanic_isa_initfn, .class_init =3D pvpanic_isa_class_init, }; =20 diff --git a/hw/misc/sga.c b/hw/misc/sga.c index c842190..08803e7 100644 --- a/hw/misc/sga.c +++ b/hw/misc/sga.c @@ -38,17 +38,16 @@ typedef struct ISASGAState { ISADevice parent_obj; } ISASGAState; =20 -static int sga_initfn(ISADevice *dev) +static void sga_realizefn(DeviceState *dev, Error **errp) { rom_add_vga(SGABIOS_FILENAME); - return 0; } =20 static void sga_class_initfn(ObjectClass *klass, void *data) { DeviceClass *dc =3D DEVICE_CLASS(klass); - ISADeviceClass *ic =3D ISA_DEVICE_CLASS(klass); - ic->init =3D sga_initfn; + + dc->realize =3D sga_realizefn; dc->desc =3D "Serial Graphics Adapter"; } =20 diff --git a/hw/misc/vmport.c b/hw/misc/vmport.c index c146129..57b71f5 100644 --- a/hw/misc/vmport.c +++ b/hw/misc/vmport.c @@ -137,25 +137,25 @@ static const MemoryRegionOps vmport_ops =3D { .endianness =3D DEVICE_LITTLE_ENDIAN, }; =20 -static int vmport_initfn(ISADevice *dev) +static void vmport_realizefn(DeviceState *dev, Error **errp) { + ISADevice *isadev =3D ISA_DEVICE(dev); VMPortState *s =3D VMPORT(dev); =20 memory_region_init_io(&s->io, &vmport_ops, s, "vmport", 1); - isa_register_ioport(dev, &s->io, 0x5658); + isa_register_ioport(isadev, &s->io, 0x5658); =20 port_state =3D s; /* Register some generic port commands */ vmport_register(VMPORT_CMD_GETVERSION, vmport_cmd_get_version, NULL)= ; vmport_register(VMPORT_CMD_GETRAMSIZE, vmport_cmd_ram_size, NULL); - return 0; } =20 static void vmport_class_initfn(ObjectClass *klass, void *data) { DeviceClass *dc =3D DEVICE_CLASS(klass); - ISADeviceClass *ic =3D ISA_DEVICE_CLASS(klass); - ic->init =3D vmport_initfn; + + dc->realize =3D vmport_realizefn; dc->no_user =3D 1; } =20 diff --git a/hw/net/ne2000-isa.c b/hw/net/ne2000-isa.c index f8e610c..9232abd 100644 --- a/hw/net/ne2000-isa.c +++ b/hw/net/ne2000-isa.c @@ -66,24 +66,23 @@ static const VMStateDescription vmstate_isa_ne2000 =3D= { } }; =20 -static int isa_ne2000_initfn(ISADevice *dev) +static void isa_ne2000_realizefn(DeviceState *dev, Error **errp) { + ISADevice *isadev =3D ISA_DEVICE(dev); ISANE2000State *isa =3D ISA_NE2000(dev); NE2000State *s =3D &isa->ne2000; =20 ne2000_setup_io(s, 0x20); - isa_register_ioport(dev, &s->io, isa->iobase); + isa_register_ioport(isadev, &s->io, isa->iobase); =20 - isa_init_irq(dev, &s->irq, isa->isairq); + isa_init_irq(isadev, &s->irq, isa->isairq); =20 qemu_macaddr_default_if_unset(&s->c.macaddr); ne2000_reset(s); =20 s->nic =3D qemu_new_nic(&net_ne2000_isa_info, &s->c, - object_get_typename(OBJECT(dev)), dev->qdev.id= , s); + object_get_typename(OBJECT(dev)), dev->id, s); qemu_format_nic_info_str(qemu_get_queue(s->nic), s->c.macaddr.a); - - return 0; } =20 static Property ne2000_isa_properties[] =3D { @@ -96,8 +95,8 @@ static Property ne2000_isa_properties[] =3D { static void isa_ne2000_class_initfn(ObjectClass *klass, void *data) { DeviceClass *dc =3D DEVICE_CLASS(klass); - ISADeviceClass *ic =3D ISA_DEVICE_CLASS(klass); - ic->init =3D isa_ne2000_initfn; + + dc->realize =3D isa_ne2000_realizefn; dc->props =3D ne2000_isa_properties; } =20 diff --git a/hw/timer/i8254_common.c b/hw/timer/i8254_common.c index 5342df4..36eed80 100644 --- a/hw/timer/i8254_common.c +++ b/hw/timer/i8254_common.c @@ -166,22 +166,22 @@ void pit_reset_common(PITCommonState *pit) } } =20 -static int pit_init_common(ISADevice *dev) +static void pit_common_realize(DeviceState *dev, Error **errp) { + ISADevice *isadev =3D ISA_DEVICE(dev); PITCommonState *pit =3D PIT_COMMON(dev); PITCommonClass *c =3D PIT_COMMON_GET_CLASS(pit); int ret; =20 ret =3D c->init(pit); if (ret < 0) { - return ret; + error_setg(errp, "PIT init failed."); + return; } =20 - isa_register_ioport(dev, &pit->ioports, pit->iobase); + isa_register_ioport(isadev, &pit->ioports, pit->iobase); =20 - qdev_set_legacy_instance_id(&dev->qdev, pit->iobase, 2); - - return 0; + qdev_set_legacy_instance_id(dev, pit->iobase, 2); } =20 static const VMStateDescription vmstate_pit_channel =3D { @@ -286,10 +286,9 @@ static const VMStateDescription vmstate_pit_common =3D= { =20 static void pit_common_class_init(ObjectClass *klass, void *data) { - ISADeviceClass *ic =3D ISA_DEVICE_CLASS(klass); DeviceClass *dc =3D DEVICE_CLASS(klass); =20 - ic->init =3D pit_init_common; + dc->realize =3D pit_common_realize; dc->vmsd =3D &vmstate_pit_common; dc->no_user =3D 1; } diff --git a/hw/timer/m48t59.c b/hw/timer/m48t59.c index 45753d8..bf6c4c8 100644 --- a/hw/timer/m48t59.c +++ b/hw/timer/m48t59.c @@ -691,7 +691,7 @@ M48t59State *m48t59_init_isa(ISABus *bus, uint32_t io= _base, uint16_t size, return s; } =20 -static void m48t59_init_common(M48t59State *s) +static void m48t59_realize_common(M48t59State *s, Error **errp) { s->buffer =3D g_malloc0(s->size); if (s->model =3D=3D 59) { @@ -703,27 +703,31 @@ static void m48t59_init_common(M48t59State *s) vmstate_register(NULL, -1, &vmstate_m48t59, s); } =20 -static int m48t59_init_isa1(ISADevice *dev) +static void m48t59_isa_realize(DeviceState *dev, Error **errp) { + ISADevice *isadev =3D ISA_DEVICE(dev); M48t59ISAState *d =3D ISA_M48T59(dev); M48t59State *s =3D &d->state; =20 - isa_init_irq(dev, &s->IRQ, 8); - m48t59_init_common(s); - - return 0; + isa_init_irq(isadev, &s->IRQ, 8); + m48t59_realize_common(s, errp); } =20 static int m48t59_init1(SysBusDevice *dev) { M48t59SysBusState *d =3D FROM_SYSBUS(M48t59SysBusState, dev); M48t59State *s =3D &d->state; + Error *err =3D NULL; =20 sysbus_init_irq(dev, &s->IRQ); =20 memory_region_init_io(&s->iomem, &nvram_ops, s, "m48t59.nvram", s->s= ize); sysbus_init_mmio(dev, &s->iomem); - m48t59_init_common(s); + m48t59_realize_common(s, &err); + if (err !=3D NULL) { + error_free(err); + return -1; + } =20 return 0; } @@ -738,8 +742,8 @@ static Property m48t59_isa_properties[] =3D { static void m48t59_isa_class_init(ObjectClass *klass, void *data) { DeviceClass *dc =3D DEVICE_CLASS(klass); - ISADeviceClass *ic =3D ISA_DEVICE_CLASS(klass); - ic->init =3D m48t59_init_isa1; + + dc->realize =3D m48t59_isa_realize; dc->no_user =3D 1; dc->reset =3D m48t59_reset_isa; dc->props =3D m48t59_isa_properties; diff --git a/hw/timer/mc146818rtc.c b/hw/timer/mc146818rtc.c index 481604d..9c4a7bd 100644 --- a/hw/timer/mc146818rtc.c +++ b/hw/timer/mc146818rtc.c @@ -814,8 +814,9 @@ static void rtc_get_date(Object *obj, Visitor *v, voi= d *opaque, visit_end_struct(v, errp); } =20 -static int rtc_initfn(ISADevice *dev) +static void rtc_realizefn(DeviceState *dev, Error **errp) { + ISADevice *isadev =3D ISA_DEVICE(dev); RTCState *s =3D MC146818_RTC(dev); int base =3D 0x70; =20 @@ -836,7 +837,7 @@ static int rtc_initfn(ISADevice *dev) s->base_year =3D 0; } =20 - rtc_set_date_from_host(dev); + rtc_set_date_from_host(isadev); =20 #ifdef TARGET_I386 switch (s->lost_tick_policy) { @@ -847,7 +848,8 @@ static int rtc_initfn(ISADevice *dev) case LOST_TICK_DISCARD: break; default: - return -EINVAL; + error_setg(errp, "Invalid lost tick policy."); + return; } #endif =20 @@ -862,15 +864,13 @@ static int rtc_initfn(ISADevice *dev) qemu_register_suspend_notifier(&s->suspend_notifier); =20 memory_region_init_io(&s->io, &cmos_ops, s, "rtc", 2); - isa_register_ioport(dev, &s->io, base); + isa_register_ioport(isadev, &s->io, base); =20 - qdev_set_legacy_instance_id(&dev->qdev, base, 3); + qdev_set_legacy_instance_id(dev, base, 3); qemu_register_reset(rtc_reset, s); =20 object_property_add(OBJECT(s), "date", "struct tm", rtc_get_date, NULL, NULL, s, NULL); - - return 0; } =20 ISADevice *rtc_init(ISABus *bus, int base_year, qemu_irq intercept_irq) @@ -902,8 +902,8 @@ static Property mc146818rtc_properties[] =3D { static void rtc_class_initfn(ObjectClass *klass, void *data) { DeviceClass *dc =3D DEVICE_CLASS(klass); - ISADeviceClass *ic =3D ISA_DEVICE_CLASS(klass); - ic->init =3D rtc_initfn; + + dc->realize =3D rtc_realizefn; dc->no_user =3D 1; dc->vmsd =3D &vmstate_rtc; dc->props =3D mc146818rtc_properties; diff --git a/hw/watchdog/wdt_ib700.c b/hw/watchdog/wdt_ib700.c index 6b8e33a..d85c894 100644 --- a/hw/watchdog/wdt_ib700.c +++ b/hw/watchdog/wdt_ib700.c @@ -97,7 +97,7 @@ static const VMStateDescription vmstate_ib700 =3D { } }; =20 -static int wdt_ib700_init(ISADevice *dev) +static void wdt_ib700_realize(DeviceState *dev, Error **errp) { IB700State *s =3D IB700(dev); =20 @@ -106,8 +106,6 @@ static int wdt_ib700_init(ISADevice *dev) s->timer =3D qemu_new_timer_ns(vm_clock, ib700_timer_expired, s); register_ioport_write(0x441, 2, 1, ib700_write_disable_reg, s); register_ioport_write(0x443, 2, 1, ib700_write_enable_reg, s); - - return 0; } =20 static void wdt_ib700_reset(DeviceState *dev) @@ -127,8 +125,8 @@ static WatchdogTimerModel model =3D { static void wdt_ib700_class_init(ObjectClass *klass, void *data) { DeviceClass *dc =3D DEVICE_CLASS(klass); - ISADeviceClass *ic =3D ISA_DEVICE_CLASS(klass); - ic->init =3D wdt_ib700_init; + + dc->realize =3D wdt_ib700_realize; dc->reset =3D wdt_ib700_reset; dc->vmsd =3D &vmstate_ib700; } diff --git a/include/hw/char/serial.h b/include/hw/char/serial.h index bca79f1..c15354a 100644 --- a/include/hw/char/serial.h +++ b/include/hw/char/serial.h @@ -83,7 +83,7 @@ struct SerialState { extern const VMStateDescription vmstate_serial; extern const MemoryRegionOps serial_io_ops; =20 -void serial_init_core(SerialState *s); +void serial_realize_core(SerialState *s, Error **errp); void serial_exit_core(SerialState *s); void serial_set_frequency(SerialState *s, uint32_t frequency); =20 diff --git a/include/hw/isa/isa.h b/include/hw/isa/isa.h index 82da37c..1f6ff55 100644 --- a/include/hw/isa/isa.h +++ b/include/hw/isa/isa.h @@ -22,7 +22,6 @@ =20 typedef struct ISADeviceClass { DeviceClass parent_class; - int (*init)(ISADevice *dev); } ISADeviceClass; =20 struct ISABus { --=20 1.8.1.4