mirror of
https://github.com/EnderIce2/Fennix.git
synced 2025-05-28 15:34:31 +00:00
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 <enderice2@protonmail.com>
This commit is contained in:
parent
793ccfd5ba
commit
b4cc1d9e66
@ -187,6 +187,8 @@ namespace Driver
|
|||||||
void FreeMemory(dev_t DriverID, void *Pointer, size_t Pages);
|
void FreeMemory(dev_t DriverID, void *Pointer, size_t Pages);
|
||||||
|
|
||||||
Manager();
|
Manager();
|
||||||
|
|
||||||
|
private:
|
||||||
~Manager();
|
~Manager();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -344,16 +344,10 @@ EXTERNC __no_stack_protector NIF void Entry(BootInfo *Info)
|
|||||||
uintptr_t KernelStack = (uintptr_t)KernelStackAddress + STACK_SIZE - 0x10;
|
uintptr_t KernelStack = (uintptr_t)KernelStackAddress + STACK_SIZE - 0x10;
|
||||||
debug("Kernel stack: %#lx-%#lx", KernelStackAddress, KernelStack);
|
debug("Kernel stack: %#lx-%#lx", KernelStackAddress, KernelStack);
|
||||||
#if defined(__amd64__)
|
#if defined(__amd64__)
|
||||||
asmv("mov %0, %%rsp"
|
asmv("mov %0, %%rsp" : : "r"(KernelStack) : "memory");
|
||||||
:
|
|
||||||
: "r"(KernelStack)
|
|
||||||
: "memory");
|
|
||||||
asmv("mov $0, %rbp");
|
asmv("mov $0, %rbp");
|
||||||
#elif defined(__i386__)
|
#elif defined(__i386__)
|
||||||
asmv("mov %0, %%esp"
|
asmv("mov %0, %%esp" : : "r"(KernelStack) : "memory");
|
||||||
:
|
|
||||||
: "r"(KernelStack)
|
|
||||||
: "memory");
|
|
||||||
asmv("mov $0, %ebp");
|
asmv("mov $0, %ebp");
|
||||||
#else
|
#else
|
||||||
#warning "Kernel stack is not set!"
|
#warning "Kernel stack is not set!"
|
||||||
@ -391,7 +385,7 @@ EXTERNC __no_stack_protector void BeforeShutdown(bool Reboot)
|
|||||||
|
|
||||||
KPrint("Unloading all drivers");
|
KPrint("Unloading all drivers");
|
||||||
if (DriverManager)
|
if (DriverManager)
|
||||||
delete DriverManager, DriverManager = nullptr;
|
DriverManager->UnloadAllDrivers();
|
||||||
|
|
||||||
KPrint("Stopping scheduling");
|
KPrint("Stopping scheduling");
|
||||||
if (TaskManager && !TaskManager->IsPanic())
|
if (TaskManager && !TaskManager->IsPanic())
|
||||||
|
Loading…
x
Reference in New Issue
Block a user