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=…
==============================================================================
--- 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