summaryrefslogtreecommitdiff
path: root/src/c/idt.c
blob: 843c9daa1a451a2b91a43542da9a69fdd4576533 (plain)
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include<types.h>
#include<irq.h>
#include<asm.h>

#define INTERRUPT_GATE_32 0x8E

#define KERNEL_CODE 0x08
#define KERNEL_DATA 0x10

#define PIC1_COMMAND_PORT 0x20
#define PIC1_DATA_PORT 0x21
#define PIC2_COMMAND_PORT 0xA0
#define PIC2_DATA_PORT 0xA1

struct idt_entry
{
    uint16_t offset1;
    uint16_t selector;
    uint8_t zero;
    uint8_t type_attr;
    uint16_t offset2;
} __attribute__((packed));

struct idt_pointer
{
    uint16_t size;
    uint32_t offset;
} __attribute__((packed));


extern void load_idt(struct idt_pointer *idtp);
extern void keyboard_irq();

struct idt_entry idt[256];
struct idt_pointer idtp;

void init_idt_entry(size_t num, uint32_t offset, uint16_t selector, uint8_t type_attr)
{
    idt[num].offset1=(offset & 0xffff);
    idt[num].selector=selector;
    idt[num].zero=0;
    idt[num].type_attr=type_attr;
    idt[num].offset2=(offset & 0xffff0000)>>16;
}

void add_idt_entry(size_t num,uint32_t offset)
{
    init_idt_entry(num,offset,KERNEL_CODE,INTERRUPT_GATE_32);
}

void init_pic()
{
    ioport_out(PIC1_COMMAND_PORT, 0x11);
    ioport_out(PIC2_COMMAND_PORT, 0x11);
    ioport_out(PIC1_DATA_PORT, 0x20);
    ioport_out(PIC2_DATA_PORT, 0x28);
    ioport_out(PIC1_DATA_PORT, 0x04);
    ioport_out(PIC2_DATA_PORT, 0x02);
    ioport_out(PIC1_DATA_PORT, 0x01);
    ioport_out(PIC2_DATA_PORT, 0x01);
    ioport_out(PIC1_DATA_PORT, 0xff);
    ioport_out(PIC2_DATA_PORT, 0xff);
    ioport_out(PIC1_DATA_PORT, 0xFC);
}

void init_idt_table()
{
    init_pic();
    add_idt_entry(0,(uint32_t)irq0);
    add_idt_entry(1,(uint32_t)irq1);
    add_idt_entry(2,(uint32_t)irq2);
    add_idt_entry(3,(uint32_t)irq3);
    add_idt_entry(4,(uint32_t)irq4);
    add_idt_entry(5,(uint32_t)irq5);
    add_idt_entry(6,(uint32_t)irq6);
    add_idt_entry(7,(uint32_t)irq7);
    add_idt_entry(8,(uint32_t)irq8);
    add_idt_entry(9,(uint32_t)irq9);
    add_idt_entry(10,(uint32_t)irq10);
    add_idt_entry(11,(uint32_t)irq11);
    add_idt_entry(12,(uint32_t)irq12);
    add_idt_entry(13,(uint32_t)irq13);
    add_idt_entry(14,(uint32_t)irq14);
    add_idt_entry(15,(uint32_t)irq15);
    add_idt_entry(16,(uint32_t)irq16);
    add_idt_entry(17,(uint32_t)irq17);
    add_idt_entry(18,(uint32_t)irq18);
    add_idt_entry(19,(uint32_t)irq19);
    add_idt_entry(20,(uint32_t)irq20);
    add_idt_entry(21,(uint32_t)irq21);
    add_idt_entry(22,(uint32_t)irq22);
    add_idt_entry(23,(uint32_t)irq23);
    add_idt_entry(24,(uint32_t)irq24);
    add_idt_entry(25,(uint32_t)irq25);
    add_idt_entry(26,(uint32_t)irq26);
    add_idt_entry(27,(uint32_t)irq27);
    add_idt_entry(28,(uint32_t)irq28);
    add_idt_entry(29,(uint32_t)irq29);
    add_idt_entry(30,(uint32_t)irq30);
    add_idt_entry(31,(uint32_t)irq31);
    add_idt_entry(32,(uint32_t)timer_irq);
    add_idt_entry(33,(uint32_t)keyboard_irq);

    idtp.size=sizeof(struct idt_entry)*256-1;
    idtp.offset=(uint32_t)&idt;

    load_idt(&idtp);
}