aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@ost.ch>2026-03-26 16:47:41 +0100
committerFelix Morgner <felix.morgner@ost.ch>2026-03-27 07:02:35 +0100
commitf4dc64976049761a6f56dd55d9d0b651f1e9475f (patch)
tree87bbed7943f2f90505b68be5acc58f423a508ef8
parent00a77644192642e06462c11479a5c0e9bd859e9a (diff)
downloadteachos-f4dc64976049761a6f56dd55d9d0b651f1e9475f.tar.xz
teachos-f4dc64976049761a6f56dd55d9d0b651f1e9475f.zip
kapi: move interrupt handling to kernel
-rw-r--r--arch/x86_64/kapi/interrupts.cpp52
-rw-r--r--kapi/include/kapi/interrupts.hpp6
-rw-r--r--kernel/CMakeLists.txt1
-rw-r--r--kernel/kapi/interrupts.cpp45
4 files changed, 49 insertions, 55 deletions
diff --git a/arch/x86_64/kapi/interrupts.cpp b/arch/x86_64/kapi/interrupts.cpp
index babc926..cf1defa 100644
--- a/arch/x86_64/kapi/interrupts.cpp
+++ b/arch/x86_64/kapi/interrupts.cpp
@@ -1,22 +1,8 @@
#include "kapi/interrupts.hpp"
-#include "kapi/system.hpp"
-
-#include <kstd/print>
-#include <kstd/vector>
-
-#include <array>
-#include <cstdint>
-
namespace kapi::interrupts
{
- namespace
- {
- constexpr auto irq_offset = 32uz;
- auto constinit handlers = std::array<kstd::vector<handler *>, 256 - irq_offset>{};
- } // namespace
-
auto enable() -> void
{
asm volatile("sti");
@@ -27,42 +13,4 @@ namespace kapi::interrupts
asm volatile("cli");
}
- auto register_handler(std::uint32_t irq_number, handler & handler) -> void
- {
- if (irq_number < irq_offset)
- {
- system::panic("[x86_64:CPU] IRQ number must be in range [32, 255].");
- }
-
- handlers[irq_number - irq_offset].push_back(&handler);
- }
-
- auto unregister_handler(std::uint32_t irq_number, [[maybe_unused]] handler & handler) -> void
- {
- if (irq_number < irq_offset)
- {
- system::panic("[x86_64:CPU] IRQ number must be in range [32, 255].");
- }
-
- kstd::println("[x86_64:CPU] TODO: support erasure from vector.");
- }
-
- auto dispatch(std::uint32_t irq_number) -> status
- {
- if (irq_number < irq_offset)
- {
- return status::unhandled;
- }
-
- for (auto handler : handlers[irq_number - irq_offset])
- {
- if (handler && handler->handle_interrupt(irq_number) == status::handled)
- {
- return status::handled;
- }
- }
-
- return status::unhandled;
- }
-
} // namespace kapi::interrupts \ No newline at end of file
diff --git a/kapi/include/kapi/interrupts.hpp b/kapi/include/kapi/interrupts.hpp
index fa4bc95..f72ef8c 100644
--- a/kapi/include/kapi/interrupts.hpp
+++ b/kapi/include/kapi/interrupts.hpp
@@ -35,21 +35,21 @@ namespace kapi::interrupts
//! Disable external interrupts.
auto disable() -> void;
- //! @qualifier platform-defined
+ //! @qualifier kernel-defined
//! Register an interrupt handler for the given IRQ number.
//!
//! @param irq_number The IRQ number to register the handler for.
//! @param handler The interrupt handler to register.
auto register_handler(std::uint32_t irq_number, handler & handler) -> void;
- //! @qualifier platform-defined
+ //! @qualifier kernel-defined
//! Unregister a previously registered interrupt handler.
//!
//! @param irq_number The IRQ number to unregister the handler for.
//! @param handler The interrupt handler to unregister.
auto unregister_handler(std::uint32_t irq_number, handler & handler) -> void;
- //! @qualifier platform-defined
+ //! @qualifier kernel-defined
//! Dispatch an interrupt to all registered handlers.
//!
//! @param irq_number The IRQ number to dispatch.
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