From c86b42b88659c50b6def9b5b52b4605b2a0e5d13 Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Fri, 24 Jul 2026 12:36:04 +0200 Subject: kapi/interrupts: add ISR context --- kernel/kapi/interrupts.cpp | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) (limited to 'kernel/kapi/interrupts.cpp') diff --git a/kernel/kapi/interrupts.cpp b/kernel/kapi/interrupts.cpp index 18a1b29d..c5925058 100644 --- a/kernel/kapi/interrupts.cpp +++ b/kernel/kapi/interrupts.cpp @@ -1,37 +1,42 @@ #include #include +#include #include #include #include #include +#include namespace kapi::interrupts { namespace { - auto constinit handlers = kstd::flat_map>{}; + auto constinit handlers = kstd::flat_map>>>{}; } // namespace - auto register_handler(std::uint32_t irq_number, handler & handler) -> void + auto register_handler(std::uint32_t irq_number, handler & handler, kstd::weak_ptr context) -> void { if (handlers.contains(irq_number)) { auto & handler_list = handlers.at(irq_number); - handler_list.push_back(&handler); + handler_list.push_back(std::pair{&handler, context}); } else { - handlers.emplace(irq_number, kstd::vector{&handler}); + handlers.emplace(irq_number, kstd::vector{ + std::pair{&handler, context} + }); } } 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); + auto [first, last] = + std::ranges::remove_if(handler_list, [&](auto const & entry) { return entry.first == &handler; }); handler_list.erase(first, last); } @@ -51,9 +56,9 @@ namespace kapi::interrupts return status::unhandled; } - for (auto handler : handler_list) + for (auto const & [handler, context] : handler_list) { - if (handler && handler->handle_interrupt(irq_number) == status::handled) + if (handler && handler->handle_interrupt(irq_number, context) == status::handled) { return status::handled; } -- cgit v1.2.3