diff --git a/Core/Crash/CrashHandler.cpp b/Core/Crash/CrashHandler.cpp index 0c6eb9e..d07c247 100644 --- a/Core/Crash/CrashHandler.cpp +++ b/Core/Crash/CrashHandler.cpp @@ -738,6 +738,7 @@ namespace CrashHandler debug("Exception in kernel mode (ip: %#lx (%s), cr2: %#lx)", Frame->rip, KernelSymbolTable ? KernelSymbolTable->GetSymbolFromAddress(Frame->rip) : "No symbol", PageFaultAddress); if (TaskManager) TaskManager->Panic(); + ForceUnlock = true; Display->CreateBuffer(0, 0, SBIdx); } else @@ -746,6 +747,7 @@ namespace CrashHandler CPUData *data = GetCurrentCPU(); if (!data) { + ForceUnlock = true; Display->CreateBuffer(0, 0, SBIdx); EHPrint("\eFF0000Cannot get CPU data! This results in a kernel crash!"); error("Cannot get CPU data! This results in a kernel crash!"); @@ -759,6 +761,7 @@ namespace CrashHandler debug("Critical thread \"%s\"(%d) died", data->CurrentThread->Name, data->CurrentThread->ID); if (TaskManager) TaskManager->Panic(); + ForceUnlock = true; Display->CreateBuffer(0, 0, SBIdx); } else @@ -890,8 +893,8 @@ namespace CrashHandler if (TaskManager && cpudata != nullptr) { - crashdata.Process = cpudata->CurrentProcess; - crashdata.Thread = cpudata->CurrentThread; + crashdata.Process = cpudata->CurrentProcess.Load(); + crashdata.Thread = cpudata->CurrentThread.Load(); error("Current Process: %s(%ld)", cpudata->CurrentProcess->Name, diff --git a/Core/Lock.cpp b/Core/Lock.cpp index 8753ac2..c77acb4 100644 --- a/Core/Lock.cpp +++ b/Core/Lock.cpp @@ -5,8 +5,18 @@ #include "../kernel.h" +bool ForceUnlock = false; + void LockClass::DeadLock(SpinLockData Lock) { + if (ForceUnlock) + { + warn("Unlocking lock '%s' which it was held by '%s'...", Lock.AttemptingToGet, Lock.CurrentHolder); + this->DeadLocks = 0; + this->Unlock(); + return; + } + CPUData *CoreData = GetCurrentCPU(); long CCore = 0xdead; if (CoreData != nullptr) @@ -33,19 +43,6 @@ void LockClass::DeadLock(SpinLockData Lock) int LockClass::Lock(const char *FunctionName) { - // LockData.AttemptingToGet = FunctionName; - // SpinLock_Lock(&LockData.LockData); - // LockData.Count++; - // LockData.CurrentHolder = FunctionName; - // CPUData *CoreData = GetCurrentCPU(); - // if (CoreData != nullptr) - // LockData.Core = CoreData->ID; - // __sync_synchronize(); - - // while (!__sync_bool_compare_and_swap(&IsLocked, false, true)) - // CPU::Pause(); - // __sync_synchronize(); - LockData.AttemptingToGet = FunctionName; Retry: unsigned int i = 0; @@ -68,14 +65,6 @@ Retry: int LockClass::Unlock() { - // SpinLock_Unlock(&LockData.LockData); - // LockData.Count--; - // __sync_synchronize(); - - // __sync_synchronize(); - // __atomic_store_n(&IsLocked, false, __ATOMIC_SEQ_CST); - // IsLocked = false; - __sync_synchronize(); IsLocked.Store(false, MemoryOrder::Release); LockData.Count--; diff --git a/include/lock.hpp b/include/lock.hpp index bfe233a..a76dd0b 100644 --- a/include/lock.hpp +++ b/include/lock.hpp @@ -8,6 +8,9 @@ #ifdef __cplusplus +/* Enabled ONLY on crash. */ +extern bool ForceUnlock; + /** @brief Please use this macro to create a new lock. */ class LockClass {