aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@ost.ch>2026-03-26 17:15:26 +0100
committerFelix Morgner <felix.morgner@ost.ch>2026-03-27 07:02:35 +0100
commitaa68f53d2502e0ea81c8e9c95e37d9847cb6cb16 (patch)
treeadf2c0052dc36641e0ca81a92f2a9516110d03b0
parenta2834cc22b096e848448bb681ab7b517ecbe70b9 (diff)
downloadteachos-aa68f53d2502e0ea81c8e9c95e37d9847cb6cb16.tar.xz
teachos-aa68f53d2502e0ea81c8e9c95e37d9847cb6cb16.zip
arch/cpu: fix interrupt dispatch
-rw-r--r--arch/x86_64/src/cpu/interrupts.cpp34
-rw-r--r--kernel/kapi/interrupts.cpp6
2 files changed, 27 insertions, 13 deletions
diff --git a/arch/x86_64/src/cpu/interrupts.cpp b/arch/x86_64/src/cpu/interrupts.cpp
index 2f23f07..907f289 100644
--- a/arch/x86_64/src/cpu/interrupts.cpp
+++ b/arch/x86_64/src/cpu/interrupts.cpp
@@ -134,25 +134,33 @@ namespace arch::cpu
{
auto [number, code] = frame->interrupt;
- if (number < number_of_exception_vectors && !dispatch_exception(frame))
+ if (number < number_of_exception_vectors)
{
- if (has_error_code(static_cast<exception>(number)))
+ if (!dispatch_exception(frame))
{
- kstd::println(kstd::print_sink::stderr,
- "[x86_64:CPU] Unhandled exception number {:#04x} received with code {:#04x}", number, code);
- }
- else
- {
- kstd::println(kstd::print_sink::stderr, "[x86_64:CPU] Unhandled exception number {:#04x} received", number);
+ if (has_error_code(static_cast<exception>(number)))
+ {
+ kstd::println(kstd::print_sink::stderr,
+ "[x86_64:CPU] Unhandled exception number {:#04x} received with code {:#04x}", number, code);
+ }
+ else
+ {
+ kstd::println(kstd::print_sink::stderr, "[x86_64:CPU] Unhandled exception number {:#04x} received", number);
+ }
}
}
- else if (number >= number_of_exception_vectors &&
- kapi::interrupts::dispatch(number) == kapi::interrupts::status::unhandled)
+ else
{
- kstd::println(kstd::print_sink::stderr, "[x86_64:CPU] Unhandled interrupt {:#04x}", number);
- }
+ auto irq_number = number - number_of_exception_vectors;
- acknowledge_pic_interrupt(frame);
+ if (kapi::interrupts::dispatch(irq_number) == kapi::interrupts::status::unhandled)
+ {
+ kstd::println(kstd::print_sink::stderr, "[x86_64:CPU] Unhandled interrupt {:#04x} (IRQ{})", number,
+ irq_number);
+ }
+
+ acknowledge_pic_interrupt(frame);
+ }
}
}
diff --git a/kernel/kapi/interrupts.cpp b/kernel/kapi/interrupts.cpp
index e79453a..27427bb 100644
--- a/kernel/kapi/interrupts.cpp
+++ b/kernel/kapi/interrupts.cpp
@@ -31,6 +31,12 @@ namespace kapi::interrupts
{
auto & handler_list = handlers.at(irq_number);
+ if (handler_list.empty())
+ {
+ kstd::println(kstd::print_sink::stderr, "[OS:interrupts] No handler for IRQ{}", irq_number);
+ return status::unhandled;
+ }
+
for (auto handler : handler_list)
{
if (handler && handler->handle_interrupt(irq_number) == status::handled)