mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
Merge branch 'realize-isa.v2' of git://github.com/afaerber/qemu-cpu
* 'realize-isa.v2' of git://github.com/afaerber/qemu-cpu: qdev: Drop FROM_QBUS() macro isa: QOM'ify ISADevice isa: QOM'ify ISABus i8259: Convert PICCommonState to use QOM realizefn kvm/i8259: QOM'ify some more i8259: QOM'ify some more i8254: Convert PITCommonState to QOM realizefn kvm/i8254: QOM'ify some more i8254: QOM'ify some more isa: Use realizefn for ISADevice cs4231a: QOM'ify some more gus: QOM'ify some more
This commit is contained in:
+11
-12
@@ -283,21 +283,21 @@ static void Adlib_fini (AdlibState *s)
|
||||
AUD_remove_card (&s->card);
|
||||
}
|
||||
|
||||
static int Adlib_initfn (ISADevice *dev)
|
||||
static void adlib_realizefn (DeviceState *dev, Error **errp)
|
||||
{
|
||||
AdlibState *s = ADLIB(dev);
|
||||
struct audsettings as;
|
||||
|
||||
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 = s;
|
||||
|
||||
#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 = 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;
|
||||
}
|
||||
|
||||
s->samples = AUD_get_buffer_size_out (s->voice) >> SHIFT;
|
||||
@@ -346,8 +347,6 @@ static int Adlib_initfn (ISADevice *dev)
|
||||
|
||||
register_ioport_read (s->port + 8, 2, 1, adlib_read, s);
|
||||
register_ioport_write (s->port + 8, 2, 1, adlib_write, s);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static Property adlib_properties[] = {
|
||||
@@ -359,8 +358,8 @@ static Property adlib_properties[] = {
|
||||
static void adlib_class_initfn (ObjectClass *klass, void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS (klass);
|
||||
ISADeviceClass *ic = ISA_DEVICE_CLASS (klass);
|
||||
ic->init = Adlib_initfn;
|
||||
|
||||
dc->realize = adlib_realizefn;
|
||||
dc->desc = ADLIB_DESC;
|
||||
dc->props = adlib_properties;
|
||||
}
|
||||
|
||||
+23
-15
@@ -56,6 +56,9 @@ static struct {
|
||||
#define CS_REGS 16
|
||||
#define CS_DREGS 32
|
||||
|
||||
#define TYPE_CS4231A "cs4231a"
|
||||
#define CS4231A(obj) OBJECT_CHECK (CSState, (obj), TYPE_CS4231A)
|
||||
|
||||
typedef struct CSState {
|
||||
ISADevice dev;
|
||||
QEMUSoundCard card;
|
||||
@@ -208,9 +211,9 @@ static int16_t ALawDecompressTable[256] =
|
||||
944, 912, 1008, 976, 816, 784, 880, 848
|
||||
};
|
||||
|
||||
static void cs_reset (void *opaque)
|
||||
static void cs4231a_reset (DeviceState *dev)
|
||||
{
|
||||
CSState *s = opaque;
|
||||
CSState *s = CS4231A (dev);
|
||||
|
||||
s->regs[Index_Address] = 0x40;
|
||||
s->regs[Index_Data] = 0x00;
|
||||
@@ -641,27 +644,30 @@ static const MemoryRegionOps cs_ioport_ops = {
|
||||
}
|
||||
};
|
||||
|
||||
static int cs4231a_initfn (ISADevice *dev)
|
||||
static void cs4231a_initfn (Object *obj)
|
||||
{
|
||||
CSState *s = DO_UPCAST (CSState, dev, dev);
|
||||
|
||||
isa_init_irq (dev, &s->pic, s->irq);
|
||||
CSState *s = CS4231A (obj);
|
||||
|
||||
memory_region_init_io (&s->ioports, &cs_ioport_ops, s, "cs4231a", 4);
|
||||
isa_register_ioport (dev, &s->ioports, s->port);
|
||||
}
|
||||
|
||||
static void cs4231a_realizefn (DeviceState *dev, Error **errp)
|
||||
{
|
||||
ISADevice *d = ISA_DEVICE (dev);
|
||||
CSState *s = CS4231A (dev);
|
||||
|
||||
isa_init_irq (d, &s->pic, s->irq);
|
||||
|
||||
isa_register_ioport (d, &s->ioports, s->port);
|
||||
|
||||
DMA_register_channel (s->dma, cs_dma_read, s);
|
||||
|
||||
qemu_register_reset (cs_reset, s);
|
||||
cs_reset (s);
|
||||
|
||||
AUD_register_card ("cs4231a", &s->card);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cs4231a_init (ISABus *bus)
|
||||
{
|
||||
isa_create_simple (bus, "cs4231a");
|
||||
isa_create_simple (bus, TYPE_CS4231A);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -675,17 +681,19 @@ static Property cs4231a_properties[] = {
|
||||
static void cs4231a_class_initfn (ObjectClass *klass, void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS (klass);
|
||||
ISADeviceClass *ic = ISA_DEVICE_CLASS (klass);
|
||||
ic->init = cs4231a_initfn;
|
||||
|
||||
dc->realize = cs4231a_realizefn;
|
||||
dc->reset = cs4231a_reset;
|
||||
dc->desc = "Crystal Semiconductor CS4231A";
|
||||
dc->vmsd = &vmstate_cs4231a;
|
||||
dc->props = cs4231a_properties;
|
||||
}
|
||||
|
||||
static const TypeInfo cs4231a_info = {
|
||||
.name = "cs4231a",
|
||||
.name = TYPE_CS4231A,
|
||||
.parent = TYPE_ISA_DEVICE,
|
||||
.instance_size = sizeof (CSState),
|
||||
.instance_init = cs4231a_initfn,
|
||||
.class_init = cs4231a_class_initfn,
|
||||
};
|
||||
|
||||
|
||||
+15
-12
@@ -46,6 +46,9 @@
|
||||
#define IO_WRITE_PROTO(name) \
|
||||
static void name (void *opaque, uint32_t nport, uint32_t val)
|
||||
|
||||
#define TYPE_GUS "gus"
|
||||
#define GUS(obj) OBJECT_CHECK (GUSState, (obj), TYPE_GUS)
|
||||
|
||||
typedef struct GUSState {
|
||||
ISADevice dev;
|
||||
GUSEmuState emu;
|
||||
@@ -248,9 +251,10 @@ static const MemoryRegionPortio gus_portio_list2[] = {
|
||||
PORTIO_END_OF_LIST (),
|
||||
};
|
||||
|
||||
static int gus_initfn (ISADevice *dev)
|
||||
static void gus_realizefn (DeviceState *dev, Error **errp)
|
||||
{
|
||||
GUSState *s = DO_UPCAST (GUSState, dev, dev);
|
||||
ISADevice *d = ISA_DEVICE(dev);
|
||||
GUSState *s = GUS (dev);
|
||||
struct audsettings as;
|
||||
|
||||
AUD_register_card ("gus", &s->card);
|
||||
@@ -271,31 +275,30 @@ static int gus_initfn (ISADevice *dev)
|
||||
|
||||
if (!s->voice) {
|
||||
AUD_remove_card (&s->card);
|
||||
return -1;
|
||||
error_setg(errp, "No voice");
|
||||
return;
|
||||
}
|
||||
|
||||
s->shift = 2;
|
||||
s->samples = AUD_get_buffer_size_out (s->voice) >> s->shift;
|
||||
s->mixbuf = g_malloc0 (s->samples << s->shift);
|
||||
|
||||
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");
|
||||
|
||||
DMA_register_channel (s->emu.gusdma, GUS_read_DMA, s);
|
||||
s->emu.himemaddr = s->himem;
|
||||
s->emu.gusdatapos = s->emu.himemaddr + 1024 * 1024 + 32;
|
||||
s->emu.opaque = s;
|
||||
isa_init_irq (dev, &s->pic, s->emu.gusirq);
|
||||
isa_init_irq (d, &s->pic, s->emu.gusirq);
|
||||
|
||||
AUD_set_active_out (s->voice, 1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int GUS_init (ISABus *bus)
|
||||
{
|
||||
isa_create_simple (bus, "gus");
|
||||
isa_create_simple (bus, TYPE_GUS);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -310,15 +313,15 @@ static Property gus_properties[] = {
|
||||
static void gus_class_initfn (ObjectClass *klass, void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS (klass);
|
||||
ISADeviceClass *ic = ISA_DEVICE_CLASS (klass);
|
||||
ic->init = gus_initfn;
|
||||
|
||||
dc->realize = gus_realizefn;
|
||||
dc->desc = "Gravis Ultrasound GF1";
|
||||
dc->vmsd = &vmstate_gus;
|
||||
dc->props = gus_properties;
|
||||
}
|
||||
|
||||
static const TypeInfo gus_info = {
|
||||
.name = "gus",
|
||||
.name = TYPE_GUS,
|
||||
.parent = TYPE_ISA_DEVICE,
|
||||
.instance_size = sizeof (GUSState),
|
||||
.class_init = gus_class_initfn,
|
||||
|
||||
+12
-7
@@ -163,16 +163,21 @@ static const MemoryRegionOps pcspk_io_ops = {
|
||||
},
|
||||
};
|
||||
|
||||
static int pcspk_initfn(ISADevice *dev)
|
||||
static void pcspk_initfn(Object *obj)
|
||||
{
|
||||
PCSpkState *s = PC_SPEAKER(dev);
|
||||
PCSpkState *s = PC_SPEAKER(obj);
|
||||
|
||||
memory_region_init_io(&s->ioport, &pcspk_io_ops, s, "elcr", 1);
|
||||
isa_register_ioport(dev, &s->ioport, s->iobase);
|
||||
}
|
||||
|
||||
static void pcspk_realizefn(DeviceState *dev, Error **errp)
|
||||
{
|
||||
ISADevice *isadev = ISA_DEVICE(dev);
|
||||
PCSpkState *s = PC_SPEAKER(dev);
|
||||
|
||||
isa_register_ioport(isadev, &s->ioport, s->iobase);
|
||||
|
||||
pcspk_state = s;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static Property pcspk_properties[] = {
|
||||
@@ -184,9 +189,8 @@ static Property pcspk_properties[] = {
|
||||
static void pcspk_class_initfn(ObjectClass *klass, void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
ISADeviceClass *ic = ISA_DEVICE_CLASS(klass);
|
||||
|
||||
ic->init = pcspk_initfn;
|
||||
dc->realize = pcspk_realizefn;
|
||||
dc->no_user = 1;
|
||||
dc->props = pcspk_properties;
|
||||
}
|
||||
@@ -195,6 +199,7 @@ static const TypeInfo pcspk_info = {
|
||||
.name = TYPE_PC_SPEAKER,
|
||||
.parent = TYPE_ISA_DEVICE,
|
||||
.instance_size = sizeof(PCSpkState),
|
||||
.instance_init = pcspk_initfn,
|
||||
.class_init = pcspk_class_initfn,
|
||||
};
|
||||
|
||||
|
||||
+14
-7
@@ -1356,12 +1356,19 @@ static const MemoryRegionPortio sb16_ioport_list[] = {
|
||||
};
|
||||
|
||||
|
||||
static int sb16_initfn (ISADevice *dev)
|
||||
static void sb16_initfn (Object *obj)
|
||||
{
|
||||
SB16State *s = SB16 (dev);
|
||||
SB16State *s = SB16 (obj);
|
||||
|
||||
s->cmd = -1;
|
||||
isa_init_irq (dev, &s->pic, s->irq);
|
||||
}
|
||||
|
||||
static void sb16_realizefn (DeviceState *dev, Error **errp)
|
||||
{
|
||||
ISADevice *isadev = ISA_DEVICE (dev);
|
||||
SB16State *s = SB16 (dev);
|
||||
|
||||
isa_init_irq (isadev, &s->pic, s->irq);
|
||||
|
||||
s->mixer_regs[0x80] = magic_of_irq (s->irq);
|
||||
s->mixer_regs[0x81] = (1 << s->dma) | (1 << s->hdma);
|
||||
@@ -1376,14 +1383,13 @@ static int sb16_initfn (ISADevice *dev)
|
||||
dolog ("warning: Could not create auxiliary timer\n");
|
||||
}
|
||||
|
||||
isa_register_portio_list (dev, s->port, sb16_ioport_list, s, "sb16");
|
||||
isa_register_portio_list (isadev, s->port, sb16_ioport_list, s, "sb16");
|
||||
|
||||
DMA_register_channel (s->hdma, SB_read_DMA, s);
|
||||
DMA_register_channel (s->dma, SB_read_DMA, s);
|
||||
s->can_write = 1;
|
||||
|
||||
AUD_register_card ("sb16", &s->card);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int SB16_init (ISABus *bus)
|
||||
@@ -1404,8 +1410,8 @@ static Property sb16_properties[] = {
|
||||
static void sb16_class_initfn (ObjectClass *klass, void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS (klass);
|
||||
ISADeviceClass *ic = ISA_DEVICE_CLASS (klass);
|
||||
ic->init = sb16_initfn;
|
||||
|
||||
dc->realize = sb16_realizefn;
|
||||
dc->desc = "Creative Sound Blaster 16";
|
||||
dc->vmsd = &vmstate_sb16;
|
||||
dc->props = sb16_properties;
|
||||
@@ -1415,6 +1421,7 @@ static const TypeInfo sb16_info = {
|
||||
.name = TYPE_SB16,
|
||||
.parent = TYPE_ISA_DEVICE,
|
||||
.instance_size = sizeof (SB16State),
|
||||
.instance_init = sb16_initfn,
|
||||
.class_init = sb16_class_initfn,
|
||||
};
|
||||
|
||||
|
||||
+23
-17
@@ -2022,22 +2022,24 @@ static int fdctrl_connect_drives(FDCtrl *fdctrl)
|
||||
|
||||
ISADevice *fdctrl_init_isa(ISABus *bus, DriveInfo **fds)
|
||||
{
|
||||
ISADevice *dev;
|
||||
DeviceState *dev;
|
||||
ISADevice *isadev;
|
||||
|
||||
dev = isa_try_create(bus, TYPE_ISA_FDC);
|
||||
if (!dev) {
|
||||
isadev = isa_try_create(bus, TYPE_ISA_FDC);
|
||||
if (!isadev) {
|
||||
return NULL;
|
||||
}
|
||||
dev = DEVICE(isadev);
|
||||
|
||||
if (fds[0]) {
|
||||
qdev_prop_set_drive_nofail(&dev->qdev, "driveA", fds[0]->bdrv);
|
||||
qdev_prop_set_drive_nofail(dev, "driveA", fds[0]->bdrv);
|
||||
}
|
||||
if (fds[1]) {
|
||||
qdev_prop_set_drive_nofail(&dev->qdev, "driveB", fds[1]->bdrv);
|
||||
qdev_prop_set_drive_nofail(dev, "driveB", fds[1]->bdrv);
|
||||
}
|
||||
qdev_init_nofail(&dev->qdev);
|
||||
qdev_init_nofail(dev);
|
||||
|
||||
return dev;
|
||||
return isadev;
|
||||
}
|
||||
|
||||
void fdctrl_init_sysbus(qemu_irq irq, int dma_chann,
|
||||
@@ -2117,24 +2119,28 @@ static const MemoryRegionPortio fdc_portio_list[] = {
|
||||
PORTIO_END_OF_LIST(),
|
||||
};
|
||||
|
||||
static int isabus_fdc_init1(ISADevice *dev)
|
||||
static void isabus_fdc_realize(DeviceState *dev, Error **errp)
|
||||
{
|
||||
ISADevice *isadev = ISA_DEVICE(dev);
|
||||
FDCtrlISABus *isa = ISA_FDC(dev);
|
||||
FDCtrl *fdctrl = &isa->state;
|
||||
int ret;
|
||||
|
||||
isa_register_portio_list(dev, isa->iobase, fdc_portio_list, fdctrl, "fdc");
|
||||
isa_register_portio_list(isadev, isa->iobase, fdc_portio_list, fdctrl,
|
||||
"fdc");
|
||||
|
||||
isa_init_irq(dev, &fdctrl->irq, isa->irq);
|
||||
isa_init_irq(isadev, &fdctrl->irq, isa->irq);
|
||||
fdctrl->dma_chann = isa->dma;
|
||||
|
||||
qdev_set_legacy_instance_id(&dev->qdev, isa->iobase, 2);
|
||||
qdev_set_legacy_instance_id(dev, isa->iobase, 2);
|
||||
ret = fdctrl_init_common(fdctrl);
|
||||
if (ret < 0) {
|
||||
error_setg(errp, "Floppy init failed.");
|
||||
return;
|
||||
}
|
||||
|
||||
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");
|
||||
}
|
||||
|
||||
static int sysbus_fdc_init1(SysBusDevice *dev)
|
||||
@@ -2203,8 +2209,8 @@ static Property isa_fdc_properties[] = {
|
||||
static void isabus_fdc_class_init(ObjectClass *klass, void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
ISADeviceClass *ic = ISA_DEVICE_CLASS(klass);
|
||||
ic->init = isabus_fdc_init1;
|
||||
|
||||
dc->realize = isabus_fdc_realize;
|
||||
dc->fw_name = "fdc";
|
||||
dc->no_user = 1;
|
||||
dc->reset = fdctrl_external_reset_isa;
|
||||
|
||||
+14
-9
@@ -81,27 +81,32 @@ static const MemoryRegionOps debugcon_ops = {
|
||||
.endianness = DEVICE_LITTLE_ENDIAN,
|
||||
};
|
||||
|
||||
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 device");
|
||||
return;
|
||||
}
|
||||
|
||||
qemu_chr_add_handlers(s->chr, NULL, NULL, NULL, s);
|
||||
}
|
||||
|
||||
static int debugcon_isa_initfn(ISADevice *dev)
|
||||
static void debugcon_isa_realizefn(DeviceState *dev, Error **errp)
|
||||
{
|
||||
ISADevice *d = ISA_DEVICE(dev);
|
||||
ISADebugconState *isa = ISA_DEBUGCON_DEVICE(dev);
|
||||
DebugconState *s = &isa->state;
|
||||
Error *err = NULL;
|
||||
|
||||
debugcon_init_core(s);
|
||||
debugcon_realize_core(s, &err);
|
||||
if (err != 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;
|
||||
}
|
||||
|
||||
static Property debugcon_isa_properties[] = {
|
||||
@@ -114,8 +119,8 @@ static Property debugcon_isa_properties[] = {
|
||||
static void debugcon_isa_class_initfn(ObjectClass *klass, void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
ISADeviceClass *ic = ISA_DEVICE_CLASS(klass);
|
||||
ic->init = debugcon_isa_initfn;
|
||||
|
||||
dc->realize = debugcon_isa_realizefn;
|
||||
dc->props = debugcon_isa_properties;
|
||||
}
|
||||
|
||||
|
||||
+17
-12
@@ -477,29 +477,35 @@ static const MemoryRegionPortio isa_parallel_portio_sw_list[] = {
|
||||
PORTIO_END_OF_LIST(),
|
||||
};
|
||||
|
||||
static int parallel_isa_initfn(ISADevice *dev)
|
||||
static void parallel_isa_realizefn(DeviceState *dev, Error **errp)
|
||||
{
|
||||
static int index;
|
||||
ISADevice *isadev = ISA_DEVICE(dev);
|
||||
ISAParallelState *isa = ISA_PARALLEL(dev);
|
||||
ParallelState *s = &isa->state;
|
||||
int base;
|
||||
uint8_t dummy;
|
||||
|
||||
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 device");
|
||||
return;
|
||||
}
|
||||
|
||||
if (isa->index == -1)
|
||||
if (isa->index == -1) {
|
||||
isa->index = index;
|
||||
if (isa->index >= MAX_PARALLEL_PORTS)
|
||||
return -1;
|
||||
if (isa->iobase == -1)
|
||||
}
|
||||
if (isa->index >= MAX_PARALLEL_PORTS) {
|
||||
error_setg(errp, "Max. supported number of parallel ports is %d.",
|
||||
MAX_PARALLEL_PORTS);
|
||||
return;
|
||||
}
|
||||
if (isa->iobase == -1) {
|
||||
isa->iobase = isa_parallel_io[isa->index];
|
||||
}
|
||||
index++;
|
||||
|
||||
base = isa->iobase;
|
||||
isa_init_irq(dev, &s->irq, isa->isairq);
|
||||
isa_init_irq(isadev, &s->irq, isa->isairq);
|
||||
qemu_register_reset(parallel_reset, s);
|
||||
|
||||
if (qemu_chr_fe_ioctl(s->chr, CHR_IOCTL_PP_READ_STATUS, &dummy) == 0) {
|
||||
@@ -507,12 +513,11 @@ static int parallel_isa_initfn(ISADevice *dev)
|
||||
s->status = dummy;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
/* Memory mapped interface */
|
||||
@@ -599,8 +604,8 @@ static Property parallel_isa_properties[] = {
|
||||
static void parallel_isa_class_initfn(ObjectClass *klass, void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
ISADeviceClass *ic = ISA_DEVICE_CLASS(klass);
|
||||
ic->init = parallel_isa_initfn;
|
||||
|
||||
dc->realize = parallel_isa_realizefn;
|
||||
dc->props = parallel_isa_properties;
|
||||
}
|
||||
|
||||
|
||||
+19
-15
@@ -44,9 +44,10 @@ static const int isa_serial_irq[MAX_SERIAL_PORTS] = {
|
||||
4, 3, 4, 3
|
||||
};
|
||||
|
||||
static int serial_isa_initfn(ISADevice *dev)
|
||||
static void serial_isa_realizefn(DeviceState *dev, Error **errp)
|
||||
{
|
||||
static int index;
|
||||
ISADevice *isadev = ISA_DEVICE(dev);
|
||||
ISASerialState *isa = ISA_SERIAL(dev);
|
||||
SerialState *s = &isa->state;
|
||||
|
||||
@@ -54,7 +55,9 @@ static int serial_isa_initfn(ISADevice *dev)
|
||||
isa->index = index;
|
||||
}
|
||||
if (isa->index >= MAX_SERIAL_PORTS) {
|
||||
return -1;
|
||||
error_setg(errp, "Max. supported number of ISA serial ports is %d.",
|
||||
MAX_SERIAL_PORTS);
|
||||
return;
|
||||
}
|
||||
if (isa->iobase == -1) {
|
||||
isa->iobase = isa_serial_io[isa->index];
|
||||
@@ -65,13 +68,12 @@ static int serial_isa_initfn(ISADevice *dev)
|
||||
index++;
|
||||
|
||||
s->baudbase = 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);
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
static const VMStateDescription vmstate_isa_serial = {
|
||||
@@ -96,8 +98,8 @@ static Property serial_isa_properties[] = {
|
||||
static void serial_isa_class_initfn(ObjectClass *klass, void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
ISADeviceClass *ic = ISA_DEVICE_CLASS(klass);
|
||||
ic->init = serial_isa_initfn;
|
||||
|
||||
dc->realize = serial_isa_realizefn;
|
||||
dc->vmsd = &vmstate_isa_serial;
|
||||
dc->props = serial_isa_properties;
|
||||
}
|
||||
@@ -118,15 +120,17 @@ type_init(serial_register_types)
|
||||
|
||||
bool serial_isa_init(ISABus *bus, int index, CharDriverState *chr)
|
||||
{
|
||||
ISADevice *dev;
|
||||
DeviceState *dev;
|
||||
ISADevice *isadev;
|
||||
|
||||
dev = isa_try_create(bus, TYPE_ISA_SERIAL);
|
||||
if (!dev) {
|
||||
isadev = isa_try_create(bus, TYPE_ISA_SERIAL);
|
||||
if (!isadev) {
|
||||
return false;
|
||||
}
|
||||
qdev_prop_set_uint32(&dev->qdev, "index", index);
|
||||
qdev_prop_set_chr(&dev->qdev, "chardev", chr);
|
||||
if (qdev_init(&dev->qdev) < 0) {
|
||||
dev = DEVICE(isadev);
|
||||
qdev_prop_set_uint32(dev, "index", index);
|
||||
qdev_prop_set_chr(dev, "chardev", chr);
|
||||
if (qdev_init(dev) < 0) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
|
||||
+15
-2
@@ -27,6 +27,7 @@
|
||||
|
||||
#include "hw/char/serial.h"
|
||||
#include "hw/pci/pci.h"
|
||||
#include "qapi/qmp/qerror.h"
|
||||
|
||||
#define PCI_SERIAL_MAX_PORTS 4
|
||||
|
||||
@@ -49,9 +50,15 @@ static int serial_pci_init(PCIDevice *dev)
|
||||
{
|
||||
PCISerialState *pci = DO_UPCAST(PCISerialState, dev, dev);
|
||||
SerialState *s = &pci->state;
|
||||
Error *err = NULL;
|
||||
|
||||
s->baudbase = 115200;
|
||||
serial_init_core(s);
|
||||
serial_realize_core(s, &err);
|
||||
if (err != NULL) {
|
||||
qerror_report_err(err);
|
||||
error_free(err);
|
||||
return -1;
|
||||
}
|
||||
|
||||
pci->dev.config[PCI_INTERRUPT_PIN] = 0x01;
|
||||
s->irq = pci->dev.irq[0];
|
||||
@@ -80,6 +87,7 @@ static int multi_serial_pci_init(PCIDevice *dev)
|
||||
PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(dev);
|
||||
PCIMultiSerialState *pci = DO_UPCAST(PCIMultiSerialState, dev, dev);
|
||||
SerialState *s;
|
||||
Error *err = NULL;
|
||||
int i;
|
||||
|
||||
switch (pc->device_id) {
|
||||
@@ -102,7 +110,12 @@ static int multi_serial_pci_init(PCIDevice *dev)
|
||||
for (i = 0; i < pci->ports; i++) {
|
||||
s = pci->state + i;
|
||||
s->baudbase = 115200;
|
||||
serial_init_core(s);
|
||||
serial_realize_core(s, &err);
|
||||
if (err != NULL) {
|
||||
qerror_report_err(err);
|
||||
error_free(err);
|
||||
return -1;
|
||||
}
|
||||
s->irq = pci->irqs[i];
|
||||
pci->name[i] = g_strdup_printf("uart #%d", i+1);
|
||||
memory_region_init_io(&s->io, &serial_io_ops, s, pci->name[i], 8);
|
||||
|
||||
+17
-5
@@ -642,11 +642,11 @@ static void serial_reset(void *opaque)
|
||||
qemu_irq_lower(s->irq);
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
s->modem_status_poll = qemu_new_timer_ns(vm_clock, (QEMUTimerCB *) serial_update_msl, s);
|
||||
@@ -687,13 +687,19 @@ SerialState *serial_init(int base, qemu_irq irq, int baudbase,
|
||||
CharDriverState *chr, MemoryRegion *system_io)
|
||||
{
|
||||
SerialState *s;
|
||||
Error *err = NULL;
|
||||
|
||||
s = g_malloc0(sizeof(SerialState));
|
||||
|
||||
s->irq = irq;
|
||||
s->baudbase = baudbase;
|
||||
s->chr = chr;
|
||||
serial_init_core(s);
|
||||
serial_realize_core(s, &err);
|
||||
if (err != NULL) {
|
||||
fprintf(stderr, "%s\n", error_get_pretty(err));
|
||||
error_free(err);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
vmstate_register(NULL, base, &vmstate_serial, s);
|
||||
|
||||
@@ -743,6 +749,7 @@ SerialState *serial_mm_init(MemoryRegion *address_space,
|
||||
CharDriverState *chr, enum device_endian end)
|
||||
{
|
||||
SerialState *s;
|
||||
Error *err = NULL;
|
||||
|
||||
s = g_malloc0(sizeof(SerialState));
|
||||
|
||||
@@ -751,7 +758,12 @@ SerialState *serial_mm_init(MemoryRegion *address_space,
|
||||
s->baudbase = baudbase;
|
||||
s->chr = chr;
|
||||
|
||||
serial_init_core(s);
|
||||
serial_realize_core(s, &err);
|
||||
if (err != NULL) {
|
||||
fprintf(stderr, "%s\n", error_get_pretty(err));
|
||||
error_free(err);
|
||||
exit(1);
|
||||
}
|
||||
vmstate_register(NULL, base, &vmstate_serial, s);
|
||||
|
||||
memory_region_init_io(&s->io, &serial_mm_ops[end], s,
|
||||
|
||||
@@ -2906,19 +2906,20 @@ static void cirrus_init_common(CirrusVGAState * s, int device_id, int is_pci,
|
||||
*
|
||||
***************************************/
|
||||
|
||||
static int vga_initfn(ISADevice *dev)
|
||||
static void isa_cirrus_vga_realizefn(DeviceState *dev, Error **errp)
|
||||
{
|
||||
ISADevice *isadev = ISA_DEVICE(dev);
|
||||
ISACirrusVGAState *d = ISA_CIRRUS_VGA(dev);
|
||||
VGACommonState *s = &d->cirrus_vga.vga;
|
||||
|
||||
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 = graphic_console_init(DEVICE(dev), s->hw_ops, s);
|
||||
isa_address_space(isadev),
|
||||
isa_address_space_io(isadev));
|
||||
s->con = graphic_console_init(dev, s->hw_ops, s);
|
||||
rom_add_vga(VGABIOS_CIRRUS_FILENAME);
|
||||
/* XXX ISA-LFB support */
|
||||
/* FIXME not qdev yet */
|
||||
return 0;
|
||||
}
|
||||
|
||||
static Property isa_cirrus_vga_properties[] = {
|
||||
@@ -2929,11 +2930,10 @@ static Property isa_cirrus_vga_properties[] = {
|
||||
|
||||
static void isa_cirrus_vga_class_init(ObjectClass *klass, void *data)
|
||||
{
|
||||
ISADeviceClass *k = ISA_DEVICE_CLASS(klass);
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
|
||||
dc->vmsd = &vmstate_cirrus_vga;
|
||||
k->init = vga_initfn;
|
||||
dc->realize = isa_cirrus_vga_realizefn;
|
||||
dc->props = isa_cirrus_vga_properties;
|
||||
}
|
||||
|
||||
|
||||
@@ -48,30 +48,30 @@ static void vga_isa_reset(DeviceState *dev)
|
||||
vga_common_reset(s);
|
||||
}
|
||||
|
||||
static int vga_initfn(ISADevice *dev)
|
||||
static void vga_isa_realizefn(DeviceState *dev, Error **errp)
|
||||
{
|
||||
ISADevice *isadev = ISA_DEVICE(dev);
|
||||
ISAVGAState *d = ISA_VGA(dev);
|
||||
VGACommonState *s = &d->state;
|
||||
MemoryRegion *vga_io_memory;
|
||||
const MemoryRegionPortio *vga_ports, *vbe_ports;
|
||||
|
||||
vga_common_init(s);
|
||||
s->legacy_address_space = isa_address_space(dev);
|
||||
s->legacy_address_space = isa_address_space(isadev);
|
||||
vga_io_memory = 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 = graphic_console_init(DEVICE(dev), s->hw_ops, s);
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
static Property vga_isa_properties[] = {
|
||||
@@ -82,9 +82,8 @@ static Property vga_isa_properties[] = {
|
||||
static void vga_isa_class_initfn(ObjectClass *klass, void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
ISADeviceClass *ic = ISA_DEVICE_CLASS(klass);
|
||||
|
||||
ic->init = vga_initfn;
|
||||
dc->realize = vga_isa_realizefn;
|
||||
dc->reset = vga_isa_reset;
|
||||
dc->vmsd = &vmstate_vga_common;
|
||||
dc->props = vga_isa_properties;
|
||||
|
||||
+5
-8
@@ -98,7 +98,7 @@ static uint32_t i82374_read_descriptor(void *opaque, uint32_t nport)
|
||||
return val;
|
||||
}
|
||||
|
||||
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 = {
|
||||
},
|
||||
};
|
||||
|
||||
static int i82374_isa_init(ISADevice *dev)
|
||||
static void i82374_isa_realize(DeviceState *dev, Error **errp)
|
||||
{
|
||||
ISAi82374State *isa = I82374(dev);
|
||||
I82374State *s = &isa->state;
|
||||
@@ -135,11 +135,9 @@ static int i82374_isa_init(ISADevice *dev)
|
||||
register_ioport_write(isa->iobase + 0x20, 0x20, 1, i82374_write_descriptor, s);
|
||||
register_ioport_read(isa->iobase + 0x20, 0x20, 1, i82374_read_descriptor, s);
|
||||
|
||||
i82374_init(s);
|
||||
i82374_realize(s, errp);
|
||||
|
||||
qdev_init_gpio_out(&dev->qdev, &s->out, 1);
|
||||
|
||||
return 0;
|
||||
qdev_init_gpio_out(dev, &s->out, 1);
|
||||
}
|
||||
|
||||
static Property i82374_properties[] = {
|
||||
@@ -149,10 +147,9 @@ static Property i82374_properties[] = {
|
||||
|
||||
static void i82374_class_init(ObjectClass *klass, void *data)
|
||||
{
|
||||
ISADeviceClass *k = ISA_DEVICE_CLASS(klass);
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
|
||||
k->init = i82374_isa_init;
|
||||
dc->realize = i82374_isa_realize;
|
||||
dc->vmsd = &vmstate_isa_i82374;
|
||||
dc->props = i82374_properties;
|
||||
}
|
||||
|
||||
+2
-2
@@ -66,7 +66,7 @@ i2c_bus *i2c_init_bus(DeviceState *parent, const char *name)
|
||||
{
|
||||
i2c_bus *bus;
|
||||
|
||||
bus = FROM_QBUS(i2c_bus, qbus_create(TYPE_I2C_BUS, parent, name));
|
||||
bus = I2C_BUS(qbus_create(TYPE_I2C_BUS, parent, name));
|
||||
vmstate_register(NULL, -1, &vmstate_i2c_bus, bus);
|
||||
return bus;
|
||||
}
|
||||
@@ -183,7 +183,7 @@ static int i2c_slave_post_load(void *opaque, int version_id)
|
||||
{
|
||||
I2CSlave *dev = opaque;
|
||||
i2c_bus *bus;
|
||||
bus = FROM_QBUS(i2c_bus, qdev_get_parent_bus(&dev->qdev));
|
||||
bus = I2C_BUS(qdev_get_parent_bus(DEVICE(dev)));
|
||||
if (bus->saved_address == dev->address) {
|
||||
bus->current_dev = dev;
|
||||
}
|
||||
|
||||
+39
-20
@@ -32,13 +32,26 @@
|
||||
|
||||
#define CALIBRATION_ROUNDS 3
|
||||
|
||||
#define KVM_PIT(obj) OBJECT_CHECK(KVMPITState, (obj), TYPE_KVM_I8254)
|
||||
#define KVM_PIT_CLASS(class) \
|
||||
OBJECT_CLASS_CHECK(KVMPITClass, (class), TYPE_KVM_I8254)
|
||||
#define KVM_PIT_GET_CLASS(obj) \
|
||||
OBJECT_GET_CLASS(KVMPITClass, (obj), TYPE_KVM_I8254)
|
||||
|
||||
typedef struct KVMPITState {
|
||||
PITCommonState pit;
|
||||
PITCommonState parent_obj;
|
||||
|
||||
LostTickPolicy lost_tick_policy;
|
||||
bool vm_stopped;
|
||||
int64_t kernel_clock_offset;
|
||||
} KVMPITState;
|
||||
|
||||
typedef struct KVMPITClass {
|
||||
PITCommonClass parent_class;
|
||||
|
||||
DeviceRealize parent_realize;
|
||||
} KVMPITClass;
|
||||
|
||||
static int64_t abs64(int64_t v)
|
||||
{
|
||||
return v < 0 ? -v : v;
|
||||
@@ -70,7 +83,7 @@ static void kvm_pit_update_clock_offset(KVMPITState *s)
|
||||
|
||||
static void kvm_pit_get(PITCommonState *pit)
|
||||
{
|
||||
KVMPITState *s = DO_UPCAST(KVMPITState, pit, pit);
|
||||
KVMPITState *s = KVM_PIT(pit);
|
||||
struct kvm_pit_state2 kpit;
|
||||
struct kvm_pit_channel_state *kchan;
|
||||
struct PITChannelState *sc;
|
||||
@@ -124,7 +137,7 @@ static void kvm_pit_get(PITCommonState *pit)
|
||||
|
||||
static void kvm_pit_put(PITCommonState *pit)
|
||||
{
|
||||
KVMPITState *s = DO_UPCAST(KVMPITState, pit, pit);
|
||||
KVMPITState *s = KVM_PIT(pit);
|
||||
struct kvm_pit_state2 kpit;
|
||||
struct kvm_pit_channel_state *kchan;
|
||||
struct PITChannelState *sc;
|
||||
@@ -200,7 +213,7 @@ static void kvm_pit_get_channel_info(PITCommonState *s, PITChannelState *sc,
|
||||
|
||||
static void kvm_pit_reset(DeviceState *dev)
|
||||
{
|
||||
PITCommonState *s = DO_UPCAST(PITCommonState, dev.qdev, dev);
|
||||
PITCommonState *s = PIT_COMMON(dev);
|
||||
|
||||
pit_reset_common(s);
|
||||
|
||||
@@ -229,14 +242,16 @@ static void kvm_pit_vm_state_change(void *opaque, int running,
|
||||
s->vm_stopped = false;
|
||||
} else {
|
||||
kvm_pit_update_clock_offset(s);
|
||||
kvm_pit_get(&s->pit);
|
||||
kvm_pit_get(PIT_COMMON(s));
|
||||
s->vm_stopped = true;
|
||||
}
|
||||
}
|
||||
|
||||
static int kvm_pit_initfn(PITCommonState *pit)
|
||||
static void kvm_pit_realizefn(DeviceState *dev, Error **errp)
|
||||
{
|
||||
KVMPITState *s = DO_UPCAST(KVMPITState, pit, pit);
|
||||
PITCommonState *pit = PIT_COMMON(dev);
|
||||
KVMPITClass *kpc = KVM_PIT_GET_CLASS(dev);
|
||||
KVMPITState *s = KVM_PIT(pit);
|
||||
struct kvm_pit_config config = {
|
||||
.flags = 0,
|
||||
};
|
||||
@@ -248,9 +263,9 @@ static int kvm_pit_initfn(PITCommonState *pit)
|
||||
ret = kvm_vm_ioctl(kvm_state, KVM_CREATE_PIT);
|
||||
}
|
||||
if (ret < 0) {
|
||||
fprintf(stderr, "Create kernel PIC irqchip failed: %s\n",
|
||||
strerror(ret));
|
||||
return ret;
|
||||
error_setg(errp, "Create kernel PIC irqchip failed: %s",
|
||||
strerror(ret));
|
||||
return;
|
||||
}
|
||||
switch (s->lost_tick_policy) {
|
||||
case LOST_TICK_DELAY:
|
||||
@@ -261,28 +276,29 @@ static int kvm_pit_initfn(PITCommonState *pit)
|
||||
|
||||
ret = kvm_vm_ioctl(kvm_state, KVM_REINJECT_CONTROL, &control);
|
||||
if (ret < 0) {
|
||||
fprintf(stderr,
|
||||
"Can't disable in-kernel PIT reinjection: %s\n",
|
||||
strerror(ret));
|
||||
return ret;
|
||||
error_setg(errp,
|
||||
"Can't disable in-kernel PIT reinjection: %s",
|
||||
strerror(ret));
|
||||
return;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
error_setg(errp, "Lost tick policy not supported.");
|
||||
return;
|
||||
}
|
||||
|
||||
memory_region_init_reservation(&pit->ioports, "kvm-pit", 4);
|
||||
|
||||
qdev_init_gpio_in(&pit->dev.qdev, kvm_pit_irq_control, 1);
|
||||
qdev_init_gpio_in(dev, kvm_pit_irq_control, 1);
|
||||
|
||||
qemu_add_vm_change_state_handler(kvm_pit_vm_state_change, s);
|
||||
|
||||
return 0;
|
||||
kpc->parent_realize(dev, errp);
|
||||
}
|
||||
|
||||
static Property kvm_pit_properties[] = {
|
||||
DEFINE_PROP_HEX32("iobase", KVMPITState, pit.iobase, -1),
|
||||
DEFINE_PROP_HEX32("iobase", PITCommonState, iobase, -1),
|
||||
DEFINE_PROP_LOSTTICKPOLICY("lost_tick_policy", KVMPITState,
|
||||
lost_tick_policy, LOST_TICK_DELAY),
|
||||
DEFINE_PROP_END_OF_LIST(),
|
||||
@@ -290,10 +306,12 @@ static Property kvm_pit_properties[] = {
|
||||
|
||||
static void kvm_pit_class_init(ObjectClass *klass, void *data)
|
||||
{
|
||||
KVMPITClass *kpc = KVM_PIT_CLASS(klass);
|
||||
PITCommonClass *k = PIT_COMMON_CLASS(klass);
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
|
||||
k->init = kvm_pit_initfn;
|
||||
kpc->parent_realize = dc->realize;
|
||||
dc->realize = kvm_pit_realizefn;
|
||||
k->set_channel_gate = kvm_pit_set_gate;
|
||||
k->get_channel_info = kvm_pit_get_channel_info;
|
||||
k->pre_save = kvm_pit_get;
|
||||
@@ -303,10 +321,11 @@ static void kvm_pit_class_init(ObjectClass *klass, void *data)
|
||||
}
|
||||
|
||||
static const TypeInfo kvm_pit_info = {
|
||||
.name = "kvm-pit",
|
||||
.name = TYPE_KVM_I8254,
|
||||
.parent = TYPE_PIT_COMMON,
|
||||
.instance_size = sizeof(KVMPITState),
|
||||
.class_init = kvm_pit_class_init,
|
||||
.class_size = sizeof(KVMPITClass),
|
||||
};
|
||||
|
||||
static void kvm_pit_register(void)
|
||||
|
||||
+29
-5
@@ -13,6 +13,22 @@
|
||||
#include "hw/i386/apic_internal.h"
|
||||
#include "sysemu/kvm.h"
|
||||
|
||||
#define TYPE_KVM_I8259 "kvm-i8259"
|
||||
#define KVM_PIC_CLASS(class) \
|
||||
OBJECT_CLASS_CHECK(KVMPICClass, (class), TYPE_KVM_I8259)
|
||||
#define KVM_PIC_GET_CLASS(obj) \
|
||||
OBJECT_GET_CLASS(KVMPICClass, (obj), TYPE_KVM_I8259)
|
||||
|
||||
/**
|
||||
* KVMPICClass:
|
||||
* @parent_realize: The parent's realizefn.
|
||||
*/
|
||||
typedef struct KVMPICClass {
|
||||
PICCommonClass parent_class;
|
||||
|
||||
DeviceRealize parent_realize;
|
||||
} KVMPICClass;
|
||||
|
||||
static void kvm_pic_get(PICCommonState *s)
|
||||
{
|
||||
struct kvm_irqchip chip;
|
||||
@@ -98,36 +114,44 @@ static void kvm_pic_set_irq(void *opaque, int irq, int level)
|
||||
apic_report_irq_delivered(delivered);
|
||||
}
|
||||
|
||||
static void kvm_pic_init(PICCommonState *s)
|
||||
static void kvm_pic_realize(DeviceState *dev, Error **errp)
|
||||
{
|
||||
PICCommonState *s = PIC_COMMON(dev);
|
||||
KVMPICClass *kpc = KVM_PIC_GET_CLASS(dev);
|
||||
|
||||
memory_region_init_reservation(&s->base_io, "kvm-pic", 2);
|
||||
memory_region_init_reservation(&s->elcr_io, "kvm-elcr", 1);
|
||||
|
||||
kpc->parent_realize(dev, errp);
|
||||
}
|
||||
|
||||
qemu_irq *kvm_i8259_init(ISABus *bus)
|
||||
{
|
||||
i8259_init_chip("kvm-i8259", bus, true);
|
||||
i8259_init_chip("kvm-i8259", bus, false);
|
||||
i8259_init_chip(TYPE_KVM_I8259, bus, true);
|
||||
i8259_init_chip(TYPE_KVM_I8259, bus, false);
|
||||
|
||||
return qemu_allocate_irqs(kvm_pic_set_irq, NULL, ISA_NUM_IRQS);
|
||||
}
|
||||
|
||||
static void kvm_i8259_class_init(ObjectClass *klass, void *data)
|
||||
{
|
||||
KVMPICClass *kpc = KVM_PIC_CLASS(klass);
|
||||
PICCommonClass *k = PIC_COMMON_CLASS(klass);
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
|
||||
dc->reset = kvm_pic_reset;
|
||||
k->init = kvm_pic_init;
|
||||
kpc->parent_realize = dc->realize;
|
||||
dc->realize = kvm_pic_realize;
|
||||
k->pre_save = kvm_pic_get;
|
||||
k->post_load = kvm_pic_put;
|
||||
}
|
||||
|
||||
static const TypeInfo kvm_i8259_info = {
|
||||
.name = "kvm-i8259",
|
||||
.name = TYPE_KVM_I8259,
|
||||
.parent = TYPE_PIC_COMMON,
|
||||
.instance_size = sizeof(PICCommonState),
|
||||
.class_init = kvm_i8259_class_init,
|
||||
.class_size = sizeof(KVMPICClass),
|
||||
};
|
||||
|
||||
static void kvm_pic_register_types(void)
|
||||
|
||||
+18
-10
@@ -522,23 +522,29 @@ static const MemoryRegionOps port92_ops = {
|
||||
.endianness = DEVICE_LITTLE_ENDIAN,
|
||||
};
|
||||
|
||||
static int port92_initfn(ISADevice *dev)
|
||||
static void port92_initfn(Object *obj)
|
||||
{
|
||||
Port92State *s = PORT92(dev);
|
||||
Port92State *s = PORT92(obj);
|
||||
|
||||
memory_region_init_io(&s->io, &port92_ops, s, "port92", 1);
|
||||
isa_register_ioport(dev, &s->io, 0x92);
|
||||
|
||||
s->outport = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void port92_realizefn(DeviceState *dev, Error **errp)
|
||||
{
|
||||
ISADevice *isadev = ISA_DEVICE(dev);
|
||||
Port92State *s = PORT92(dev);
|
||||
|
||||
isa_register_ioport(isadev, &s->io, 0x92);
|
||||
}
|
||||
|
||||
static void port92_class_initfn(ObjectClass *klass, void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
ISADeviceClass *ic = ISA_DEVICE_CLASS(klass);
|
||||
ic->init = port92_initfn;
|
||||
|
||||
dc->no_user = 1;
|
||||
dc->realize = port92_realizefn;
|
||||
dc->reset = port92_reset;
|
||||
dc->vmsd = &vmstate_port92_isa;
|
||||
}
|
||||
@@ -547,6 +553,7 @@ static const TypeInfo port92_info = {
|
||||
.name = TYPE_PORT92,
|
||||
.parent = TYPE_ISA_DEVICE,
|
||||
.instance_size = sizeof(Port92State),
|
||||
.instance_init = port92_initfn,
|
||||
.class_init = port92_class_initfn,
|
||||
};
|
||||
|
||||
@@ -1093,7 +1100,7 @@ DeviceState *pc_vga_init(ISABus *isa_bus, PCIBus *pci_bus)
|
||||
dev = pcidev ? &pcidev->qdev : NULL;
|
||||
} else if (isa_bus) {
|
||||
ISADevice *isadev = isa_vga_init(isa_bus);
|
||||
dev = isadev ? &isadev->qdev : NULL;
|
||||
dev = isadev ? DEVICE(isadev) : NULL;
|
||||
}
|
||||
return dev;
|
||||
}
|
||||
@@ -1180,7 +1187,7 @@ void pc_basic_device_init(ISABus *isa_bus, qemu_irq *gsi,
|
||||
}
|
||||
if (hpet) {
|
||||
/* connect PIT to output control line of the HPET */
|
||||
qdev_connect_gpio_out(hpet, 0, qdev_get_gpio_in(&pit->qdev, 0));
|
||||
qdev_connect_gpio_out(hpet, 0, qdev_get_gpio_in(DEVICE(pit), 0));
|
||||
}
|
||||
pcspk_init(isa_bus, pit);
|
||||
}
|
||||
@@ -1208,8 +1215,9 @@ void pc_basic_device_init(ISABus *isa_bus, qemu_irq *gsi,
|
||||
vmmouse = NULL;
|
||||
}
|
||||
if (vmmouse) {
|
||||
qdev_prop_set_ptr(&vmmouse->qdev, "ps2_mouse", i8042);
|
||||
qdev_init_nofail(&vmmouse->qdev);
|
||||
DeviceState *dev = DEVICE(vmmouse);
|
||||
qdev_prop_set_ptr(dev, "ps2_mouse", i8042);
|
||||
qdev_init_nofail(dev);
|
||||
}
|
||||
port92 = isa_create_simple(isa_bus, "port92");
|
||||
port92_init(port92, &a20_line[1]);
|
||||
|
||||
+1
-1
@@ -199,7 +199,7 @@ static void pc_init1(MemoryRegion *system_memory,
|
||||
dev = isa_ide_init(isa_bus, ide_iobase[i], ide_iobase2[i],
|
||||
ide_irq[i],
|
||||
hd[MAX_IDE_DEVS * i], hd[MAX_IDE_DEVS * i + 1]);
|
||||
idebus[i] = qdev_get_child_bus(&dev->qdev, "ide.0");
|
||||
idebus[i] = qdev_get_child_bus(DEVICE(dev), "ide.0");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+8
-8
@@ -65,16 +65,16 @@ static const VMStateDescription vmstate_ide_isa = {
|
||||
}
|
||||
};
|
||||
|
||||
static int isa_ide_initfn(ISADevice *dev)
|
||||
static void isa_ide_realizefn(DeviceState *dev, Error **errp)
|
||||
{
|
||||
ISADevice *isadev = ISA_DEVICE(dev);
|
||||
ISAIDEState *s = ISA_IDE(dev);
|
||||
|
||||
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);
|
||||
};
|
||||
|
||||
ISADevice *isa_ide_init(ISABus *bus, int iobase, int iobase2, int isairq,
|
||||
@@ -113,8 +113,8 @@ static Property isa_ide_properties[] = {
|
||||
static void isa_ide_class_initfn(ObjectClass *klass, void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
ISADeviceClass *ic = ISA_DEVICE_CLASS(klass);
|
||||
ic->init = isa_ide_initfn;
|
||||
|
||||
dc->realize = isa_ide_realizefn;
|
||||
dc->fw_name = "ide";
|
||||
dc->reset = isa_ide_reset;
|
||||
dc->props = isa_ide_properties;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user