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