X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Fx86%2Firq.c;h=e2dcf0e31f68c585dc3871d0f7fb584c061858f1;hb=e957c67ea0f63a668303d087af7ee0c7ecff1f01;hp=9e0647f25145bf748894d49c6ce8a651f0dc17b7;hpb=b3fa9a08edcbc459bd8e9df73186e292470ebfc3;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86/irq.c b/Kernel/arch/x86/irq.c index 9e0647f2..e2dcf0e3 100644 --- a/Kernel/arch/x86/irq.c +++ b/Kernel/arch/x86/irq.c @@ -6,12 +6,17 @@ // === CONSTANTS === #define MAX_CALLBACKS_PER_IRQ 4 +#define TRACE_IRQS 0 // === TYPES === -typedef void (*tIRQ_Callback)(int); +typedef void (*tIRQ_Callback)(int, void *); + +// === PROTOTYPES === +void IRQ_Handler(tRegs *Regs); // === GLOBALS === tIRQ_Callback gIRQ_Handlers[16][MAX_CALLBACKS_PER_IRQ]; +void *gaIRQ_DataPointers[16][MAX_CALLBACKS_PER_IRQ]; // === CODE === /** @@ -20,21 +25,23 @@ tIRQ_Callback gIRQ_Handlers[16][MAX_CALLBACKS_PER_IRQ]; */ void IRQ_Handler(tRegs *Regs) { - int i; - - Regs->int_num -= 0xF0; // Adjust + int i, irq = Regs->int_num - 0xF0; //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] ) - gIRQ_Handlers[Regs->int_num][i](Regs->int_num); + if( gIRQ_Handlers[irq][i] ) { + gIRQ_Handlers[irq][i](irq, gaIRQ_DataPointers[irq][i]); + #if TRACE_IRQS + if( irq != 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) + if(irq >= 8) outb(0xA0, 0x20); // ACK IRQ (Secondary PIC) outb(0x20, 0x20); // ACK IRQ //Log("IRQ_Handler: RETURN"); @@ -43,18 +50,19 @@ void IRQ_Handler(tRegs *Regs) /** * \fn int IRQ_AddHandler( int Num, void (*Callback)(int) ) */ -int IRQ_AddHandler( int Num, void (*Callback)(int) ) +int IRQ_AddHandler( int Num, void (*Callback)(int, void*), void *Ptr ) { int i; for( i = 0; i < MAX_CALLBACKS_PER_IRQ; i++ ) { if( gIRQ_Handlers[Num][i] == NULL ) { - Log("IRQ_AddHandler: Added IRQ%i Cb#%i %p", Num, i, Callback); + Log_Log("IRQ", "Added IRQ%i Cb#%i %p", Num, i, Callback); gIRQ_Handlers[Num][i] = Callback; + gaIRQ_DataPointers[Num][i] = Ptr; return 1; } } - Warning("IRQ_AddHandler - No free callbacks on IRQ%i", Num); + Log_Warning("IRQ", "No free callbacks on IRQ%i", Num); return 0; }