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
|
#include "interrupts.h"
#include "x86.h"
#include "../lib/logger/log.h" // logger facilities
#define FOOLOS_MODULE_NAME "interrupts"
// the interrupt descriptor table
static struct int_desc
{
uint16_t addrLo;
uint16_t sel;
uint8_t zeros;
uint8_t flags;
uint16_t addrHi;
} idt[INT_MAX];
// interrupt descriptor table descriptor
static struct idt_desc
{
uint16_t size;
uint16_t baseLo;
uint16_t baseHi;
} idtd;
// disable interrupts
void int_disable()
{
__asm__("cli");
}
// enable interrupts
void int_enable()
{
__asm__("sti");
log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"up and running");
}
void int_generate88()
{
__asm__("int $88");
}
void int_def_handler()
{
X86_IRQ_BEGIN
int_unhandled++;
X86_IRQ_END
}
//set a handler for a specific interrupt
void int_install_ir(int irq, uint16_t flags, uint16_t sel, void *addr)
{
uint64_t base=(uint64_t)&(*addr); // TODO!
idt[irq].addrLo = base & 0xffff;
idt[irq].addrHi = (base >> 16) & 0xffff;
idt[irq].addrHi = 0x0;
idt[irq].zeros=0;
idt[irq].flags=flags;
idt[irq].sel=sel;
}
// set default handler for all interrupts for a start
void int_init(uint16_t sel)
{
int i;
for(i=0; i<INT_MAX; i++)
{
int_install_ir(i, 0b10001110, sel,&int_def_handler);
}
log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"initializing. IDT: 0x%08x, IDTD: 0x%08X",&idt,&idtd);
}
void int_install()
{
idtd.size=sizeof(struct int_desc)*INT_MAX; //TODO
idtd.baseHi=0x0000;
idtd.baseLo=&idt[0];
__asm__("lidt %0"::"m" (idtd));
}
/*
//print interrupt table; //TODO!
void int_show()
{
uint16_t *ptr3=&idt[0]; // TODO!
scr_put_string("idt located: ");
scr_put_hex(ptr3);
scr_nextline();
// first two bytes as chars
int offset;
for(offset=32;offset<40;offset++)
{
print_hex(offset-32); //ir // install keyboard handler
int_install_ir(33, 0b10001110, 0x08,&int_kb_handler);
q
print_string(" -> ");
print_hex(*(ptr3+offset*4)); //addrLo
print_hex(*(ptr3+1+offset*4)); //sel
print_hex(*(ptr3+2+offset*4)); //zeros & flags
print_hex(*(ptr3+3+offset*4)); //addrHi
print_nextline();
}
}
*/
|