diff options
Diffstat (limited to 'src/idt/idt.c')
| -rw-r--r-- | src/idt/idt.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/src/idt/idt.c b/src/idt/idt.c new file mode 100644 index 0000000..d7a6743 --- /dev/null +++ b/src/idt/idt.c @@ -0,0 +1,42 @@ +#include <stdint.h> +#include <toxic/config.h> +#include <toxic/string.h> +#include <toxic/vga.h> +#include <toxic/idt.h> + +struct int_descriptor int_table[TOTAL_INTERRUPTS]; +struct int_reg_descriptor idtr_descriptor; + +extern void idt_load(struct int_reg_descriptor *desc); + +static void +idt_zero() +{ + vprintl("Illegal operation: Divide by zero\n"); +} + +static void +idt_set(int int_num, void *addr) +{ + struct int_descriptor *desc = &int_table[int_num]; + + desc->offset_low = (uint32_t) addr & 0x0000FFFF; + desc->selector = KERNEL_CODE_SELECTOR; + desc->reserved = 0x00; + desc->type_attr = TOXIC_INT_ATTR; + desc->offset_high = (uint32_t) addr >> 16; +} + +void +interrupts_init(void) +{ + memset(int_table, 0, sizeof(int_table)); + + idtr_descriptor.limit = sizeof(int_table) - 1; + idtr_descriptor.base = (uint32_t) int_table; + + idt_set(0, idt_zero); + + idt_load(&idtr_descriptor); +} + |
