rustubs/arch/x86_64/interrupt/
pic_8259.rsuse crate::arch::x86_64::io_port::*;
const IMR1: u16 = 0x21;
const IMR2: u16 = 0xa1;
const CTRL1: u16 = 0x20;
const CTRL2: u16 = 0xa0;
const PIC_VECTOR_OFFSET: u8 = 0x20;
pub struct PicDeviceInt;
impl PicDeviceInt {
pub const TIMER: u8 = 0;
pub const KEYBOARD: u8 = 1;
}
pub fn init() {
outb(CTRL1, 0x11);
outb(CTRL2, 0x11);
outb(IMR1, PIC_VECTOR_OFFSET);
outb(IMR2, PIC_VECTOR_OFFSET + 8);
outb(IMR1, 0x04);
outb(IMR2, 0x02);
outb(IMR1, 0x03);
outb(IMR2, 0x03);
outb(IMR1, 0xfb);
outb(IMR2, 0xff);
}
pub fn allow(interrupt: u8) {
if interrupt < 8 {
let old = inb(IMR1);
outb(IMR1, old & !(1 << interrupt));
} else {
let old = inb(IMR2);
outb(IMR2, old & !(1 << (interrupt - 8)));
}
}
pub fn forbid(interrupt: u8) {
if interrupt < 8 {
let old = inb(IMR1);
outb(IMR1, old | (1 << interrupt));
} else {
let old = inb(IMR2);
outb(IMR2, old | (1 << (interrupt - 8)));
}
}
pub fn is_masked(interrupt: u8) -> bool {
if interrupt < 8 {
let val = inb(IMR1);
val & (interrupt) != 0
} else {
let val = inb(IMR2);
val & (interrupt - 8) != 0
}
}