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
109
|
#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);
}
|