qemu-devel
[Top][All Lists]
Advanced

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

[Qemu-devel] [PATCH 6/6] add interrupt override entries for IRQs 5, 9, 1


From: Gerd Hoffmann
Subject: [Qemu-devel] [PATCH 6/6] add interrupt override entries for IRQs 5, 9, 10, 11 to the MADT
Date: Fri, 14 Aug 2009 14:21:58 +0200

so the OS knows that they're active high, level triggered. This allows
for proper ACPI event reporting such as the (emulated) power button and
should also fix the ACPI timer.

by Avi Kivity, adapted for upstream qemu by Gerd Hoffmann

Signed-off-by: Gerd Hoffmann <address@hidden>
---
 rombios32.c |   20 +++++++++++++++++++-
 1 files changed, 19 insertions(+), 1 deletions(-)

diff --git a/rombios32.c b/rombios32.c
index ece0865..624f39f 100644
--- a/rombios32.c
+++ b/rombios32.c
@@ -57,6 +57,9 @@ typedef unsigned long long uint64_t;
 #define APIC_ID      0x020
 #define APIC_LVT3    0x370
 
+/* IRQs 5,9,10,11 */
+#define PCI_ISA_IRQ_MASK    0x0e20U
+
 #define APIC_ENABLED 0x0100
 
 #define AP_BOOT_ADDR 0x9f000
@@ -1730,7 +1733,7 @@ void acpi_bios_init(void)
     madt_size = sizeof(*madt) +
         sizeof(struct madt_processor_apic) * max_cpus +
 #ifdef BX_QEMU
-        sizeof(struct madt_io_apic) + sizeof(struct madt_int_override);
+        sizeof(struct madt_io_apic) + sizeof(struct madt_int_override) * 5;
 #else
         sizeof(struct madt_io_apic);
 #endif
@@ -1828,6 +1831,21 @@ void acpi_bios_init(void)
         int_override->source = cpu_to_le32(0);
         int_override->gsi = cpu_to_le32(2);
         int_override->flags = cpu_to_le32(0);
+        int_override++;
+
+        for ( i = 0; i < 16; i++ ) {
+            if (!(PCI_ISA_IRQ_MASK & (1U << i))) {
+                /* No need for a INT source override structure. */
+                continue;
+            }
+            memset(int_override, 0, sizeof(*int_override));
+            int_override->type   = APIC_XRUPT_OVERRIDE;
+            int_override->length = sizeof(*int_override);
+            int_override->source = i;
+            int_override->gsi    = i;
+            int_override->flags  = 0xd; /* active high, level triggered */
+            int_override++;
+        }
 #endif
 
         acpi_build_table_header((struct acpi_table_header *)madt,
-- 
1.6.2.5





reply via email to

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