diff --git a/src/kernel/boot/kmain.c b/src/kernel/boot/kmain.c index da4d9f2..716c850 100644 --- a/src/kernel/boot/kmain.c +++ b/src/kernel/boot/kmain.c @@ -12,6 +12,11 @@ int divide(int a, int b) return a/b; } +registers *divbyzero(registers *r) { + PANIC("DIVIDE BY ZERO!"); + return r; +} + void kmain(uint64_t multiboot_magic, void *multiboot_data) { vga_init(); @@ -35,6 +40,8 @@ void kmain(uint64_t multiboot_magic, void *multiboot_data) interrupt_init(); + bind_interrupt(0, divbyzero); + debug("Hello, world!"); // Force a divide by zero error diff --git a/src/kernel/cpu/interrupts.c b/src/kernel/cpu/interrupts.c index 5545312..aaa4acd 100644 --- a/src/kernel/cpu/interrupts.c +++ b/src/kernel/cpu/interrupts.c @@ -26,6 +26,7 @@ struct { }__attribute__((packed)) idtr; extern uintptr_t isr_table[]; +int_handler_t int_handlers[NUM_INTERRUPTS]; void interrupt_init() { @@ -45,8 +46,16 @@ void interrupt_init() load_idt(&idtr); // cpu/registers.S } +int_handler_t bind_interrupt(uint32_t num, int_handler_t fn) { + int_handler_t old = int_handlers[num]; + int_handlers[num] = fn; + return old; +} + registers *int_handler(registers *r) { + if(int_handlers[r->int_no]) + return int_handlers[r->int_no](r); debug_error("Unhandled interrupt occurred\n"); debug_error("Interrupt number: %d, Error code: %d\n", r->int_no, r->err_code); PANIC("Unhandled interrupt"); diff --git a/src/kernel/include/interrupts.h b/src/kernel/include/interrupts.h index 0e8230c..b1c6845 100644 --- a/src/kernel/include/interrupts.h +++ b/src/kernel/include/interrupts.h @@ -28,5 +28,9 @@ typedef struct { uint64_t ss; } registers; +typedef registers *(*int_handler_t)(registers *); + +// cpu/interrupts.c void interrupt_init(); -void isr_return(registers *); \ No newline at end of file +void isr_return(registers *); +int_handler_t bind_interrupt(uint32_t num, int_handler_t fn); \ No newline at end of file