diff options
| author | Felix Morgner <felix.morgner@ost.ch> | 2026-03-26 16:47:41 +0100 |
|---|---|---|
| committer | Felix Morgner <felix.morgner@ost.ch> | 2026-03-27 07:02:35 +0100 |
| commit | f4dc64976049761a6f56dd55d9d0b651f1e9475f (patch) | |
| tree | 87bbed7943f2f90505b68be5acc58f423a508ef8 /kernel | |
| parent | 00a77644192642e06462c11479a5c0e9bd859e9a (diff) | |
| download | teachos-f4dc64976049761a6f56dd55d9d0b651f1e9475f.tar.xz teachos-f4dc64976049761a6f56dd55d9d0b651f1e9475f.zip | |
kapi: move interrupt handling to kernel
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | kernel/kapi/interrupts.cpp | 45 |
2 files changed, 46 insertions, 0 deletions
diff --git a/kernel/CMakeLists.txt b/kernel/CMakeLists.txt index 9b1e2ad..535c441 100644 --- a/kernel/CMakeLists.txt +++ b/kernel/CMakeLists.txt @@ -3,6 +3,7 @@ add_executable("kernel" "kapi/boot_modules.cpp" "kapi/cio.cpp" "kapi/cpu.cpp" + "kapi/interrupts.cpp" "kapi/memory.cpp" "kapi/system.cpp" 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 |
