void isr_install() { set_idt_gate(0 , (uint32)isr0 ); set_idt_gate(1 , (uint32)isr1 ); set_idt_gate(2 , (uint32)isr2 ); set_idt_gate(3 , (uint32)isr3 ); set_idt_gate(4 , (uint32)isr4 ); set_idt_gate(5 , (uint32)isr5 ); set_idt_gate(6 , (uint32)isr6 ); set_idt_gate(7 , (uint32)isr7 ); set_idt_gate(8 , (uint32)isr8 ); set_idt_gate(9 , (uint32)isr9 ); set_idt_gate(10 , (uint32)isr10 ); set_idt_gate(11 , (uint32)isr11 ); set_idt_gate(12 , (uint32)isr12 ); set_idt_gate(13 , (uint32)isr13 ); set_idt_gate(14 , (uint32)isr14 ); set_idt_gate(15 , (uint32)isr15 ); set_idt_gate(16 , (uint32)isr16 ); set_idt_gate(17 , (uint32)isr17 ); set_idt_gate(18 , (uint32)isr18 ); set_idt_gate(19 , (uint32)isr19 ); set_idt_gate(20 , (uint32)isr20 ); set_idt_gate(21 , (uint32)isr21 ); set_idt_gate(22 , (uint32)isr22 ); set_idt_gate(23 , (uint32)isr23 ); set_idt_gate(24 , (uint32)isr24 ); set_idt_gate(25 , (uint32)isr25 ); set_idt_gate(26 , (uint32)isr26 ); set_idt_gate(27 , (uint32)isr27 ); set_idt_gate(28 , (uint32)isr28 ); set_idt_gate(29 , (uint32)isr29 ); set_idt_gate(30 , (uint32)isr30 ); set_idt_gate(31 , (uint32)isr31 ); set_idt(); }
void set_sys_gate(int n, void* addr){ set_idt_gate((idt_desc*)&idt[n], 15, 3, addr); }
void set_intr_gate(int n, void* addr){ set_idt_gate((idt_desc*)&idt[n], 14, 0, addr); }
void set_trap_gate(int n, void* addr){ set_idt_gate((idt_desc*)&idt[n], 15, 0, addr); }
/* Can't do this with a loop because we need the address * of the function names */ void isr_install() { set_idt_gate(0, (uint32_t)isr0); set_idt_gate(1, (uint32_t)isr1); set_idt_gate(2, (uint32_t)isr2); set_idt_gate(3, (uint32_t)isr3); set_idt_gate(4, (uint32_t)isr4); set_idt_gate(5, (uint32_t)isr5); set_idt_gate(6, (uint32_t)isr6); set_idt_gate(7, (uint32_t)isr7); set_idt_gate(8, (uint32_t)isr8); set_idt_gate(9, (uint32_t)isr9); set_idt_gate(10, (uint32_t)isr10); set_idt_gate(11, (uint32_t)isr11); set_idt_gate(12, (uint32_t)isr12); set_idt_gate(13, (uint32_t)isr13); set_idt_gate(14, (uint32_t)isr14); set_idt_gate(15, (uint32_t)isr15); set_idt_gate(16, (uint32_t)isr16); set_idt_gate(17, (uint32_t)isr17); set_idt_gate(18, (uint32_t)isr18); set_idt_gate(19, (uint32_t)isr19); set_idt_gate(20, (uint32_t)isr20); set_idt_gate(21, (uint32_t)isr21); set_idt_gate(22, (uint32_t)isr22); set_idt_gate(23, (uint32_t)isr23); set_idt_gate(24, (uint32_t)isr24); set_idt_gate(25, (uint32_t)isr25); set_idt_gate(26, (uint32_t)isr26); set_idt_gate(27, (uint32_t)isr27); set_idt_gate(28, (uint32_t)isr28); set_idt_gate(29, (uint32_t)isr29); set_idt_gate(30, (uint32_t)isr30); set_idt_gate(31, (uint32_t)isr31); // Remap the PIC port_byte_out(0x20, 0x11); port_byte_out(0xA0, 0x11); port_byte_out(0x21, 0x20); port_byte_out(0xA1, 0x28); port_byte_out(0x21, 0x04); port_byte_out(0xA1, 0x02); port_byte_out(0x21, 0x01); port_byte_out(0xA1, 0x01); port_byte_out(0x21, 0x0); port_byte_out(0xA1, 0x0); // Install the IRQs set_idt_gate(32, (uint32_t)irq0); set_idt_gate(33, (uint32_t)irq1); set_idt_gate(34, (uint32_t)irq2); set_idt_gate(35, (uint32_t)irq3); set_idt_gate(36, (uint32_t)irq4); set_idt_gate(37, (uint32_t)irq5); set_idt_gate(38, (uint32_t)irq6); set_idt_gate(39, (uint32_t)irq7); set_idt_gate(40, (uint32_t)irq8); set_idt_gate(41, (uint32_t)irq9); set_idt_gate(42, (uint32_t)irq10); set_idt_gate(43, (uint32_t)irq11); set_idt_gate(44, (uint32_t)irq12); set_idt_gate(45, (uint32_t)irq13); set_idt_gate(46, (uint32_t)irq14); set_idt_gate(47, (uint32_t)irq15); set_idt(); // Load with ASM }