blob: 1d3a2b5b2130912478c4a8fbc1fa54ddaf87ed68 [file] [log] [blame]
Brad Bishop19323692019-04-05 15:28:33 -04001From 4829da131996548dc86775b8b97a29c436f3d130 Mon Sep 17 00:00:00 2001
Brad Bishopd7bf8c12018-02-25 22:55:05 -05002From: Mark Asselstine <mark.asselstine@windriver.com>
3Date: Tue, 26 Feb 2013 11:43:28 -0500
Brad Bishopd5ae7d92018-06-14 09:52:03 -07004Subject: [PATCH] apic: fixup fallthrough to PIC
Brad Bishopd7bf8c12018-02-25 22:55:05 -05005
6Commit 0e21e12bb311c4c1095d0269dc2ef81196ccb60a [Don't route PIC
7interrupts through the local APIC if the local APIC config says so.]
8missed a check to ensure the local APIC is enabled. Since if the local
9APIC is disabled it doesn't matter what the local APIC config says.
10
11If this check isn't done and the guest has disabled the local APIC the
12guest will receive a general protection fault, similar to what is seen
13here:
14
15https://lists.gnu.org/archive/html/qemu-devel/2012-12/msg02304.html
16
17The GPF is caused by an attempt to service interrupt 0xffffffff. This
18comes about since cpu_get_pic_interrupt() calls apic_accept_pic_intr()
19(with the local APIC disabled apic_get_interrupt() returns -1).
20apic_accept_pic_intr() returns 0 and thus the interrupt number which
21is returned from cpu_get_pic_interrupt(), and which is attempted to be
22serviced, is -1.
23
24Signed-off-by: Mark Asselstine <mark.asselstine@windriver.com>
25Upstream-Status: Submitted [https://lists.gnu.org/archive/html/qemu-devel/2013-04/msg00878.html]
26Signed-off-by: He Zhe <zhe.he@windriver.com>
Brad Bishop19323692019-04-05 15:28:33 -040027
Brad Bishopd7bf8c12018-02-25 22:55:05 -050028---
29 hw/intc/apic.c | 2 +-
30 1 file changed, 1 insertion(+), 1 deletion(-)
31
Brad Bishopd5ae7d92018-06-14 09:52:03 -070032diff --git a/hw/intc/apic.c b/hw/intc/apic.c
Brad Bishop19323692019-04-05 15:28:33 -040033index 97ffdd82..ef23430e 100644
Brad Bishopd5ae7d92018-06-14 09:52:03 -070034--- a/hw/intc/apic.c
35+++ b/hw/intc/apic.c
Brad Bishop1a4b7ee2018-12-16 17:11:34 -080036@@ -603,7 +603,7 @@ int apic_accept_pic_intr(DeviceState *dev)
Brad Bishop316dfdd2018-06-25 12:45:53 -040037 APICCommonState *s = APIC(dev);
Brad Bishopd7bf8c12018-02-25 22:55:05 -050038 uint32_t lvt0;
39
40- if (!s)
41+ if (!s || !(s->spurious_vec & APIC_SV_ENABLE))
42 return -1;
43
44 lvt0 = s->lvt[APIC_LVT_LINT0];