aboutsummaryrefslogtreecommitdiff
path: root/arch/x86_64/src/cpu/interrupts.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86_64/src/cpu/interrupts.cpp')
-rw-r--r--arch/x86_64/src/cpu/interrupts.cpp20
1 files changed, 18 insertions, 2 deletions
diff --git a/arch/x86_64/src/cpu/interrupts.cpp b/arch/x86_64/src/cpu/interrupts.cpp
index 19cf6f4..2eec026 100644
--- a/arch/x86_64/src/cpu/interrupts.cpp
+++ b/arch/x86_64/src/cpu/interrupts.cpp
@@ -13,7 +13,11 @@ namespace arch::cpu
namespace
{
- constexpr auto isr_code_PF = 14;
+ constexpr auto isr_number_page_fault = 0x0e;
+ constexpr auto isr_number_legacy_start = 0x20;
+ constexpr auto isr_number_legacy_end = 0x29;
+ constexpr auto isr_number_cascade_start = 0x2c;
+ constexpr auto isr_number_cascade_end = 0x2f;
auto handle_page_fault(interrupt_frame * frame) -> void
{
@@ -34,6 +38,11 @@ namespace arch::cpu
kapi::cpu::halt();
}
+
+ auto handle_legacy_interrupt(interrupt_frame * frame) -> void
+ {
+ kstd::println("[x86_64:SYS] Ignoring 8259 legacy interrupt {}", frame->interrupt.number);
+ }
} // namespace
extern "C"
@@ -42,9 +51,16 @@ namespace arch::cpu
auto interrupt_dispatch(interrupt_frame * frame) -> void
{
+ if ((frame->interrupt.number >= isr_number_legacy_start && frame->interrupt.number <= isr_number_legacy_end) ||
+ (frame->interrupt.number >= isr_number_cascade_start && frame->interrupt.number <= isr_number_cascade_end))
+ {
+ handle_legacy_interrupt(frame);
+ return;
+ }
+
switch (frame->interrupt.number)
{
- case isr_code_PF:
+ case isr_number_page_fault:
handle_page_fault(frame);
break;
default: