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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
|
#include<source/idt.h>
#include<types.h>
#include<source/irq.h>
#include<asm.h>
extern void load_idt(struct idt_pointer *idtp);
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=(uint16_t)(offset & 0xffff);
idt[num].selector=selector;
idt[num].zero=0;
idt[num].type_attr=type_attr;
idt[num].offset2=(uint16_t)((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(void)
{
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(void)
{
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);
add_idt_entry(34,(uint32_t)irq34);
add_idt_entry(35,(uint32_t)irq35);
add_idt_entry(36,(uint32_t)irq36);
add_idt_entry(37,(uint32_t)irq37);
add_idt_entry(38,(uint32_t)irq38);
add_idt_entry(39,(uint32_t)irq39);
add_idt_entry(40,(uint32_t)irq40);
add_idt_entry(41,(uint32_t)irq41);
add_idt_entry(42,(uint32_t)irq42);
add_idt_entry(43,(uint32_t)irq43);
add_idt_entry(44,(uint32_t)irq44);
add_idt_entry(45,(uint32_t)irq45);
add_idt_entry(46,(uint32_t)irq46);
add_idt_entry(47,(uint32_t)irq47);
add_idt_entry(48,(uint32_t)irq48);
add_idt_entry(49,(uint32_t)irq49);
add_idt_entry(50,(uint32_t)irq50);
add_idt_entry(51,(uint32_t)irq51);
add_idt_entry(52,(uint32_t)irq52);
add_idt_entry(53,(uint32_t)irq53);
add_idt_entry(54,(uint32_t)irq54);
add_idt_entry(55,(uint32_t)irq55);
add_idt_entry(56,(uint32_t)irq56);
add_idt_entry(57,(uint32_t)irq57);
add_idt_entry(58,(uint32_t)irq58);
add_idt_entry(59,(uint32_t)irq59);
add_idt_entry(60,(uint32_t)irq60);
add_idt_entry(61,(uint32_t)irq61);
add_idt_entry(62,(uint32_t)irq62);
add_idt_entry(63,(uint32_t)irq63);
add_idt_entry(64,(uint32_t)irq64);
add_idt_entry(65,(uint32_t)irq65);
add_idt_entry(66,(uint32_t)irq66);
add_idt_entry(67,(uint32_t)irq67);
add_idt_entry(68,(uint32_t)irq68);
add_idt_entry(69,(uint32_t)irq69);
add_idt_entry(70,(uint32_t)irq70);
add_idt_entry(71,(uint32_t)irq71);
add_idt_entry(72,(uint32_t)irq72);
add_idt_entry(73,(uint32_t)irq73);
add_idt_entry(74,(uint32_t)irq74);
add_idt_entry(75,(uint32_t)irq75);
add_idt_entry(76,(uint32_t)irq76);
add_idt_entry(77,(uint32_t)irq77);
add_idt_entry(78,(uint32_t)irq78);
add_idt_entry(79,(uint32_t)irq79);
add_idt_entry(80,(uint32_t)irq80);
add_idt_entry(81,(uint32_t)irq81);
add_idt_entry(82,(uint32_t)irq82);
add_idt_entry(83,(uint32_t)irq83);
add_idt_entry(84,(uint32_t)irq84);
add_idt_entry(85,(uint32_t)irq85);
add_idt_entry(86,(uint32_t)irq86);
add_idt_entry(87,(uint32_t)irq87);
add_idt_entry(88,(uint32_t)irq88);
add_idt_entry(89,(uint32_t)irq89);
add_idt_entry(90,(uint32_t)irq90);
add_idt_entry(91,(uint32_t)irq91);
add_idt_entry(92,(uint32_t)irq92);
add_idt_entry(93,(uint32_t)irq93);
add_idt_entry(94,(uint32_t)irq94);
add_idt_entry(95,(uint32_t)irq95);
add_idt_entry(96,(uint32_t)irq96);
add_idt_entry(97,(uint32_t)irq97);
add_idt_entry(98,(uint32_t)irq98);
add_idt_entry(99,(uint32_t)irq99);
add_idt_entry(100,(uint32_t)irq100);
add_idt_entry(101,(uint32_t)irq101);
add_idt_entry(102,(uint32_t)irq102);
add_idt_entry(103,(uint32_t)irq103);
add_idt_entry(104,(uint32_t)irq104);
add_idt_entry(105,(uint32_t)irq105);
add_idt_entry(106,(uint32_t)irq106);
add_idt_entry(107,(uint32_t)irq107);
add_idt_entry(108,(uint32_t)irq108);
add_idt_entry(109,(uint32_t)irq109);
add_idt_entry(110,(uint32_t)irq110);
add_idt_entry(111,(uint32_t)irq111);
add_idt_entry(112,(uint32_t)irq112);
add_idt_entry(113,(uint32_t)irq113);
add_idt_entry(114,(uint32_t)irq114);
add_idt_entry(115,(uint32_t)irq115);
add_idt_entry(116,(uint32_t)irq116);
add_idt_entry(117,(uint32_t)irq117);
add_idt_entry(118,(uint32_t)irq118);
add_idt_entry(119,(uint32_t)irq119);
add_idt_entry(120,(uint32_t)irq120);
add_idt_entry(121,(uint32_t)irq121);
add_idt_entry(122,(uint32_t)irq122);
add_idt_entry(123,(uint32_t)irq123);
add_idt_entry(124,(uint32_t)irq124);
add_idt_entry(125,(uint32_t)irq125);
add_idt_entry(126,(uint32_t)irq126);
add_idt_entry(127,(uint32_t)irq127);
add_idt_entry(128,(uint32_t)irq128);
add_idt_entry(129,(uint32_t)irq129);
add_idt_entry(130,(uint32_t)irq130);
add_idt_entry(131,(uint32_t)irq131);
add_idt_entry(132,(uint32_t)irq132);
add_idt_entry(133,(uint32_t)irq133);
add_idt_entry(134,(uint32_t)irq134);
add_idt_entry(135,(uint32_t)irq135);
add_idt_entry(136,(uint32_t)irq136);
add_idt_entry(137,(uint32_t)irq137);
add_idt_entry(138,(uint32_t)irq138);
add_idt_entry(139,(uint32_t)irq139);
add_idt_entry(140,(uint32_t)irq140);
add_idt_entry(141,(uint32_t)irq141);
add_idt_entry(142,(uint32_t)irq142);
add_idt_entry(143,(uint32_t)irq143);
add_idt_entry(144,(uint32_t)irq144);
add_idt_entry(145,(uint32_t)irq145);
add_idt_entry(146,(uint32_t)irq146);
add_idt_entry(147,(uint32_t)irq147);
add_idt_entry(148,(uint32_t)irq148);
add_idt_entry(149,(uint32_t)irq149);
add_idt_entry(150,(uint32_t)irq150);
add_idt_entry(151,(uint32_t)irq151);
add_idt_entry(152,(uint32_t)irq152);
add_idt_entry(153,(uint32_t)irq153);
add_idt_entry(154,(uint32_t)irq154);
add_idt_entry(155,(uint32_t)irq155);
add_idt_entry(156,(uint32_t)irq156);
add_idt_entry(157,(uint32_t)irq157);
add_idt_entry(158,(uint32_t)irq158);
add_idt_entry(159,(uint32_t)irq159);
add_idt_entry(160,(uint32_t)irq160);
add_idt_entry(161,(uint32_t)irq161);
add_idt_entry(162,(uint32_t)irq162);
add_idt_entry(163,(uint32_t)irq163);
add_idt_entry(164,(uint32_t)irq164);
add_idt_entry(165,(uint32_t)irq165);
add_idt_entry(166,(uint32_t)irq166);
add_idt_entry(167,(uint32_t)irq167);
add_idt_entry(168,(uint32_t)irq168);
add_idt_entry(169,(uint32_t)irq169);
add_idt_entry(170,(uint32_t)irq170);
add_idt_entry(171,(uint32_t)irq171);
add_idt_entry(172,(uint32_t)irq172);
add_idt_entry(173,(uint32_t)irq173);
add_idt_entry(174,(uint32_t)irq174);
add_idt_entry(175,(uint32_t)irq175);
add_idt_entry(176,(uint32_t)irq176);
add_idt_entry(177,(uint32_t)irq177);
add_idt_entry(178,(uint32_t)irq178);
add_idt_entry(179,(uint32_t)irq179);
add_idt_entry(180,(uint32_t)irq180);
add_idt_entry(181,(uint32_t)irq181);
add_idt_entry(182,(uint32_t)irq182);
add_idt_entry(183,(uint32_t)irq183);
add_idt_entry(184,(uint32_t)irq184);
add_idt_entry(185,(uint32_t)irq185);
add_idt_entry(186,(uint32_t)irq186);
add_idt_entry(187,(uint32_t)irq187);
add_idt_entry(188,(uint32_t)irq188);
add_idt_entry(189,(uint32_t)irq189);
add_idt_entry(190,(uint32_t)irq190);
add_idt_entry(191,(uint32_t)irq191);
add_idt_entry(192,(uint32_t)irq192);
add_idt_entry(193,(uint32_t)irq193);
add_idt_entry(194,(uint32_t)irq194);
add_idt_entry(195,(uint32_t)irq195);
add_idt_entry(196,(uint32_t)irq196);
add_idt_entry(197,(uint32_t)irq197);
add_idt_entry(198,(uint32_t)irq198);
add_idt_entry(199,(uint32_t)irq199);
add_idt_entry(200,(uint32_t)irq200);
add_idt_entry(201,(uint32_t)irq201);
add_idt_entry(202,(uint32_t)irq202);
add_idt_entry(203,(uint32_t)irq203);
add_idt_entry(204,(uint32_t)irq204);
add_idt_entry(205,(uint32_t)irq205);
add_idt_entry(206,(uint32_t)irq206);
add_idt_entry(207,(uint32_t)irq207);
add_idt_entry(208,(uint32_t)irq208);
add_idt_entry(209,(uint32_t)irq209);
add_idt_entry(210,(uint32_t)irq210);
add_idt_entry(211,(uint32_t)irq211);
add_idt_entry(212,(uint32_t)irq212);
add_idt_entry(213,(uint32_t)irq213);
add_idt_entry(214,(uint32_t)irq214);
add_idt_entry(215,(uint32_t)irq215);
add_idt_entry(216,(uint32_t)irq216);
add_idt_entry(217,(uint32_t)irq217);
add_idt_entry(218,(uint32_t)irq218);
add_idt_entry(219,(uint32_t)irq219);
add_idt_entry(220,(uint32_t)irq220);
add_idt_entry(221,(uint32_t)irq221);
add_idt_entry(222,(uint32_t)irq222);
add_idt_entry(223,(uint32_t)irq223);
add_idt_entry(224,(uint32_t)irq224);
add_idt_entry(225,(uint32_t)irq225);
add_idt_entry(226,(uint32_t)irq226);
add_idt_entry(227,(uint32_t)irq227);
add_idt_entry(228,(uint32_t)irq228);
add_idt_entry(229,(uint32_t)irq229);
add_idt_entry(230,(uint32_t)irq230);
add_idt_entry(231,(uint32_t)irq231);
add_idt_entry(232,(uint32_t)irq232);
add_idt_entry(233,(uint32_t)irq233);
add_idt_entry(234,(uint32_t)irq234);
add_idt_entry(235,(uint32_t)irq235);
add_idt_entry(236,(uint32_t)irq236);
add_idt_entry(237,(uint32_t)irq237);
add_idt_entry(238,(uint32_t)irq238);
add_idt_entry(239,(uint32_t)irq239);
add_idt_entry(240,(uint32_t)irq240);
add_idt_entry(241,(uint32_t)irq241);
add_idt_entry(242,(uint32_t)irq242);
add_idt_entry(243,(uint32_t)irq243);
add_idt_entry(244,(uint32_t)irq244);
add_idt_entry(245,(uint32_t)irq245);
add_idt_entry(246,(uint32_t)irq246);
add_idt_entry(247,(uint32_t)irq247);
add_idt_entry(248,(uint32_t)irq248);
add_idt_entry(249,(uint32_t)irq249);
add_idt_entry(250,(uint32_t)irq250);
add_idt_entry(251,(uint32_t)irq251);
add_idt_entry(252,(uint32_t)irq252);
add_idt_entry(253,(uint32_t)irq253);
add_idt_entry(254,(uint32_t)irq254);
add_idt_entry(255,(uint32_t)irq255);
idtp.size=sizeof(struct idt_entry)*256-1;
idtp.offset=(uint32_t)&idt;
load_idt(&idtp);
}
|