Initialize PIC in Rust

This commit is contained in:
Jeremy Soller
2017-02-11 20:54:14 -07:00
parent 571b2aa2e7
commit 0e22ba24be
3 changed files with 50 additions and 4 deletions

View File

@@ -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();

View File

@@ -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);
}
}

View File

@@ -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);
}