#include #include "isrs.h" #include "../idt/idt.h" extern void _STOP_ERROR_SCREEN(ISR_stack_regs *); /* This is a very repetitive function... it's not hard, it's * just annoying. As you can see, we set the first 32 entries * in the IDT to the first 32 ISRs. We can't use a for loop * for this, because there is no way to get the function names * that correspond to that given entry. We set the access * flags to 0x8E. This means that the entry is present, is * running in ring 0 (kernel level), and has the lower 5 bits * set to the required '14', which is represented by 'E' in * hex. */ void i86_isrs_install() { i86_idt_set_gate(0, (unsigned)i86_isr0, 0x08, 0x8E); i86_idt_set_gate(1, (unsigned)i86_isr1, 0x08, 0x8E); i86_idt_set_gate(2, (unsigned)i86_isr2, 0x08, 0x8E); i86_idt_set_gate(3, (unsigned)i86_isr3, 0x08, 0x8E); i86_idt_set_gate(4, (unsigned)i86_isr4, 0x08, 0x8E); i86_idt_set_gate(5, (unsigned)i86_isr5, 0x08, 0x8E); i86_idt_set_gate(6, (unsigned)i86_isr6, 0x08, 0x8E); i86_idt_set_gate(7, (unsigned)i86_isr7, 0x08, 0x8E); i86_idt_set_gate(8, (unsigned)i86_isr8, 0x08, 0x8E); i86_idt_set_gate(9, (unsigned)i86_isr9, 0x08, 0x8E); i86_idt_set_gate(10, (unsigned)i86_isr10, 0x08, 0x8E); i86_idt_set_gate(11, (unsigned)i86_isr11, 0x08, 0x8E); i86_idt_set_gate(12, (unsigned)i86_isr12, 0x08, 0x8E); i86_idt_set_gate(13, (unsigned)i86_isr13, 0x08, 0x8E); i86_idt_set_gate(14, (unsigned)i86_isr14, 0x08, 0x8E); i86_idt_set_gate(15, (unsigned)i86_isr15, 0x08, 0x8E); i86_idt_set_gate(16, (unsigned)i86_isr16, 0x08, 0x8E); i86_idt_set_gate(17, (unsigned)i86_isr17, 0x08, 0x8E); i86_idt_set_gate(18, (unsigned)i86_isr18, 0x08, 0x8E); i86_idt_set_gate(19, (unsigned)i86_isr19, 0x08, 0x8E); i86_idt_set_gate(20, (unsigned)i86_isr20, 0x08, 0x8E); i86_idt_set_gate(21, (unsigned)i86_isr21, 0x08, 0x8E); i86_idt_set_gate(22, (unsigned)i86_isr22, 0x08, 0x8E); i86_idt_set_gate(23, (unsigned)i86_isr23, 0x08, 0x8E); i86_idt_set_gate(24, (unsigned)i86_isr24, 0x08, 0x8E); i86_idt_set_gate(25, (unsigned)i86_isr25, 0x08, 0x8E); i86_idt_set_gate(26, (unsigned)i86_isr26, 0x08, 0x8E); i86_idt_set_gate(27, (unsigned)i86_isr27, 0x08, 0x8E); i86_idt_set_gate(28, (unsigned)i86_isr28, 0x08, 0x8E); i86_idt_set_gate(29, (unsigned)i86_isr29, 0x08, 0x8E); i86_idt_set_gate(30, (unsigned)i86_isr30, 0x08, 0x8E); i86_idt_set_gate(31, (unsigned)i86_isr31, 0x08, 0x8E); } /* All of our Exception handling Interrupt Service Routines will * point to this function. This will tell us what exception has * happened! Right now, we simply halt the system by hitting an * endless loop. All ISRs disable interrupts while they are being * serviced as a 'locking' mechanism to prevent an IRQ from * happening and messing up kernel data structures */ void i86_fault_handler(ISR_stack_regs *r) { /* Is this a fault whose number is from 0 to 31? */ if (r->int_no < 32) { _STOP_ERROR_SCREEN(r); /* Display the description for the Exception that occurred.*/ /* Put on the BSOD screen*/ for (;;); } }