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:
@@ -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
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
*
|
*
|
||||||
|
|||||||
Reference in New Issue
Block a user