* Return an error code if installing the interrupt handler fails.

* Add debug facilities.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@28164 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Michael Lotz
2008-10-16 10:05:01 +00:00
parent 8be1e1ecf4
commit 9ed6818888
+98 -11
View File
@@ -149,6 +149,35 @@ FILE * AcpiGbl_OutputFile;
static uint32 acpi_root = 0; static uint32 acpi_root = 0;
#define DEBUG_OSHAIKU 0 /* verbosity level 0 = off, 1 = normal, 2 = all */
#if DEBUG_OSHAIKU > 0
# define DEBUG_FUNCTION() \
dprintf("acpi[%ld]: %s\n", find_thread(NULL), __PRETTY_FUNCTION__);
# define DEBUG_FUNCTION_F(x, y...) \
dprintf("acpi[%ld]: %s(" x ")\n", find_thread(NULL), __PRETTY_FUNCTION__, y);
# if DEBUG_OSHAIKU > 1
# define DEBUG_FUNCTION_V() \
dprintf("acpi[%ld]: %s\n", find_thread(NULL), __PRETTY_FUNCTION__);
# define DEBUG_FUNCTION_VF(x, y...) \
dprintf("acpi[%ld]: %s(" x ")\n", find_thread(NULL), __PRETTY_FUNCTION__, y);
# else
# define DEBUG_FUNCTION_V() \
/* nothing */
# define DEBUG_FUNCTION_VF(x, y...) \
/* nothing */
# endif
#else
# define DEBUG_FUNCTION() \
/* nothing */
# define DEBUG_FUNCTION_F(x, y...) \
/* nothing */
# define DEBUG_FUNCTION_V() \
/* nothing */
# define DEBUG_FUNCTION_VF(x, y...) \
/* nothing */
#endif
/****************************************************************************** /******************************************************************************
* *
@@ -170,6 +199,7 @@ AcpiOsInitialize(void)
#else #else
AcpiGbl_OutputFile = NULL; AcpiGbl_OutputFile = NULL;
#endif #endif
DEBUG_FUNCTION();
return AE_OK; return AE_OK;
} }
@@ -177,6 +207,7 @@ AcpiOsInitialize(void)
ACPI_STATUS ACPI_STATUS
AcpiOsTerminate(void) AcpiOsTerminate(void)
{ {
DEBUG_FUNCTION();
return AE_OK; return AE_OK;
} }
@@ -200,6 +231,7 @@ AcpiOsGetRootPointer(void)
#ifdef _KERNEL_MODE #ifdef _KERNEL_MODE
ACPI_SIZE address; ACPI_SIZE address;
ACPI_STATUS status; ACPI_STATUS status;
DEBUG_FUNCTION();
if (acpi_root == 0) { if (acpi_root == 0) {
status = AcpiFindRootPointer(&address); status = AcpiFindRootPointer(&address);
if (status == AE_OK) if (status == AE_OK)
@@ -231,6 +263,7 @@ ACPI_STATUS
AcpiOsPredefinedOverride(const ACPI_PREDEFINED_NAMES *InitVal, AcpiOsPredefinedOverride(const ACPI_PREDEFINED_NAMES *InitVal,
ACPI_STRING *NewVal) ACPI_STRING *NewVal)
{ {
DEBUG_FUNCTION();
if (!InitVal || !NewVal) if (!InitVal || !NewVal)
return AE_BAD_PARAMETER; return AE_BAD_PARAMETER;
@@ -257,6 +290,7 @@ ACPI_STATUS
AcpiOsTableOverride(ACPI_TABLE_HEADER *ExistingTable, AcpiOsTableOverride(ACPI_TABLE_HEADER *ExistingTable,
ACPI_TABLE_HEADER **NewTable) ACPI_TABLE_HEADER **NewTable)
{ {
DEBUG_FUNCTION();
if (!ExistingTable || !NewTable) if (!ExistingTable || !NewTable)
return AE_BAD_PARAMETER; return AE_BAD_PARAMETER;
@@ -292,6 +326,7 @@ AcpiOsTableOverride(ACPI_TABLE_HEADER *ExistingTable,
BOOLEAN BOOLEAN
AcpiOsReadable(void *Pointer, ACPI_SIZE Length) AcpiOsReadable(void *Pointer, ACPI_SIZE Length)
{ {
DEBUG_FUNCTION_F("addr: %p; length: %lu", Pointer, (size_t)Length);
return TRUE; return TRUE;
} }
@@ -312,6 +347,7 @@ AcpiOsReadable(void *Pointer, ACPI_SIZE Length)
BOOLEAN BOOLEAN
AcpiOsWritable(void *Pointer, ACPI_SIZE Length) AcpiOsWritable(void *Pointer, ACPI_SIZE Length)
{ {
DEBUG_FUNCTION_F("addr: %p; length: %lu", Pointer, (size_t)Length);
return TRUE; return TRUE;
} }
@@ -331,6 +367,7 @@ AcpiOsWritable(void *Pointer, ACPI_SIZE Length)
void void
AcpiOsRedirectOutput(void *Destination) AcpiOsRedirectOutput(void *Destination)
{ {
DEBUG_FUNCTION();
AcpiGbl_OutputFile = Destination; AcpiGbl_OutputFile = Destination;
} }
@@ -351,6 +388,7 @@ void ACPI_INTERNAL_VAR_XFACE
AcpiOsPrintf(const char *Fmt, ...) AcpiOsPrintf(const char *Fmt, ...)
{ {
va_list Args; va_list Args;
DEBUG_FUNCTION();
va_start(Args, Fmt); va_start(Args, Fmt);
AcpiOsVprintf(Fmt, Args); AcpiOsVprintf(Fmt, Args);
va_end(Args); va_end(Args);
@@ -434,6 +472,7 @@ AcpiOsGetLine(char *Buffer)
Buffer[i] = 0; Buffer[i] = 0;
/* Return the number of bytes in the string */ /* Return the number of bytes in the string */
DEBUG_FUNCTION_F("buffer: \"%s\"; result: %lu", Buffer, (uint32)i);
return i; return i;
} }
@@ -458,6 +497,8 @@ AcpiOsMapMemory(ACPI_PHYSICAL_ADDRESS where, ACPI_SIZE length)
void *there; void *there;
area_id area = map_physical_memory("acpi_physical_mem_area", (void *)where, area_id area = map_physical_memory("acpi_physical_mem_area", (void *)where,
length, B_ANY_KERNEL_ADDRESS, 0, &there); length, B_ANY_KERNEL_ADDRESS, 0, &there);
DEBUG_FUNCTION_F("addr: 0x%08lx; length: %lu; mapped: %p; area: %ld",
(addr_t)where, (size_t)length, there, area);
if (area < 0) { if (area < 0) {
dprintf("ACPI: cannot map memory at 0x%08x, length %d\n", where, length); dprintf("ACPI: cannot map memory at 0x%08x, length %d\n", where, length);
return NULL; return NULL;
@@ -487,6 +528,7 @@ AcpiOsMapMemory(ACPI_PHYSICAL_ADDRESS where, ACPI_SIZE length)
void void
AcpiOsUnmapMemory(void *where, ACPI_SIZE length) AcpiOsUnmapMemory(void *where, ACPI_SIZE length)
{ {
DEBUG_FUNCTION_F("mapped: %p; length: %lu", where, (size_t)length);
delete_area(area_for(where)); delete_area(area_for(where));
} }
@@ -506,7 +548,9 @@ AcpiOsUnmapMemory(void *where, ACPI_SIZE length)
void * void *
AcpiOsAllocate(ACPI_SIZE size) AcpiOsAllocate(ACPI_SIZE size)
{ {
return malloc((size_t)size); void *result = malloc((size_t)size);
DEBUG_FUNCTION_VF("result: %p", result);
return result;
} }
@@ -525,6 +569,7 @@ AcpiOsAllocate(ACPI_SIZE size)
void void
AcpiOsFree(void *mem) AcpiOsFree(void *mem)
{ {
DEBUG_FUNCTION_VF("mem: %p", mem);
free(mem); free(mem);
} }
@@ -547,6 +592,8 @@ AcpiOsCreateSemaphore(UINT32 MaxUnits, UINT32 InitialUnits,
ACPI_HANDLE *OutHandle) ACPI_HANDLE *OutHandle)
{ {
*OutHandle = (ACPI_HANDLE)create_sem(InitialUnits, "acpi_sem"); *OutHandle = (ACPI_HANDLE)create_sem(InitialUnits, "acpi_sem");
DEBUG_FUNCTION_F("max: %lu; count: %lu; result: %ld",
(uint32)MaxUnits, (uint32)InitialUnits, (sem_id)*OutHandle);
if (*OutHandle < B_OK) if (*OutHandle < B_OK)
return AE_ERROR; return AE_ERROR;
return AE_OK; return AE_OK;
@@ -567,6 +614,7 @@ AcpiOsCreateSemaphore(UINT32 MaxUnits, UINT32 InitialUnits,
ACPI_STATUS ACPI_STATUS
AcpiOsDeleteSemaphore(ACPI_HANDLE Handle) AcpiOsDeleteSemaphore(ACPI_HANDLE Handle)
{ {
DEBUG_FUNCTION_F("sem: %ld", (sem_id)Handle);
delete_sem((sem_id)Handle); delete_sem((sem_id)Handle);
return AE_OK; return AE_OK;
} }
@@ -589,22 +637,32 @@ AcpiOsDeleteSemaphore(ACPI_HANDLE Handle)
ACPI_STATUS ACPI_STATUS
AcpiOsWaitSemaphore(ACPI_HANDLE Handle, UINT32 Units, UINT16 Timeout) AcpiOsWaitSemaphore(ACPI_HANDLE Handle, UINT32 Units, UINT16 Timeout)
{ {
ACPI_STATUS result;
DEBUG_FUNCTION_VF("sem: %ld; count: %lu; timeout: %u",
(sem_id)Handle, (uint32)Units, (uint16)Timeout);
if (Timeout != ACPI_WAIT_FOREVER) { if (Timeout != ACPI_WAIT_FOREVER) {
switch (acquire_sem_etc((sem_id)Handle, Units, B_RELATIVE_TIMEOUT, switch (acquire_sem_etc((sem_id)Handle, Units, B_RELATIVE_TIMEOUT,
(bigtime_t)Timeout * 1000)) { (bigtime_t)Timeout * 1000)) {
case B_TIMED_OUT: case B_TIMED_OUT:
return AE_TIME; result = AE_TIME;
break;
case B_BAD_VALUE: case B_BAD_VALUE:
return AE_BAD_PARAMETER; result = AE_BAD_PARAMETER;
break;
case B_OK: case B_OK:
return AE_OK; result = AE_OK;
break;
default: default:
return AE_ERROR; result = AE_ERROR;
break;
} }
} else {
result = acquire_sem_etc((sem_id)Handle, Units, 0, 0)
== B_OK ? AE_OK : AE_BAD_PARAMETER;
} }
return acquire_sem_etc((sem_id)Handle, Units, 0, 0) DEBUG_FUNCTION_VF("result: %lu", (uint32)result);
== B_OK ? AE_OK : AE_BAD_PARAMETER; return result;
} }
@@ -624,6 +682,8 @@ AcpiOsWaitSemaphore(ACPI_HANDLE Handle, UINT32 Units, UINT16 Timeout)
ACPI_STATUS ACPI_STATUS
AcpiOsSignalSemaphore(ACPI_HANDLE Handle, UINT32 Units) AcpiOsSignalSemaphore(ACPI_HANDLE Handle, UINT32 Units)
{ {
DEBUG_FUNCTION_VF("sem: %ld; count: %lu", (sem_id)Handle,
(uint32)Units);
release_sem_etc((sem_id)Handle, Units, 0); release_sem_etc((sem_id)Handle, Units, 0);
return AE_OK; return AE_OK;
} }
@@ -633,6 +693,7 @@ ACPI_STATUS
AcpiOsCreateLock(ACPI_HANDLE *OutHandle) AcpiOsCreateLock(ACPI_HANDLE *OutHandle)
{ {
*OutHandle = (ACPI_HANDLE)malloc(sizeof(spinlock)); *OutHandle = (ACPI_HANDLE)malloc(sizeof(spinlock));
DEBUG_FUNCTION_F("result: %p", (spinlock *)*OutHandle);
if (OutHandle == NULL) if (OutHandle == NULL)
return AE_NO_MEMORY; return AE_NO_MEMORY;
@@ -643,6 +704,7 @@ AcpiOsCreateLock(ACPI_HANDLE *OutHandle)
void void
AcpiOsDeleteLock(ACPI_HANDLE Handle) AcpiOsDeleteLock(ACPI_HANDLE Handle)
{ {
DEBUG_FUNCTION();
free(Handle); free(Handle);
} }
@@ -650,7 +712,9 @@ AcpiOsDeleteLock(ACPI_HANDLE Handle)
ACPI_CPU_FLAGS ACPI_CPU_FLAGS
AcpiOsAcquireLock(ACPI_HANDLE Handle) AcpiOsAcquireLock(ACPI_HANDLE Handle)
{ {
cpu_status cpu = disable_interrupts(); cpu_status cpu;
DEBUG_FUNCTION_F("spinlock: %p", (spinlock *)Handle);
cpu = disable_interrupts();
acquire_spinlock((spinlock *)Handle); acquire_spinlock((spinlock *)Handle);
return cpu; return cpu;
} }
@@ -661,6 +725,7 @@ AcpiOsReleaseLock(ACPI_HANDLE Handle, ACPI_CPU_FLAGS Flags)
{ {
release_spinlock((spinlock *)Handle); release_spinlock((spinlock *)Handle);
restore_interrupts((cpu_status)Flags); restore_interrupts((cpu_status)Flags);
DEBUG_FUNCTION_F("spinlock: %p", (spinlock *)Handle);
} }
@@ -683,12 +748,14 @@ UINT32
AcpiOsInstallInterruptHandler(UINT32 InterruptNumber, AcpiOsInstallInterruptHandler(UINT32 InterruptNumber,
ACPI_OSD_HANDLER ServiceRoutine, void *Context) ACPI_OSD_HANDLER ServiceRoutine, void *Context)
{ {
DEBUG_FUNCTION_F("vector: %lu; handler: %p; data: %p",
(uint32)InterruptNumber, ServiceRoutine, Context);
#ifdef _KERNEL_MODE #ifdef _KERNEL_MODE
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 */
return AE_OK; return install_io_interrupt_handler(InterruptNumber,
(interrupt_handler)ServiceRoutine, Context, 0) == B_OK ? AE_OK
: AE_ERROR;
#else #else
return AE_ERROR; return AE_ERROR;
#endif #endif
@@ -711,6 +778,8 @@ ACPI_STATUS
AcpiOsRemoveInterruptHandler(UINT32 InterruptNumber, AcpiOsRemoveInterruptHandler(UINT32 InterruptNumber,
ACPI_OSD_HANDLER ServiceRoutine) ACPI_OSD_HANDLER ServiceRoutine)
{ {
DEBUG_FUNCTION_F("vector: %lu; handler: %p", (uint32)InterruptNumber,
ServiceRoutine);
#ifdef _KERNEL_MODE #ifdef _KERNEL_MODE
panic("AcpiOsRemoveInterruptHandler()\n"); panic("AcpiOsRemoveInterruptHandler()\n");
/*remove_io_interrupt_handler(InterruptNumber, /*remove_io_interrupt_handler(InterruptNumber,
@@ -742,6 +811,7 @@ ACPI_STATUS
AcpiOsExecute(ACPI_EXECUTE_TYPE Type, ACPI_OSD_EXEC_CALLBACK Function, AcpiOsExecute(ACPI_EXECUTE_TYPE Type, ACPI_OSD_EXEC_CALLBACK Function,
void *Context) void *Context)
{ {
DEBUG_FUNCTION();
switch (Type) { switch (Type) {
case OSL_GLOBAL_LOCK_HANDLER: case OSL_GLOBAL_LOCK_HANDLER:
case OSL_NOTIFY_HANDLER: case OSL_NOTIFY_HANDLER:
@@ -799,6 +869,7 @@ AcpiOsBreakpoint(char *Msg)
void void
AcpiOsStall(UINT32 microseconds) AcpiOsStall(UINT32 microseconds)
{ {
DEBUG_FUNCTION_F("microseconds: %lu", (uint32)microseconds);
spin(microseconds); spin(microseconds);
} }
@@ -818,6 +889,7 @@ AcpiOsStall(UINT32 microseconds)
void void
AcpiOsSleep(ACPI_INTEGER milliseconds) AcpiOsSleep(ACPI_INTEGER milliseconds)
{ {
DEBUG_FUNCTION_F("milliseconds: %lu", (uint32)milliseconds);
snooze(milliseconds * 1000); /* Sleep for micro seconds */ snooze(milliseconds * 1000); /* Sleep for micro seconds */
} }
@@ -836,6 +908,7 @@ AcpiOsSleep(ACPI_INTEGER milliseconds)
UINT64 UINT64
AcpiOsGetTimer (void) AcpiOsGetTimer (void)
{ {
DEBUG_FUNCTION();
return system_time() * 10; return system_time() * 10;
} }
@@ -856,6 +929,7 @@ AcpiOsGetTimer (void)
ACPI_STATUS ACPI_STATUS
AcpiOsValidateInterface(char *Interface) AcpiOsValidateInterface(char *Interface)
{ {
DEBUG_FUNCTION_F("interface: \"%s\"", Interface);
return AE_SUPPORT; return AE_SUPPORT;
} }
@@ -880,6 +954,8 @@ ACPI_STATUS
AcpiOsValidateAddress(UINT8 SpaceId, ACPI_PHYSICAL_ADDRESS Address, AcpiOsValidateAddress(UINT8 SpaceId, ACPI_PHYSICAL_ADDRESS Address,
ACPI_SIZE Length) ACPI_SIZE Length)
{ {
DEBUG_FUNCTION_F("space: %u; addr: 0x%08lx; length: %lu",
(uint8)SpaceId, (addr_t)Address, (size_t)Length);
return AE_OK; return AE_OK;
} }
@@ -906,6 +982,7 @@ AcpiOsReadPciConfiguration(ACPI_PCI_ID *PciId, UINT32 Register, void *Value,
#ifdef _KERNEL_MODE #ifdef _KERNEL_MODE
UINT32 val = gPCIManager->read_pci_config( UINT32 val = gPCIManager->read_pci_config(
PciId->Bus, PciId->Device, PciId->Function, Register, Width / 8); PciId->Bus, PciId->Device, PciId->Function, Register, Width / 8);
DEBUG_FUNCTION();
switch (Width) { switch (Width) {
case 8: *(UINT8 *)Value = val; case 8: *(UINT8 *)Value = val;
case 16: *(UINT16 *)Value = val; case 16: *(UINT16 *)Value = val;
@@ -943,6 +1020,7 @@ AcpiOsWritePciConfiguration(ACPI_PCI_ID *PciId, UINT32 Register,
ACPI_INTEGER Value, UINT32 Width) ACPI_INTEGER Value, UINT32 Width)
{ {
#ifdef _KERNEL_MODE #ifdef _KERNEL_MODE
DEBUG_FUNCTION();
gPCIManager->write_pci_config( gPCIManager->write_pci_config(
PciId->Bus, PciId->Device, PciId->Function, Register, Width / 8, Value); PciId->Bus, PciId->Device, PciId->Function, Register, Width / 8, Value);
return AE_OK; return AE_OK;
@@ -976,6 +1054,8 @@ ACPI_STATUS
AcpiOsReadPort(ACPI_IO_ADDRESS Address, UINT32 *Value, UINT32 Width) AcpiOsReadPort(ACPI_IO_ADDRESS Address, UINT32 *Value, UINT32 Width)
{ {
#ifdef _KERNEL_MODE #ifdef _KERNEL_MODE
DEBUG_FUNCTION_F("addr: 0x%08lx; width: %lu", (addr_t)Address,
(uint32)Width);
switch (Width) { switch (Width) {
case 8: case 8:
*Value = gPCIManager->read_io_8(Address); *Value = gPCIManager->read_io_8(Address);
@@ -1019,6 +1099,8 @@ ACPI_STATUS
AcpiOsWritePort(ACPI_IO_ADDRESS Address, UINT32 Value, UINT32 Width) AcpiOsWritePort(ACPI_IO_ADDRESS Address, UINT32 Value, UINT32 Width)
{ {
#ifdef _KERNEL_MODE #ifdef _KERNEL_MODE
DEBUG_FUNCTION_F("addr: 0x%08lx; value: %lu; width: %lu",
(addr_t)Address, (uint32)Value, (uint32)Width);
switch (Width) { switch (Width) {
case 8: case 8:
gPCIManager->write_io_8(Address, Value); gPCIManager->write_io_8(Address, Value);
@@ -1066,6 +1148,7 @@ AcpiOsReadMemory(ACPI_PHYSICAL_ADDRESS Address, UINT32 *Value, UINT32 Width)
addr_t virtualAddress; addr_t virtualAddress;
status_t error = vm_get_physical_page(Address - pageOffset, status_t error = vm_get_physical_page(Address - pageOffset,
&virtualAddress, 0); &virtualAddress, 0);
DEBUG_FUNCTION();
if (error != B_OK) if (error != B_OK)
return AE_ERROR; return AE_ERROR;
@@ -1100,6 +1183,7 @@ AcpiOsWriteMemory(ACPI_PHYSICAL_ADDRESS Address, UINT32 Value, UINT32 Width)
addr_t virtualAddress; addr_t virtualAddress;
status_t error = vm_get_physical_page(Address - pageOffset, status_t error = vm_get_physical_page(Address - pageOffset,
&virtualAddress, 0); &virtualAddress, 0);
DEBUG_FUNCTION();
if (error != B_OK) if (error != B_OK)
return AE_ERROR; return AE_ERROR;
@@ -1135,13 +1219,16 @@ AcpiOsGetThreadId(void)
ACPI_STATUS ACPI_STATUS
AcpiOsSignal(UINT32 Function, void *Info) AcpiOsSignal(UINT32 Function, void *Info)
{ {
DEBUG_FUNCTION();
switch (Function) { switch (Function) {
case ACPI_SIGNAL_FATAL: case ACPI_SIGNAL_FATAL:
#ifdef _KERNEL_MODE
if (Info != NULL) if (Info != NULL)
panic(Info); panic(Info);
else else
panic("AcpiOsSignal: fatal"); panic("AcpiOsSignal: fatal");
break; break;
#endif
case ACPI_SIGNAL_BREAKPOINT: case ACPI_SIGNAL_BREAKPOINT:
if (Info != NULL) if (Info != NULL)