161 lines
4.2 KiB
C
161 lines
4.2 KiB
C
#include "interrupts.h"
|
|
#include "io.h"
|
|
#include "sys.h"
|
|
#include "idt.h"
|
|
#include "tty.h"
|
|
|
|
extern void isr0(void);
|
|
extern void isr1(void);
|
|
extern void isr2(void);
|
|
extern void isr3(void);
|
|
extern void isr4(void);
|
|
extern void isr5(void);
|
|
extern void isr6(void);
|
|
extern void isr7(void);
|
|
extern void isr8(void);
|
|
extern void isr9(void);
|
|
extern void isr10(void);
|
|
extern void isr11(void);
|
|
extern void isr12(void);
|
|
extern void isr13(void);
|
|
extern void isr14(void);
|
|
extern void isr15(void);
|
|
extern void isr16(void);
|
|
extern void isr17(void);
|
|
extern void isr18(void);
|
|
extern void isr19(void);
|
|
extern void isr20(void);
|
|
extern void isr21(void);
|
|
extern void isr22(void);
|
|
extern void isr23(void);
|
|
extern void isr24(void);
|
|
extern void isr25(void);
|
|
extern void isr26(void);
|
|
extern void isr27(void);
|
|
extern void isr28(void);
|
|
extern void isr29(void);
|
|
extern void isr30(void);
|
|
extern void isr31(void);
|
|
extern void isr128(void);
|
|
|
|
void *isr_routines[NB_ISR_ROUTINES] = {0};
|
|
|
|
void isr_install_handler(uint8_t isr, void (*handler)(Stack *registers))
|
|
{
|
|
isr_routines[isr] = handler;
|
|
}
|
|
|
|
void isr_uninstall_handler(uint8_t isr)
|
|
{
|
|
isr_routines[isr] = 0;
|
|
}
|
|
|
|
void isr_call_handler(Stack *registers)
|
|
{
|
|
void (*handler)(Stack *registers);
|
|
handler = isr_routines[registers->id];
|
|
if (handler)
|
|
handler(registers);
|
|
}
|
|
|
|
void isr_install(void)
|
|
{
|
|
idt_set_gate(0, (uint32_t)isr0, 0x08, 0x8E);
|
|
idt_set_gate(1, (uint32_t)isr1, 0x08, 0x8E);
|
|
idt_set_gate(2, (uint32_t)isr2, 0x08, 0x8E);
|
|
idt_set_gate(3, (uint32_t)isr3, 0x08, 0x8E);
|
|
idt_set_gate(4, (uint32_t)isr4, 0x08, 0x8E);
|
|
idt_set_gate(5, (uint32_t)isr5, 0x08, 0x8E);
|
|
idt_set_gate(6, (uint32_t)isr6, 0x08, 0x8E);
|
|
idt_set_gate(7, (uint32_t)isr7, 0x08, 0x8E);
|
|
|
|
idt_set_gate(8, (uint32_t)isr8, 0x08, 0x8E);
|
|
idt_set_gate(9, (uint32_t)isr9, 0x08, 0x8E);
|
|
idt_set_gate(10, (uint32_t)isr10, 0x08, 0x8E);
|
|
idt_set_gate(11, (uint32_t)isr11, 0x08, 0x8E);
|
|
idt_set_gate(12, (uint32_t)isr12, 0x08, 0x8E);
|
|
idt_set_gate(13, (uint32_t)isr13, 0x08, 0x8E);
|
|
idt_set_gate(14, (uint32_t)isr14, 0x08, 0x8E);
|
|
idt_set_gate(15, (uint32_t)isr15, 0x08, 0x8E);
|
|
|
|
idt_set_gate(16, (uint32_t)isr16, 0x08, 0x8E);
|
|
idt_set_gate(17, (uint32_t)isr17, 0x08, 0x8E);
|
|
idt_set_gate(18, (uint32_t)isr18, 0x08, 0x8E);
|
|
idt_set_gate(19, (uint32_t)isr19, 0x08, 0x8E);
|
|
idt_set_gate(20, (uint32_t)isr20, 0x08, 0x8E);
|
|
idt_set_gate(21, (uint32_t)isr21, 0x08, 0x8E);
|
|
idt_set_gate(22, (uint32_t)isr22, 0x08, 0x8E);
|
|
idt_set_gate(23, (uint32_t)isr23, 0x08, 0x8E);
|
|
|
|
idt_set_gate(24, (uint32_t)isr24, 0x08, 0x8E);
|
|
idt_set_gate(25, (uint32_t)isr25, 0x08, 0x8E);
|
|
idt_set_gate(26, (uint32_t)isr26, 0x08, 0x8E);
|
|
idt_set_gate(27, (uint32_t)isr27, 0x08, 0x8E);
|
|
idt_set_gate(28, (uint32_t)isr28, 0x08, 0x8E);
|
|
idt_set_gate(29, (uint32_t)isr29, 0x08, 0x8E);
|
|
idt_set_gate(30, (uint32_t)isr30, 0x08, 0x8E);
|
|
idt_set_gate(31, (uint32_t)isr31, 0x08, 0x8E);
|
|
|
|
idt_set_gate(128, (uint32_t)isr128, 0x08, 0x8E);
|
|
}
|
|
|
|
static const char *exception_messages[] =
|
|
{
|
|
"Division By Zero",
|
|
"Debug",
|
|
"Non Maskable Interrupt",
|
|
"Breakpoint",
|
|
"Into Detected Overflow",
|
|
"Out of Bounds",
|
|
"Invalid Opcode",
|
|
"No Coprocessor",
|
|
|
|
"Double Fault",
|
|
"Coprocessor Segment Overrun",
|
|
"Bad TSS",
|
|
"Segment Not Present",
|
|
"Stack Fault",
|
|
"General Protection Fault",
|
|
"Page Fault",
|
|
"Unknown Interrupt",
|
|
|
|
"Coprocessor Fault",
|
|
"Alignment Check",
|
|
"Machine Check",
|
|
"Reserved",
|
|
"Reserved",
|
|
"Reserved",
|
|
"Reserved",
|
|
"Reserved",
|
|
|
|
"Reserved",
|
|
"Reserved",
|
|
"Reserved",
|
|
"Reserved",
|
|
"Reserved",
|
|
"Reserved",
|
|
"Reserved",
|
|
"Reserved"};
|
|
|
|
void fault_handler(Stack *registers)
|
|
{
|
|
if (registers->id == 128)
|
|
isr_call_handler(registers);
|
|
|
|
if (registers->id < 32)
|
|
{
|
|
terminal_printc("Exception. System Halted!\n");
|
|
|
|
const char *message = exception_messages[registers->id];
|
|
while (*message)
|
|
{
|
|
terminal_putchar(*message);
|
|
message++;
|
|
}
|
|
|
|
isr_call_handler(registers);
|
|
|
|
for (;;)
|
|
sys_halt();
|
|
}
|
|
} |