Fixed TID0 not being on the All Threads list
[tpg/acess2.git] / Kernel / arch / x86 / irq.c
1 /*
2  * AcessOS Microkernel Version
3  * irq.c
4  */
5 #include <acess.h>
6
7 // === CONSTANTS ===
8 #define MAX_CALLBACKS_PER_IRQ   4
9
10 // === TYPES ===
11 typedef void (*tIRQ_Callback)(int);
12
13 // === GLOBALS ===
14 tIRQ_Callback   gIRQ_Handlers[16][MAX_CALLBACKS_PER_IRQ];
15
16 // === CODE ===
17 /**
18  * \fn void IRQ_Handler(tRegs *Regs)
19  * \brief Handle an IRQ
20  */
21 void IRQ_Handler(tRegs *Regs)
22 {
23          int    i;
24
25         Regs->int_num -= 0xF0;  // Adjust
26
27         //Log("IRQ_Handler: (Regs={int_num:%i})", Regs->int_num);
28
29         for( i = 0; i < MAX_CALLBACKS_PER_IRQ; i++ )
30         {
31                 //Log(" IRQ_Handler: Call %p", gIRQ_Handlers[Regs->int_num][i]);
32                 if( gIRQ_Handlers[Regs->int_num][i] )
33                         gIRQ_Handlers[Regs->int_num][i](Regs->int_num);
34         }
35
36         //Log(" IRQ_Handler: Resetting");
37         if(Regs->int_num >= 8)
38                 outb(0xA0, 0x20);       // ACK IRQ (Secondary PIC)
39         outb(0x20, 0x20);       // ACK IRQ
40         //Log("IRQ_Handler: RETURN");
41 }
42
43 /**
44  * \fn int IRQ_AddHandler( int Num, void (*Callback)(int) )
45  */
46 int IRQ_AddHandler( int Num, void (*Callback)(int) )
47 {
48          int    i;
49         for( i = 0; i < MAX_CALLBACKS_PER_IRQ; i++ )
50         {
51                 if( gIRQ_Handlers[Num][i] == NULL ) {
52                         Log_Log("IRQ", "Added IRQ%i Cb#%i %p", Num, i, Callback);
53                         gIRQ_Handlers[Num][i] = Callback;
54                         return 1;
55                 }
56         }
57
58         Log_Warning("IRQ", "No free callbacks on IRQ%i", Num);
59         return 0;
60 }

UCC git Repository :: git.ucc.asn.au