Kernel: Reboot will now always succeed

If acpi reset fails, we forcefully trigger a triple fault to restart
the system.
This commit is contained in:
Bananymous 2023-09-28 12:48:52 +03:00
parent 79851394b3
commit 547eabb403
3 changed files with 25 additions and 1 deletions

View File

@ -424,4 +424,14 @@ namespace IDT
flush_idt();
}
[[noreturn]] void force_triple_fault()
{
// load 0 sized IDT and trigger an interrupt to force triple fault
asm volatile("cli");
s_idtr.size = 0;
flush_idt();
asm volatile("int $0x00");
ASSERT_NOT_REACHED();
}
}

View File

@ -9,5 +9,6 @@ namespace IDT
void initialize();
void register_irq_handler(uint8_t irq, void(*f)());
[[noreturn]] void force_triple_fault();
}

View File

@ -3,6 +3,7 @@
#include <kernel/CriticalScope.h>
#include <kernel/FS/DevFS/FileSystem.h>
#include <kernel/FS/VirtualFileSystem.h>
#include <kernel/IDT.h>
#include <kernel/InterruptController.h>
#include <kernel/LockGuard.h>
#include <kernel/Memory/Heap.h>
@ -776,6 +777,18 @@ namespace Kernel
return 0;
}
[[noreturn]] static void reset_system()
{
lai_acpi_reset();
// acpi reset did not work
dwarnln("Could not reset with ACPI, crashing the cpu");
// reset through triple fault
IDT::force_triple_fault();
}
BAN::ErrorOr<long> Process::sys_poweroff(int command)
{
if (command != POWEROFF_REBOOT && command != POWEROFF_SHUTDOWN)
@ -789,7 +802,7 @@ namespace Kernel
switch (command)
{
case POWEROFF_REBOOT:
error = lai_acpi_reset();
reset_system();
break;
case POWEROFF_SHUTDOWN:
error = lai_enter_sleep(5);