hw/dma/i82374: Avoid double creation of the 82374 controller
QEMU fails when used with the following command line:
    ./ppc64-softmmu/qemu-system-ppc64 -S -machine 40p -device i82374
    qemu-system-ppc64: hw/isa/isa-bus.c:110: isa_bus_dma: Assertion `!bus->dma[0] && !bus->dma[1]' failed.
The 40p machine type already creates the device i82374. If specified in the
command line, it will try to create it again, hence generating the error. The
function isa_bus_dma() isn't supposed to be called twice for the same bus.
Check the bus doesn't already have a DMA controller registered before creating
the device.
Fixes: https://bugs.launchpad.net/qemu/+bug/1721224
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Message-Id: <20180326153441.32641-2-f4bug@amsat.org>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
			
			
This commit is contained in:
		
							parent
							
								
									29e560f00e
								
							
						
					
					
						commit
						4968a2c6ed
					
				| @ -23,6 +23,7 @@ | ||||
|  */ | ||||
| 
 | ||||
| #include "qemu/osdep.h" | ||||
| #include "qapi/error.h" | ||||
| #include "hw/isa/isa.h" | ||||
| #include "hw/dma/i8257.h" | ||||
| 
 | ||||
| @ -118,13 +119,19 @@ static const MemoryRegionPortio i82374_portio_list[] = { | ||||
| static void i82374_realize(DeviceState *dev, Error **errp) | ||||
| { | ||||
|     I82374State *s = I82374(dev); | ||||
|     ISABus *isa_bus = isa_bus_from_device(ISA_DEVICE(dev)); | ||||
| 
 | ||||
|     if (isa_get_dma(isa_bus, 0)) { | ||||
|         error_setg(errp, "DMA already initialized on ISA bus"); | ||||
|         return; | ||||
|     } | ||||
|     i8257_dma_init(isa_bus, true); | ||||
| 
 | ||||
|     portio_list_init(&s->port_list, OBJECT(s), i82374_portio_list, s, | ||||
|                      "i82374"); | ||||
|     portio_list_add(&s->port_list, isa_address_space_io(&s->parent_obj), | ||||
|                     s->iobase); | ||||
| 
 | ||||
|     i8257_dma_init(isa_bus_from_device(ISA_DEVICE(dev)), true); | ||||
|     memset(s->commands, 0, sizeof(s->commands)); | ||||
| } | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Philippe Mathieu-Daudé
						Philippe Mathieu-Daudé