X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Fx86%2Firq.c;h=381b157988c4d579b8b76634e22cf1fbd89a1f8b;hb=30e2436921e53b149d65403430048e39a44cad4b;hp=586768eaa2de34b0a0fe6b327b1b0d45879bb43e;hpb=466eda7c917791866a29c253c6c22197faf41bf7;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86/irq.c b/Kernel/arch/x86/irq.c index 586768ea..381b1579 100644 --- a/Kernel/arch/x86/irq.c +++ b/Kernel/arch/x86/irq.c @@ -2,14 +2,18 @@ * AcessOS Microkernel Version * irq.c */ -#include +#include // === CONSTANTS === #define MAX_CALLBACKS_PER_IRQ 4 +#define TRACE_IRQS 0 // === TYPES === typedef void (*tIRQ_Callback)(int); +// === PROTOTYPES === +void IRQ_Handler(tRegs *Regs); + // === GLOBALS === tIRQ_Callback gIRQ_Handlers[16][MAX_CALLBACKS_PER_IRQ]; @@ -21,21 +25,27 @@ tIRQ_Callback gIRQ_Handlers[16][MAX_CALLBACKS_PER_IRQ]; void IRQ_Handler(tRegs *Regs) { int i; - + Regs->int_num -= 0xF0; // Adjust - + //Log("IRQ_Handler: (Regs={int_num:%i})", Regs->int_num); - + for( i = 0; i < MAX_CALLBACKS_PER_IRQ; i++ ) { - //Log(" IRQ_Handler: Call %p", gIRQ_Handlers[Regs->int_num][i]); - if( gIRQ_Handlers[Regs->int_num][i] ) + if( gIRQ_Handlers[Regs->int_num][i] ) { gIRQ_Handlers[Regs->int_num][i](Regs->int_num); + #if TRACE_IRQS + if( Regs->int_num != 8 ) + Log("IRQ %i: Call %p", Regs->int_num, gIRQ_Handlers[Regs->int_num][i]); + #endif + } } - + + //Log(" IRQ_Handler: Resetting"); if(Regs->int_num >= 8) outb(0xA0, 0x20); // ACK IRQ (Secondary PIC) outb(0x20, 0x20); // ACK IRQ + //Log("IRQ_Handler: RETURN"); } /** @@ -47,10 +57,12 @@ int IRQ_AddHandler( int Num, void (*Callback)(int) ) for( i = 0; i < MAX_CALLBACKS_PER_IRQ; i++ ) { if( gIRQ_Handlers[Num][i] == NULL ) { + Log_Log("IRQ", "Added IRQ%i Cb#%i %p", Num, i, Callback); gIRQ_Handlers[Num][i] = Callback; return 1; } } - + + Log_Warning("IRQ", "No free callbacks on IRQ%i", Num); return 0; }