#include "kernel/cpu.hpp" #include "kapi/cpu.hpp" #include "kapi/system.hpp" #include namespace kernel::cpu { namespace { struct exception_handler : kapi::cpu::exception_handler { auto handle(kapi::cpu::exception const & context) -> bool override { kstd::println(kstd::print_sink::stderr, "[OS:CPU] {} @ {:#018x}", context.type, context.instruction_pointer); switch (context.type) { case kapi::cpu::exception::type::page_fault: return handle_page_fault(context); default: return false; } } private: auto handle_page_fault(kapi::cpu::exception const & context) -> bool { kstd::println(kstd::print_sink::stderr, "\tFault address: {:#018x}", context.access_address); kstd::println(kstd::print_sink::stderr, "\tPresent: {}", context.is_present); kstd::println(kstd::print_sink::stderr, "\tWrite: {}", context.is_write_access); kstd::println(kstd::print_sink::stderr, "\tUser: {}", context.is_user_mode); kapi::system::panic("Halting the system due to an unrecoverable page fault."); } } static constinit handler; } // namespace auto init() -> void { kapi::cpu::set_exception_handler(handler); } } // namespace kernel::cpu