From 3d947c2a03ca37a9b326cc17eae0356ae5c39e4b Mon Sep 17 00:00:00 2001 From: Alex Date: Sun, 6 Nov 2022 03:43:12 +0200 Subject: [PATCH] Added implementation of critical thread/process --- Core/CrashHandler.cpp | 9 +++++++-- KThread.cpp | 1 + Tasking/Task.cpp | 4 ++-- include/task.hpp | 7 +++++++ 4 files changed, 17 insertions(+), 4 deletions(-) diff --git a/Core/CrashHandler.cpp b/Core/CrashHandler.cpp index 8f5089a..0c270db 100644 --- a/Core/CrashHandler.cpp +++ b/Core/CrashHandler.cpp @@ -117,8 +117,13 @@ namespace CrashHandler else { debug("Exception in user mode"); - UserModeExceptionHandler(Frame); - return; + if (!GetCurrentCPU()->CurrentThread->Security.IsCritical) + { + UserModeExceptionHandler(Frame); + return; + } + else + EHPrint("\eFF0000Init process crashed!"); } debug("Reading control registers..."); diff --git a/KThread.cpp b/KThread.cpp index f4d97ee..bb01a1b 100644 --- a/KThread.cpp +++ b/KThread.cpp @@ -81,6 +81,7 @@ void KernelMainThread() // TODO: Untested! Execute::SpawnData ret = Execute::Spawn(Config.InitPath, argc, (uint64_t)argv.data()); + ret.Thread->SetCritical(true); if (ret.Status != Execute::ExStatus::OK) { KPrint("\eE85230Failed to start %s! Code: %d", Config.InitPath, ret); diff --git a/Tasking/Task.cpp b/Tasking/Task.cpp index 34e747a..93c3676 100644 --- a/Tasking/Task.cpp +++ b/Tasking/Task.cpp @@ -624,12 +624,12 @@ namespace Tasking Thread->Registers.rsp = ((uint64_t)Thread->Stack + STACK_SIZE); /* We need to leave the libc's crt to make a syscall when the Thread is exited or we are going to get GPF or PF exception. */ for (uint64_t i = 0; i < TO_PAGES(STACK_SIZE); i++) - Memory::Virtual(Parent->PageTable).Map((void *)((uint64_t)Thread->Stack + (i * PAGE_SIZE)), (void *)((uint64_t)Thread->Stack + (i * PAGE_SIZE)), Memory::PTFlag::US); + Memory::Virtual(Parent->PageTable).Map((void *)((uint64_t)Thread->Stack + (i * PAGE_SIZE)), (void *)((uint64_t)Thread->Stack + (i * PAGE_SIZE)), Memory::PTFlag::RW | Memory::PTFlag::US); if (!Memory::Virtual(Parent->PageTable).Check((void *)Offset, Memory::PTFlag::US)) { error("Offset is not user accessible"); - Memory::Virtual(Parent->PageTable).Map((void *)Offset, (void *)Offset, Memory::PTFlag::RW | Memory::PTFlag::US); + Memory::Virtual(Parent->PageTable).Map((void *)Offset, (void *)Offset, Memory::PTFlag::RW | Memory::PTFlag::US); // We try one more time. } #elif defined(__i386__) #elif defined(__aarch64__) diff --git a/include/task.hpp b/include/task.hpp index 6049c96..2c6ccea 100644 --- a/include/task.hpp +++ b/include/task.hpp @@ -60,6 +60,7 @@ namespace Tasking { TaskTrustLevel TrustLevel; Token UniqueToken; + bool IsCritical; }; struct TaskInfo @@ -117,6 +118,12 @@ namespace Tasking } int GetExitCode() { return ExitCode; } + + void SetCritical(bool critical) + { + trace("Setting criticality of thread %s to %s", Name, critical ? "true" : "false"); + Security.IsCritical = critical; + } }; struct PCB