From bdf28e38f4b4b60b4c59ccb888eb525382a4c1d5 Mon Sep 17 00:00:00 2001 From: Julien CLEMENT Date: Thu, 21 Apr 2022 16:28:08 +0200 Subject: [PATCH] feat(interrupts): refactor pic in dedicated module Signed-off-by: Julien CLEMENT --- src/{interrupts.rs => interrupts/mod.rs} | 66 ++-------------------- src/interrupts/pic/mod.rs | 71 ++++++++++++++++++++++++ 2 files changed, 75 insertions(+), 62 deletions(-) rename src/{interrupts.rs => interrupts/mod.rs} (51%) create mode 100644 src/interrupts/pic/mod.rs diff --git a/src/interrupts.rs b/src/interrupts/mod.rs similarity index 51% rename from src/interrupts.rs rename to src/interrupts/mod.rs index bb06b40..e5f5dd5 100644 --- a/src/interrupts.rs +++ b/src/interrupts/mod.rs @@ -1,39 +1,13 @@ use crate::gdt; use crate::hlt_loop; use crate::vga::{self, Color, ColorCode}; -use crate::{print, println}; +use crate::{println}; use lazy_static::lazy_static; -use pc_keyboard::{layouts, DecodedKey, HandleControl, Keyboard, ScancodeSet1}; -use pic8259::ChainedPics; -use spin::{self, Mutex}; -use x86_64::instructions::port::Port; use x86_64::structures::idt::PageFaultErrorCode; use x86_64::structures::idt::{InterruptDescriptorTable, InterruptStackFrame}; +use pic::{InterruptIndex, init_pic, keyboard_interrupt_handler, timer_interrupt_handler}; -pub const PIC_1_OFFSET: u8 = 32; -pub const PIC_2_OFFSET: u8 = PIC_1_OFFSET + 8; - -pub const PS2_CONTROLLER_PORT: u16 = 0x60; - -#[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()) - } -} - -pub static PICS: spin::Mutex = - spin::Mutex::new(unsafe { ChainedPics::new(PIC_1_OFFSET, PIC_2_OFFSET) }); +pub mod pic; lazy_static! { static ref IDT: InterruptDescriptorTable = { @@ -55,8 +29,7 @@ pub fn init_idt() { println!("Loading IDT"); IDT.load(); - println!("Initializing PIC"); - unsafe { PICS.lock().initialize() }; + init_pic(); println!("Enabling interrupts"); x86_64::instructions::interrupts::enable(); @@ -92,35 +65,4 @@ extern "x86-interrupt" fn double_fault_handler( panic!("EXCEPTION: DOUBLE FAULT\n{:#?}", stack_frame); } -extern "x86-interrupt" fn timer_interrupt_handler(_stack_frame: InterruptStackFrame) { - // print!("."); - unsafe { - PICS.lock() - .notify_end_of_interrupt(InterruptIndex::Timer.as_u8()); - } -} -extern "x86-interrupt" fn keyboard_interrupt_handler(_stack_frame: InterruptStackFrame) { - lazy_static! { - static ref KEYBOARD: Mutex> = Mutex::new( - Keyboard::new(layouts::Us104Key, ScancodeSet1, HandleControl::Ignore) - ); - } - - let mut keyboard = KEYBOARD.lock(); - let mut port = Port::new(PS2_CONTROLLER_PORT); - let scancode: u8 = unsafe { port.read() }; - - if let Ok(Some(key_event)) = keyboard.add_byte(scancode) { - if let Some(key) = keyboard.process_keyevent(key_event) { - match key { - DecodedKey::Unicode(character) => print!("{}", character), - DecodedKey::RawKey(key) => print!("{:?}", key), - } - } - } - unsafe { - PICS.lock() - .notify_end_of_interrupt(InterruptIndex::Keyboard.as_u8()); - } -} diff --git a/src/interrupts/pic/mod.rs b/src/interrupts/pic/mod.rs new file mode 100644 index 0000000..b31e83a --- /dev/null +++ b/src/interrupts/pic/mod.rs @@ -0,0 +1,71 @@ +use pic8259::ChainedPics; +use crate::{print, println}; +use lazy_static::lazy_static; +use pc_keyboard::{layouts, DecodedKey, HandleControl, Keyboard, ScancodeSet1}; +use x86_64::structures::idt::{InterruptStackFrame}; +use x86_64::instructions::port::Port; +use spin::{self, Mutex}; + +pub const PIC_1_OFFSET: u8 = 32; +pub const PIC_2_OFFSET: u8 = PIC_1_OFFSET + 8; + + +pub const PS2_CONTROLLER_PORT: u16 = 0x60; + +#[derive(Debug, Clone, Copy)] +#[repr(u8)] +pub enum InterruptIndex { + Timer = PIC_1_OFFSET, + Keyboard, +} + +impl InterruptIndex { + pub fn as_u8(self) -> u8 { + self as u8 + } + + pub fn as_usize(self) -> usize { + usize::from(self.as_u8()) + } +} + +pub static PICS: spin::Mutex = + spin::Mutex::new(unsafe { ChainedPics::new(PIC_1_OFFSET, PIC_2_OFFSET) }); + +pub fn init_pic() { + println!("Initializing PIC"); + unsafe { PICS.lock().initialize() }; +} + +pub extern "x86-interrupt" fn timer_interrupt_handler(_stack_frame: InterruptStackFrame) { + // print!("."); + unsafe { + PICS.lock() + .notify_end_of_interrupt(InterruptIndex::Timer.as_u8()); + } +} + +pub extern "x86-interrupt" fn keyboard_interrupt_handler(_stack_frame: InterruptStackFrame) { + lazy_static! { + static ref KEYBOARD: Mutex> = Mutex::new( + Keyboard::new(layouts::Us104Key, ScancodeSet1, HandleControl::Ignore) + ); + } + + let mut keyboard = KEYBOARD.lock(); + let mut port = Port::new(PS2_CONTROLLER_PORT); + let scancode: u8 = unsafe { port.read() }; + + if let Ok(Some(key_event)) = keyboard.add_byte(scancode) { + if let Some(key) = keyboard.process_keyevent(key_event) { + match key { + DecodedKey::Unicode(character) => print!("{}", character), + DecodedKey::RawKey(key) => print!("{:?}", key), + } + } + } + unsafe { + PICS.lock() + .notify_end_of_interrupt(InterruptIndex::Keyboard.as_u8()); + } +}