[ros-diffs] [ros-arm-bringup] 34482: - Implement KeTrapFrameToContext. - We now get to the point where we call KiDebugRoutine, which is registered as KdpEnterDebuggerException. - KdpEnterDebuggerException reads our exception record and understands this is a BREAKPOINT_PRINT. - It then calls the KdpServiceDispatcher. - This, in turn, calls KdpPrintString. - Which in turn loops the "debug providers" and calls KdpSerialPrintString. - Which calls into KDCOM. - And we see this on the debug log: (ntoskrnl/kd/kdio.c:191) . - Epic Win. Need to implement KeContextToTrapFrame now.

ros-arm-bringup at svn.reactos.org ros-arm-bringup at svn.reactos.org
Mon Jul 14 01:58:48 CEST 2008


Author: ros-arm-bringup
Date: Sun Jul 13 18:58:47 2008
New Revision: 34482

URL: http://svn.reactos.org/svn/reactos?rev=34482&view=rev
Log:
- Implement KeTrapFrameToContext.
- We now get to the point where we call KiDebugRoutine, which is registered as KdpEnterDebuggerException.
- KdpEnterDebuggerException reads our exception record and understands this is a BREAKPOINT_PRINT.
- It then calls the KdpServiceDispatcher.
- This, in turn, calls KdpPrintString.
- Which in turn loops the "debug providers" and calls KdpSerialPrintString.
- Which calls into KDCOM.
- And we see this on the debug log: (ntoskrnl/kd/kdio.c:191) .
- Epic Win. Need to implement KeContextToTrapFrame now.


Modified:
    trunk/reactos/ntoskrnl/ke/arm/exp.c

Modified: trunk/reactos/ntoskrnl/ke/arm/exp.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/arm/exp.c?rev=34482&r1=34481&r2=34482&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/ke/arm/exp.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/ke/arm/exp.c [iso-8859-1] Sun Jul 13 18:58:47 2008
@@ -13,6 +13,10 @@
 #include <debug.h>
 
 /* GLOBALS ********************************************************************/
+
+#include <internal/arm/ksarm.h>
+#define KiGetPreviousMode(tf) \
+((tf->Spsr & CPSR_MODES) == CPSR_USER_MODE) ? UserMode: KernelMode
 
 
 /* FUNCTIONS ******************************************************************/
@@ -35,8 +39,73 @@
                      IN PKEXCEPTION_FRAME ExceptionFrame,
                      IN OUT PCONTEXT Context)
 {
-    while (TRUE);
-    return; 
+    KIRQL OldIrql;
+    
+    //
+    // Do this at APC_LEVEL
+    //
+    OldIrql = KeGetCurrentIrql();
+    if (OldIrql < APC_LEVEL) KeRaiseIrql(APC_LEVEL, &OldIrql);
+    
+    //
+    // Start with the Control flags
+    //
+    if ((Context->ContextFlags & CONTEXT_CONTROL) == CONTEXT_CONTROL)
+    {
+        //
+        // So this basically means all the special stuff
+        //
+        if (KiGetPreviousMode(TrapFrame))
+        {
+            //
+            // ARM has register banks
+            //
+            Context->Sp = TrapFrame->UserSp;
+            Context->Lr = TrapFrame->UserLr;
+        }
+        else
+        {
+            //
+            // ARM has register banks
+            //
+            Context->Sp = TrapFrame->SvcSp;
+            Context->Lr = TrapFrame->SvcLr;
+        }
+        
+        //
+        // The rest is already in the right mode
+        //
+        Context->Pc = TrapFrame->Pc;
+        Context->Psr = TrapFrame->Spsr;
+    }
+    
+    //
+    // Now do the integers
+    //
+    if ((Context->ContextFlags & CONTEXT_INTEGER) == CONTEXT_INTEGER)
+    {
+        //
+        // Basically everything else but FPU
+        //
+        Context->R0 = TrapFrame->R0;
+        Context->R1 = TrapFrame->R1;
+        Context->R2 = TrapFrame->R2;
+        Context->R3 = TrapFrame->R3;
+        Context->R4 = TrapFrame->R4;
+        Context->R5 = TrapFrame->R5;
+        Context->R6 = TrapFrame->R6;
+        Context->R7 = TrapFrame->R7;
+        Context->R8 = TrapFrame->R8;
+        Context->R0 = TrapFrame->R9;
+        Context->R10 = TrapFrame->R10;
+        Context->R11 = TrapFrame->R11;
+        Context->R12 = TrapFrame->R12;
+    }
+           
+    //
+    // Restore IRQL
+    //
+    if (OldIrql < APC_LEVEL) KeLowerIrql(OldIrql);    
 }
 
 VOID



More information about the Ros-diffs mailing list