qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] Re: [PATCH] Fix timer interrupt routing for non-ACPI guest


From: Sebastian Herbszt
Subject: [Qemu-devel] Re: [PATCH] Fix timer interrupt routing for non-ACPI guest
Date: Mon, 13 Apr 2009 17:49:28 +0200

Ed Swierk wrote:
The interrupt routing table in the MPTABLE needs to route the timer
interrupt (IRQ 0) to IOAPIC pin 2.

Do you refer here to "5.3 Assigning of I/O Interrupts to the APIC I/O Unit"
from MultiProcessor Specification 1.4 or some other documentation?

I confess I haven't checked actual documentation; instead I've
referred to code from Coreboot that seems to work. For example the
bus_isa interrupts at
http://tracker.coreboot.org/trac/coreboot/browser/trunk/coreboot-v2/src/mainboard/msi/ms9185/mptable.c
.

Looks like this sets:

ExtINT IRQ0 -> 0:0
INT IRQ1 -> 0:1
INT IRQ0 -> 0:2
INT IRQ3 -> 0:3

This seems to also be what VMware provides:

Int: type 3, pol 1, trig 1, bus 02, IRQ 00, APIC ID 1, APIC INT 00
Int: type 0, pol 1, trig 1, bus 02, IRQ 01, APIC ID 1, APIC INT 01
Int: type 0, pol 1, trig 1, bus 02, IRQ 00, APIC ID 1, APIC INT 02
Int: type 0, pol 1, trig 1, bus 02, IRQ 03, APIC ID 1, APIC INT 03
..TIMER: vector=0x31 apic1=0 pin1=2 apic2=0 pin2=0

..TIMER: vector=0x31 apic1=0 pin1=2 apic2=-1 pin2=-1

IRQ0 -> 0:2
IRQ1 -> 0:1
IRQ3 -> 0:3

I suspect the latter is correct but I don't know that it really makes
a difference, at least to Linux.

We can achieve this

Int: type 3, pol 0, trig 0, bus 00, IRQ 00, APIC ID 1, APIC INT 00
Int: type 0, pol 0, trig 0, bus 00, IRQ 00, APIC ID 1, APIC INT 02
Int: type 0, pol 0, trig 0, bus 00, IRQ 01, APIC ID 1, APIC INT 01
Int: type 0, pol 0, trig 0, bus 00, IRQ 03, APIC ID 1, APIC INT 03
..TIMER: vector=0x31 apic1=0 pin1=2 apic2=0 pin2=0

with the following patch.

- Sebastian

Index: bochs-cvs/bios/rombios32.c
===================================================================
--- bochs-cvs.orig/bios/rombios32.c
+++ bochs-cvs/bios/rombios32.c
@@ -1142,16 +1142,27 @@ static void mptable_init(void)
    putb(&q, 1); /* enable */
    putle32(&q, 0xfec00000); /* I/O APIC addr */

+    putb(&q, 3); /* entry type = I/O interrupt */
+    putb(&q, 3); /* interrupt type = ExtINT */
+    putb(&q, 0); /* flags: po=0, el=0 */
+    putb(&q, 0);
+    putb(&q, 0); /* source bus ID = ISA */
+    putb(&q, 0); /* source bus IRQ */
+    putb(&q, ioapic_id); /* dest I/O APIC ID */
+    putb(&q, 0); /* dest I/O APIC interrupt in */
+
    /* irqs */
    for(i = 0; i < 16; i++) {
+        if (i == 2)
+            continue;
        putb(&q, 3); /* entry type = I/O interrupt */
        putb(&q, 0); /* interrupt type = vectored interrupt */
        putb(&q, 0); /* flags: po=0, el=0 */
        putb(&q, 0);
        putb(&q, 0); /* source bus ID = ISA */
-        putb(&q, (i == 2) ? 0 : i); /* source bus IRQ */
+        putb(&q, i); /* source bus IRQ */
        putb(&q, ioapic_id); /* dest I/O APIC ID */
-        putb(&q, i); /* dest I/O APIC interrupt in */
+        putb(&q, (i == 0) ? 2 : i); /* dest I/O APIC interrupt in */
    }
    /* patch length */
    len = q - mp_config_table;





reply via email to

[Prev in Thread] Current Thread [Next in Thread]