diff options
author | Blue Swirl <blauwirbel@gmail.com> | 2011-02-05 14:34:56 +0000 |
---|---|---|
committer | Blue Swirl <blauwirbel@gmail.com> | 2011-02-12 09:45:03 +0000 |
commit | 4912371fc39120fb7eb1a6b3f270fab30d05a7b6 (patch) | |
tree | e4afd92efce18ebbbae098459dde8288117312a4 | |
parent | 86d864140bc597dce0fedf8547f4d615a920c444 (diff) |
sysbus: add creation function that may fail
Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
-rw-r--r-- | hw/sysbus.c | 31 | ||||
-rw-r--r-- | hw/sysbus.h | 9 |
2 files changed, 40 insertions, 0 deletions
diff --git a/hw/sysbus.c b/hw/sysbus.c index 1928b516a1..acad72abe4 100644 --- a/hw/sysbus.c +++ b/hw/sysbus.c @@ -173,6 +173,37 @@ DeviceState *sysbus_create_varargs(const char *name, return dev; } +DeviceState *sysbus_try_create_varargs(const char *name, + target_phys_addr_t addr, ...) +{ + DeviceState *dev; + SysBusDevice *s; + va_list va; + qemu_irq irq; + int n; + + dev = qdev_try_create(NULL, name); + if (!dev) { + return NULL; + } + s = sysbus_from_qdev(dev); + qdev_init_nofail(dev); + if (addr != (target_phys_addr_t)-1) { + sysbus_mmio_map(s, 0, addr); + } + va_start(va, addr); + n = 0; + while (1) { + irq = va_arg(va, qemu_irq); + if (!irq) { + break; + } + sysbus_connect_irq(s, n, irq); + n++; + } + return dev; +} + static void sysbus_dev_print(Monitor *mon, DeviceState *dev, int indent) { SysBusDevice *s = sysbus_from_qdev(dev); diff --git a/hw/sysbus.h b/hw/sysbus.h index e9eb618a72..4e8cb16d42 100644 --- a/hw/sysbus.h +++ b/hw/sysbus.h @@ -57,6 +57,8 @@ void sysbus_mmio_map(SysBusDevice *dev, int n, target_phys_addr_t addr); /* Legacy helper function for creating devices. */ DeviceState *sysbus_create_varargs(const char *name, target_phys_addr_t addr, ...); +DeviceState *sysbus_try_create_varargs(const char *name, + target_phys_addr_t addr, ...); static inline DeviceState *sysbus_create_simple(const char *name, target_phys_addr_t addr, qemu_irq irq) @@ -64,4 +66,11 @@ static inline DeviceState *sysbus_create_simple(const char *name, return sysbus_create_varargs(name, addr, irq, NULL); } +static inline DeviceState *sysbus_try_create_simple(const char *name, + target_phys_addr_t addr, + qemu_irq irq) +{ + return sysbus_try_create_varargs(name, addr, irq, NULL); +} + #endif /* !HW_SYSBUS_H */ |