9f2bd069180f0ea5c26ab3439f39f44ea0563f6e
[lunaix-os.git] / lunaix-os / kernel / asm / x86 / idt.c
1 #include <arch/x86/idt.h>
2 #include <arch/x86/interrupts.h>
3 #include <arch/x86/types.h>
4 #include <stdint.h>
5
6 #define IDT_ENTRY 32
7
8 uint64_t _idt[IDT_ENTRY];
9 uint16_t _idt_limit = sizeof(_idt) - 1;
10
11 void _set_idt_entry(uint32_t vector, uint16_t seg_selector, void (*isr)(), uint8_t dpl) {
12     uintptr_t offset = (uintptr_t)isr;
13     _idt[vector] = (offset & 0xffff0000) | IDT_ATTR(dpl);
14     _idt[vector] <<= 32;
15     _idt[vector] |= (seg_selector << 16) | (offset & 0x0000ffff);
16 }
17
18
19 void
20 _init_idt() {
21     _set_idt_entry(FAULT_DIVISION_ERROR, 0x08, _asm_isr0, 0);
22 }