[ros-diffs] [ros-arm-bringup] 34584: - Enable interrupts after probing and capturing parameters during a system call. - Enable WFI during idle loop. - Implement undefined exception handler, and get rid of reserved exception code -- this will never happen except for an SoC bug. - Request an APC interrupt if the new thread we context switched to has APCs pending and enabled. - Perform DPC watchdog debugging code if a DPC lasted more than a second. - Do the appropriate bugcheck if DPCs are active during a context switch. - Go over the FIXMEs in the assembly files too, and create a new FIXME-PERF category.

ros-arm-bringup at svn.reactos.org ros-arm-bringup at svn.reactos.org
Sat Jul 19 08:53:03 CEST 2008


Author: ros-arm-bringup
Date: Sat Jul 19 01:53:03 2008
New Revision: 34584

URL: http://svn.reactos.org/svn/reactos?rev=34584&view=rev
Log:
- Enable interrupts after probing and capturing parameters during a system call.
- Enable WFI during idle loop.
- Implement undefined exception handler, and get rid of reserved exception code -- this will never happen except for an SoC bug.
- Request an APC interrupt if the new thread we context switched to has APCs pending and enabled.
- Perform DPC watchdog debugging code if a DPC lasted more than a second.
- Do the appropriate bugcheck if DPCs are active during a context switch.
- Go over the FIXMEs in the assembly files too, and create a new FIXME-PERF category.


Modified:
    trunk/reactos/ntoskrnl/include/internal/arm/intrin_i.h
    trunk/reactos/ntoskrnl/include/internal/ke.h
    trunk/reactos/ntoskrnl/ke/arm/ctxswtch.s
    trunk/reactos/ntoskrnl/ke/arm/kiinit.c
    trunk/reactos/ntoskrnl/ke/arm/time.c
    trunk/reactos/ntoskrnl/ke/arm/trap.s
    trunk/reactos/ntoskrnl/ke/arm/trapc.c
    trunk/reactos/ntoskrnl/ke/arm/usercall.c

Modified: trunk/reactos/ntoskrnl/include/internal/arm/intrin_i.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/include/internal/arm/intrin_i.h?rev=34584&r1=34583&r2=34584&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/include/internal/arm/intrin_i.h [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/include/internal/arm/intrin_i.h [iso-8859-1] Sat Jul 19 01:53:03 2008
@@ -148,5 +148,11 @@
     __asm__ __volatile__ ("mcr p15, 0, %0, c7, c5, 0" : : "r"(0) : "cc");
 }
 
+FORCEINLINE
+VOID
+KeArmWaitForInterrupt(VOID)
+{
+    __asm__ __volatile__ ("mcr p15, 0, %0, c7, c0, 4" : : "r"(0) : "cc");
+}
 
 #endif

