#include "kapi/cpu.hpp" #include "kapi/devices.hpp" #include "kapi/system.hpp" #include "kernel/devices/cpu.hpp" #include #include #include #include #include namespace kapi::cpu { namespace { 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."); } } // namespace auto dispatch(exception const & context) -> bool { 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; } } auto core_detected(kapi::devices::bus & bus, std::size_t major, std::size_t minor, std::uint64_t hardware_id, bool is_bsp, kstd::unique_ptr core_interrupt_controller) -> bool { auto core = kstd::make_unique(major, minor, hardware_id, is_bsp); core->add_child(std::move(core_interrupt_controller)); bus.add_child(std::move(core)); return true; } } // namespace kapi::cpu