- Misc changes
[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 #define TRACE_IRQS      0
10
11 // === TYPES ===
12 typedef void (*tIRQ_Callback)(int);
13
14 // === GLOBALS ===
15 tIRQ_Callback   gIRQ_Handlers[16][MAX_CALLBACKS_PER_IRQ];
16
17 // === CODE ===
18 /**
19  * \fn void IRQ_Handler(tRegs *Regs)
20  * \brief Handle an IRQ
21  */
22 void IRQ_Handler(tRegs *Regs)
23 {
24          int    i;
25
26         Regs->int_num -= 0xF0;  // Adjust
27
28         //Log("IRQ_Handler: (Regs={int_num:%i})", Regs->int_num);
29
30         for( i = 0; i < MAX_CALLBACKS_PER_IRQ; i++ )
31         {
32                 if( gIRQ_Handlers[Regs->int_num][i] ) {
33                         gIRQ_Handlers[Regs->int_num][i](Regs->int_num);
34                         #if TRACE_IRQS
35                         if( Regs->int_num != 8 )
36                                 Log("IRQ %i: Call %p", Regs->int_num, gIRQ_Handlers[Regs->int_num][i]);
37                         #endif
38                 }
39         }
40
41         //Log(" IRQ_Handler: Resetting");
42         if(Regs->int_num >= 8)
43                 outb(0xA0, 0x20);       // ACK IRQ (Secondary PIC)
44         outb(0x20, 0x20);       // ACK IRQ
45         //Log("IRQ_Handler: RETURN");
46 }
47
48 /**
49  * \fn int IRQ_AddHandler( int Num, void (*Callback)(int) )
50  */
51 int IRQ_AddHandler( int Num, void (*Callback)(int) )
52 {
53          int    i;
54         for( i = 0; i < MAX_CALLBACKS_PER_IRQ; i++ )
55         {
56                 if( gIRQ_Handlers[Num][i] == NULL ) {
57                         Log_Log("IRQ", "Added IRQ%i Cb#%i %p", Num, i, Callback);
58                         gIRQ_Handlers[Num][i] = Callback;
59                         return 1;
60                 }
61         }
62
63         Log_Warning("IRQ", "No free callbacks on IRQ%i", Num);
64         return 0;
65 }

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