Usermode/libc - Fix strchr and strrchr behavior
[tpg/acess2.git] / KernelLand / Kernel / arch / x86 / irq.c
index e2dcf0e..6ec3c2f 100644 (file)
@@ -25,11 +25,12 @@ void        *gaIRQ_DataPointers[16][MAX_CALLBACKS_PER_IRQ];
  */
 void IRQ_Handler(tRegs *Regs)
 {
-        int    i, irq = Regs->int_num - 0xF0;
+        int    irq = Regs->int_num - 0xF0;
+        int    bHandled = 0;
 
        //Log("IRQ_Handler: (Regs={int_num:%i})", Regs->int_num);
 
-       for( i = 0; i < MAX_CALLBACKS_PER_IRQ; i++ )
+       for( int i = 0; i < MAX_CALLBACKS_PER_IRQ; i++ )
        {
                if( gIRQ_Handlers[irq][i] ) {
                        gIRQ_Handlers[irq][i](irq, gaIRQ_DataPointers[irq][i]);
@@ -37,8 +38,13 @@ void IRQ_Handler(tRegs *Regs)
                        if( irq != 8 )
                                Log("IRQ %i: Call %p", Regs->int_num, gIRQ_Handlers[Regs->int_num][i]);
                        #endif
+                       bHandled = 1;
                }
        }
+       
+       if( !bHandled ) {
+               Log_Debug("IRQ", "Unhandled IRQ %i", irq);
+       }
 
        //Log(" IRQ_Handler: Resetting");
        if(irq >= 8)
@@ -52,17 +58,24 @@ void IRQ_Handler(tRegs *Regs)
  */
 int IRQ_AddHandler( int Num, void (*Callback)(int, void*), void *Ptr )
 {
-        int    i;
-       for( i = 0; i < MAX_CALLBACKS_PER_IRQ; i++ )
+       for( int 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);
+               if( gIRQ_Handlers[Num][i] == NULL )
+               {
+                       //Log_Log("IRQ", "Added IRQ%i Cb#%i %p", Num, i, Callback);
                        gIRQ_Handlers[Num][i] = Callback;
                        gaIRQ_DataPointers[Num][i] = Ptr;
-                       return 1;
+                       return Num * MAX_CALLBACKS_PER_IRQ + i;
                }
        }
 
        Log_Warning("IRQ", "No free callbacks on IRQ%i", Num);
-       return 0;
+       return -1;
+}
+
+void IRQ_RemHandler(int Handle)
+{
+        int    Num = Handle / MAX_CALLBACKS_PER_IRQ;
+        int    id = Handle % MAX_CALLBACKS_PER_IRQ;
+       gIRQ_Handlers[Num][id] = NULL;
 }

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