e194d87b02492706b7c802181881f1f502e86d9b
[lunaix-os.git] / lunaix-os / kernel / asm / x86 / idt.c
1 #include <arch/x86/idt.h>
2 #include <arch/x86/interrupts.h>
3 #include <stdint.h>
4
5 #define IDT_ENTRY 256
6
7 uint64_t _idt[IDT_ENTRY];
8 uint16_t _idt_limit = sizeof(_idt) - 1;
9
10 void _set_idt_entry(uint32_t vector, uint16_t seg_selector, void (*isr)(), uint8_t dpl) {
11     uintptr_t offset = (uintptr_t)isr;
12     _idt[vector] = (offset & 0xffff0000) | IDT_ATTR(dpl);
13     _idt[vector] <<= 32;
14     _idt[vector] |= (seg_selector << 16) | (offset & 0x0000ffff);
15 }
16
17
18 void
19 _init_idt() {
20     // CPU defined interrupts
21     _set_idt_entry(FAULT_DIVISION_ERROR, 0x08, _asm_isr0, 0);
22     _set_idt_entry(FAULT_GENERAL_PROTECTION, 0x08, _asm_isr13, 0);
23     _set_idt_entry(FAULT_PAGE_FAULT, 0x08, _asm_isr14, 0);
24
25     _set_idt_entry(APIC_ERROR_IV, 0x08, _asm_isr250, 0);
26     _set_idt_entry(APIC_LINT0_IV, 0x08, _asm_isr251, 0);
27     _set_idt_entry(APIC_SPIV_IV,  0x08, _asm_isr252, 0);
28     _set_idt_entry(APIC_TIMER_IV, 0x08, _asm_isr253, 0);
29     _set_idt_entry(PC_KBD_IV,  0x08, _asm_isr201, 0);
30
31     _set_idt_entry(RTC_TIMER_IV,  0x08, _asm_isr210, 0);
32
33     // system defined interrupts
34     _set_idt_entry(LUNAIX_SYS_PANIC, 0x08, _asm_isr32, 0);
35 }