summaryrefslogtreecommitdiff
path: root/kernel/interrupts.c
blob: 348972ef4a4dd102a6b0a906b18f74163ece3370 (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
#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();
    }
}
*/