mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-06 09:13:55 -06:00
QOM/QTest infrastructure fixes and device conversions
* -device / device_add assertion fix * QEMUMachine conversion to MachineClass * Device error handling improvements * QTest cleanups and test cases for some more PCI devices * PortIO memory leak fixes -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iQIcBAABAgAGBQJTZ9+EAAoJEPou0S0+fgE/wAsP/RymQyMGXbvkzy89UQ+V/y8B YWGd+mfdNpic8ofCFP792uVNFhR9IfIEg+ZK4qJ8iI68B4MWXbJtvaAQZm+LrWJJ fFMUsI7Cl4mDPpCq5cXVgA1Df7YwarPG5rnq20A2XGFUANaO6pROxNt72K940sW8 q1O7tMPZ1T//EBAKFYj6UhAbHa+C6vwYQmosaRoZ4uj8NZdP3uCZLKqhAE44QZcc nAQwWHsev3Qv0Tvx3DYbOjXZugXiUryKd8yX+PaKyQuHEdCaLjK/eGjMYbhUkqol 4i44tbjnjUYPnAxZtIrYtDFDepyVaVvsLyP3K+0zHKkWhOl+nlqa+ERnycz2Q1de w+FXuftMOf+S/HO1kjv8JBUh4vcgLT77qrE/h1D5thXcTe4jz8WTEB/irUfZl7oa dGbSiAPaggrKIf/nBJVDnHaqIdCgMQ/WgNaSsRfKazP1OM04B0F7KKEVPTU9Zo6y rDYOKtsL3va+uD8ntf7kBCBjfhmJ2L+IZvI27xc0FISKgg9XXTwX8NhdfvM0/GIC F4guEGmralNAIjhBVUy+ajq6E2ku/i04CEfFyofgUVQ2kTcDMwhqSdG2WBjEQs2e NsteCfAu7B8EJ3lQa6F856k+/u1FiIRHDR6+Qi/qW2yAjdn3USMm7KWTtQaEQn8Y ZE2gvvnMmiWkzTSlmRUz =UrRJ -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/afaerber/tags/qom-devices-for-peter' into staging QOM/QTest infrastructure fixes and device conversions * -device / device_add assertion fix * QEMUMachine conversion to MachineClass * Device error handling improvements * QTest cleanups and test cases for some more PCI devices * PortIO memory leak fixes # gpg: Signature made Mon 05 May 2014 19:59:16 BST 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: PortioList: Store PortioList in device state tests: Add EHCI qtest tests: Add ioh3420 qtest tests: Add intel-hda qtests tests: Add es1370 qtest tests: Add ac97 qtest qtest: Be paranoid about accept() addrlen argument qtest: Add error reporting to socket_accept() qtest: Assure that init_socket()'s listen() does not fail MAINTAINERS: Document QOM arm: Clean up fragile use of error_is_set() in realize() methods qom: Clean up fragile use of error_is_set() in set() methods hw: Consistently name Error ** objects errp, and not err hw: Consistently name Error * objects err, and not errp machine: Remove QEMUMachine indirection from MachineClass machine: Replace QEMUMachine by MachineClass in accelerator configuration vl.c: Replace QEMUMachine with MachineClass in QEMUMachineInitArgs machine: Copy QEMUMachine's fields to MachineClass machine: Remove obsoleted field from QEMUMachine qdev: Fix crash by validating the object type Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
7f8fea8b3d
47 changed files with 463 additions and 174 deletions
|
@ -86,6 +86,7 @@ typedef struct {
|
|||
#ifndef HAS_YMF262
|
||||
FM_OPL *opl;
|
||||
#endif
|
||||
PortioList port_list;
|
||||
} AdlibState;
|
||||
|
||||
static AdlibState *glob_adlib;
|
||||
|
@ -293,7 +294,6 @@ static MemoryRegionPortio adlib_portio_list[] = {
|
|||
static void adlib_realizefn (DeviceState *dev, Error **errp)
|
||||
{
|
||||
AdlibState *s = ADLIB(dev);
|
||||
PortioList *port_list = g_new(PortioList, 1);
|
||||
struct audsettings as;
|
||||
|
||||
if (glob_adlib) {
|
||||
|
@ -349,8 +349,8 @@ static void adlib_realizefn (DeviceState *dev, Error **errp)
|
|||
|
||||
adlib_portio_list[0].offset = s->port;
|
||||
adlib_portio_list[1].offset = s->port + 8;
|
||||
portio_list_init (port_list, OBJECT(s), adlib_portio_list, s, "adlib");
|
||||
portio_list_add (port_list, isa_address_space_io(&s->parent_obj), 0);
|
||||
portio_list_init (&s->port_list, OBJECT(s), adlib_portio_list, s, "adlib");
|
||||
portio_list_add (&s->port_list, isa_address_space_io(&s->parent_obj), 0);
|
||||
}
|
||||
|
||||
static Property adlib_properties[] = {
|
||||
|
|
|
@ -338,13 +338,13 @@ PropertyInfo qdev_prop_vlan = {
|
|||
int qdev_prop_set_drive(DeviceState *dev, const char *name,
|
||||
BlockDriverState *value)
|
||||
{
|
||||
Error *errp = NULL;
|
||||
Error *err = NULL;
|
||||
const char *bdrv_name = value ? bdrv_get_device_name(value) : "";
|
||||
object_property_set_str(OBJECT(dev), bdrv_name,
|
||||
name, &errp);
|
||||
if (errp) {
|
||||
qerror_report_err(errp);
|
||||
error_free(errp);
|
||||
name, &err);
|
||||
if (err) {
|
||||
qerror_report_err(err);
|
||||
error_free(err);
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
|
|
|
@ -751,6 +751,7 @@ static void set_prop_arraylen(Object *obj, Visitor *v, void *opaque,
|
|||
Property *prop = opaque;
|
||||
uint32_t *alenptr = qdev_get_prop_ptr(dev, prop);
|
||||
void **arrayptr = (void *)dev + prop->arrayoffset;
|
||||
Error *local_err = NULL;
|
||||
void *eltptr;
|
||||
const char *arrayname;
|
||||
int i;
|
||||
|
@ -764,8 +765,9 @@ static void set_prop_arraylen(Object *obj, Visitor *v, void *opaque,
|
|||
name);
|
||||
return;
|
||||
}
|
||||
visit_type_uint32(v, alenptr, name, errp);
|
||||
if (error_is_set(errp)) {
|
||||
visit_type_uint32(v, alenptr, name, &local_err);
|
||||
if (local_err) {
|
||||
error_propagate(errp, local_err);
|
||||
return;
|
||||
}
|
||||
if (!*alenptr) {
|
||||
|
@ -802,8 +804,9 @@ static void set_prop_arraylen(Object *obj, Visitor *v, void *opaque,
|
|||
arrayprop->prop.info->get,
|
||||
arrayprop->prop.info->set,
|
||||
array_element_release,
|
||||
arrayprop, errp);
|
||||
if (error_is_set(errp)) {
|
||||
arrayprop, &local_err);
|
||||
if (local_err) {
|
||||
error_propagate(errp, local_err);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -174,14 +174,14 @@ int qdev_init(DeviceState *dev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void device_realize(DeviceState *dev, Error **err)
|
||||
static void device_realize(DeviceState *dev, Error **errp)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_GET_CLASS(dev);
|
||||
|
||||
if (dc->init) {
|
||||
int rc = dc->init(dev);
|
||||
if (rc < 0) {
|
||||
error_setg(err, "Device initialization failed.");
|
||||
error_setg(errp, "Device initialization failed.");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -504,14 +504,14 @@ static void bus_unparent(Object *obj)
|
|||
}
|
||||
}
|
||||
|
||||
static bool bus_get_realized(Object *obj, Error **err)
|
||||
static bool bus_get_realized(Object *obj, Error **errp)
|
||||
{
|
||||
BusState *bus = BUS(obj);
|
||||
|
||||
return bus->realized;
|
||||
}
|
||||
|
||||
static void bus_set_realized(Object *obj, bool value, Error **err)
|
||||
static void bus_set_realized(Object *obj, bool value, Error **errp)
|
||||
{
|
||||
BusState *bus = BUS(obj);
|
||||
BusClass *bc = BUS_GET_CLASS(bus);
|
||||
|
@ -540,7 +540,7 @@ static void bus_set_realized(Object *obj, bool value, Error **err)
|
|||
return;
|
||||
|
||||
error:
|
||||
error_propagate(err, local_err);
|
||||
error_propagate(errp, local_err);
|
||||
}
|
||||
|
||||
void qbus_create_inplace(void *bus, size_t size, const char *typename,
|
||||
|
@ -724,13 +724,13 @@ void qdev_property_add_static(DeviceState *dev, Property *prop,
|
|||
}
|
||||
}
|
||||
|
||||
static bool device_get_realized(Object *obj, Error **err)
|
||||
static bool device_get_realized(Object *obj, Error **errp)
|
||||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
return dev->realized;
|
||||
}
|
||||
|
||||
static void device_set_realized(Object *obj, bool value, Error **err)
|
||||
static void device_set_realized(Object *obj, bool value, Error **errp)
|
||||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
DeviceClass *dc = DEVICE_GET_CLASS(dev);
|
||||
|
@ -738,7 +738,7 @@ static void device_set_realized(Object *obj, bool value, Error **err)
|
|||
Error *local_err = NULL;
|
||||
|
||||
if (dev->hotplugged && !dc->hotpluggable) {
|
||||
error_set(err, QERR_DEVICE_NO_HOTPLUG, object_get_typename(obj));
|
||||
error_set(errp, QERR_DEVICE_NO_HOTPLUG, object_get_typename(obj));
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -797,14 +797,14 @@ static void device_set_realized(Object *obj, bool value, Error **err)
|
|||
}
|
||||
|
||||
if (local_err != NULL) {
|
||||
error_propagate(err, local_err);
|
||||
error_propagate(errp, local_err);
|
||||
return;
|
||||
}
|
||||
|
||||
dev->realized = value;
|
||||
}
|
||||
|
||||
static bool device_get_hotpluggable(Object *obj, Error **err)
|
||||
static bool device_get_hotpluggable(Object *obj, Error **errp)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_GET_CLASS(obj);
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
|
|
|
@ -2055,7 +2055,6 @@ static int qxl_init_primary(PCIDevice *dev)
|
|||
{
|
||||
PCIQXLDevice *qxl = DO_UPCAST(PCIQXLDevice, pci, dev);
|
||||
VGACommonState *vga = &qxl->vga;
|
||||
PortioList *qxl_vga_port_list = g_new(PortioList, 1);
|
||||
int rc;
|
||||
|
||||
qxl->id = 0;
|
||||
|
@ -2064,10 +2063,10 @@ static int qxl_init_primary(PCIDevice *dev)
|
|||
vga_common_init(vga, OBJECT(dev), true);
|
||||
vga_init(vga, OBJECT(dev),
|
||||
pci_address_space(dev), pci_address_space_io(dev), false);
|
||||
portio_list_init(qxl_vga_port_list, OBJECT(dev), qxl_vga_portio_list,
|
||||
portio_list_init(&qxl->vga_port_list, OBJECT(dev), qxl_vga_portio_list,
|
||||
vga, "vga");
|
||||
portio_list_set_flush_coalesced(qxl_vga_port_list);
|
||||
portio_list_add(qxl_vga_port_list, pci_address_space_io(dev), 0x3b0);
|
||||
portio_list_set_flush_coalesced(&qxl->vga_port_list);
|
||||
portio_list_add(&qxl->vga_port_list, pci_address_space_io(dev), 0x3b0);
|
||||
|
||||
vga->con = graphic_console_init(DEVICE(dev), 0, &qxl_ops, qxl);
|
||||
qemu_spice_display_init_common(&qxl->ssd);
|
||||
|
|
|
@ -32,6 +32,7 @@ enum qxl_mode {
|
|||
|
||||
typedef struct PCIQXLDevice {
|
||||
PCIDevice pci;
|
||||
PortioList vga_port_list;
|
||||
SimpleSpiceDisplay ssd;
|
||||
int id;
|
||||
uint32_t debug;
|
||||
|
|
|
@ -2355,8 +2355,6 @@ void vga_init(VGACommonState *s, Object *obj, MemoryRegion *address_space,
|
|||
{
|
||||
MemoryRegion *vga_io_memory;
|
||||
const MemoryRegionPortio *vga_ports, *vbe_ports;
|
||||
PortioList *vga_port_list = g_new(PortioList, 1);
|
||||
PortioList *vbe_port_list = g_new(PortioList, 1);
|
||||
|
||||
qemu_register_reset(vga_reset, s);
|
||||
|
||||
|
@ -2371,13 +2369,13 @@ void vga_init(VGACommonState *s, Object *obj, MemoryRegion *address_space,
|
|||
1);
|
||||
memory_region_set_coalescing(vga_io_memory);
|
||||
if (init_vga_ports) {
|
||||
portio_list_init(vga_port_list, obj, vga_ports, s, "vga");
|
||||
portio_list_set_flush_coalesced(vga_port_list);
|
||||
portio_list_add(vga_port_list, address_space_io, 0x3b0);
|
||||
portio_list_init(&s->vga_port_list, obj, vga_ports, s, "vga");
|
||||
portio_list_set_flush_coalesced(&s->vga_port_list);
|
||||
portio_list_add(&s->vga_port_list, address_space_io, 0x3b0);
|
||||
}
|
||||
if (vbe_ports) {
|
||||
portio_list_init(vbe_port_list, obj, vbe_ports, s, "vbe");
|
||||
portio_list_add(vbe_port_list, address_space_io, 0x1ce);
|
||||
portio_list_init(&s->vbe_port_list, obj, vbe_ports, s, "vbe");
|
||||
portio_list_add(&s->vbe_port_list, address_space_io, 0x1ce);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -124,6 +124,8 @@ typedef struct VGACommonState {
|
|||
void (*get_resolution)(struct VGACommonState *s,
|
||||
int *pwidth,
|
||||
int *pheight);
|
||||
PortioList vga_port_list;
|
||||
PortioList vbe_port_list;
|
||||
/* bochs vbe state */
|
||||
uint16_t vbe_index;
|
||||
uint16_t vbe_regs[VBE_DISPI_INDEX_NB];
|
||||
|
|
|
@ -39,6 +39,7 @@ do { fprintf(stderr, "i82374 ERROR: " fmt , ## __VA_ARGS__); } while (0)
|
|||
typedef struct I82374State {
|
||||
uint8_t commands[8];
|
||||
qemu_irq out;
|
||||
PortioList port_list;
|
||||
} I82374State;
|
||||
|
||||
static const VMStateDescription vmstate_i82374 = {
|
||||
|
@ -137,10 +138,10 @@ static void i82374_isa_realize(DeviceState *dev, Error **errp)
|
|||
{
|
||||
ISAi82374State *isa = I82374(dev);
|
||||
I82374State *s = &isa->state;
|
||||
PortioList *port_list = g_new(PortioList, 1);
|
||||
|
||||
portio_list_init(port_list, OBJECT(isa), i82374_portio_list, s, "i82374");
|
||||
portio_list_add(port_list, isa_address_space_io(&isa->parent_obj),
|
||||
portio_list_init(&s->port_list, OBJECT(isa), i82374_portio_list, s,
|
||||
"i82374");
|
||||
portio_list_add(&s->port_list, isa_address_space_io(&isa->parent_obj),
|
||||
isa->iobase);
|
||||
|
||||
i82374_realize(s, errp);
|
||||
|
|
|
@ -534,24 +534,24 @@ static void xilinx_axidma_realize(DeviceState *dev, Error **errp)
|
|||
XilinxAXIDMAStreamSlave *ds = XILINX_AXI_DMA_DATA_STREAM(&s->rx_data_dev);
|
||||
XilinxAXIDMAStreamSlave *cs = XILINX_AXI_DMA_CONTROL_STREAM(
|
||||
&s->rx_control_dev);
|
||||
Error *local_errp = NULL;
|
||||
Error *local_err = NULL;
|
||||
|
||||
object_property_add_link(OBJECT(ds), "dma", TYPE_XILINX_AXI_DMA,
|
||||
(Object **)&ds->dma,
|
||||
object_property_allow_set_link,
|
||||
OBJ_PROP_LINK_UNREF_ON_RELEASE,
|
||||
&local_errp);
|
||||
&local_err);
|
||||
object_property_add_link(OBJECT(cs), "dma", TYPE_XILINX_AXI_DMA,
|
||||
(Object **)&cs->dma,
|
||||
object_property_allow_set_link,
|
||||
OBJ_PROP_LINK_UNREF_ON_RELEASE,
|
||||
&local_errp);
|
||||
if (local_errp) {
|
||||
&local_err);
|
||||
if (local_err) {
|
||||
goto xilinx_axidma_realize_fail;
|
||||
}
|
||||
object_property_set_link(OBJECT(ds), OBJECT(s), "dma", &local_errp);
|
||||
object_property_set_link(OBJECT(cs), OBJECT(s), "dma", &local_errp);
|
||||
if (local_errp) {
|
||||
object_property_set_link(OBJECT(ds), OBJECT(s), "dma", &local_err);
|
||||
object_property_set_link(OBJECT(cs), OBJECT(s), "dma", &local_err);
|
||||
if (local_err) {
|
||||
goto xilinx_axidma_realize_fail;
|
||||
}
|
||||
|
||||
|
@ -567,7 +567,7 @@ static void xilinx_axidma_realize(DeviceState *dev, Error **errp)
|
|||
|
||||
xilinx_axidma_realize_fail:
|
||||
if (!*errp) {
|
||||
*errp = local_errp;
|
||||
*errp = local_err;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -797,9 +797,11 @@ static void arm_gic_realize(DeviceState *dev, Error **errp)
|
|||
GICState *s = ARM_GIC(dev);
|
||||
SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
|
||||
ARMGICClass *agc = ARM_GIC_GET_CLASS(s);
|
||||
Error *local_err = NULL;
|
||||
|
||||
agc->parent_realize(dev, errp);
|
||||
if (error_is_set(errp)) {
|
||||
agc->parent_realize(dev, &local_err);
|
||||
if (local_err) {
|
||||
error_propagate(errp, local_err);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -517,10 +517,12 @@ static void kvm_arm_gic_realize(DeviceState *dev, Error **errp)
|
|||
GICState *s = KVM_ARM_GIC(dev);
|
||||
SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
|
||||
KVMARMGICClass *kgc = KVM_ARM_GIC_GET_CLASS(s);
|
||||
Error *local_err = NULL;
|
||||
int ret;
|
||||
|
||||
kgc->parent_realize(dev, errp);
|
||||
if (error_is_set(errp)) {
|
||||
kgc->parent_realize(dev, &local_err);
|
||||
if (local_err) {
|
||||
error_propagate(errp, local_err);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -474,14 +474,16 @@ static void armv7m_nvic_realize(DeviceState *dev, Error **errp)
|
|||
{
|
||||
nvic_state *s = NVIC(dev);
|
||||
NVICClass *nc = NVIC_GET_CLASS(s);
|
||||
Error *local_err = NULL;
|
||||
|
||||
/* The NVIC always has only one CPU */
|
||||
s->gic.num_cpu = 1;
|
||||
/* Tell the common code we're an NVIC */
|
||||
s->gic.revision = 0xffffffff;
|
||||
s->num_irq = s->gic.num_irq;
|
||||
nc->parent_realize(dev, errp);
|
||||
if (error_is_set(errp)) {
|
||||
nc->parent_realize(dev, &local_err);
|
||||
if (local_err) {
|
||||
error_propagate(errp, local_err);
|
||||
return;
|
||||
}
|
||||
gic_init_irqs_and_distributor(&s->gic, s->num_irq);
|
||||
|
|
|
@ -412,7 +412,7 @@ static const MemoryRegionOps pic_elcr_ioport_ops = {
|
|||
},
|
||||
};
|
||||
|
||||
static void pic_realize(DeviceState *dev, Error **err)
|
||||
static void pic_realize(DeviceState *dev, Error **errp)
|
||||
{
|
||||
PICCommonState *s = PIC_COMMON(dev);
|
||||
PICClass *pc = PIC_GET_CLASS(dev);
|
||||
|
@ -425,7 +425,7 @@ static void pic_realize(DeviceState *dev, Error **err)
|
|||
qdev_init_gpio_out(dev, s->int_out, ARRAY_SIZE(s->int_out));
|
||||
qdev_init_gpio_in(dev, pic_set_irq, 8);
|
||||
|
||||
pc->parent_realize(dev, err);
|
||||
pc->parent_realize(dev, errp);
|
||||
}
|
||||
|
||||
void pic_info(Monitor *mon, const QDict *qdict)
|
||||
|
|
|
@ -108,15 +108,20 @@ void isa_register_portio_list(ISADevice *dev, uint16_t start,
|
|||
const MemoryRegionPortio *pio_start,
|
||||
void *opaque, const char *name)
|
||||
{
|
||||
PortioList *piolist = g_new(PortioList, 1);
|
||||
PortioList piolist;
|
||||
|
||||
/* START is how we should treat DEV, regardless of the actual
|
||||
contents of the portio array. This is how the old code
|
||||
actually handled e.g. the FDC device. */
|
||||
isa_init_ioport(dev, start);
|
||||
|
||||
portio_list_init(piolist, OBJECT(dev), pio_start, opaque, name);
|
||||
portio_list_add(piolist, isabus->address_space_io, start);
|
||||
/* FIXME: the device should store created PortioList in its state. Note
|
||||
that DEV can be NULL here and that single device can register several
|
||||
portio lists. Current implementation is leaking memory allocated
|
||||
in portio_list_init. The leak is not critical because it happens only
|
||||
at initialization time. */
|
||||
portio_list_init(&piolist, OBJECT(dev), pio_start, opaque, name);
|
||||
portio_list_add(&piolist, isabus->address_space_io, start);
|
||||
}
|
||||
|
||||
static void isa_device_init(Object *obj)
|
||||
|
|
|
@ -68,10 +68,12 @@ static void tmp105_set_temperature(Object *obj, Visitor *v, void *opaque,
|
|||
const char *name, Error **errp)
|
||||
{
|
||||
TMP105State *s = TMP105(obj);
|
||||
Error *local_err = NULL;
|
||||
int64_t temp;
|
||||
|
||||
visit_type_int(v, &temp, name, errp);
|
||||
if (error_is_set(errp)) {
|
||||
visit_type_int(v, &temp, name, &local_err);
|
||||
if (local_err) {
|
||||
error_propagate(errp, local_err);
|
||||
return;
|
||||
}
|
||||
if (temp >= 128000 || temp < -128000) {
|
||||
|
|
|
@ -945,24 +945,24 @@ static void xilinx_enet_realize(DeviceState *dev, Error **errp)
|
|||
XilinxAXIEnetStreamSlave *ds = XILINX_AXI_ENET_DATA_STREAM(&s->rx_data_dev);
|
||||
XilinxAXIEnetStreamSlave *cs = XILINX_AXI_ENET_CONTROL_STREAM(
|
||||
&s->rx_control_dev);
|
||||
Error *local_errp = NULL;
|
||||
Error *local_err = NULL;
|
||||
|
||||
object_property_add_link(OBJECT(ds), "enet", "xlnx.axi-ethernet",
|
||||
(Object **) &ds->enet,
|
||||
object_property_allow_set_link,
|
||||
OBJ_PROP_LINK_UNREF_ON_RELEASE,
|
||||
&local_errp);
|
||||
&local_err);
|
||||
object_property_add_link(OBJECT(cs), "enet", "xlnx.axi-ethernet",
|
||||
(Object **) &cs->enet,
|
||||
object_property_allow_set_link,
|
||||
OBJ_PROP_LINK_UNREF_ON_RELEASE,
|
||||
&local_errp);
|
||||
if (local_errp) {
|
||||
&local_err);
|
||||
if (local_err) {
|
||||
goto xilinx_enet_realize_fail;
|
||||
}
|
||||
object_property_set_link(OBJECT(ds), OBJECT(s), "enet", &local_errp);
|
||||
object_property_set_link(OBJECT(cs), OBJECT(s), "enet", &local_errp);
|
||||
if (local_errp) {
|
||||
object_property_set_link(OBJECT(ds), OBJECT(s), "enet", &local_err);
|
||||
object_property_set_link(OBJECT(cs), OBJECT(s), "enet", &local_err);
|
||||
if (local_err) {
|
||||
goto xilinx_enet_realize_fail;
|
||||
}
|
||||
|
||||
|
@ -981,7 +981,7 @@ static void xilinx_enet_realize(DeviceState *dev, Error **errp)
|
|||
|
||||
xilinx_enet_realize_fail:
|
||||
if (!*errp) {
|
||||
*errp = local_errp;
|
||||
*errp = local_err;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -361,6 +361,8 @@ static const MemoryRegionPortio prep_portio_list[] = {
|
|||
PORTIO_END_OF_LIST(),
|
||||
};
|
||||
|
||||
static PortioList prep_port_list;
|
||||
|
||||
/* PowerPC PREP hardware initialisation */
|
||||
static void ppc_prep_init(QEMUMachineInitArgs *args)
|
||||
{
|
||||
|
@ -375,7 +377,6 @@ static void ppc_prep_init(QEMUMachineInitArgs *args)
|
|||
CPUPPCState *env = NULL;
|
||||
nvram_t nvram;
|
||||
M48t59State *m48t59;
|
||||
PortioList *port_list = g_new(PortioList, 1);
|
||||
#if 0
|
||||
MemoryRegion *xcsr = g_new(MemoryRegion, 1);
|
||||
#endif
|
||||
|
@ -542,8 +543,8 @@ static void ppc_prep_init(QEMUMachineInitArgs *args)
|
|||
cpu = POWERPC_CPU(first_cpu);
|
||||
sysctrl->reset_irq = cpu->env.irq_inputs[PPC6xx_INPUT_HRESET];
|
||||
|
||||
portio_list_init(port_list, NULL, prep_portio_list, sysctrl, "prep");
|
||||
portio_list_add(port_list, isa_address_space_io(isa), 0x0);
|
||||
portio_list_init(&prep_port_list, NULL, prep_portio_list, sysctrl, "prep");
|
||||
portio_list_add(&prep_port_list, isa_address_space_io(isa), 0x0);
|
||||
|
||||
/* PowerPC control and status register group */
|
||||
#if 0
|
||||
|
|
|
@ -1419,19 +1419,6 @@ static int spapr_kvm_type(const char *vm_type)
|
|||
exit(1);
|
||||
}
|
||||
|
||||
static QEMUMachine spapr_machine = {
|
||||
.name = "pseries",
|
||||
.desc = "pSeries Logical Partition (PAPR compliant)",
|
||||
.is_default = 1,
|
||||
.init = ppc_spapr_init,
|
||||
.reset = ppc_spapr_reset,
|
||||
.block_default_type = IF_SCSI,
|
||||
.max_cpus = MAX_CPUS,
|
||||
.no_parallel = 1,
|
||||
.default_boot_order = NULL,
|
||||
.kvm_type = spapr_kvm_type,
|
||||
};
|
||||
|
||||
/*
|
||||
* Implementation of an interface to adjust firmware patch
|
||||
* for the bootindex property handling.
|
||||
|
@ -1494,7 +1481,17 @@ static void spapr_machine_class_init(ObjectClass *oc, void *data)
|
|||
MachineClass *mc = MACHINE_CLASS(oc);
|
||||
FWPathProviderClass *fwc = FW_PATH_PROVIDER_CLASS(oc);
|
||||
|
||||
mc->qemu_machine = data;
|
||||
mc->name = "pseries";
|
||||
mc->desc = "pSeries Logical Partition (PAPR compliant)";
|
||||
mc->is_default = 1;
|
||||
mc->init = ppc_spapr_init;
|
||||
mc->reset = ppc_spapr_reset;
|
||||
mc->block_default_type = IF_SCSI;
|
||||
mc->max_cpus = MAX_CPUS;
|
||||
mc->no_parallel = 1;
|
||||
mc->default_boot_order = NULL;
|
||||
mc->kvm_type = spapr_kvm_type;
|
||||
|
||||
fwc->get_dev_path = spapr_get_fw_dev_path;
|
||||
}
|
||||
|
||||
|
@ -1502,7 +1499,6 @@ static const TypeInfo spapr_machine_info = {
|
|||
.name = TYPE_SPAPR_MACHINE,
|
||||
.parent = TYPE_MACHINE,
|
||||
.class_init = spapr_machine_class_init,
|
||||
.class_data = &spapr_machine,
|
||||
.interfaces = (InterfaceInfo[]) {
|
||||
{ TYPE_FW_PATH_PROVIDER },
|
||||
{ }
|
||||
|
|
|
@ -322,7 +322,7 @@ static void pit_post_load(PITCommonState *s)
|
|||
}
|
||||
}
|
||||
|
||||
static void pit_realizefn(DeviceState *dev, Error **err)
|
||||
static void pit_realizefn(DeviceState *dev, Error **errp)
|
||||
{
|
||||
PITCommonState *pit = PIT_COMMON(dev);
|
||||
PITClass *pc = PIT_GET_CLASS(dev);
|
||||
|
@ -338,7 +338,7 @@ static void pit_realizefn(DeviceState *dev, Error **err)
|
|||
|
||||
qdev_init_gpio_in(dev, pit_irq_control, 1);
|
||||
|
||||
pc->parent_realize(dev, err);
|
||||
pc->parent_realize(dev, errp);
|
||||
}
|
||||
|
||||
static Property pit_properties[] = {
|
||||
|
|
|
@ -142,10 +142,12 @@ static void balloon_stats_set_poll_interval(Object *obj, struct Visitor *v,
|
|||
Error **errp)
|
||||
{
|
||||
VirtIOBalloon *s = opaque;
|
||||
Error *local_err = NULL;
|
||||
int64_t value;
|
||||
|
||||
visit_type_int(v, &value, name, errp);
|
||||
if (error_is_set(errp)) {
|
||||
visit_type_int(v, &value, name, &local_err);
|
||||
if (local_err) {
|
||||
error_propagate(errp, local_err);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -42,6 +42,8 @@ typedef struct IB700state {
|
|||
ISADevice parent_obj;
|
||||
|
||||
QEMUTimer *timer;
|
||||
|
||||
PortioList port_list;
|
||||
} IB700State;
|
||||
|
||||
/* This is the timer. We use a global here because the watchdog
|
||||
|
@ -106,14 +108,13 @@ static const MemoryRegionPortio wdt_portio_list[] = {
|
|||
static void wdt_ib700_realize(DeviceState *dev, Error **errp)
|
||||
{
|
||||
IB700State *s = IB700(dev);
|
||||
PortioList *port_list = g_new(PortioList, 1);
|
||||
|
||||
ib700_debug("watchdog init\n");
|
||||
|
||||
s->timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, ib700_timer_expired, s);
|
||||
|
||||
portio_list_init(port_list, OBJECT(s), wdt_portio_list, s, "ib700");
|
||||
portio_list_add(port_list, isa_address_space_io(&s->parent_obj), 0);
|
||||
portio_list_init(&s->port_list, OBJECT(s), wdt_portio_list, s, "ib700");
|
||||
portio_list_add(&s->port_list, isa_address_space_io(&s->parent_obj), 0);
|
||||
}
|
||||
|
||||
static void wdt_ib700_reset(DeviceState *dev)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue