From b4cc1d9e668de30bf0a592095399c0f30a8c6c3d Mon Sep 17 00:00:00 2001 From: EnderIce2 Date: Thu, 6 Mar 2025 13:38:42 +0000 Subject: [PATCH] fix(kernel): crash on ACPI shutdown/reboot The deletion of DriverManager invalidates "DriverManager->GlobalKeyboardInputReports" which results in a crash if other processes are waiting for keyboard input. Signed-off-by: EnderIce2 --- Kernel/include/driver.hpp | 2 ++ Kernel/kernel.cpp | 12 +++--------- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/Kernel/include/driver.hpp b/Kernel/include/driver.hpp index 733866cd..9ff36056 100644 --- a/Kernel/include/driver.hpp +++ b/Kernel/include/driver.hpp @@ -187,6 +187,8 @@ namespace Driver void FreeMemory(dev_t DriverID, void *Pointer, size_t Pages); Manager(); + + private: ~Manager(); }; diff --git a/Kernel/kernel.cpp b/Kernel/kernel.cpp index a64f08b6..09183d1e 100644 --- a/Kernel/kernel.cpp +++ b/Kernel/kernel.cpp @@ -344,16 +344,10 @@ EXTERNC __no_stack_protector NIF void Entry(BootInfo *Info) uintptr_t KernelStack = (uintptr_t)KernelStackAddress + STACK_SIZE - 0x10; debug("Kernel stack: %#lx-%#lx", KernelStackAddress, KernelStack); #if defined(__amd64__) - asmv("mov %0, %%rsp" - : - : "r"(KernelStack) - : "memory"); + asmv("mov %0, %%rsp" : : "r"(KernelStack) : "memory"); asmv("mov $0, %rbp"); #elif defined(__i386__) - asmv("mov %0, %%esp" - : - : "r"(KernelStack) - : "memory"); + asmv("mov %0, %%esp" : : "r"(KernelStack) : "memory"); asmv("mov $0, %ebp"); #else #warning "Kernel stack is not set!" @@ -391,7 +385,7 @@ EXTERNC __no_stack_protector void BeforeShutdown(bool Reboot) KPrint("Unloading all drivers"); if (DriverManager) - delete DriverManager, DriverManager = nullptr; + DriverManager->UnloadAllDrivers(); KPrint("Stopping scheduling"); if (TaskManager && !TaskManager->IsPanic())