diff --git a/Core/Lock.cpp b/Core/Lock.cpp index ba1bf04..7db7100 100644 --- a/Core/Lock.cpp +++ b/Core/Lock.cpp @@ -5,6 +5,8 @@ #include "../kernel.h" +// #define PRINT_BACKTRACE + bool ForceUnlock = false; Atomic LocksCount = 0; @@ -31,6 +33,23 @@ void LockClass::DeadLock(SpinLockData Lock) CPU::Interrupts(CPU::Check) ? "enabled" : "disabled", CCore, Lock.Core, this->DeadLocks); +#ifdef PRINT_BACKTRACE + if (KernelSymbolTable) + { + debug("\t\t%s<-%s<-%s<-%s<-%s<-%s<-%s<-%s<-%s<-%s", + KernelSymbolTable->GetSymbolFromAddress((uintptr_t)__builtin_return_address(0)), + KernelSymbolTable->GetSymbolFromAddress((uintptr_t)__builtin_return_address(1)), + KernelSymbolTable->GetSymbolFromAddress((uintptr_t)__builtin_return_address(2)), + KernelSymbolTable->GetSymbolFromAddress((uintptr_t)__builtin_return_address(3)), + KernelSymbolTable->GetSymbolFromAddress((uintptr_t)__builtin_return_address(4)), + KernelSymbolTable->GetSymbolFromAddress((uintptr_t)__builtin_return_address(5)), + KernelSymbolTable->GetSymbolFromAddress((uintptr_t)__builtin_return_address(6)), + KernelSymbolTable->GetSymbolFromAddress((uintptr_t)__builtin_return_address(7)), + KernelSymbolTable->GetSymbolFromAddress((uintptr_t)__builtin_return_address(8)), + KernelSymbolTable->GetSymbolFromAddress((uintptr_t)__builtin_return_address(9))); + } +#endif + // TODO: Print on screen too. this->DeadLocks++; @@ -103,6 +122,23 @@ void LockClass::TimeoutDeadLock(SpinLockData Lock, uint64_t Timeout) CPU::Interrupts(CPU::Check) ? "enabled" : "disabled", CCore, Lock.Core, Timeout, Timeout - Counter); +#ifdef PRINT_BACKTRACE + if (KernelSymbolTable) + { + debug("\t\t%s<-%s<-%s<-%s<-%s<-%s<-%s<-%s<-%s<-%s", + KernelSymbolTable->GetSymbolFromAddress((uintptr_t)__builtin_return_address(0)), + KernelSymbolTable->GetSymbolFromAddress((uintptr_t)__builtin_return_address(1)), + KernelSymbolTable->GetSymbolFromAddress((uintptr_t)__builtin_return_address(2)), + KernelSymbolTable->GetSymbolFromAddress((uintptr_t)__builtin_return_address(3)), + KernelSymbolTable->GetSymbolFromAddress((uintptr_t)__builtin_return_address(4)), + KernelSymbolTable->GetSymbolFromAddress((uintptr_t)__builtin_return_address(5)), + KernelSymbolTable->GetSymbolFromAddress((uintptr_t)__builtin_return_address(6)), + KernelSymbolTable->GetSymbolFromAddress((uintptr_t)__builtin_return_address(7)), + KernelSymbolTable->GetSymbolFromAddress((uintptr_t)__builtin_return_address(8)), + KernelSymbolTable->GetSymbolFromAddress((uintptr_t)__builtin_return_address(9))); + } +#endif + if (Timeout < Counter) { warn("Unlocking lock '%s' because of timeout. (%ld < %ld)", Lock.AttemptingToGet, Timeout, Counter);