2 * AcessOS Microkernel Version
8 #define MAX_CALLBACKS_PER_IRQ 4
11 typedef void (*tIRQ_Callback)(int);
14 tIRQ_Callback gIRQ_Handlers[16][MAX_CALLBACKS_PER_IRQ];
18 * \fn void IRQ_Handler(tRegs *Regs)
19 * \brief Handle an IRQ
21 void IRQ_Handler(tRegs *Regs)
25 Regs->int_num -= 0xF0; // Adjust
27 //Log("IRQ_Handler: (Regs={int_num:%i})", Regs->int_num);
29 for( i = 0; i < MAX_CALLBACKS_PER_IRQ; i++ )
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);
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");
44 * \fn int IRQ_AddHandler( int Num, void (*Callback)(int) )
46 int IRQ_AddHandler( int Num, void (*Callback)(int) )
49 for( i = 0; i < MAX_CALLBACKS_PER_IRQ; i++ )
51 if( gIRQ_Handlers[Num][i] == NULL ) {
52 gIRQ_Handlers[Num][i] = Callback;