diff options
| author | Felix Morgner <felix.morgner@ost.ch> | 2026-03-26 17:15:26 +0100 |
|---|---|---|
| committer | Felix Morgner <felix.morgner@ost.ch> | 2026-03-27 07:02:35 +0100 |
| commit | aa68f53d2502e0ea81c8e9c95e37d9847cb6cb16 (patch) | |
| tree | adf2c0052dc36641e0ca81a92f2a9516110d03b0 /arch/x86_64 | |
| parent | a2834cc22b096e848448bb681ab7b517ecbe70b9 (diff) | |
| download | teachos-aa68f53d2502e0ea81c8e9c95e37d9847cb6cb16.tar.xz teachos-aa68f53d2502e0ea81c8e9c95e37d9847cb6cb16.zip | |
arch/cpu: fix interrupt dispatch
Diffstat (limited to 'arch/x86_64')
| -rw-r--r-- | arch/x86_64/src/cpu/interrupts.cpp | 34 |
1 files changed, 21 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); + } } } |