Modified: trunk/reactos/ntoskrnl/include/internal/ke.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/include/internal/ke.h?rev=34584&r1=34583&r2=34584&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/include/internal/ke.h [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/include/internal/ke.h [iso-8859-1] Sat Jul 19 01:53:03 2008
@@ -155,6 +155,7 @@
 extern ULONG KeTimeIncrement;
 extern ULONG_PTR KiBugCheckData[5];
 extern ULONG KiFreezeFlag;
+extern ULONG KiDPCTimeout;
 
 /* MACROS *************************************************************************/
 

Modified: trunk/reactos/ntoskrnl/ke/arm/ctxswtch.s
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/arm/ctxswtch.s?rev=34584&r1=34583&r2=34584&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/ke/arm/ctxswtch.s [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/ke/arm/ctxswtch.s [iso-8859-1] Sat Jul 19 01:53:03 2008
@@ -25,7 +25,7 @@
     
     //
     // Build exception frame
-    // FIXME: Change to stmdb later
+    // FIXME-PERF: Change to stmdb later
     //
     str r4, [sp, #ExR4]
     str r5, [sp, #ExR5]
@@ -58,7 +58,7 @@
     
     //
     // Restore the registers
-    // FIXME: Use LDMIA later
+    // FIXME-PERF: Use LDMIA later
     //
     ldr r4, [sp, #ExR4]
     ldr r5, [sp, #ExR5]
@@ -84,11 +84,7 @@
 
     NESTED_ENTRY KiThreadStartup
     PROLOG_END KiThreadStartup
-    
-    //
-    // FIXME: Make space on stack and clean it up?
-    //
-    
+        
     //
     // Lower to APC_LEVEL
     //

Modified: trunk/reactos/ntoskrnl/ke/arm/kiinit.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/arm/kiinit.c?rev=34584&r1=34583&r2=34584&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/ke/arm/kiinit.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/ke/arm/kiinit.c [iso-8859-1] Sat Jul 19 01:53:03 2008
@@ -22,17 +22,6 @@
 #define __ARMV6__ KeIsArmV6
 
 /* FUNCTIONS ******************************************************************/
-
-VOID
-DebugService2(IN ULONG Arg1,
-              IN ULONG Arg2,
-              IN ULONG Service)
-{
-    //
-    // FIXME-TODO: Implement this for symbol load and such
-    //
-    return;
-}
 
 VOID
 NTAPI

Modified: trunk/reactos/ntoskrnl/ke/arm/time.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/arm/time.c?rev=34584&r1=34583&r2=34584&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/ke/arm/time.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/ke/arm/time.c [iso-8859-1] Sat Jul 19 01:53:03 2008
@@ -224,8 +224,31 @@
             Prcb->DpcTime++;
             
             //
-            // FIXME-TODO: Handle DPC checks
-            //
+            // Update Debug DPC time 
+            //
+            Prcb->DebugDpcTime++;
+            
+            //
+            // Check if we've timed out
+            //
+            if (Prcb->DebugDpcTime >= KiDPCTimeout)
+            {
+                //
+                // Print a message
+                //
+                DbgPrint("\n*** DPC routine > 1 sec --- This is not a break in "
+                         "KeUpdateSystemTime\n");
+                
+                //
+                // Break if a debugger is attached
+                //
+                if (KdDebuggerEnabled) DbgBreakPoint();
+                
+                //
+                // Restore the debug DPC time
+                //
+                Prcb->DebugDpcTime = 0;
+            }
         }
     }
     

Modified: trunk/reactos/ntoskrnl/ke/arm/trap.s
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/arm/trap.s?rev=34584&r1=34583&r2=34584&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/ke/arm/trap.s [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/ke/arm/trap.s [iso-8859-1] Sat Jul 19 01:53:03 2008
@@ -17,7 +17,7 @@
         ldr pc, _KiSoftwareInterruptJump        // Software Interrupt
         ldr pc, _KiPrefetchAbortJump            // Prefetch Abort
         ldr pc, _KiDataAbortJump                // Data Abort
-        ldr pc, _KiReservedJump                 // Reserved
+        b .                                     // Reserved
         ldr pc, _KiInterruptJump                // Interrupt
         ldr pc, _KiFastInterruptJump            // Fast Interrupt
         
@@ -25,7 +25,6 @@
     _KiSoftwareInterruptJump:       .word KiSoftwareInterruptException
     _KiPrefetchAbortJump:           .word KiPrefetchAbortException
     _KiDataAbortJump:               .word KiDataAbortException
-    _KiReservedJump:                .word KiReservedException
     _KiInterruptJump:               .word KiInterruptException
     _KiFastInterruptJump:           .word KiFastInterruptException
     
@@ -34,9 +33,22 @@
     PROLOG_END KiUndefinedInstructionException
     
     //
-    // FIXME: TODO
+    // Handle trap entry
     //
-    b .
+    TRAP_PROLOG 0 // NotFromAbort
+    
+    //
+    // Call the C handler
+    //
+    adr lr, 1f
+    mov r0, sp
+    ldr pc, =KiUndefinedExceptionHandler
+    
+1:
+    //
+    // Handle trap exit
+    // 
+    TRAP_EPILOG 0 // NotFromSystemCall
     
     ENTRY_END KiUndefinedInstructionException
     
@@ -137,19 +149,8 @@
     PROLOG_END KiFastInterruptException
     
     //
-    // FIXME: TODO
+    // FIXME-PERF: Implement FIQ exception
     //
     b .
     
     ENTRY_END KiFastInterruptException
-    
-
-    NESTED_ENTRY KiReservedException
-    PROLOG_END KiReservedException
-    
-    //
-    // FIXME: TODO
-    //
-    b .
-    
-    ENTRY_END KiReservedException

Modified: trunk/reactos/ntoskrnl/ke/arm/trapc.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/arm/trapc.c?rev=34584&r1=34583&r2=34584&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/ke/arm/trapc.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/ke/arm/trapc.c [iso-8859-1] Sat Jul 19 01:53:03 2008
@@ -80,8 +80,9 @@
         else
         {
             //
-            // FIXME-TODO: Wait-For-Interrupt ARM Opcode
-            //
+            // Go into WFI (sleep more)
+            //
+            KeArmWaitForInterrupt();
         }
     }
 }
@@ -155,10 +156,13 @@
     if (Prcb->DpcRoutineActive)
     {
         //
-        // FIXME-TODO: Implement bugcheck code
-        //
-        DPRINT1("DPCS ACTIVE!!!\n");
-        ASSERT(FALSE);
+        // Crash the machine
+        //
+        KeBugCheckEx(ATTEMPTED_SWITCH_FROM_DPC,
+                     (ULONG_PTR)OldThread,
+                     (ULONG_PTR)NewThread,
+                     (ULONG_PTR)OldThread->InitialStack,
+                     0);
     }
     
     //
@@ -167,10 +171,16 @@
     if (NewThread->ApcState.KernelApcPending)
     {
         //
-        // FIXME-TODO: Implement bugcheck code
-        //
-        DPRINT1("APCs pending!\n");
-        ASSERT(FALSE);
+        // Are APCs enabled?
+        //
+        if (NewThread->SpecialApcDisable == 0)
+        {
+            //
+            // Request APC delivery
+            //
+            HalRequestSoftwareInterrupt(APC_LEVEL);
+            return TRUE;
+        }
     }
     
     //
@@ -517,13 +527,23 @@
     // Read the opcode
     //
     Instruction = *(PULONG)(TrapFrame->Pc - sizeof(ULONG));
-    
-    //
-    // FIXME-TODO: Enable interrupts?
-    //
-    
+
     //
     // Call the service call dispatcher
     //
     KiSystemService(Thread, TrapFrame, Instruction);
 }
+
+NTSTATUS
+KiUndefinedExceptionHandler(IN PKTRAP_FRAME TrapFrame)
+{
+    ASSERT(TrapFrame->DbgArgMark == 0xBADB0D00);
+    
+    //
+    // This should never happen
+    //
+    DPRINT1("[UNDEF] @ %p/%p\n", TrapFrame->SvcLr, TrapFrame->Pc);
+    UNIMPLEMENTED;
+    ASSERT(FALSE);
+    return STATUS_SUCCESS;
+}

Modified: trunk/reactos/ntoskrnl/ke/arm/usercall.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/arm/usercall.c?rev=34584&r1=34583&r2=34584&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/ke/arm/usercall.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/ke/arm/usercall.c [iso-8859-1] Sat Jul 19 01:53:03 2008
@@ -200,6 +200,11 @@
     }
     
     //
+    // We can safely enable interrupts here
+    //
+    _enable();
+    
+    //
     // Do the system call and save result in EAX
     //
     TrapFrame->R0 = KiSyscallHandlers[ArgumentCount]((PVOID)SystemCall,



More information about the Ros-diffs mailing list