diff options
| author | cpplover0 <osdev555@yandex.com> | 2026-03-12 07:23:06 +0300 |
|---|---|---|
| committer | cpplover0 <osdev555@yandex.com> | 2026-03-12 07:23:06 +0300 |
| commit | e31de642e987664a9765fb76fd782b9d7f838bda (patch) | |
| tree | 1ea6f14d0abfdc2ed601507bb28464aa0e222cd5 /kernel/src/generic/poweroff.cpp | |
| parent | a79fa41862d2f81e2a8d505fa994c16234e7e41b (diff) | |
x2apic, poweroff, nvme driver, mp, powerbutton
Diffstat (limited to 'kernel/src/generic/poweroff.cpp')
| -rw-r--r-- | kernel/src/generic/poweroff.cpp | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/kernel/src/generic/poweroff.cpp b/kernel/src/generic/poweroff.cpp new file mode 100644 index 0000000..d81b3df --- /dev/null +++ b/kernel/src/generic/poweroff.cpp @@ -0,0 +1,51 @@ +#include <cstdint> +#include <generic/poweroff.hpp> +#include <drivers/nvme.hpp> +#if defined(__x86_64__) +#include <uacpi/sleep.h> +#include <arch/x86_64/cpu/lapic.hpp> +#include <arch/x86_64/schedule_timer.hpp> +#endif +#include <generic/arch.hpp> +#include <klibc/stdio.hpp> +#include <generic/time.hpp> +#include <generic/lock/spinlock.hpp> + +void poweroff::prepare_for_shutdown() { + drivers::nvme::disable(); + klibc::printf("Poweroff: NVME is disabled\r\n"); +#if defined(__x86_64__) + x86_64::schedule_timer::off(); +#endif + locks::is_disabled = true; + klibc::printf("Poweroff: Preparing for shutdown is successful\r\n"); +} + +void poweroff::off() { + arch::disable_interrupts(); + prepare_for_shutdown(); + if(time::timer) { + klibc::printf("Poweroff: Shutdowning after 3 seconds\r\n"); + time::timer->sleep(3 * (1000 * 1000)); + } +#if defined(__x86_64__) + uacpi_prepare_for_sleep_state(UACPI_SLEEP_STATE_S5); + uacpi_enter_sleep_state(UACPI_SLEEP_STATE_S5); +#endif + klibc::printf("uhh its safe to shutdown yk\r\n"); + arch::hcf(); +} + +void poweroff::reboot() { + arch::disable_interrupts(); + prepare_for_shutdown(); + if(time::timer) { + klibc::printf("Poweroff: Rebooting after 3 seconds\r\n"); + time::timer->sleep(3 * (1000 * 1000)); + } +#if defined(__x86_64__) + uacpi_reboot(); +#endif + klibc::printf("uhh its safe to reboot yk\r\n"); + arch::hcf(); +}
\ No newline at end of file |
