#include "kapi/interrupts.hpp" #include #include #include #include namespace kapi::interrupts { namespace { auto constinit handlers = std::array, 256>{}; } // namespace auto register_handler(std::uint32_t irq_number, handler & handler) -> void { auto & handler_list = handlers.at(irq_number); handler_list.push_back(&handler); } auto unregister_handler(std::uint32_t irq_number, handler & handler) -> void { static_cast(irq_number); static_cast(handler); kstd::println("[OS:interrupts] TODO: support erasure from vector."); } auto dispatch(std::uint32_t irq_number) -> status { auto & handler_list = handlers.at(irq_number); if (handler_list.empty()) { kstd::println(kstd::print_sink::stderr, "[OS:interrupts] No handler for IRQ{}", irq_number); return status::unhandled; } for (auto handler : handler_list) { if (handler && handler->handle_interrupt(irq_number) == status::handled) { return status::handled; } } return status::unhandled; } } // namespace kapi::interrupts