summaryrefslogtreecommitdiff
path: root/src/c/idt.c
blob: b25ba7805fc79e37f99a015cb6a37706b60fb609 (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
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);
}