From 2ee21dea05e53c81cffdc5049fa1c8ccd225bd5e Mon Sep 17 00:00:00 2001 From: zxq5 Date: Sat, 22 Feb 2025 03:19:05 +0000 Subject: [PATCH] did interrupts stuff --- Cargo.lock | 10 ++++ Cargo.toml | 2 +- kernel/Cargo.toml | 1 + kernel/src/arch/x86_64/interrupts.rs | 79 +++++++++++++++++++++++++++- kernel/src/arch/x86_64/mod.rs | 4 ++ kernel/src/lib.rs | 6 +++ kernel/src/main.rs | 11 +++- lib/lib_application | 2 +- lib/lib_ascii | 2 +- lib/lib_serial | 2 +- 10 files changed, 112 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4d3f2cc..d36daaf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11,6 +11,7 @@ dependencies = [ "lib_framebuffer", "lib_serial", "limine", + "pic8259", "spin", "x86_64", ] @@ -104,6 +105,15 @@ dependencies = [ "scopeguard", ] +[[package]] +name = "pic8259" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62d9a86c292b165f757e47e7fd66855def189b2564609bc4203727b27c33db22" +dependencies = [ + "x86_64", +] + [[package]] name = "rustversion" version = "1.0.19" diff --git a/Cargo.toml b/Cargo.toml index 0d17198..c740bdd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,7 +21,7 @@ incremental = false codegen-units = 1 [profile.release] -opt-level = "z" +opt-level = 3 debug = false debug-assertions = false overflow-checks = false diff --git a/kernel/Cargo.toml b/kernel/Cargo.toml index 2619042..1b94af6 100644 --- a/kernel/Cargo.toml +++ b/kernel/Cargo.toml @@ -10,6 +10,7 @@ lib_serial = { path = "../lib/lib_serial" } lib_ascii = { path = "../lib/lib_ascii" } x86_64 = "0.15.2" spin = "0.9.8" +pic8259 = "0.11.0" [build-dependencies] cc = "1.2.14" diff --git a/kernel/src/arch/x86_64/interrupts.rs b/kernel/src/arch/x86_64/interrupts.rs index 9f4d82a..234915f 100644 --- a/kernel/src/arch/x86_64/interrupts.rs +++ b/kernel/src/arch/x86_64/interrupts.rs @@ -1,18 +1,95 @@ use lib_ascii::println_log; +use lib_serial::serial_println; +use x86_64::instructions::port::Port; use x86_64::structures::idt::{InterruptDescriptorTable, InterruptStackFrame}; -use spin::Lazy; +use pic8259::ChainedPics; +use spin::{Lazy, Mutex}; static IDT: Lazy = Lazy::new(|| { let mut idt = InterruptDescriptorTable::new(); idt.breakpoint.set_handler_fn(breakpoint_handler); + idt.double_fault.set_handler_fn(double_fault_handler); + idt.general_protection_fault + .set_handler_fn(general_protection_fault_handler); + + idt[InterruptIndex::Timer.as_u8()].set_handler_fn(timer_interrupt_handler); + idt[InterruptIndex::Keyboard.as_u8()].set_handler_fn(keyboard_interrupt_handler); idt }); +<<<<<<< Updated upstream +======= +pub const PIC_1_OFFSET: u8 = 32; +pub const PIC_2_OFFSET: u8 = PIC_1_OFFSET + 8; + +pub static PICS: Mutex = + Mutex::new(unsafe { ChainedPics::new(PIC_1_OFFSET, PIC_2_OFFSET) }); + +#[derive(Debug, Clone, Copy)] +#[repr(u8)] +pub enum InterruptIndex { + Timer = PIC_1_OFFSET, + Keyboard, +} + +impl InterruptIndex { + fn as_u8(self) -> u8 { + self as u8 + } + + fn _as_usize(self) -> usize { + usize::from(self.as_u8()) + } +} + +>>>>>>> Stashed changes pub fn init_idt() { IDT.load(); + unsafe { + PICS.lock().initialize(); + PICS.lock().write_masks(0xfc, 0xff); + } } extern "x86-interrupt" fn breakpoint_handler(stack_frame: InterruptStackFrame) { +<<<<<<< Updated upstream println_log!("Exception: Breakpoint\n{:#?}", stack_frame); } +======= + serial_println!("Exception: Breakpoint\n{:#?}", stack_frame); + println_log!("Exception: Breakpoint\n{:#?}", stack_frame); +} + +extern "x86-interrupt" fn general_protection_fault_handler( + stack_frame: InterruptStackFrame, + _error_code: u64, +) { + serial_println!("Exception: General Protection Fault\n{:#?}", stack_frame); + panic!("Exception: General Protection Fault\n{:#?}", stack_frame); +} + +extern "x86-interrupt" fn double_fault_handler( + stack_frame: InterruptStackFrame, + _error_code: u64, +) -> ! { + serial_println!("Exception: Double Fault\n{:#?}", stack_frame); + panic!("Exception: Double Fault\n{:#?}", stack_frame); +} + +extern "x86-interrupt" fn keyboard_interrupt_handler(_stack_frame: InterruptStackFrame) { + let mut port = Port::new(0x60); + let _scancode: u8 = unsafe { port.read() }; + unsafe { + PICS.lock() + .notify_end_of_interrupt(InterruptIndex::Keyboard.as_u8()); + } +} + +extern "x86-interrupt" fn timer_interrupt_handler(_stack_frame: InterruptStackFrame) { + unsafe { + PICS.lock() + .notify_end_of_interrupt(InterruptIndex::Timer.as_u8()); + } +} +>>>>>>> Stashed changes diff --git a/kernel/src/arch/x86_64/mod.rs b/kernel/src/arch/x86_64/mod.rs index 136e70b..7bd6bd6 100644 --- a/kernel/src/arch/x86_64/mod.rs +++ b/kernel/src/arch/x86_64/mod.rs @@ -1 +1,5 @@ +<<<<<<< Updated upstream +======= +pub mod gdt; +>>>>>>> Stashed changes pub mod interrupts; diff --git a/kernel/src/lib.rs b/kernel/src/lib.rs index 3ea6f29..c2b3037 100644 --- a/kernel/src/lib.rs +++ b/kernel/src/lib.rs @@ -1,6 +1,7 @@ #![no_std] #![feature(abi_x86_interrupt)] +use arch::x86_64::interrupts; use core::arch::asm; use limine::request::{RequestsEndMarker, RequestsStartMarker}; use limine::BaseRevision; @@ -54,5 +55,10 @@ pub fn boot() -> Result<(), &'static str> { lib_serial::init()?; arch::x86_64::interrupts::init_idt(); +<<<<<<< Updated upstream +======= + x86_64::instructions::interrupts::enable(); + +>>>>>>> Stashed changes Ok(()) } diff --git a/kernel/src/main.rs b/kernel/src/main.rs index 5e64b54..6dbd439 100644 --- a/kernel/src/main.rs +++ b/kernel/src/main.rs @@ -14,8 +14,6 @@ unsafe extern "C" fn kmain() -> ! { let dimensions2 = lib_framebuffer::screensize_px(); println_log!(" [ Initialising ] "); - x86_64::instructions::interrupts::int3(); - println!("Dimensions: {}x{} (px)", dimensions2.0, dimensions2.1); println!("Dimensions: {}x{} (chars)", dimensions.0, dimensions.1); @@ -39,6 +37,15 @@ unsafe extern "C" fn kmain() -> ! { \\______/ \\______/ \\_/ \\______| " ); +<<<<<<< Updated upstream +======= + + // for i in 0..100000 { + // println!("{}", i); + // } + + loop {} +>>>>>>> Stashed changes FoundryOS::hcf(); } diff --git a/lib/lib_application b/lib/lib_application index 4b1c606..df1cbd1 160000 --- a/lib/lib_application +++ b/lib/lib_application @@ -1 +1 @@ -Subproject commit 4b1c60676a2f67c2f95139ef2820238cdcbbf19e +Subproject commit df1cbd1170723ad75045052dec5b2641fb154591 diff --git a/lib/lib_ascii b/lib/lib_ascii index d48792e..fefe217 160000 --- a/lib/lib_ascii +++ b/lib/lib_ascii @@ -1 +1 @@ -Subproject commit d48792ecd011f88acb84e93e2e2ba33ac2598a72 +Subproject commit fefe217980e5535bfb9de4de1dbc84db3def93ae diff --git a/lib/lib_serial b/lib/lib_serial index 6731ed5..a3b0bf0 160000 --- a/lib/lib_serial +++ b/lib/lib_serial @@ -1 +1 @@ -Subproject commit 6731ed5ef601201f746946f4c0eea90050414f2a +Subproject commit a3b0bf0bdbe60c53b930ff13d251e50ed8895f78