mirror of https://github.com/xemu-project/xemu.git
hw/isa/ich9: Add comment on imperfect emulation of PIC vs. I/O APIC routing
As noted in the comment, the PCI INTx lines are supposed to be routed to *both* the PIC and the I/O APIC. It's just that we don't cope with the concept of an IRQ being asserted to two *different* pins on the two irqchips. So we have this hack of routing to I/O APIC only if the PIRQ routing to the PIC is disabled. Which seems to work well enough, even when I try hard to break it with kexec. But should be explicitly documented and understood. Signed-off-by: David Woodhouse <dwmw@amazon.co.uk> Message-Id: <112a09643b8191c4eae7d92fa247a861ab90a9ee.camel@infradead.org> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
3d123a8b41
commit
886e0a5f31
|
@ -304,6 +304,21 @@ static PCIINTxRoute ich9_route_intx_pin_to_irq(void *opaque, int pirq_pin)
|
|||
route.irq = -1;
|
||||
}
|
||||
} else {
|
||||
/*
|
||||
* Strictly speaking, this is wrong. The PIRQ should be routed
|
||||
* to *both* the I/O APIC and the PIC, on different pins. The
|
||||
* I/O APIC has a fixed mapping to IRQ16-23, while the PIC is
|
||||
* routed according to the PIRQx_ROUT configuration. But QEMU
|
||||
* doesn't (yet) cope with the concept of pin numbers differing
|
||||
* between PIC and I/O APIC, and neither does the in-kernel KVM
|
||||
* irqchip support. So we route to the I/O APIC *only* if the
|
||||
* routing to the PIC is disabled in the PIRQx_ROUT settings.
|
||||
*
|
||||
* This seems to work even if we boot a Linux guest with 'noapic'
|
||||
* to make it use the legacy PIC, and then kexec directly into a
|
||||
* new kernel which uses the I/O APIC. The new kernel explicitly
|
||||
* disables the PIRQ routing even though it doesn't need to care.
|
||||
*/
|
||||
route.irq = ich9_pirq_to_gsi(pirq_pin);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue