diff options
| author | Felix Morgner <felix.morgner@ost.ch> | 2026-03-26 16:35:32 +0100 |
|---|---|---|
| committer | Felix Morgner <felix.morgner@ost.ch> | 2026-03-27 07:02:35 +0100 |
| commit | 00a77644192642e06462c11479a5c0e9bd859e9a (patch) | |
| tree | d86cee8a0d7f4d2894ced16614fcd4554e10c327 /arch/x86_64 | |
| parent | 2521d58e7a5c16595e401e1af7becb572ad35f53 (diff) | |
| download | teachos-00a77644192642e06462c11479a5c0e9bd859e9a.tar.xz teachos-00a77644192642e06462c11479a5c0e9bd859e9a.zip | |
kapi: extract interrupts API
Diffstat (limited to 'arch/x86_64')
| -rw-r--r-- | arch/x86_64/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | arch/x86_64/kapi/interrupts.cpp (renamed from arch/x86_64/kapi/cpu/interrupts.cpp) | 23 | ||||
| -rw-r--r-- | arch/x86_64/src/cpu/interrupts.cpp | 3 |
3 files changed, 15 insertions, 13 deletions
diff --git a/arch/x86_64/CMakeLists.txt b/arch/x86_64/CMakeLists.txt index 8ff81d8..4427e4c 100644 --- a/arch/x86_64/CMakeLists.txt +++ b/arch/x86_64/CMakeLists.txt @@ -15,7 +15,7 @@ target_sources("x86_64" PRIVATE "kapi/boot_modules.cpp" "kapi/cio.cpp" "kapi/cpu.cpp" - "kapi/cpu/interrupts.cpp" + "kapi/interrupts.cpp" "kapi/memory.cpp" "kapi/system.cpp" diff --git a/arch/x86_64/kapi/cpu/interrupts.cpp b/arch/x86_64/kapi/interrupts.cpp index b98595c..babc926 100644 --- a/arch/x86_64/kapi/cpu/interrupts.cpp +++ b/arch/x86_64/kapi/interrupts.cpp @@ -1,4 +1,5 @@ -#include "kapi/cpu.hpp" +#include "kapi/interrupts.hpp" + #include "kapi/system.hpp" #include <kstd/print> @@ -7,36 +8,36 @@ #include <array> #include <cstdint> -namespace kapi::cpu +namespace kapi::interrupts { namespace { constexpr auto irq_offset = 32uz; - auto constinit interrupt_handlers = std::array<kstd::vector<interrupt_handler *>, 256 - irq_offset>{}; + auto constinit handlers = std::array<kstd::vector<handler *>, 256 - irq_offset>{}; } // namespace - auto enable_interrupts() -> void + auto enable() -> void { asm volatile("sti"); } - auto disable_interrupts() -> void + auto disable() -> void { asm volatile("cli"); } - auto register_interrupt_handler(std::uint32_t irq_number, interrupt_handler & handler) -> void + 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]."); } - interrupt_handlers[irq_number - irq_offset].push_back(&handler); + handlers[irq_number - irq_offset].push_back(&handler); } - auto unregister_interrupt_handler(std::uint32_t irq_number, [[maybe_unused]] interrupt_handler & handler) -> void + auto unregister_handler(std::uint32_t irq_number, [[maybe_unused]] handler & handler) -> void { if (irq_number < irq_offset) { @@ -46,14 +47,14 @@ namespace kapi::cpu kstd::println("[x86_64:CPU] TODO: support erasure from vector."); } - auto dispatch_interrupt(std::uint32_t irq_number) -> status + auto dispatch(std::uint32_t irq_number) -> status { if (irq_number < irq_offset) { return status::unhandled; } - for (auto handler : interrupt_handlers[irq_number - irq_offset]) + for (auto handler : handlers[irq_number - irq_offset]) { if (handler && handler->handle_interrupt(irq_number) == status::handled) { @@ -64,4 +65,4 @@ namespace kapi::cpu return status::unhandled; } -} // namespace kapi::cpu
\ No newline at end of file +} // namespace kapi::interrupts
\ No newline at end of file diff --git a/arch/x86_64/src/cpu/interrupts.cpp b/arch/x86_64/src/cpu/interrupts.cpp index 9ee3ce8..2f23f07 100644 --- a/arch/x86_64/src/cpu/interrupts.cpp +++ b/arch/x86_64/src/cpu/interrupts.cpp @@ -1,6 +1,7 @@ #include "arch/cpu/interrupts.hpp" #include "kapi/cpu.hpp" +#include "kapi/interrupts.hpp" #include "kapi/memory.hpp" #include "arch/cpu/legacy_pic.hpp" @@ -146,7 +147,7 @@ namespace arch::cpu } } else if (number >= number_of_exception_vectors && - kapi::cpu::dispatch_interrupt(number) == kapi::cpu::status::unhandled) + kapi::interrupts::dispatch(number) == kapi::interrupts::status::unhandled) { kstd::println(kstd::print_sink::stderr, "[x86_64:CPU] Unhandled interrupt {:#04x}", number); } |
