Fixed a crashing bug in GPE interrupt handlers, and cleaned up the error reporting code.

git-svn-id: file:///srv/svn/repos/haiku/trunk/current@11463 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Nathan Whitehorn
2005-02-23 20:38:24 +00:00
parent 91fbc56d75
commit 20a7c7863d
+36 -20
View File
@@ -422,13 +422,9 @@ AcpiOsVprintf (
} }
#else #else
char acpi_err_string[512]; //char acpi_err_string[512];
int debug_fd = open("/boot/acpi_log",O_WRONLY | O_APPEND | O_CREAT); //vsprintf(acpi_err_string, Fmt, Args);
vsprintf(acpi_err_string, Fmt, Args); //dprintf("ACPI: %s\n",acpi_err_string);
write(debug_fd,acpi_err_string,strlen(acpi_err_string));
write(debug_fd,"\n",1);
close(debug_fd);
//kernel_debugger(acpi_err_string);
#endif #endif
return; return;
@@ -452,10 +448,11 @@ UINT32
AcpiOsGetLine ( AcpiOsGetLine (
char *Buffer) char *Buffer)
{ {
UINT8 Temp;
UINT32 i = 0; UINT32 i = 0;
#ifndef _KERNEL_MODE #ifndef _KERNEL_MODE
UINT8 Temp;
for (i = 0; ; i++) for (i = 0; ; i++)
{ {
scanf ("%1c", &Temp); scanf ("%1c", &Temp);
@@ -502,13 +499,14 @@ AcpiOsMapMemory (
#ifdef _KERNEL_MODE #ifdef _KERNEL_MODE
int page_offset = ACPI_TO_INTEGER(where) % B_PAGE_SIZE; int page_offset = ACPI_TO_INTEGER(where) % B_PAGE_SIZE;
void *map_base = ACPI_PTR_ADD(void,where,0 - page_offset); void *map_base = ACPI_PTR_ADD(void,where,0L - page_offset);
area_id area; area_id area;
area = map_physical_memory("acpi_physical_mem_area", map_base, ROUNDUP(length + page_offset,B_PAGE_SIZE),B_ANY_KERNEL_BLOCK_ADDRESS,0,there); area = map_physical_memory("acpi_physical_mem_area", map_base, ROUNDUP(length + page_offset,B_PAGE_SIZE),B_ANY_KERNEL_BLOCK_ADDRESS,0,there);
*there += page_offset; *there += page_offset;
#endif
#endif
return (area > 0 ? AE_OK : AE_BAD_ADDRESS); return (area > 0 ? AE_OK : AE_BAD_ADDRESS);
} }
@@ -691,14 +689,15 @@ AcpiOsCreateLock (
ACPI_HANDLE *OutHandle) ACPI_HANDLE *OutHandle)
{ {
return (AcpiOsCreateSemaphore (1, 1, OutHandle)); *OutHandle = (ACPI_HANDLE)memalign(sizeof(spinlock),sizeof(spinlock));
return AE_OK;
} }
void void
AcpiOsDeleteLock ( AcpiOsDeleteLock (
ACPI_HANDLE Handle) ACPI_HANDLE Handle)
{ {
AcpiOsDeleteSemaphore (Handle); free(Handle);
} }
@@ -707,7 +706,15 @@ AcpiOsAcquireLock (
ACPI_HANDLE Handle, ACPI_HANDLE Handle,
UINT32 Flags) UINT32 Flags)
{ {
AcpiOsWaitSemaphore (Handle, 1, 0xFFFF); cpu_status cpu;
if (Flags == ACPI_NOT_ISR)
cpu = disable_interrupts();
acquire_spinlock ((spinlock *)(Handle));
if (Flags == ACPI_NOT_ISR)
restore_interrupts(cpu);
} }
@@ -716,7 +723,15 @@ AcpiOsReleaseLock (
ACPI_HANDLE Handle, ACPI_HANDLE Handle,
UINT32 Flags) UINT32 Flags)
{ {
AcpiOsSignalSemaphore (Handle, 1); cpu_status cpu;
if (Flags == ACPI_NOT_ISR)
cpu = disable_interrupts();
release_spinlock ((spinlock *)(Handle));
if (Flags == ACPI_NOT_ISR)
restore_interrupts(cpu);
} }
@@ -744,7 +759,7 @@ AcpiOsInstallInterruptHandler (
#ifdef _KERNEL_MODE #ifdef _KERNEL_MODE
install_io_interrupt_handler(InterruptNumber,ServiceRoutine,Context,0); install_io_interrupt_handler(InterruptNumber,(interrupt_handler)ServiceRoutine,Context,0);
/* It so happens that the Haiku and ACPI-CA interrupt handler routines /* It so happens that the Haiku and ACPI-CA interrupt handler routines
return the same values with the same meanings */ return the same values with the same meanings */
#endif #endif
@@ -773,7 +788,7 @@ AcpiOsRemoveInterruptHandler (
#ifdef _KERNEL_MODE #ifdef _KERNEL_MODE
remove_io_interrupt_handler(InterruptNumber,ServiceRoutine,NULL); remove_io_interrupt_handler(InterruptNumber,(interrupt_handler)ServiceRoutine,NULL);
/* Crap. We don't get the Context argument back. */ /* Crap. We don't get the Context argument back. */
#warning Sketchy code! #warning Sketchy code!
@@ -819,7 +834,7 @@ AcpiOsQueueForExecution (
#define spawn_kernel_thread spawn_thread #define spawn_kernel_thread spawn_thread
#endif #endif
spawn_kernel_thread(Function,"ACPI Worker Thread",priority,Context); spawn_kernel_thread((thread_func)(Function),"ACPI Worker Thread",priority,Context);
/* We're going to cheerfully ignore the fact that ACPI_OSD_EXEC_CALLBACK /* We're going to cheerfully ignore the fact that ACPI_OSD_EXEC_CALLBACK
routines don't give canonical return values, as we aren't going to routines don't give canonical return values, as we aren't going to
check up on them, and the kernel doesn't care */ check up on them, and the kernel doesn't care */
@@ -840,6 +855,7 @@ AcpiOsQueueForExecution (
* *
*****************************************************************************/ *****************************************************************************/
#if 0
ACPI_STATUS ACPI_STATUS
AcpiOsBreakpoint ( AcpiOsBreakpoint (
char *Msg) char *Msg)
@@ -849,17 +865,17 @@ AcpiOsBreakpoint (
if (Msg) if (Msg)
{ {
AcpiOsPrintf ("AcpiOsBreakpoint: %s ****\n", Msg); kernel_debugger ("AcpiOsBreakpoint: %s ****\n", Msg);
} }
else else
{ {
AcpiOsPrintf ("At AcpiOsBreakpoint ****\n"); kernel_debugger ("At AcpiOsBreakpoint ****\n");
} }
return AE_OK; return AE_OK;
} }
#endif
/****************************************************************************** /******************************************************************************
* *