* [Qemu-devel] [5041] De-assert PIC IRQs properly at APIC level
@ 2008-08-21 3:14 Aurelien Jarno
0 siblings, 0 replies; only message in thread
From: Aurelien Jarno @ 2008-08-21 3:14 UTC (permalink / raw)
To: qemu-devel
Revision: 5041
http://svn.sv.gnu.org/viewvc/?view=rev&root=qemu&revision=5041
Author: aurel32
Date: 2008-08-21 03:14:52 +0000 (Thu, 21 Aug 2008)
Log Message:
-----------
De-assert PIC IRQs properly at APIC level
[ Taking latest isapc changes into account. ]
Ensure that PIC-delivered IRQs are properly de-asserted in case the APIC
is in EXTINT or FIXED mode (with level-triggering selected) on LINT0.
Fixes EFI-BIOS boot issues.
This patch also cleans up a bit the interface between PIC and APIC,
making apic_local_deliver private again.
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
Modified Paths:
--------------
trunk/hw/apic.c
trunk/hw/pc.c
trunk/hw/pc.h
Modified: trunk/hw/apic.c
===================================================================
--- trunk/hw/apic.c 2008-08-21 03:14:41 UTC (rev 5040)
+++ trunk/hw/apic.c 2008-08-21 03:14:52 UTC (rev 5041)
@@ -166,7 +166,7 @@
tab[i] &= ~mask;
}
-void apic_local_deliver(CPUState *env, int vector)
+static void apic_local_deliver(CPUState *env, int vector)
{
APICState *s = env->apic_state;
uint32_t lvt = s->lvt[vector];
@@ -197,6 +197,27 @@
}
}
+void apic_deliver_pic_intr(CPUState *env, int level)
+{
+ if (level)
+ apic_local_deliver(env, APIC_LVT_LINT0);
+ else {
+ APICState *s = env->apic_state;
+ uint32_t lvt = s->lvt[APIC_LVT_LINT0];
+
+ switch ((lvt >> 8) & 7) {
+ case APIC_DM_FIXED:
+ if (!(lvt & APIC_LVT_LEVEL_TRIGGER))
+ break;
+ reset_bit(s->irr, lvt & 0xff);
+ /* fall through */
+ case APIC_DM_EXTINT:
+ cpu_reset_interrupt(env, CPU_INTERRUPT_HARD);
+ break;
+ }
+ }
+}
+
#define foreach_apic(apic, deliver_bitmask, code) \
{\
int __i, __j, __mask;\
Modified: trunk/hw/pc.c
===================================================================
--- trunk/hw/pc.c 2008-08-21 03:14:41 UTC (rev 5040)
+++ trunk/hw/pc.c 2008-08-21 03:14:52 UTC (rev 5041)
@@ -119,11 +119,9 @@
CPUState *env = first_cpu;
if (env->apic_state) {
- if (!level)
- return;
while (env) {
if (apic_accept_pic_intr(env))
- apic_local_deliver(env, APIC_LINT0);
+ apic_deliver_pic_intr(env, level);
env = env->next_cpu;
}
} else {
Modified: trunk/hw/pc.h
===================================================================
--- trunk/hw/pc.h 2008-08-21 03:14:41 UTC (rev 5040)
+++ trunk/hw/pc.h 2008-08-21 03:14:52 UTC (rev 5041)
@@ -40,11 +40,9 @@
/* APIC */
typedef struct IOAPICState IOAPICState;
-#define APIC_LINT0 3
-
int apic_init(CPUState *env);
int apic_accept_pic_intr(CPUState *env);
-void apic_local_deliver(CPUState *env, int vector);
+void apic_deliver_pic_intr(CPUState *env, int level);
int apic_get_interrupt(CPUState *env);
IOAPICState *ioapic_init(void);
void ioapic_set_irq(void *opaque, int vector, int level);
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2008-08-21 3:14 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-08-21 3:14 [Qemu-devel] [5041] De-assert PIC IRQs properly at APIC level Aurelien Jarno
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.