qemu/hw/isa
Philippe Mathieu-Daudé d1396cc749 Revert "hw/isa/i82378: Remove intermediate IRQ forwarder"
To be 'usable', QDev objects (which are QOM objects) must be
1/ initialized (at this point their properties can be modified), then
2/ realized (properties are consumed).
Some devices (objects) might depend on other devices. When creating
the 'QOM composition tree', parent objects can't be 'realized' until
all their children are. We might also have circular dependencies.
A common circular dependency occurs with IRQs. Device (A) has an
output IRQ wired to device (B), and device (B) has one to device (A).
When (A) is realized and connects its IRQ to an unrealized (B), the
IRQ handler on (B) is not yet created. QEMU pass IRQ between objects
as pointer. When (A) poll (B)'s IRQ, it is NULL. Later (B) is realized
and its IRQ pointers are populated, but (A) keeps a reference to a
NULL pointer.
A common pattern to bypass this circular limitation is to use 'proxy'
objects. Proxy (P) is created (and realized) before (A) and (B). Then
(A) and (B) can be created in different order, it doesn't matter: (P)
pointers are already populated.

Commit cef2e7148e ("hw/isa/i82378: Remove intermediate IRQ forwarder")
neglected the QOM/QDev circular dependency issue, and removed the
'proxy' between the southbridge, its PCI functions and the interrupt
controller, resulting in PCI functions wiring output IRQs to
'NULL', leading to guest failures (IRQ never delivered) [1] [2].

Since we are entering feature freeze, it is safer to revert the
offending patch until we figure a way to strengthen our APIs.

[1] https://lore.kernel.org/qemu-devel/928a8552-ab62-9e6c-a492-d6453e338b9d@redhat.com/
[2] https://lore.kernel.org/qemu-devel/cover.1677628524.git.balaton@eik.bme.hu/

This reverts commit cef2e7148e.

Reported-by: Thomas Huth <thuth@redhat.com>
Inspired-by: Bernhard Beschow <shentey@gmail.com>
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
2023-03-08 00:37:48 +01:00
..
apm.c nomaintainer: Fix Lesser GPL version number 2020-11-15 17:04:40 +01:00
i82378.c Revert "hw/isa/i82378: Remove intermediate IRQ forwarder" 2023-03-08 00:37:48 +01:00
isa-bus.c hw/isa: Factor isa_bus_get_irq() out of isa_get_irq() 2023-02-27 22:29:02 +01:00
isa-superio.c Do not include sysemu/sysemu.h if it's not really necessary 2021-05-02 17:24:50 +02:00
Kconfig hw/isa/Kconfig: Add missing dependency to VT82C686 2023-01-08 01:54:21 -05:00
lpc_ich9.c hw/isa: Rename isa_bus_irqs() -> isa_bus_register_input_irqs() 2023-02-27 22:29:02 +01:00
meson.build meson: convert hw/isa 2020-08-21 06:30:29 -04:00
pc87312.c pc87312: Rename TYPE_PC87312_SUPERIO to TYPE_PC87312 2020-09-09 13:20:22 -04:00
piix3.c hw/isa/isa-bus: Turn isa_build_aml() into qbus_build_aml() 2023-01-27 11:47:02 -05:00
piix4.c hw/rtc/mc146818rtc: Rename RTCState -> MC146818RtcState 2023-02-27 22:29:02 +01:00
smc37c669-superio.c hw/isa/superio: Correct the license text 2020-04-01 19:00:16 +02:00
trace-events hw/isa: add trace events for ICH9 LPC chip config access 2022-12-21 06:35:28 -05:00
trace.h trace: switch position of headers to what Meson requires 2020-08-21 06:18:24 -04:00
vt82c686.c hw/rtc/mc146818rtc: Rename RTCState -> MC146818RtcState 2023-02-27 22:29:02 +01:00