Skip to content

Commit

Permalink
Merge remote-tracking branch 'remotes/afaerber/tags/qom-devices-for-p…
Browse files Browse the repository at this point in the history
…eter' into staging

QOM infrastructure fixes and device conversions

* Assertion fix for device_add with non-device types
* Documentation fix
* qdev_init() error reporting cleanups

# gpg: Signature made Tue Feb 24 13:56:33 2015 GMT using RSA key ID 3E7E013F
# gpg: Good signature from "Andreas Färber <afaerber@suse.de>"
# gpg:                 aka "Andreas Färber <afaerber@suse.com>"

* remotes/afaerber/tags/qom-devices-for-peter:
  parallel: parallel_hds_isa_init() shouldn't fail
  parallel: Factor out common parallel_hds_isa_init()
  serial: serial_hds_isa_init() shouldn't fail
  serial: Factor out common serial_hds_isa_init()
  etsec: Replace qdev_init() by qdev_init_nofail()
  leon3: Replace unchecked qdev_init() by qdev_init_nofail()
  ide/isa: Replace unchecked qdev_init() by qdev_init_nofail()
  qdev: Improve qdev_init_nofail()'s error reporting
  qom: Fix typo, 'my_class_init' -> 'derived_class_init'
  qdev: Avoid type assertion in qdev_build_hotpluggable_device_list()

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
  • Loading branch information
pm215 committed Mar 2, 2015
2 parents 2dffe55 + 4bc6a3e commit 5de0904
Show file tree
Hide file tree
Showing 15 changed files with 73 additions and 91 deletions.
6 changes: 1 addition & 5 deletions hw/alpha/dp264.c
Expand Up @@ -83,11 +83,7 @@ static void clipper_init(MachineState *machine)
pci_vga_init(pci_bus);

/* Serial code setup. */
for (i = 0; i < MAX_SERIAL_PORTS; ++i) {
if (serial_hds[i]) {
serial_isa_init(isa_bus, i, serial_hds[i]);
}
}
serial_hds_isa_init(isa_bus, MAX_SERIAL_PORTS);

/* Network setup. e1000 is good enough, failing Tulip support. */
for (i = 0; i < nb_nics; i++) {
Expand Down
25 changes: 25 additions & 0 deletions hw/char/parallel.c
Expand Up @@ -641,3 +641,28 @@ static void parallel_register_types(void)
}

type_init(parallel_register_types)

static void parallel_init(ISABus *bus, int index, CharDriverState *chr)
{
DeviceState *dev;
ISADevice *isadev;

isadev = isa_create(bus, "isa-parallel");
dev = DEVICE(isadev);
qdev_prop_set_uint32(dev, "index", index);
qdev_prop_set_chr(dev, "chardev", chr);
qdev_init_nofail(dev);
}

void parallel_hds_isa_init(ISABus *bus, int n)
{
int i;

assert(n <= MAX_PARALLEL_PORTS);

for (i = 0; i < n; i++) {
if (parallel_hds[i]) {
parallel_init(bus, i, parallel_hds[i]);
}
}
}
23 changes: 15 additions & 8 deletions hw/char/serial-isa.c
Expand Up @@ -119,20 +119,27 @@ static void serial_register_types(void)

type_init(serial_register_types)

