aboutsummaryrefslogtreecommitdiff
path: root/kernel/kapi
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@ost.ch>2026-03-27 07:05:05 +0100
committerFelix Morgner <felix.morgner@ost.ch>2026-03-27 07:05:05 +0100
commit3070bb45b9741165d786b2c5a018ee55c1a82db8 (patch)
tree774dd9361ab4ad87b9fa57a4216d30eaa1007be6 /kernel/kapi
parent11c6d57e013832983bcd9bb965d470bf4c282ab6 (diff)
downloadteachos-3070bb45b9741165d786b2c5a018ee55c1a82db8.tar.xz
teachos-3070bb45b9741165d786b2c5a018ee55c1a82db8.zip
kernel/interrupts: switch to flat_map for dispatch
Diffstat (limited to 'kernel/kapi')
-rw-r--r--kernel/kapi/interrupts.cpp21
1 files changed, 17 insertions, 4 deletions
diff --git a/kernel/kapi/interrupts.cpp b/kernel/kapi/interrupts.cpp
index e172e70..0e37bc3 100644
--- a/kernel/kapi/interrupts.cpp
+++ b/kernel/kapi/interrupts.cpp
@@ -1,10 +1,10 @@
#include "kapi/interrupts.hpp"
+#include <kstd/flat_map>
#include <kstd/print>
#include <kstd/vector>
#include <algorithm>
-#include <array>
#include <cstdint>
namespace kapi::interrupts
@@ -12,13 +12,20 @@ namespace kapi::interrupts
namespace
{
- auto constinit handlers = std::array<kstd::vector<handler *>, 256>{};
+ auto constinit handlers = kstd::flat_map<std::uint32_t, kstd::vector<handler *>>{};
} // namespace
auto register_handler(std::uint32_t irq_number, handler & handler) -> void
{
- auto & handler_list = handlers.at(irq_number);
- handler_list.push_back(&handler);
+ if (handlers.contains(irq_number))
+ {
+ auto & handler_list = handlers.at(irq_number);
+ handler_list.push_back(&handler);
+ }
+ else
+ {
+ handlers.emplace(irq_number, kstd::vector{&handler});
+ }
}
auto unregister_handler(std::uint32_t irq_number, handler & handler) -> void
@@ -30,6 +37,12 @@ namespace kapi::interrupts
auto dispatch(std::uint32_t irq_number) -> status
{
+ if (!handlers.contains(irq_number))
+ {
+ kstd::println(kstd::print_sink::stderr, "[OS:interrupts] No handler for IRQ{}", irq_number);
+ return status::unhandled;
+ }
+
auto & handler_list = handlers.at(irq_number);
if (handler_list.empty())