From a59a98d100123030a4145e7efe3b8a001920a9f1 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(-)
|
|
Index: qemu-6.0.0/hw/intc/apic.c
|
===================================================================
|
--- qemu-6.0.0.orig/hw/intc/apic.c
|
+++ qemu-6.0.0/hw/intc/apic.c
|
@@ -606,7 +606,7 @@ int apic_accept_pic_intr(DeviceState *de
|
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];
|