aboutsummaryrefslogtreecommitdiff
path: root/kernel/kapi/interrupts.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/kapi/interrupts.cpp')
-rw-r--r--kernel/kapi/interrupts.cpp45
1 files changed, 45 insertions, 0 deletions
diff --git a/kernel/kapi/interrupts.cpp b/kernel/kapi/interrupts.cpp
new file mode 100644
index 0000000..e79453a
--- /dev/null
+++ b/kernel/kapi/interrupts.cpp
@@ -0,0 +1,45 @@
+#include "kapi/interrupts.hpp"
+
+#include <kstd/print>
+#include <kstd/vector>
+
+#include <array>
+#include <cstdint>
+
+namespace kapi::interrupts
+{
+
+ namespace
+ {
+ auto constinit handlers = std::array<kstd::vector<handler *>, 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<void>(irq_number);
+ static_cast<void>(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);
+
+ 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