#include "arch/x86_64/CPU.h" #include "arch/x86_64/IO.h" #define PIC1_COMMAND 0x20 #define PIC1_DATA 0x21 #define PIC2_COMMAND 0xA0 #define PIC2_DATA 0xA1 #define PIC_EOI 0x20 #define ICW1_INIT 0x10 #define ICW1_ICW4 0x01 #define ICW4_8086 0x01 #define io_delay() IO::outb(0x80, 0) void remap_pic() { IO::outb(PIC1_COMMAND, ICW1_INIT | ICW1_ICW4); io_delay(); IO::outb(PIC2_COMMAND, ICW1_INIT | ICW1_ICW4); io_delay(); IO::outb(PIC1_DATA, 0x20); io_delay(); IO::outb(PIC2_DATA, 0x28); io_delay(); IO::outb(PIC1_DATA, 4); io_delay(); IO::outb(PIC2_DATA, 2); io_delay(); IO::outb(PIC1_DATA, ICW4_8086); io_delay(); IO::outb(PIC2_DATA, ICW4_8086); io_delay(); IO::outb(PIC1_DATA, 0b11111111); io_delay(); IO::outb(PIC2_DATA, 0b11111111); io_delay(); } void change_pic_masks(u8 pic1_mask, u8 pic2_mask) { IO::outb(PIC1_DATA, pic1_mask); io_delay(); IO::outb(PIC2_DATA, pic2_mask); io_delay(); } void pic_eoi(unsigned char irq) { if (irq >= 8) IO::outb(PIC2_COMMAND, PIC_EOI); IO::outb(PIC1_COMMAND, PIC_EOI); } void pic_eoi(Registers* regs) { pic_eoi((unsigned char)(regs->error)); // On IRQs, the error code is the IRQ number }