#include "types.h" #include "x86.h" #include "traps.h" #include "defs.h" // I/O Addresses of the two 8259A programmable interrupt controllers #define IO_PIC1 0x20 // Master (IRQs 0-7) #define IO_PIC2 0xA0 // Slave (IRQs 8-15) #define IRQ_SLAVE 2 // IRQ at which slave connects to master // Current IRQ mask. // Initial IRQ mask has interrupt 2 enabled (for slave 8259A). static ushort irq_mask_8259A = 0xFFFF & ~(1<> 8)); } /* Initialize the 8259A interrupt controllers. */ void pic_init(void) { // mask all interrupts outb(IO_PIC1+1, 0xFF); outb(IO_PIC2+1, 0xFF); // Set up master (8259A-1) // ICW1: 0001g0hi // g: 0 = edge triggering, 1 = level triggering // h: 0 = cascaded PICs, 1 = master only // i: 0 = no ICW4, 1 = ICW4 required outb(IO_PIC1, 0x11); // ICW2: Vector offset outb(IO_PIC1+1, IRQ_OFFSET); // ICW3: bit mask of IR lines connected to slave PICs (master PIC), // 3-bit No of IR line at which slave connects to master(slave PIC). outb(IO_PIC1+1, 1<