diff --git a/Core/Crash/CrashHandler.cpp b/Core/Crash/CrashHandler.cpp index 330ce26..7b59c71 100644 --- a/Core/Crash/CrashHandler.cpp +++ b/Core/Crash/CrashHandler.cpp @@ -818,8 +818,7 @@ namespace CrashHandler SBIdx = 255; CHArchTrapFrame *Frame = (CHArchTrapFrame *)Data; #if defined(a64) - error("-----------------------------------------------------------------------------------"); - error("An exception occurred!"); + debug("-----------------------------------------------------------------------------------"); error("Exception: %#llx", Frame->InterruptNumber); for (size_t i = 0; i < INT_FRAMES_MAX; i++) EHIntFrames[i] = Interrupts::InterruptFrames[i]; @@ -834,6 +833,15 @@ namespace CrashHandler debug("Exception in kernel mode (ip: %#lx (%s))", Frame->rip, KernelSymbolTable ? KernelSymbolTable->GetSymbolFromAddress(Frame->rip) : "No symbol"); + CPUData *data = GetCurrentCPU(); + if (data) + { + if (!data->CurrentThread->Security.IsCritical) + { + fixme("Exception in non-critical thread (kernel mode)"); + } + } + if (TaskManager) TaskManager->Panic(); ForceUnlock = true; diff --git a/Tasking/Task.cpp b/Tasking/Task.cpp index 3e528e1..6b8abdd 100644 --- a/Tasking/Task.cpp +++ b/Tasking/Task.cpp @@ -445,6 +445,7 @@ namespace Tasking [[fallthrough]]; case TaskTrustLevel::Kernel: { + Thread->Security.IsCritical = true; Thread->Stack = new Memory::StackGuard(false, Parent->PageTable); #if defined(a64) SecurityManager.TrustToken(Thread->Security.UniqueToken, TTL::TrustedByKernel); @@ -706,6 +707,7 @@ namespace Tasking [[fallthrough]]; case TaskTrustLevel::Kernel: { + Process->Security.IsCritical = true; SecurityManager.TrustToken(Process->Security.UniqueToken, TTL::TrustedByKernel); #if defined(a64) if (!DoNotCreatePageTable)