| From 5046c21efdbc7413cddd5c5dbd9e1d53258d3e8c 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] 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 6fda52b86c..cd7291962d 100644 |
| --- a/hw/intc/apic.c |
| +++ b/hw/intc/apic.c |
| @@ -603,7 +603,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]; |