提交 d10e5432 编写于 作者: M Markus Armbruster

isa: Clean up error handling around isa_bus_new()

We can have at most one ISA bus.  If you try to create another one,
isa_bus_new() complains to stderr and returns null.

isa_bus_new() is called in two contexts, machine's init() and device's
realize() methods.  Since complaining to stderr is not proper in the
latter context, convert isa_bus_new() to Error.

Machine's init():

* mips_jazz_init(), called from the init() methods of machines
  "magnum" and "pica"

* mips_r4k_init(), the init() method of machine "mips"

* pc_init1() called from the init() methods of non-q35 PC machines

* typhoon_init(), called from clipper_init(), the init() method of
  machine "clipper"

These callers always create the first ISA bus, hence isa_bus_new()
can't fail.  Simply pass &error_abort.

Device's realize():

* i82378_realize(), of PCI device "i82378"

* ich9_lpc_realize(), of PCI device "ICH9-LPC"

* pci_ebus_realize(), of PCI device "ebus"

* piix3_realize(), of PCI device "pci-piix3", abstract parent of
  "PIIX3" and "PIIX3-xen"

* piix4_realize(), of PCI device "PIIX4"

* vt82c686b_realize(), of PCI device "VT82C686B"

Propagate the error.  Note that these devices are typically created
only by machine init() methods with qdev_init_nofail() or similar.  If
we screwed up and created an ISA bus before that call, we now give up
right away.  Before, we'd hobble on, and typically die in
isa_bus_irqs().  Similar if someone finds a way to hot-plug one of
these critters.