bool serial_isa_init(ISABus *bus, int index, CharDriverState *chr)
static void serial_isa_init(ISABus *bus, int index, CharDriverState *chr)
{
DeviceState *dev;
ISADevice *isadev;

isadev = isa_try_create(bus, TYPE_ISA_SERIAL);
if (!isadev) {
return false;
}
isadev = isa_create(bus, TYPE_ISA_SERIAL);
dev = DEVICE(isadev);
qdev_prop_set_uint32(dev, "index", index);
qdev_prop_set_chr(dev, "chardev", chr);
if (qdev_init(dev) < 0) {
return false;
qdev_init_nofail(dev);
}

void serial_hds_isa_init(ISABus *bus, int n)
{
int i;

assert(n <= MAX_SERIAL_PORTS);

for (i = 0; i < n; ++i) {
if (serial_hds[i]) {
serial_isa_init(bus, i, serial_hds[i]);
}
}
return true;
}
18 changes: 14 additions & 4 deletions hw/core/qdev.c
Expand Up @@ -373,10 +373,15 @@ void qdev_simple_device_unplug_cb(HotplugHandler *hotplug_dev,
way is somewhat unclean, and best avoided. */
void qdev_init_nofail(DeviceState *dev)
{
const char *typename = object_get_typename(OBJECT(dev));
Error *err = NULL;

assert(!dev->realized);

if (qdev_init(dev) < 0) {
error_report("Initialization of device %s failed", typename);
object_property_set_bool(OBJECT(dev), true, "realized", &err);
if (err) {
error_report("Initialization of device %s failed: %s",
object_get_typename(OBJECT(dev)),
error_get_pretty(err));
exit(1);
}
}
Expand Down Expand Up @@ -995,7 +1000,12 @@ void qdev_alias_all_properties(DeviceState *target, Object *source)
static int qdev_add_hotpluggable_device(Object *obj, void *opaque)
{
GSList **list = opaque;
DeviceState *dev = DEVICE(obj);
DeviceState *dev = (DeviceState *)object_dynamic_cast(OBJECT(obj),
TYPE_DEVICE);

if (dev == NULL) {
return 0;
}

if (dev->realized && object_property_get_bool(obj, "hotpluggable", NULL)) {
*list = g_slist_append(*list, dev);
Expand Down
13 changes: 2 additions & 11 deletions hw/i386/pc.c
Expand Up @@ -1419,17 +1419,8 @@ void pc_basic_device_init(ISABus *isa_bus, qemu_irq *gsi,
pcspk_init(isa_bus, pit);
}

for(i = 0; i < MAX_SERIAL_PORTS; i++) {
if (serial_hds[i]) {
serial_isa_init(isa_bus, i, serial_hds[i]);
}
}

for(i = 0; i < MAX_PARALLEL_PORTS; i++) {
if (parallel_hds[i]) {
parallel_init(isa_bus, i, parallel_hds[i]);
}
}
serial_hds_isa_init(isa_bus, MAX_SERIAL_PORTS);
parallel_hds_isa_init(isa_bus, MAX_PARALLEL_PORTS);

a20_line = qemu_allocate_irqs(handle_a20_line_change, first_cpu, 2);
i8042 = isa_create_simple(isa_bus, "i8042");
Expand Down
4 changes: 1 addition & 3 deletions hw/ide/isa.c
Expand Up @@ -88,9 +88,7 @@ ISADevice *isa_ide_init(ISABus *bus, int iobase, int iobase2, int isairq,
qdev_prop_set_uint32(dev, "iobase", iobase);
qdev_prop_set_uint32(dev, "iobase2", iobase2);
qdev_prop_set_uint32(dev, "irq", isairq);
if (qdev_init(dev) < 0) {
return NULL;
}
qdev_init_nofail(dev);

s = ISA_IDE(dev);
if (hd0) {
Expand Down
12 changes: 2 additions & 10 deletions hw/mips/mips_fulong2e.c
Expand Up @@ -277,7 +277,6 @@ static void mips_fulong2e_init(MachineState *machine)
PCIBus *pci_bus;
ISABus *isa_bus;
I2CBus *smbus;
int i;
DriveInfo *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
MIPSCPU *cpu;
CPUMIPSState *env;
Expand Down Expand Up @@ -384,15 +383,8 @@ static void mips_fulong2e_init(MachineState *machine)

rtc_init(isa_bus, 2000, NULL);

for(i = 0; i < MAX_SERIAL_PORTS; i++) {
if (serial_hds[i]) {
serial_isa_init(isa_bus, i, serial_hds[i]);
}
}

if (parallel_hds[0]) {
parallel_init(isa_bus, 0, parallel_hds[0]);
}
serial_hds_isa_init(isa_bus, MAX_SERIAL_PORTS);
parallel_hds_isa_init(isa_bus, 1);

/* Sound card */
audio_init(pci_bus);
Expand Down
7 changes: 3 additions & 4 deletions hw/mips/mips_malta.c
Expand Up @@ -1172,10 +1172,9 @@ void mips_malta_init(MachineState *machine)
isa_create_simple(isa_bus, "i8042");

rtc_init(isa_bus, 2000, NULL);
serial_isa_init(isa_bus, 0, serial_hds[0]);
serial_isa_init(isa_bus, 1, serial_hds[1]);
if (parallel_hds[0])
parallel_init(isa_bus, 0, parallel_hds[0]);
serial_hds_isa_init(isa_bus, 2);
parallel_hds_isa_init(isa_bus, 1);

for(i = 0; i < MAX_FD; i++) {
fd[i] = drive_get(IF_FLOPPY, 0, i);
}
Expand Down
6 changes: 1 addition & 5 deletions hw/mips/mips_r4k.c
Expand Up @@ -284,11 +284,7 @@ void mips_r4k_init(MachineState *machine)

pit = pit_init(isa_bus, 0x40, 0, NULL);

for(i = 0; i < MAX_SERIAL_PORTS; i++) {
if (serial_hds[i]) {
serial_isa_init(isa_bus, i, serial_hds[i]);
}
}
serial_hds_isa_init(isa_bus, MAX_SERIAL_PORTS);

isa_vga_init(isa_bus);

Expand Down
5 changes: 1 addition & 4 deletions hw/net/fsl_etsec/etsec.c
Expand Up @@ -443,10 +443,7 @@ DeviceState *etsec_create(hwaddr base,

dev = qdev_create(NULL, "eTSEC");
qdev_set_nic_properties(dev, nd);

if (qdev_init(dev)) {
return NULL;
}
qdev_init_nofail(dev);

sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, tx_irq);
sysbus_connect_irq(SYS_BUS_DEVICE(dev), 1, rx_irq);
Expand Down
12 changes: 2 additions & 10 deletions hw/sparc64/sun4u.c
Expand Up @@ -850,17 +850,9 @@ static void sun4uv_init(MemoryRegion *address_space_mem,
NULL, 115200, serial_hds[i], DEVICE_BIG_ENDIAN);
i++;
}
for(; i < MAX_SERIAL_PORTS; i++) {
if (serial_hds[i]) {
serial_isa_init(isa_bus, i, serial_hds[i]);
}
}

for(i = 0; i < MAX_PARALLEL_PORTS; i++) {
if (parallel_hds[i]) {
parallel_init(isa_bus, i, parallel_hds[i]);
}
}
serial_hds_isa_init(isa_bus, MAX_SERIAL_PORTS);
parallel_hds_isa_init(isa_bus, MAX_PARALLEL_PORTS);

for(i = 0; i < nb_nics; i++)
pci_nic_init_nofail(&nd_table[i], pci_bus, "ne2k_pci", NULL);
Expand Down
2 changes: 1 addition & 1 deletion include/hw/char/serial.h
Expand Up @@ -92,6 +92,6 @@ SerialState *serial_mm_init(MemoryRegion *address_space,

/* serial-isa.c */
#define TYPE_ISA_SERIAL "isa-serial"
bool serial_isa_init(ISABus *bus, int index, CharDriverState *chr);
void serial_hds_isa_init(ISABus *bus, int n);

#endif
17 changes: 1 addition & 16 deletions include/hw/i386/pc.h
Expand Up @@ -107,23 +107,8 @@ struct PcGuestInfo {
};

/* parallel.c */
static inline bool parallel_init(ISABus *bus, int index, CharDriverState *chr)
{
DeviceState *dev;
ISADevice *isadev;

isadev = isa_try_create(bus, "isa-parallel");
if (!isadev) {
return false;
}
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;
}
void parallel_hds_isa_init(ISABus *bus, int n);

bool parallel_mm_init(MemoryRegion *address_space,
hwaddr base, int it_shift, qemu_irq irq,
Expand Down
12 changes: 3 additions & 9 deletions include/hw/sparc/grlib.h
Expand Up @@ -55,9 +55,7 @@ DeviceState *grlib_irqmp_create(hwaddr base,
qdev_prop_set_ptr(dev, "set_pil_in", set_pil_in);
qdev_prop_set_ptr(dev, "set_pil_in_opaque", env);

if (qdev_init(dev)) {
return NULL;
}
qdev_init_nofail(dev);

env->irq_manager = dev;

Expand Down Expand Up @@ -87,9 +85,7 @@ DeviceState *grlib_gptimer_create(hwaddr base,
qdev_prop_set_uint32(dev, "frequency", freq);
qdev_prop_set_uint32(dev, "irq-line", base_irq);

if (qdev_init(dev)) {
return NULL;
}
qdev_init_nofail(dev);

sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, base);

Expand All @@ -112,9 +108,7 @@ DeviceState *grlib_apbuart_create(hwaddr base,
dev = qdev_create(NULL, "grlib,apbuart");
qdev_prop_set_chr(dev, "chrdev", serial);

if (qdev_init(dev)) {
return NULL;
}
qdev_init_nofail(dev);

sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, base);

Expand Down
2 changes: 1 addition & 1 deletion include/qom/object.h
Expand Up @@ -273,7 +273,7 @@ typedef struct InterfaceInfo InterfaceInfo;
* .name = TYPE_DERIVED,
* .parent = TYPE_MY,
* .class_size = sizeof(DerivedClass),
* .class_init = my_class_init,
* .class_init = derived_class_init,
* };
* </programlisting>
* </example>
Expand Down

0 comments on commit 5de0904

Please sign in to comment.