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
+37 -21
View File
@@ -422,13 +422,9 @@ AcpiOsVprintf (
}
#else
char acpi_err_string[512];
int debug_fd = open("/boot/acpi_log",O_WRONLY | O_APPEND | O_CREAT);
vsprintf(acpi_err_string, Fmt, Args);
write(debug_fd,acpi_err_string,strlen(acpi_err_string));
write(debug_fd,"\n",1);
close(debug_fd);
//kernel_debugger(acpi_err_string);
//char acpi_err_string[512];
//vsprintf(acpi_err_string, Fmt, Args);
//dprintf("ACPI: %s\n",acpi_err_string);
#endif
return;
@@ -452,10 +448,11 @@ UINT32
AcpiOsGetLine (
char *Buffer)
{
UINT8 Temp;
UINT32 i = 0;
#ifndef _KERNEL_MODE
UINT8 Temp;
for (i = 0; ; i++)
{
scanf ("%1c", &Temp);
@@ -502,13 +499,14 @@ AcpiOsMapMemory (
#ifdef _KERNEL_MODE
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 = 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;
#endif
#endif
return (area > 0 ? AE_OK : AE_BAD_ADDRESS);
}
@@ -691,14 +689,15 @@ AcpiOsCreateLock (
ACPI_HANDLE *OutHandle)
{
return (AcpiOsCreateSemaphore (1, 1, OutHandle));
*OutHandle = (ACPI_HANDLE)memalign(sizeof(spinlock),sizeof(spinlock));
return AE_OK;
}
void
AcpiOsDeleteLock (
ACPI_HANDLE Handle)
{
AcpiOsDeleteSemaphore (Handle);
free(Handle);
}
@@ -707,7 +706,15 @@ AcpiOsAcquireLock (
ACPI_HANDLE Handle,
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,
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
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
return the same values with the same meanings */
#endif
@@ -773,7 +788,7 @@ AcpiOsRemoveInterruptHandler (
#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. */
#warning Sketchy code!
@@ -819,7 +834,7 @@ AcpiOsQueueForExecution (
#define spawn_kernel_thread spawn_thread
#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
routines don't give canonical return values, as we aren't going to
check up on them, and the kernel doesn't care */
@@ -840,6 +855,7 @@ AcpiOsQueueForExecution (
*
*****************************************************************************/
#if 0
ACPI_STATUS
AcpiOsBreakpoint (
char *Msg)
@@ -849,17 +865,17 @@ AcpiOsBreakpoint (
if (Msg)
{
AcpiOsPrintf ("AcpiOsBreakpoint: %s ****\n", Msg);
kernel_debugger ("AcpiOsBreakpoint: %s ****\n", Msg);
}
else
{
AcpiOsPrintf ("At AcpiOsBreakpoint ****\n");
kernel_debugger ("At AcpiOsBreakpoint ****\n");
}
return AE_OK;
}
#endif
/******************************************************************************
*