From 5da3b3ae6c845ffd723ae9de1f26a064fb37717e Mon Sep 17 00:00:00 2001 From: Alex Date: Mon, 26 Dec 2022 08:41:43 +0200 Subject: [PATCH] Recovery stub --- KThread.cpp | 7 ++++-- Recovery/RecoveryMain.cpp | 45 +++++++++++++++++++++++++++++++++++++++ include/recovery.hpp | 12 ++++++++++- kernel.h | 4 +++- 4 files changed, 64 insertions(+), 4 deletions(-) diff --git a/KThread.cpp b/KThread.cpp index c94b523..02583d0 100644 --- a/KThread.cpp +++ b/KThread.cpp @@ -14,6 +14,7 @@ Driver::Driver *DriverManager = nullptr; Disk::Manager *DiskManager = nullptr; NetworkInterfaceManager::NetworkInterface *NIManager = nullptr; +Recovery::KernelRecovery *RecoveryScreen = nullptr; void KernelMainThread() { @@ -46,7 +47,7 @@ void KernelMainThread() KPrint("Initializing Network Interface Manager..."); NIManager = new NetworkInterfaceManager::NetworkInterface; KPrint("Starting Network Interface Manager..."); - NIManager->StartService(); + // NIManager->StartService(); KPrint("Setting up userspace..."); @@ -82,7 +83,9 @@ void KernelMainThread() KPrint("\eE85230Userspace process exited with code %d", ret.Thread->GetExitCode()); error("Userspace process exited with code %d (%#x)", ret.Thread->GetExitCode(), ret.Thread->GetExitCode()); Exit: - KPrint("Well, this is awkward. I guess you'll have to reboot."); + KPrint("%s exited with code %d! Dropping to recovery screen...", Config.InitPath, ret.Thread->GetExitCode()); + TaskManager->Sleep(1000); + RecoveryScreen = new Recovery::KernelRecovery; CPU::Halt(true); } diff --git a/Recovery/RecoveryMain.cpp b/Recovery/RecoveryMain.cpp index 3f56df8..0c81f53 100644 --- a/Recovery/RecoveryMain.cpp +++ b/Recovery/RecoveryMain.cpp @@ -1,2 +1,47 @@ #include +#include +#include +#include +#include "../kernel.h" + +using Tasking::IP; +using Tasking::PCB; +using Tasking::TaskTrustLevel; +using Tasking::TCB; +using namespace GraphicalUserInterface; + +namespace Recovery +{ + void KernelRecovery::RecoveryThread() + { + while (true) + { + } + } + + void RecoveryThreadWrapper() { RecoveryScreen->RecoveryThread(); } + + GraphicalUserInterface::GUI *gui = nullptr; + void GUIWrapper() { gui->Loop(); } + + KernelRecovery::KernelRecovery() + { + // PCB *proc = TaskManager->CreateProcess(TaskManager->GetCurrentProcess(), "Recovery", TaskTrustLevel::Kernel, nullptr); + + gui = new GraphicalUserInterface::GUI; + + Vector auxv; + auxv.push_back({.archaux = {.a_type = AT_NULL, .a_un = {.a_val = 0}}}); + // TaskManager->CreateThread(proc, (IP)RecoveryThreadWrapper, nullptr, nullptr, auxv); + TCB *guiThread = TaskManager->CreateThread(TaskManager->GetCurrentProcess(), (IP)GUIWrapper, nullptr, nullptr, auxv); + guiThread->SetPriority(100); + Window *win = new Window(gui, 50, 50, 400, 250, "Recovery"); + gui->AddWindow(win); + } + + KernelRecovery::~KernelRecovery() + { + delete gui; + } +} diff --git a/include/recovery.hpp b/include/recovery.hpp index d084071..6d1e439 100644 --- a/include/recovery.hpp +++ b/include/recovery.hpp @@ -2,10 +2,20 @@ #define __FENNIX_KERNEL_RECOVERY_H__ #include +#include namespace Recovery { - + class KernelRecovery + { + private: + Memory::MemMgr *mem; + + public: + void RecoveryThread(); + KernelRecovery(); + ~KernelRecovery(); + }; } #endif // !__FENNIX_KERNEL_RECOVERY_H__ diff --git a/kernel.h b/kernel.h index adad586..63d5523 100644 --- a/kernel.h +++ b/kernel.h @@ -5,11 +5,12 @@ #include #ifdef __cplusplus -#include #include +#include #include #include #include +#include #include #include #include @@ -31,6 +32,7 @@ extern FileSystem::Virtual *vfs; extern Driver::Driver *DriverManager; extern Disk::Manager *DiskManager; extern NetworkInterfaceManager::NetworkInterface *NIManager; +extern Recovery::KernelRecovery *RecoveryScreen; #define PEXIT(Code) TaskManager->GetCurrentProcess()->ExitCode = Code #define TEXIT(Code) TaskManager->GetCurrentThread()->ExitCode = Code