diff --git a/arch/x86_64/src/device/mod.rs b/arch/x86_64/src/device/mod.rs index d4d56e66645d75901afebb5e9b15e8864f12e6be..522b2b484ffcb600ef4abd6125ae7f2d5a09d595 100644 --- a/arch/x86_64/src/device/mod.rs +++ b/arch/x86_64/src/device/mod.rs @@ -2,10 +2,12 @@ use paging::ActivePageTable; pub mod cpu; pub mod local_apic; +pub mod pic; pub mod rtc; pub mod serial; pub unsafe fn init(active_table: &mut ActivePageTable){ + pic::init(); local_apic::init(active_table); rtc::init(); serial::init(); diff --git a/arch/x86_64/src/device/pic.rs b/arch/x86_64/src/device/pic.rs new file mode 100644 index 0000000000000000000000000000000000000000..f5b636987e90f6ddd03727060c92eb65becf9cf8 --- /dev/null +++ b/arch/x86_64/src/device/pic.rs @@ -0,0 +1,48 @@ +use syscall::io::{Io, Pio}; + +pub static mut MASTER: Pic = Pic::new(0x20); +pub static mut SLAVE: Pic = Pic::new(0xA0); + +pub unsafe fn init() { + // Start initialization + MASTER.cmd.write(0x11); + SLAVE.cmd.write(0x11); + + // Set offsets + MASTER.data.write(0x20); + SLAVE.data.write(0x28); + + // Set up cascade + MASTER.data.write(4); + SLAVE.data.write(2); + + // Set up interrupt mode (1 is manual, 2 is auto EOI) + MASTER.data.write(1); + SLAVE.data.write(1); + + // Unmask interrupts + MASTER.data.write(0); + SLAVE.data.write(0); + + // Ack remaining interrupts + MASTER.ack(); + SLAVE.ack(); +} + +pub struct Pic { + cmd: Pio<u8>, + data: Pio<u8>, +} + +impl Pic { + pub const fn new(port: u16) -> Pic { + Pic { + cmd: Pio::new(port), + data: Pio::new(port + 1), + } + } + + pub fn ack(&mut self) { + self.cmd.write(0x20); + } +} diff --git a/arch/x86_64/src/start.rs b/arch/x86_64/src/start.rs index 72772ea18b18e34193b8336ee032eb1589d8e218..448800959f7142c54a3682c9b9c4a2e3b615d8b7 100644 --- a/arch/x86_64/src/start.rs +++ b/arch/x86_64/src/start.rs @@ -120,10 +120,6 @@ pub unsafe extern fn kstart() -> ! { // Read ACPI tables, starts APs acpi::init(&mut active_table); - // Clear pending IRQs - // TODO: Remove this and ack all IRQs without listeners - interrupt::irq::acknowledge(8); - BSP_READY.store(true, Ordering::SeqCst); }