aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/arch/x86_64/idt.cpp
blob: fe3f45fc2eba4418d7c1a5d38b0f1472bfa4b025 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#include <stdint.h>
#include "idt.h"

extern "C" void isr0();
extern "C" void isr1();
extern "C" void isr2();
extern "C" void isr3();
extern "C" void isr4();
extern "C" void isr5();
extern "C" void isr6();
extern "C" void isr7();
extern "C" void isr8();
extern "C" void isr9();
extern "C" void isr10();
extern "C" void isr11();
extern "C" void isr12();
extern "C" void isr13();
extern "C" void isr14();
extern "C" void isr15();
extern "C" void isr16();
extern "C" void isr17();
extern "C" void isr18();
extern "C" void isr19();
extern "C" void isr20();
extern "C" void isr21();
extern "C" void isr22();
extern "C" void isr23();
extern "C" void isr24();
extern "C" void isr25();
extern "C" void isr26();
extern "C" void isr27();
extern "C" void isr28();
extern "C" void isr29();
extern "C" void isr30();
extern "C" void isr31();

IdtEntry idt[256];
IDTR idtr;

void idt_entry(int num, uint64_t offset, uint16_t sel, uint8_t ist, uint8_t type_attributes) {
    idt[num].offset_low = (uint64_t)offset & 0xFFFF;
    idt[num].offset_mid = ((uint64_t)offset & 0xFFFF0000) >> 16;
    idt[num].offset_high = ((uint64_t)offset & 0xFFFFFFFF00000000) >> 32;

    idt[num].seg_sel = sel;

    idt[num].ist = ist & 0b111;

    idt[num].type_attributes = type_attributes;

    idt[num].reserved = 0;
}

extern "C" void load_idt(IDTR*);

void setup_idt() {
    idtr.size = (sizeof(struct IDTR) * 256);
    idtr.offset = (uint64_t)idt;

    idt_entry(0, (uint64_t)isr0, 0x08, 0, 0x8E);
    idt_entry(1, (uint64_t)isr1, 0x08, 0, 0x8E);
    idt_entry(2, (uint64_t)isr2, 0x08, 0, 0x8E);
    idt_entry(3, (uint64_t)isr3, 0x08, 0, 0x8E);
    idt_entry(4, (uint64_t)isr4, 0x08, 0, 0x8E);
    idt_entry(5, (uint64_t)isr5, 0x08, 0, 0x8E);
    idt_entry(6, (uint64_t)isr6, 0x08, 0, 0x8E);
    idt_entry(7, (uint64_t)isr7, 0x08, 0, 0x8E);
    idt_entry(8, (uint64_t)isr8, 0x08, 0, 0x8E);
    idt_entry(9, (uint64_t)isr9, 0x08, 0, 0x8E);
    idt_entry(10, (uint64_t)isr10, 0x08, 0, 0x8E);
    idt_entry(11, (uint64_t)isr11, 0x08, 0, 0x8E);
    idt_entry(12, (uint64_t)isr12, 0x08, 0, 0x8E);
    idt_entry(13, (uint64_t)isr13, 0x08, 0, 0x8E);
    idt_entry(14, (uint64_t)isr14, 0x08, 0, 0x8E);
    idt_entry(15, (uint64_t)isr15, 0x08, 0, 0x8E);
    idt_entry(16, (uint64_t)isr16, 0x08, 0, 0x8E);
    idt_entry(17, (uint64_t)isr17, 0x08, 0, 0x8E);
    idt_entry(18, (uint64_t)isr18, 0x08, 0, 0x8E);
    idt_entry(19, (uint64_t)isr19, 0x08, 0, 0x8E);
    idt_entry(20, (uint64_t)isr20, 0x08, 0, 0x8E);
    idt_entry(21, (uint64_t)isr21, 0x08, 0, 0x8E);
    idt_entry(22, (uint64_t)isr22, 0x08, 0, 0x8E);
    idt_entry(23, (uint64_t)isr23, 0x08, 0, 0x8E);
    idt_entry(24, (uint64_t)isr24, 0x08, 0, 0x8E);
    idt_entry(25, (uint64_t)isr25, 0x08, 0, 0x8E);
    idt_entry(26, (uint64_t)isr26, 0x08, 0, 0x8E);
    idt_entry(27, (uint64_t)isr27, 0x08, 0, 0x8E);
    idt_entry(28, (uint64_t)isr28, 0x08, 0, 0x8E);
    idt_entry(29, (uint64_t)isr29, 0x08, 0, 0x8E);
    idt_entry(30, (uint64_t)isr30, 0x08, 0, 0x8E);
    idt_entry(31, (uint64_t)isr31, 0x08, 0, 0x8E);

    load_idt(&idtr);
}