Merge branch 'master' into sata-ahci-dev
[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 static inline void
11 _set_idt_entry(uint32_t vector,
12                uint16_t seg_selector,
13                void (*isr)(),
14                uint8_t dpl,
15                uint8_t type)
16 {
17     uintptr_t offset = (uintptr_t)isr;
18     _idt[vector] = (offset & 0xffff0000) | IDT_ATTR(dpl, type);
19     _idt[vector] <<= 32;
20     _idt[vector] |= (seg_selector << 16) | (offset & 0x0000ffff);
21 }
22
23 void
24 _set_idt_intr_entry(uint32_t vector,
25                     uint16_t seg_selector,
26                     void (*isr)(),
27                     uint8_t dpl)
28 {
29     _set_idt_entry(vector, seg_selector, isr, dpl, IDT_INTERRUPT);
30 }
31
32 void
33 _set_idt_trap_entry(uint32_t vector,
34                     uint16_t seg_selector,
35                     void (*isr)(),
36                     uint8_t dpl)
37 {
38     _set_idt_entry(vector, seg_selector, isr, dpl, IDT_TRAP);
39 }
40
41 void
42 _init_idt()
43 {
44     // CPU defined interrupts
45     _set_idt_intr_entry(FAULT_DIVISION_ERROR, 0x08, _asm_isr0, 0);
46     _set_idt_intr_entry(FAULT_GENERAL_PROTECTION, 0x08, _asm_isr13, 0);
47     _set_idt_intr_entry(FAULT_PAGE_FAULT, 0x08, _asm_isr14, 0);
48     _set_idt_intr_entry(FAULT_STACK_SEG_FAULT, 0x08, _asm_isr12, 0);
49
50     _set_idt_intr_entry(APIC_ERROR_IV, 0x08, _asm_isr250, 0);
51     _set_idt_intr_entry(APIC_LINT0_IV, 0x08, _asm_isr251, 0);
52     _set_idt_intr_entry(APIC_SPIV_IV, 0x08, _asm_isr252, 0);
53     _set_idt_intr_entry(APIC_TIMER_IV, 0x08, _asm_isr253, 0);
54
55     _set_idt_intr_entry(PC_KBD_IV, 0x08, _asm_isr201, 0);
56     _set_idt_intr_entry(AHCI_HBA_IV, 0x08, _asm_isr202, 0);
57
58     _set_idt_intr_entry(RTC_TIMER_IV, 0x08, _asm_isr210, 0);
59
60     // system defined interrupts
61     _set_idt_intr_entry(LUNAIX_SYS_PANIC, 0x08, _asm_isr32, 0);
62
63     // We make this a non-trap entry, and enable interrupt
64     // only when needed!
65     _set_idt_intr_entry(LUNAIX_SYS_CALL, 0x08, _asm_isr33, 3);
66 }