From 9416bd5cb944132e341c50e7ba10f08b8316a3b4 Mon Sep 17 00:00:00 2001 From: Alex Date: Mon, 13 Feb 2023 16:16:09 +0200 Subject: [PATCH] Fixed kernel hang on IPC wait --- Core/Crash/CrashHandler.cpp | 4 ++-- KThread.cpp | 5 +++-- Tasking/InterProcessCommunication.cpp | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/Core/Crash/CrashHandler.cpp b/Core/Crash/CrashHandler.cpp index 744b8dd..849d5b0 100644 --- a/Core/Crash/CrashHandler.cpp +++ b/Core/Crash/CrashHandler.cpp @@ -663,14 +663,14 @@ namespace CrashHandler if (Frame->cs != GDT_USER_CODE && Frame->cs != GDT_USER_DATA) { - debug("Exception in kernel mode"); + debug("Exception in kernel mode (ip: %#lx, cr2: %#lx)", Frame->rip, PageFaultAddress); if (TaskManager) TaskManager->Panic(); Display->CreateBuffer(0, 0, SBIdx); } else { - debug("Exception in user mode"); + debug("Exception in user mode (ip: %#lx, cr2: %#lx)", Frame->rip, PageFaultAddress); CPUData *data = GetCurrentCPU(); if (!data) { diff --git a/KThread.cpp b/KThread.cpp index fc0a0ec..3358a08 100644 --- a/KThread.cpp +++ b/KThread.cpp @@ -134,8 +134,9 @@ void KernelMainThread() TaskManager->GetCurrentThread()->SetPriority(Tasking::Critical); #ifdef DEBUG - Tasking::PCB *tskMgr = TaskManager->CreateProcess(TaskManager->GetCurrentProcess(), "Debug Task Manager", Tasking::TaskTrustLevel::Kernel); - TaskManager->CreateThread(tskMgr, (Tasking::IP)TaskMgr)->SetPriority((Tasking::TaskPriority)200); + /* TODO: This should not be enabled because it may cause a deadlock. Not sure where or how. */ + // Tasking::PCB *tskMgr = TaskManager->CreateProcess(TaskManager->GetCurrentProcess(), "Debug Task Manager", Tasking::TaskTrustLevel::Kernel); + // TaskManager->CreateThread(tskMgr, (Tasking::IP)TaskMgr)->SetPriority(Tasking::High); #endif KPrint("Kernel Compiled at: %s %s with C++ Standard: %d", __DATE__, __TIME__, CPP_LANGUAGE_STANDARD); diff --git a/Tasking/InterProcessCommunication.cpp b/Tasking/InterProcessCommunication.cpp index dcb1333..02f9927 100644 --- a/Tasking/InterProcessCommunication.cpp +++ b/Tasking/InterProcessCommunication.cpp @@ -170,7 +170,7 @@ namespace InterProcessCommunication warn("Interrupts are disabled. This may cause a kernel hang."); debug("Waiting for IPC %d (now %s)", ID, Hnd->Listening ? "listening" : "ready"); while (Hnd->Listening) - TaskManager->Schedule(); + CPU::Halt(); debug("IPC %d is ready", ID); return IPCSuccess; }