From bba5ce5afe2516936aabc2747b7687451c5b0207 Mon Sep 17 00:00:00 2001 From: Michael Lotz Date: Thu, 16 Oct 2008 22:25:04 +0000 Subject: [PATCH] * Add a mapping of interrupt handler data and remove the panic on installing the interrupt handler. There can be more than one interrupt handler installed on the same interrupt number with different data, so we also need the data pointer when removing the handler (to remove the right one). But since ACPI doesn't supply it to us, we have to do the mapping ourselfs. Fixes #2848. * Renamed acpi_root to sACPIRoot. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@28200 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../kernel/bus_managers/acpi/oshaiku.c | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/src/add-ons/kernel/bus_managers/acpi/oshaiku.c b/src/add-ons/kernel/bus_managers/acpi/oshaiku.c index 305617a473..d1eafe5b72 100644 --- a/src/add-ons/kernel/bus_managers/acpi/oshaiku.c +++ b/src/add-ons/kernel/bus_managers/acpi/oshaiku.c @@ -147,7 +147,8 @@ ACPI_MODULE_NAME ("oshaiku") extern FILE * AcpiGbl_DebugFile; FILE * AcpiGbl_OutputFile; -static uint32 acpi_root = 0; +static uint32 sACPIRoot = 0; +static void *sInterruptHandlerData[32]; #define DEBUG_OSHAIKU 0 /* verbosity level 0 = off, 1 = normal, 2 = all */ @@ -232,13 +233,13 @@ AcpiOsGetRootPointer(void) ACPI_SIZE address; ACPI_STATUS status; DEBUG_FUNCTION(); - if (acpi_root == 0) { + if (sACPIRoot == 0) { status = AcpiFindRootPointer(&address); if (status == AE_OK) - acpi_root = address; + sACPIRoot = address; } - dprintf("AcpiOsGetRootPointer returning %p\n", (void *)acpi_root); - return acpi_root; + dprintf("AcpiOsGetRootPointer returning %p\n", (void *)sACPIRoot); + return sACPIRoot; #else return (AeLocalGetRootPointer()); #endif @@ -751,14 +752,9 @@ AcpiOsInstallInterruptHandler(UINT32 InterruptNumber, DEBUG_FUNCTION_F("vector: %lu; handler: %p; data: %p", (uint32)InterruptNumber, ServiceRoutine, Context); #ifdef _KERNEL_MODE - if (Context != NULL) { - // we don't get the context parameter when - panic("ACPI: cannot add interrupt handler with non-null context"); - return AE_ERROR; - } - /* It so happens that the Haiku and ACPI-CA interrupt handler routines return the same values with the same meanings */ + sInterruptHandlerData[InterruptNumber] = Context; return install_io_interrupt_handler(InterruptNumber, (interrupt_handler)ServiceRoutine, Context, 0) == B_OK ? AE_OK : AE_ERROR; @@ -788,7 +784,8 @@ AcpiOsRemoveInterruptHandler(UINT32 InterruptNumber, ServiceRoutine); #ifdef _KERNEL_MODE remove_io_interrupt_handler(InterruptNumber, - (interrupt_handler)ServiceRoutine, NULL); + (interrupt_handler)ServiceRoutine, + sInterruptHandlerData[InterruptNumber]); return AE_OK; #else return AE_ERROR;