1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- From dc2a8ccd440ee3741b61606eafed3f7e092f4312 Mon Sep 17 00:00:00 2001
- From: Mark Asselstine <mark.asselstine@windriver.com>
- Date: Tue, 26 Feb 2013 11:43:28 -0500
- Subject: [PATCH 03/12] apic: fixup fallthrough to PIC
- Commit 0e21e12bb311c4c1095d0269dc2ef81196ccb60a [Don't route PIC
- interrupts through the local APIC if the local APIC config says so.]
- missed a check to ensure the local APIC is enabled. Since if the local
- APIC is disabled it doesn't matter what the local APIC config says.
- If this check isn't done and the guest has disabled the local APIC the
- guest will receive a general protection fault, similar to what is seen
- here:
- https://lists.gnu.org/archive/html/qemu-devel/2012-12/msg02304.html
- The GPF is caused by an attempt to service interrupt 0xffffffff. This
- comes about since cpu_get_pic_interrupt() calls apic_accept_pic_intr()
- (with the local APIC disabled apic_get_interrupt() returns -1).
- apic_accept_pic_intr() returns 0 and thus the interrupt number which
- is returned from cpu_get_pic_interrupt(), and which is attempted to be
- serviced, is -1.
- Signed-off-by: Mark Asselstine <mark.asselstine@windriver.com>
- Upstream-Status: Submitted [https://lists.gnu.org/archive/html/qemu-devel/2013-04/msg00878.html]
- Signed-off-by: He Zhe <zhe.he@windriver.com>
- ---
- hw/intc/apic.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
- diff --git a/hw/intc/apic.c b/hw/intc/apic.c
- index 3df11c34d..9506c88ce 100644
- --- a/hw/intc/apic.c
- +++ b/hw/intc/apic.c
- @@ -605,7 +605,7 @@ int apic_accept_pic_intr(DeviceState *dev)
- APICCommonState *s = APIC(dev);
- uint32_t lvt0;
-
- - if (!s)
- + if (!s || !(s->spurious_vec & APIC_SV_ENABLE))
- return -1;
-
- lvt0 = s->lvt[APIC_LVT_LINT0];
- --
- 2.30.2
|