summaryrefslogtreecommitdiff
path: root/kernel/src/generic/poweroff.cpp
diff options
context:
space:
mode:
authorcpplover0 <osdev555@yandex.com>2026-03-12 07:23:06 +0300
committercpplover0 <osdev555@yandex.com>2026-03-12 07:23:06 +0300
commite31de642e987664a9765fb76fd782b9d7f838bda (patch)
tree1ea6f14d0abfdc2ed601507bb28464aa0e222cd5 /kernel/src/generic/poweroff.cpp
parenta79fa41862d2f81e2a8d505fa994c16234e7e41b (diff)
x2apic, poweroff, nvme driver, mp, powerbutton
Diffstat (limited to 'kernel/src/generic/poweroff.cpp')
-rw-r--r--kernel/src/generic/poweroff.cpp51
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