aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arch/x86_64/src/cpu/initialization.cpp8
-rw-r--r--arch/x86_64/src/cpu/interrupts.cpp20
2 files changed, 20 insertions, 8 deletions
diff --git a/arch/x86_64/src/cpu/initialization.cpp b/arch/x86_64/src/cpu/initialization.cpp
index 85da38d..5f4703d 100644
--- a/arch/x86_64/src/cpu/initialization.cpp
+++ b/arch/x86_64/src/cpu/initialization.cpp
@@ -144,9 +144,8 @@ namespace arch::cpu
constexpr auto pic_cascade_address = std::uint8_t{0x04};
constexpr auto pic_cascade_slave_identity = std::uint8_t{0x02};
constexpr auto pic_use_8086_mode = std::uint8_t{0x01};
- constexpr auto pic_master_mask = std::uint8_t{0xfb};
- constexpr auto pic_slave_mask = std::uint8_t{0xff};
- constexpr auto pic_timer_mask = std::uint8_t{0x01};
+ constexpr auto pic_master_mask = std::uint8_t{0x00};
+ constexpr auto pic_slave_mask = std::uint8_t{0x00};
pic_master_control_port::write(pic_init_command);
pic_slave_control_port::write(pic_init_command);
@@ -162,9 +161,6 @@ namespace arch::cpu
pic_master_data_port::write(pic_master_mask);
pic_slave_data_port::write(pic_slave_mask);
-
- auto const current_master_mask = pic_master_data_port::read();
- pic_master_data_port::write<std::uint8_t>(current_master_mask | pic_timer_mask);
}
} // namespace arch::cpu
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: