Add optional verbose mode for ACPI

This commit is contained in:
Baptiste Wicht 2018-03-28 13:14:05 +02:00
parent fd5144160d
commit 78743ff188

View File

@ -26,6 +26,12 @@
#include "drivers/pci.hpp" #include "drivers/pci.hpp"
#include "logging.hpp" #include "logging.hpp"
#ifdef THOR_CONFIG_ACPI_OSL_VERBOSE
#define verbose_logf(...) logging::logf(__VA_ARGS__)
#else
#define verbose_logf(...)
#endif
extern "C" { extern "C" {
// Initialization // Initialization
@ -84,13 +90,19 @@ ACPI_STATUS AcpiOsPhysicalTableOverride(ACPI_TABLE_HEADER* /*ExistingTable*/, AC
* \brief Allocate dynamic memory on the heap of the given size. * \brief Allocate dynamic memory on the heap of the given size.
*/ */
void* AcpiOsAllocate(ACPI_SIZE size){ void* AcpiOsAllocate(ACPI_SIZE size){
return kalloc::k_malloc(size); auto memory = kalloc::k_malloc(size);
verbose_logf(logging::log_level::TRACE, "thor:acpica:osl: Allocate(size=%u)=%p\n", size, memory);
return memory;
} }
/*! /*!
* \brief Release dynamic memory from the heap. * \brief Release dynamic memory from the heap.
*/ */
void AcpiOsFree(void* p){ void AcpiOsFree(void* p){
verbose_logf(logging::log_level::TRACE, "thor:acpica:osl: Free(p=%p)\n", p);
kalloc::k_free(p); kalloc::k_free(p);
} }
@ -119,6 +131,8 @@ void AcpiOsVprintf(const char* format, va_list va){
* \brief Called by the ACPI debugger * \brief Called by the ACPI debugger
*/ */
ACPI_STATUS AcpiOsSignal(UINT32 function, void* info){ ACPI_STATUS AcpiOsSignal(UINT32 function, void* info){
verbose_logf(logging::log_level::TRACE, "thor:acpica:osl: Signal\n");
// This should never happen // This should never happen
if(!info){ if(!info){
return AE_NO_MEMORY; return AE_NO_MEMORY;
@ -152,6 +166,8 @@ ACPI_STATUS AcpiOsSignal(UINT32 function, void* info){
* \brief Return the current thread id * \brief Return the current thread id
*/ */
ACPI_THREAD_ID AcpiOsGetThreadId(){ ACPI_THREAD_ID AcpiOsGetThreadId(){
verbose_logf(logging::log_level::TRACE, "thor:acpica:osl: GetThreadId\n");
return scheduler::get_pid(); return scheduler::get_pid();
} }
@ -159,6 +175,8 @@ ACPI_THREAD_ID AcpiOsGetThreadId(){
* \brief Sleep the given number of milliseconds * \brief Sleep the given number of milliseconds
*/ */
void AcpiOsSleep(UINT64 ms){ void AcpiOsSleep(UINT64 ms){
verbose_logf(logging::log_level::TRACE, "thor:acpica:osl: Sleep\n");
scheduler::sleep_ms(ms); scheduler::sleep_ms(ms);
} }
@ -166,6 +184,8 @@ void AcpiOsSleep(UINT64 ms){
* \brief Active sleep for the given number of microseconds * \brief Active sleep for the given number of microseconds
*/ */
void AcpiOsStall(UINT32 us){ void AcpiOsStall(UINT32 us){
verbose_logf(logging::log_level::TRACE, "thor:acpica:osl: Stall\n");
uint64_t c = timer::counter(); uint64_t c = timer::counter();
uint64_t wait = us * (timer::counter_frequency() / double(1000000)); uint64_t wait = us * (timer::counter_frequency() / double(1000000));
wait = !wait ? 1 : wait; wait = !wait ? 1 : wait;
@ -183,6 +203,8 @@ void AcpiOsStall(UINT32 us){
* \brief Execute the given function in a new process * \brief Execute the given function in a new process
*/ */
ACPI_STATUS AcpiOsExecute(ACPI_EXECUTE_TYPE /*type*/, ACPI_OSD_EXEC_CALLBACK function, void* context){ ACPI_STATUS AcpiOsExecute(ACPI_EXECUTE_TYPE /*type*/, ACPI_OSD_EXEC_CALLBACK function, void* context){
verbose_logf(logging::log_level::TRACE, "thor:acpica:osl: Execute\n");
auto* user_stack = new char[scheduler::user_stack_size]; auto* user_stack = new char[scheduler::user_stack_size];
auto* kernel_stack = new char[scheduler::kernel_stack_size]; auto* kernel_stack = new char[scheduler::kernel_stack_size];
@ -200,6 +222,8 @@ ACPI_STATUS AcpiOsExecute(ACPI_EXECUTE_TYPE /*type*/, ACPI_OSD_EXEC_CALLBACK fun
* \brief Returns the system time in 100 nanoseconds units * \brief Returns the system time in 100 nanoseconds units
*/ */
UINT64 AcpiOsGetTimer(){ UINT64 AcpiOsGetTimer(){
verbose_logf(logging::log_level::TRACE, "thor:acpica:osl: GetTimer\n");
//TODO This should be done much more precise //TODO This should be done much more precise
// and should be real timestamp not an uptime timestamp // and should be real timestamp not an uptime timestamp
@ -210,6 +234,8 @@ UINT64 AcpiOsGetTimer(){
* \brief Wait for all asynchronous events to complete * \brief Wait for all asynchronous events to complete
*/ */
void AcpiOsWaitEventsComplete(){ void AcpiOsWaitEventsComplete(){
verbose_logf(logging::log_level::TRACE, "thor:acpica:osl: WaitEventsComplete\n");
return; return;
} }
@ -219,6 +245,8 @@ void AcpiOsWaitEventsComplete(){
* \brief Returns the physical address of the ACPI Root * \brief Returns the physical address of the ACPI Root
*/ */
ACPI_PHYSICAL_ADDRESS AcpiOsGetRootPointer(){ ACPI_PHYSICAL_ADDRESS AcpiOsGetRootPointer(){
verbose_logf(logging::log_level::TRACE, "thor:acpica:osl: GetRootPointer\n");
ACPI_PHYSICAL_ADDRESS root_pointer; ACPI_PHYSICAL_ADDRESS root_pointer;
root_pointer = 0; root_pointer = 0;
auto status = AcpiFindRootPointer(&root_pointer); auto status = AcpiFindRootPointer(&root_pointer);
@ -236,6 +264,8 @@ ACPI_PHYSICAL_ADDRESS AcpiOsGetRootPointer(){
* \brief Map physical memory to a virtual address * \brief Map physical memory to a virtual address
*/ */
void* AcpiOsMapMemory(ACPI_PHYSICAL_ADDRESS phys, ACPI_SIZE length){ void* AcpiOsMapMemory(ACPI_PHYSICAL_ADDRESS phys, ACPI_SIZE length){
verbose_logf(logging::log_level::TRACE, "thor:acpica:osl: MapMemory\n");
auto offset = phys % paging::PAGE_SIZE; auto offset = phys % paging::PAGE_SIZE;
auto real_length = offset + length; auto real_length = offset + length;
@ -262,6 +292,8 @@ void* AcpiOsMapMemory(ACPI_PHYSICAL_ADDRESS phys, ACPI_SIZE length){
* \brief Unmap physical memory from a virtual address * \brief Unmap physical memory from a virtual address
*/ */
void AcpiOsUnmapMemory(void* virt_raw, ACPI_SIZE length){ void AcpiOsUnmapMemory(void* virt_raw, ACPI_SIZE length){
verbose_logf(logging::log_level::TRACE, "thor:acpica:osl: UnmapMemory\n");
auto virt = reinterpret_cast<size_t>(virt_raw); auto virt = reinterpret_cast<size_t>(virt_raw);
auto offset = virt % paging::PAGE_SIZE; auto offset = virt % paging::PAGE_SIZE;
@ -282,6 +314,8 @@ void AcpiOsUnmapMemory(void* virt_raw, ACPI_SIZE length){
* \brief Create a mutex * \brief Create a mutex
*/ */
ACPI_STATUS AcpiOsCreateMutex(ACPI_MUTEX* handle){ ACPI_STATUS AcpiOsCreateMutex(ACPI_MUTEX* handle){
verbose_logf(logging::log_level::TRACE, "thor:acpica:osl: CreateMutex\n");
auto* lock = new mutex<false>(); auto* lock = new mutex<false>();
lock->init(); lock->init();
@ -295,6 +329,8 @@ ACPI_STATUS AcpiOsCreateMutex(ACPI_MUTEX* handle){
* \brief Delete a mutex * \brief Delete a mutex
*/ */
void AcpiOsDeleteMutex(ACPI_MUTEX handle){ void AcpiOsDeleteMutex(ACPI_MUTEX handle){
verbose_logf(logging::log_level::TRACE, "thor:acpica:osl: DeleteMutex\n");
auto* lock = static_cast<mutex<false>*>(handle); auto* lock = static_cast<mutex<false>*>(handle);
delete lock; delete lock;
@ -304,6 +340,8 @@ void AcpiOsDeleteMutex(ACPI_MUTEX handle){
* \brief Acquire a mutex * \brief Acquire a mutex
*/ */
ACPI_STATUS AcpiOsAcquireMutex(ACPI_MUTEX handle, UINT16 Timeout){ ACPI_STATUS AcpiOsAcquireMutex(ACPI_MUTEX handle, UINT16 Timeout){
verbose_logf(logging::log_level::TRACE, "thor:acpica:osl: AcquireMutex\n");
auto* lock = static_cast<mutex<false>*>(handle); auto* lock = static_cast<mutex<false>*>(handle);
lock->lock(); lock->lock();
@ -315,6 +353,8 @@ ACPI_STATUS AcpiOsAcquireMutex(ACPI_MUTEX handle, UINT16 Timeout){
* \brief Release a mutex * \brief Release a mutex
*/ */
void AcpiOsReleaseMutex(ACPI_MUTEX handle){ void AcpiOsReleaseMutex(ACPI_MUTEX handle){
verbose_logf(logging::log_level::TRACE, "thor:acpica:osl: ReleaseMutex\n");
auto* lock = static_cast<mutex<false>*>(handle); auto* lock = static_cast<mutex<false>*>(handle);
lock->unlock(); lock->unlock();
@ -328,6 +368,8 @@ void AcpiOsReleaseMutex(ACPI_MUTEX handle){
ACPI_STATUS AcpiOsCreateSemaphore(UINT32 /*maxUnits*/, UINT32 initialUnits, ACPI_SEMAPHORE* handle){ ACPI_STATUS AcpiOsCreateSemaphore(UINT32 /*maxUnits*/, UINT32 initialUnits, ACPI_SEMAPHORE* handle){
auto* lock = new semaphore(); auto* lock = new semaphore();
verbose_logf(logging::log_level::TRACE, "thor:acpica:osl: CreateSemaphore(initial=%u)=%p\n", initialUnits, lock);
lock->init(initialUnits); lock->init(initialUnits);
*handle = lock; *handle = lock;
@ -339,6 +381,8 @@ ACPI_STATUS AcpiOsCreateSemaphore(UINT32 /*maxUnits*/, UINT32 initialUnits, ACPI
* \brief Delete a semaphore * \brief Delete a semaphore
*/ */
ACPI_STATUS AcpiOsDeleteSemaphore(ACPI_SEMAPHORE handle){ ACPI_STATUS AcpiOsDeleteSemaphore(ACPI_SEMAPHORE handle){
verbose_logf(logging::log_level::TRACE, "thor:acpica:osl: DeleteSemaphore\n");
auto* lock = static_cast<semaphore*>(handle); auto* lock = static_cast<semaphore*>(handle);
delete lock; delete lock;
@ -349,7 +393,9 @@ ACPI_STATUS AcpiOsDeleteSemaphore(ACPI_SEMAPHORE handle){
/*! /*!
* \brief Wait a semaphore * \brief Wait a semaphore
*/ */
ACPI_STATUS AcpiOsWaitSemaphore(ACPI_SEMAPHORE handle, UINT32 units, UINT16 /*timeout*/){ ACPI_STATUS AcpiOsWaitSemaphore(ACPI_SEMAPHORE handle, UINT32 units, UINT16 timeout){
verbose_logf(logging::log_level::TRACE, "thor:acpica:osl: WaitSemaphore(handle=%p,units=%u,timeout=%u)\n", handle, units, timeout);
auto* lock = static_cast<semaphore*>(handle); auto* lock = static_cast<semaphore*>(handle);
for(size_t i = 0; i < units; ++i){ for(size_t i = 0; i < units; ++i){
@ -363,6 +409,8 @@ ACPI_STATUS AcpiOsWaitSemaphore(ACPI_SEMAPHORE handle, UINT32 units, UINT16 /*ti
* \brief Signal a semaphore * \brief Signal a semaphore
*/ */
ACPI_STATUS AcpiOsSignalSemaphore(ACPI_SEMAPHORE handle, UINT32 units){ ACPI_STATUS AcpiOsSignalSemaphore(ACPI_SEMAPHORE handle, UINT32 units){
verbose_logf(logging::log_level::TRACE, "thor:acpica:osl: SignalSemaphore\n");
auto* lock = static_cast<semaphore*>(handle); auto* lock = static_cast<semaphore*>(handle);
lock->release(units); lock->release(units);
@ -374,6 +422,8 @@ ACPI_STATUS AcpiOsSignalSemaphore(ACPI_SEMAPHORE handle, UINT32 units){
* \brief Create an interrupt spinlock * \brief Create an interrupt spinlock
*/ */
ACPI_STATUS AcpiOsCreateLock(ACPI_SPINLOCK *handle){ ACPI_STATUS AcpiOsCreateLock(ACPI_SPINLOCK *handle){
verbose_logf(logging::log_level::TRACE, "thor:acpica:osl: CreateLock\n");
auto* lock = new int_lock(); auto* lock = new int_lock();
*handle = lock; *handle = lock;
@ -385,6 +435,8 @@ ACPI_STATUS AcpiOsCreateLock(ACPI_SPINLOCK *handle){
* \brief Delete an interrupt spinlock * \brief Delete an interrupt spinlock
*/ */
void AcpiOsDeleteLock(ACPI_HANDLE handle){ void AcpiOsDeleteLock(ACPI_HANDLE handle){
verbose_logf(logging::log_level::TRACE, "thor:acpica:osl: DeleteLock\n");
auto* lock = static_cast<int_lock*>(handle); auto* lock = static_cast<int_lock*>(handle);
delete lock; delete lock;
@ -394,6 +446,8 @@ void AcpiOsDeleteLock(ACPI_HANDLE handle){
* \brief Acquire an interrupt spinlock * \brief Acquire an interrupt spinlock
*/ */
ACPI_CPU_FLAGS AcpiOsAcquireLock(ACPI_SPINLOCK handle){ ACPI_CPU_FLAGS AcpiOsAcquireLock(ACPI_SPINLOCK handle){
verbose_logf(logging::log_level::TRACE, "thor:acpica:osl: acquireLock\n");
auto* lock = static_cast<int_lock*>(handle); auto* lock = static_cast<int_lock*>(handle);
lock->lock(); lock->lock();
@ -405,6 +459,8 @@ ACPI_CPU_FLAGS AcpiOsAcquireLock(ACPI_SPINLOCK handle){
* \brief Release an interrupt spinlock * \brief Release an interrupt spinlock
*/ */
void AcpiOsReleaseLock(ACPI_SPINLOCK handle, ACPI_CPU_FLAGS /*flags*/){ void AcpiOsReleaseLock(ACPI_SPINLOCK handle, ACPI_CPU_FLAGS /*flags*/){
verbose_logf(logging::log_level::TRACE, "thor:acpica:osl: ReleaseLock\n");
auto* lock = static_cast<int_lock*>(handle); auto* lock = static_cast<int_lock*>(handle);
lock->unlock(); lock->unlock();
@ -416,6 +472,8 @@ void AcpiOsReleaseLock(ACPI_SPINLOCK handle, ACPI_CPU_FLAGS /*flags*/){
* \brief Read an hardware * \brief Read an hardware
*/ */
ACPI_STATUS AcpiOsReadPort(ACPI_IO_ADDRESS port, UINT32* value, UINT32 width){ ACPI_STATUS AcpiOsReadPort(ACPI_IO_ADDRESS port, UINT32* value, UINT32 width){
verbose_logf(logging::log_level::TRACE, "thor:acpica:osl: ReadPort\n");
switch (width) { switch (width) {
case 8: case 8:
*value = in_byte(port); *value = in_byte(port);
@ -440,6 +498,8 @@ ACPI_STATUS AcpiOsReadPort(ACPI_IO_ADDRESS port, UINT32* value, UINT32 width){
* \brief Write an hardware * \brief Write an hardware
*/ */
ACPI_STATUS AcpiOsWritePort(ACPI_IO_ADDRESS port, UINT32 value, UINT32 width){ ACPI_STATUS AcpiOsWritePort(ACPI_IO_ADDRESS port, UINT32 value, UINT32 width){
verbose_logf(logging::log_level::TRACE, "thor:acpica:osl: WritePort\n");
switch (width) { switch (width) {
case 8: case 8:
out_byte(port, value); out_byte(port, value);
@ -464,6 +524,8 @@ ACPI_STATUS AcpiOsWritePort(ACPI_IO_ADDRESS port, UINT32 value, UINT32 width){
* \brief Read a physical memory location * \brief Read a physical memory location
*/ */
ACPI_STATUS AcpiOsReadMemory(ACPI_PHYSICAL_ADDRESS Address, UINT64 *value, UINT32 width){ ACPI_STATUS AcpiOsReadMemory(ACPI_PHYSICAL_ADDRESS Address, UINT64 *value, UINT32 width){
verbose_logf(logging::log_level::TRACE, "thor:acpica:osl: ReadMemory\n");
ACPI_STATUS rv = AE_OK; ACPI_STATUS rv = AE_OK;
void* logical_address = AcpiOsMapMemory(Address, width / 8); void* logical_address = AcpiOsMapMemory(Address, width / 8);
@ -502,6 +564,8 @@ ACPI_STATUS AcpiOsReadMemory(ACPI_PHYSICAL_ADDRESS Address, UINT64 *value, UINT3
* \brief Write a physical memory location * \brief Write a physical memory location
*/ */
ACPI_STATUS AcpiOsWriteMemory(ACPI_PHYSICAL_ADDRESS Address, UINT64 value, UINT32 width){ ACPI_STATUS AcpiOsWriteMemory(ACPI_PHYSICAL_ADDRESS Address, UINT64 value, UINT32 width){
verbose_logf(logging::log_level::TRACE, "thor:acpica:osl: WriteMemory\n");
ACPI_STATUS rv = AE_OK; ACPI_STATUS rv = AE_OK;
void* logical_address = AcpiOsMapMemory(Address, width / 8); void* logical_address = AcpiOsMapMemory(Address, width / 8);
@ -537,6 +601,8 @@ ACPI_STATUS AcpiOsWriteMemory(ACPI_PHYSICAL_ADDRESS Address, UINT64 value, UINT3
} }
ACPI_STATUS AcpiOsReadPciConfiguration(ACPI_PCI_ID* pci_id, UINT32 Register, UINT64* value, UINT32 width){ ACPI_STATUS AcpiOsReadPciConfiguration(ACPI_PCI_ID* pci_id, UINT32 Register, UINT64* value, UINT32 width){
verbose_logf(logging::log_level::TRACE, "thor:acpica:osl: ReadPciConfiguration\n");
if (pci_id->Bus >= 256 || pci_id->Device >= 32 || pci_id->Function >= 8){ if (pci_id->Bus >= 256 || pci_id->Device >= 32 || pci_id->Function >= 8){
return AE_BAD_PARAMETER; return AE_BAD_PARAMETER;
} }
@ -562,6 +628,8 @@ ACPI_STATUS AcpiOsReadPciConfiguration(ACPI_PCI_ID* pci_id, UINT32 Register, UIN
} }
ACPI_STATUS AcpiOsWritePciConfiguration(ACPI_PCI_ID* pci_id, UINT32 Register, ACPI_INTEGER value, UINT32 width){ ACPI_STATUS AcpiOsWritePciConfiguration(ACPI_PCI_ID* pci_id, UINT32 Register, ACPI_INTEGER value, UINT32 width){
verbose_logf(logging::log_level::TRACE, "thor:acpica:osl: WritePciConfiguration\n");
if (pci_id->Bus >= 256 || pci_id->Device >= 32 || pci_id->Function >= 8){ if (pci_id->Bus >= 256 || pci_id->Device >= 32 || pci_id->Function >= 8){
return AE_BAD_PARAMETER; return AE_BAD_PARAMETER;
} }
@ -599,6 +667,8 @@ void acpi_interrupt_handler(interrupt::syscall_regs*, void* context){
} }
ACPI_STATUS AcpiOsInstallInterruptHandler(UINT32 irq, ACPI_OSD_HANDLER routine, void* context){ ACPI_STATUS AcpiOsInstallInterruptHandler(UINT32 irq, ACPI_OSD_HANDLER routine, void* context){
verbose_logf(logging::log_level::TRACE, "thor:acpica:osl: InstallInterruptHandler\n");
if (irq > 255){ if (irq > 255){
return AE_BAD_PARAMETER; return AE_BAD_PARAMETER;
} }
@ -623,6 +693,8 @@ ACPI_STATUS AcpiOsInstallInterruptHandler(UINT32 irq, ACPI_OSD_HANDLER routine,
} }
ACPI_STATUS AcpiOsRemoveInterruptHandler(UINT32 irq, ACPI_OSD_HANDLER routine){ ACPI_STATUS AcpiOsRemoveInterruptHandler(UINT32 irq, ACPI_OSD_HANDLER routine){
verbose_logf(logging::log_level::TRACE, "thor:acpica:osl: RemoveInterruptHandler\n");
if (irq > 255){ if (irq > 255){
return AE_BAD_PARAMETER; return AE_BAD_PARAMETER;
} }