aboutsummaryrefslogtreecommitdiff
path: root/kernel/kapi/interrupts.cpp
diff options
context:
space:
mode:
authorLukas Oesch <lukas.oesch@ost.ch>2026-06-10 10:40:46 +0200
committerLukas Oesch <lukas.oesch@ost.ch>2026-06-10 10:40:46 +0200
commit33abd5cf264cb9e34121082105b0bc17b3cf7a36 (patch)
tree36b15d53fea04f4f9d9af817100f7ad013bd9b5c /kernel/kapi/interrupts.cpp
parentd01caf1c4aef3c89c68b9d1cc9fe56445f0860b5 (diff)
parent7e27130c342b7299a1d2188a7192a7f17b5ac2ad (diff)
downloadkernel-33abd5cf264cb9e34121082105b0bc17b3cf7a36.tar.xz
kernel-33abd5cf264cb9e34121082105b0bc17b3cf7a36.zip
Merge branch 'develop-BA-FS26' into 'develop'HEADdevelop
Merge of BA-FS26 branch into develop See merge request teachos/kernel!49
Diffstat (limited to 'kernel/kapi/interrupts.cpp')
-rw-r--r--kernel/kapi/interrupts.cpp65
1 files changed, 65 insertions, 0 deletions
diff --git a/kernel/kapi/interrupts.cpp b/kernel/kapi/interrupts.cpp
new file mode 100644
index 0000000..4efcaa3
--- /dev/null
+++ b/kernel/kapi/interrupts.cpp
@@ -0,0 +1,65 @@
+#include <kapi/interrupts.hpp>
+
+#include <kstd/flat_map>
+#include <kstd/print>
+#include <kstd/vector>
+
+#include <algorithm>
+#include <cstdint>
+
+namespace kapi::interrupts
+{
+
+ namespace
+ {
+ auto constinit handlers = kstd::flat_map<std::uint32_t, kstd::vector<handler *>>{};
+ } // namespace
+
+ auto register_handler(std::uint32_t irq_number, handler & handler) -> void
+ {
+ 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
+ {
+ auto & handler_list = handlers.at(irq_number);
+ auto [first, last] = std::ranges::remove(handler_list, &handler);
+ handler_list.erase(first, last);
+ }
+
+ 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())
+ {
+ 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 \ No newline at end of file