summaryrefslogtreecommitdiff
path: root/kernel/cpu/idt.h
blob: 9a47ec02f83ffd858682421b8fc990fd77126f67 (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
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
#ifndef IDT_H
#define IDT_H
#include <cpu/gdt.h>
#include <cpu/io.h>
#include <log.h>
#include <stdio.h>
#include <typedefs.h>
typedef struct kernel_registers kernel_registers_t;
typedef struct registers registers_t;

/*
 * the type_attribute in the IDT_Entry struct
 * is divded like this
 *   7                           0
 * +---+---+---+---+---+---+---+---+
 * | P |  DPL  | S |    GateType   |
 * +---+---+---+---+---+---+---+---+
 * It is 8 bits(1 byte) long
 *
 * P
 *	Present bit. Should be zero for unused
 *	interrupts.
 *
 * DPL
 *	Specifices the maximum ring(0 to 3) the
 *	interrupt can be called from.
 *
 * S
 *	Storage segment. This should be set to
 *	zero for all interrupt and trap gates.
 *
 * GateType
 *	Possible IDT gate types:
 *	0b0101	0x5	5	80386 32 bit task gate
 *	0b0110	0x6	6	80286 16-bit interrupt gate
 *	0b0111	0x7	7	80286 16-bit trap gate
 *	0b1110	0xE	14	80386 32-bit interrupt gate
 *	0b1111	0xF	15	80386 32-bit trap gate
 */

// This enables the present bit.
#define INT_PRESENT 0x80 /* 0b10000000 */

#define INT_32_TASK_GATE(min_privlege)                                         \
  (INT_PRESENT | 0x05 | (min_privlege << 5))
#define INT_16_INTERRUPT_GATE(min_privlege)                                    \
  (INT_PRESENT | 0x06 | (min_privlege << 5))
#define INT_16_TRAP_GATE(min_privlege)                                         \
  (INT_PRESENT | 0x07 | (min_privlege << 5))
#define INT_32_INTERRUPT_GATE(min_privlege)                                    \
  (INT_PRESENT | 0x0E | (min_privlege << 5))
#define INT_32_TRAP_GATE(min_privlege)                                         \
  (INT_PRESENT | 0x0F | (min_privlege << 5))

struct interrupt_frame;

void isr0();
void isr1();
void isr2();
void isr3();
void isr4();
void isr5();
void isr6();
void isr7();
void isr8();
void isr9();
void isr10();
void isr11();
void isr12();
void isr13();
void isr14();
void isr15();
void isr16();
void isr17();
void isr18();
void isr19();
void isr20();
void isr21();
void isr22();
void isr23();
void isr24();
void isr25();
void isr26();
void isr27();
void isr28();
void isr29();
void isr30();
void isr31();
void isr32();
void isr33();
void isr34();
void isr35();
void isr36();
void isr37();
void isr38();
void isr39();
void isr40();
void isr41();
void isr42();
void isr43();
void isr44();
void isr45();
void isr46();
void isr47();
void isr48();
void isr49();
void isr50();
void isr51();
void isr52();
void isr53();
void isr54();
void isr55();
void isr56();
void isr57();
void isr58();
void isr59();
void isr60();
void isr61();
void isr62();
void isr63();
void isr64();
void isr65();
void isr66();
void isr67();
void isr68();
void isr69();
void isr70();
void isr71();
void isr72();
void isr73();
void isr74();
void isr75();
void isr76();
void isr77();
void isr78();
void isr79();
void isr80();
void isr81();
void isr82();
void isr83();
void isr84();
void isr85();
void isr86();
void isr87();
void isr88();
void isr89();
void isr90();
void isr91();
void isr92();
void isr93();
void isr94();
void isr95();
void isr96();
void isr97();
void isr98();
void isr99();
void isr100();
void isr101();
void isr102();
void isr103();
void isr104();
void isr105();
void isr106();
void isr107();
void isr108();
void isr109();
void isr110();
void isr111();
void isr112();
void isr113();
void isr114();
void isr115();
void isr116();
void isr117();
void isr118();
void isr119();
void isr120();
void isr121();
void isr122();
void isr123();
void isr124();
void isr125();
void isr126();
void isr127();
void isr128();
void isr129();
void isr130();
void isr131();
void isr132();
void isr133();
void isr134();
void isr135();
void isr136();
void isr137();
void isr138();
void isr139();
void isr140();
void isr141();
void isr142();
void isr143();
void isr144();
void isr145();
void isr146();
void isr147();
void isr148();
void isr149();
void isr150();
void isr151();
void isr152();
void isr153();
void isr154();
void isr155();
void isr156();
void isr157();
void isr158();
void isr159();
void isr160();
void isr161();
void isr162();
void isr163();
void isr164();
void isr165();
void isr166();
void isr167();
void isr168();
void isr169();
void isr170();
void isr171();
void isr172();
void isr173();
void isr174();
void isr175();
void isr176();
void isr177();
void isr178();
void isr179();
void isr180();
void isr181();
void isr182();
void isr183();
void isr184();
void isr185();
void isr186();
void isr187();
void isr188();
void isr189();
void isr190();
void isr191();
void isr192();
void isr193();
void isr194();
void isr195();
void isr196();
void isr197();
void isr198();
void isr199();
void isr200();
void isr201();
void isr202();
void isr203();
void isr204();
void isr205();
void isr206();
void isr207();
void isr208();
void isr209();
void isr210();
void isr211();
void isr212();
void isr213();
void isr214();
void isr215();
void isr216();
void isr217();
void isr218();
void isr219();
void isr220();
void isr221();
void isr222();
void isr223();
void isr224();
void isr225();
void isr226();
void isr227();
void isr228();
void isr229();
void isr230();
void isr231();
void isr232();
void isr233();
void isr234();
void isr235();
void isr236();
void isr237();
void isr238();
void isr239();
void isr240();
void isr241();
void isr242();
void isr243();
void isr244();
void isr245();
void isr246();
void isr247();
void isr248();
void isr249();
void isr250();
void isr251();
void isr252();
void isr253();
void isr254();
void isr255();

typedef struct reg {
  u32 ds;
  // Pushed by pusha.
  u32 edi, esi, ebp, esp, ebx, edx, ecx, eax;
  u32 int_no, error_code;
  // Pushed by the processor automatically.
  u32 eip, cs, eflags, useresp, ss;
} reg_t;

void idt_init(void);
__attribute__((no_caller_saved_registers)) void EOI(unsigned char irq);

typedef void (*interrupt_handler)(reg_t *);
void install_handler(interrupt_handler handler_function, u16 type_attribute,
                     u8 entry);
void irq_set_mask(u8 irq_line);
void irq_clear_mask(u8 irq_line);
#endif