From ed3125b4e05a287737496defba2d846e92b76ca8 Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Sun, 13 Jul 2008 23:58:47 +0000 Subject: [PATCH] - 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. svn path=/trunk/; revision=34482 --- reactos/ntoskrnl/ke/arm/exp.c | 73 ++++++++++++++++++++++++++++++++++- 1 file changed, 71 insertions(+), 2 deletions(-) diff --git a/reactos/ntoskrnl/ke/arm/exp.c b/reactos/ntoskrnl/ke/arm/exp.c index 7e57f397d99..822f7485345 100644 --- a/reactos/ntoskrnl/ke/arm/exp.c +++ b/reactos/ntoskrnl/ke/arm/exp.c @@ -14,6 +14,10 @@ /* GLOBALS ********************************************************************/ +#include +#define KiGetPreviousMode(tf) \ +((tf->Spsr & CPSR_MODES) == CPSR_USER_MODE) ? UserMode: KernelMode + /* FUNCTIONS ******************************************************************/ @@ -35,8 +39,73 @@ KeTrapFrameToContext(IN PKTRAP_FRAME TrapFrame, 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