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=3... ============================================================================== --- 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