Cc: Richard Henderson <rth@twiddle.net>
Cc: "Michael S. Tsirkin" <mst@redhat.com>
Cc: "Hervé Poussineau" <hpoussin@reactos.org>
Cc: Aurelien Jarno <aurelien@aurel32.net>
Cc: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Signed-off-by: NMarkus Armbruster <armbru@pond.sub.org>
Reviewed-by: NMarcel Apfelbaum <marcel@redhat.com>
Reviewed-by: NHervé Poussineau <hpoussin@reactos.org>
Reviewed-by: NMichael S. Tsirkin <mst@redhat.com>
Message-Id: <1450370121-5768-11-git-send-email-armbru@redhat.com>
上级 3a80cead
...@@ -920,7 +920,8 @@ PCIBus *typhoon_init(ram_addr_t ram_size, ISABus **isa_bus, ...@@ -920,7 +920,8 @@ PCIBus *typhoon_init(ram_addr_t ram_size, ISABus **isa_bus,
{ {
qemu_irq *isa_irqs; qemu_irq *isa_irqs;
*isa_bus = isa_bus_new(NULL, get_system_memory(), &s->pchip.reg_io); *isa_bus = isa_bus_new(NULL, get_system_memory(), &s->pchip.reg_io,
&error_abort);
isa_irqs = i8259_init(*isa_bus, isa_irqs = i8259_init(*isa_bus,
qemu_allocate_irq(typhoon_set_isa_irq, s, 0)); qemu_allocate_irq(typhoon_set_isa_irq, s, 0));
isa_bus_irqs(*isa_bus, isa_irqs); isa_bus_irqs(*isa_bus, isa_irqs);
......
...@@ -189,7 +189,8 @@ static void pc_init1(MachineState *machine, ...@@ -189,7 +189,8 @@ static void pc_init1(MachineState *machine,
} else { } else {
pci_bus = NULL; pci_bus = NULL;
i440fx_state = NULL; i440fx_state = NULL;
isa_bus = isa_bus_new(NULL, get_system_memory(), system_io); isa_bus = isa_bus_new(NULL, get_system_memory(), system_io,
&error_abort);
no_hpet = 1; no_hpet = 1;
} }
isa_bus_irqs(isa_bus, gsi); isa_bus_irqs(isa_bus, gsi);
......
...@@ -75,7 +75,10 @@ static void i82378_realize(PCIDevice *pci, Error **errp) ...@@ -75,7 +75,10 @@ static void i82378_realize(PCIDevice *pci, Error **errp)
pci_config_set_interrupt_pin(pci_conf, 1); /* interrupt pin 0 */ pci_config_set_interrupt_pin(pci_conf, 1); /* interrupt pin 0 */
isabus = isa_bus_new(dev, get_system_memory(), isabus = isa_bus_new(dev, get_system_memory(),
pci_address_space_io(pci)); pci_address_space_io(pci), errp);
if (!isabus) {
return;
}
/* This device has: /* This device has:
2 82C59 (irq) 2 82C59 (irq)
......
...@@ -44,10 +44,10 @@ static const TypeInfo isa_bus_info = { ...@@ -44,10 +44,10 @@ static const TypeInfo isa_bus_info = {
}; };
ISABus *isa_bus_new(DeviceState *dev, MemoryRegion* address_space, ISABus *isa_bus_new(DeviceState *dev, MemoryRegion* address_space,
MemoryRegion *address_space_io) MemoryRegion *address_space_io, Error **errp)
{ {
if (isabus) { if (isabus) {
fprintf(stderr, "Can't create a second ISA bus\n"); error_setg(errp, "Can't create a second ISA bus");
return NULL; return NULL;
} }
if (!dev) { if (!dev) {
......
...@@ -607,7 +607,11 @@ static void ich9_lpc_realize(PCIDevice *d, Error **errp) ...@@ -607,7 +607,11 @@ static void ich9_lpc_realize(PCIDevice *d, Error **errp)
ICH9LPCState *lpc = ICH9_LPC_DEVICE(d); ICH9LPCState *lpc = ICH9_LPC_DEVICE(d);
ISABus *isa_bus; ISABus *isa_bus;
isa_bus = isa_bus_new(DEVICE(d), get_system_memory(), get_system_io()); isa_bus = isa_bus_new(DEVICE(d), get_system_memory(), get_system_io(),
errp);
if (!isa_bus) {
return;
}
pci_set_long(d->wmask + ICH9_LPC_PMBASE, pci_set_long(d->wmask + ICH9_LPC_PMBASE,
ICH9_LPC_PMBASE_BASE_ADDRESS_MASK); ICH9_LPC_PMBASE_BASE_ADDRESS_MASK);
......
...@@ -90,8 +90,10 @@ static void piix4_realize(PCIDevice *dev, Error **errp) ...@@ -90,8 +90,10 @@ static void piix4_realize(PCIDevice *dev, Error **errp)
{ {
PIIX4State *d = PIIX4_PCI_DEVICE(dev); PIIX4State *d = PIIX4_PCI_DEVICE(dev);
isa_bus_new(DEVICE(d), pci_address_space(dev), if (!isa_bus_new(DEVICE(d), pci_address_space(dev),
pci_address_space_io(dev)); pci_address_space_io(dev), errp)) {
return;
}
piix4_dev = &d->dev; piix4_dev = &d->dev;
qemu_register_reset(piix4_reset, d); qemu_register_reset(piix4_reset, d);
} }
......
...@@ -440,7 +440,10 @@ static void vt82c686b_realize(PCIDevice *d, Error **errp) ...@@ -440,7 +440,10 @@ static void vt82c686b_realize(PCIDevice *d, Error **errp)
int i; int i;
isa_bus = isa_bus_new(DEVICE(d), get_system_memory(), isa_bus = isa_bus_new(DEVICE(d), get_system_memory(),
pci_address_space_io(d)); pci_address_space_io(d), errp);
if (!isa_bus) {
return;
}
pci_conf = d->config; pci_conf = d->config;
pci_config_set_prog_interface(pci_conf, 0x0); pci_config_set_prog_interface(pci_conf, 0x0);
......
...@@ -219,7 +219,7 @@ static void mips_jazz_init(MachineState *machine, ...@@ -219,7 +219,7 @@ static void mips_jazz_init(MachineState *machine,
memory_region_init(isa_mem, NULL, "isa-mem", 0x01000000); memory_region_init(isa_mem, NULL, "isa-mem", 0x01000000);
memory_region_add_subregion(address_space, 0x90000000, isa_io); memory_region_add_subregion(address_space, 0x90000000, isa_io);
memory_region_add_subregion(address_space, 0x91000000, isa_mem); memory_region_add_subregion(address_space, 0x91000000, isa_mem);
isa_bus = isa_bus_new(NULL, isa_mem, isa_io); isa_bus = isa_bus_new(NULL, isa_mem, isa_io, &error_abort);
/* ISA devices */ /* ISA devices */
i8259 = i8259_init(isa_bus, env->irq[4]); i8259 = i8259_init(isa_bus, env->irq[4]);
......
...@@ -272,7 +272,7 @@ void mips_r4k_init(MachineState *machine) ...@@ -272,7 +272,7 @@ void mips_r4k_init(MachineState *machine)
memory_region_init(isa_mem, NULL, "isa-mem", 0x01000000); memory_region_init(isa_mem, NULL, "isa-mem", 0x01000000);
memory_region_add_subregion(get_system_memory(), 0x14000000, isa_io); memory_region_add_subregion(get_system_memory(), 0x14000000, isa_io);
memory_region_add_subregion(get_system_memory(), 0x10000000, isa_mem); memory_region_add_subregion(get_system_memory(), 0x10000000, isa_mem);
isa_bus = isa_bus_new(NULL, isa_mem, get_system_io()); isa_bus = isa_bus_new(NULL, isa_mem, get_system_io(), &error_abort);
/* The PIC is attached to the MIPS CPU INT0 pin */ /* The PIC is attached to the MIPS CPU INT0 pin */
i8259 = i8259_init(isa_bus, env->irq[2]); i8259 = i8259_init(isa_bus, env->irq[2]);
......
...@@ -651,8 +651,10 @@ static void piix3_realize(PCIDevice *dev, Error **errp) ...@@ -651,8 +651,10 @@ static void piix3_realize(PCIDevice *dev, Error **errp)
{ {
PIIX3State *d = PIIX3_PCI_DEVICE(dev); PIIX3State *d = PIIX3_PCI_DEVICE(dev);
isa_bus_new(DEVICE(d), get_system_memory(), if (!isa_bus_new(DEVICE(d), get_system_memory(),
pci_address_space_io(dev)); pci_address_space_io(dev), errp)) {
return;
}
memory_region_init_io(&d->rcr_mem, OBJECT(dev), &rcr_ops, d, memory_region_init_io(&d->rcr_mem, OBJECT(dev), &rcr_ops, d,
"piix3-reset-control", 1); "piix3-reset-control", 1);
......
...@@ -604,8 +604,10 @@ static void pci_ebus_realize(PCIDevice *pci_dev, Error **errp) ...@@ -604,8 +604,10 @@ static void pci_ebus_realize(PCIDevice *pci_dev, Error **errp)
{ {
EbusState *s = DO_UPCAST(EbusState, pci_dev, pci_dev); EbusState *s = DO_UPCAST(EbusState, pci_dev, pci_dev);
isa_bus_new(DEVICE(pci_dev), get_system_memory(), if (!isa_bus_new(DEVICE(pci_dev), get_system_memory(),
pci_address_space_io(pci_dev)); pci_address_space_io(pci_dev), errp)) {
return;
}
pci_dev->config[0x04] = 0x06; // command = bus master, pci mem pci_dev->config[0x04] = 0x06; // command = bus master, pci mem
pci_dev->config[0x05] = 0x00; pci_dev->config[0x05] = 0x00;
......
...@@ -59,7 +59,7 @@ struct ISADevice { ...@@ -59,7 +59,7 @@ struct ISADevice {
}; };
ISABus *isa_bus_new(DeviceState *dev, MemoryRegion *address_space, ISABus *isa_bus_new(DeviceState *dev, MemoryRegion *address_space,
MemoryRegion *address_space_io); MemoryRegion *address_space_io, Error **errp);
void isa_bus_irqs(ISABus *bus, qemu_irq *irqs); void isa_bus_irqs(ISABus *bus, qemu_irq *irqs);
qemu_irq isa_get_irq(ISADevice *dev, int isairq); qemu_irq isa_get_irq(ISADevice *dev, int isairq);
void isa_init_irq(ISADevice *dev, qemu_irq *p, int isairq); void isa_init_irq(ISADevice *dev, qemu_irq *p, int isairq);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册