diff --git a/reactos/include/ndk/arm/ketypes.h b/reactos/include/ndk/arm/ketypes.h index f81afa0f441..add34dca0e5 100644 --- a/reactos/include/ndk/arm/ketypes.h +++ b/reactos/include/ndk/arm/ketypes.h @@ -101,11 +101,11 @@ typedef struct _KEXCEPTION_FRAME ULONG R9; ULONG R10; ULONG R11; - ULONG R12; +// ULONG R12; // ULONG Sp; -// ULONG Psr; + ULONG Psr; ULONG Lr; - ULONG SwapReturn; +// ULONG SwapReturn; } KEXCEPTION_FRAME, *PKEXCEPTION_FRAME; // diff --git a/reactos/ntoskrnl/ex/init.c b/reactos/ntoskrnl/ex/init.c index c9243ff9d4a..ce11447b1ac 100644 --- a/reactos/ntoskrnl/ex/init.c +++ b/reactos/ntoskrnl/ex/init.c @@ -1265,6 +1265,12 @@ Phase1InitializationDiscard(IN PVOID Context) OBJECT_ATTRIBUTES ObjectAttributes; HANDLE KeyHandle, OptionHandle; PRTL_USER_PROCESS_PARAMETERS ProcessParameters = NULL; +#ifdef _ARM_ + DPRINT1("*** Phase 1 Initialization Thread\n"); + DPRINT1("Beginning consistency checks...\n"); + // CHECK STACKS, IRQLS, DISPATCHER AND MAKE SURE WE ARE GOOD TO GO! + while (TRUE); +#endif /* Allocate the initialization buffer */ InitBuffer = ExAllocatePoolWithTag(NonPagedPool, diff --git a/reactos/ntoskrnl/ke/arm/ctxswtch.s b/reactos/ntoskrnl/ke/arm/ctxswtch.s index 6b28048ed91..40c58ef975e 100644 --- a/reactos/ntoskrnl/ke/arm/ctxswtch.s +++ b/reactos/ntoskrnl/ke/arm/ctxswtch.s @@ -21,6 +21,11 @@ // // Save volatile registers for the OLD thread // + sub sp, sp, #(4*8) + mrs ip, spsr_all + stmia sp, {ip, lr} + sub sp, sp, #(4*2) + stmia sp, {r4-r11} // // Switch stacks @@ -32,19 +37,46 @@ // Call the C context switch code // bl KiSwapContextInternal - + // // Restore volatile registers for the NEW thread // + ldmia sp, {r4-r11} + add sp, sp, #(4*8) + ldmia sp, {ip, lr} + msr spsr_all, ip + add sp, sp, #(4*2) // // Jump to saved restore address // + mov pc, lr + + ENTRY_END KiSwapContext + + NESTED_ENTRY KiThreadStartup + PROLOG_END KiThreadStartup // - // FIXME: TODO + // FIXME: Make space on stack and clean it up? + // + + // + // Lower to APC_LEVEL + // + mov a1, #1 + bl KeLowerIrql + + // + // Set the start address and startup context + // + mov a1, r6 + mov a2, r5 + blx r7 + + // + // Oh noes, we are back! // b . - ENTRY_END KiSwapContext - + ENTRY_END KiThreadStartup diff --git a/reactos/ntoskrnl/ke/arm/thrdini.c b/reactos/ntoskrnl/ke/arm/thrdini.c index 0a8bdabae69..2b94016b885 100644 --- a/reactos/ntoskrnl/ke/arm/thrdini.c +++ b/reactos/ntoskrnl/ke/arm/thrdini.c @@ -30,15 +30,7 @@ typedef struct _KKINIT_FRAME VOID NTAPI -KiThreadStartup(IN PKSYSTEM_ROUTINE SystemRoutine, - IN PKSTART_ROUTINE StartRoutine, - IN PVOID StartContext, - IN BOOLEAN UserThread, - IN KTRAP_FRAME TrapFrame) -{ - UNIMPLEMENTED; - return; -} +KiThreadStartup(VOID); VOID NTAPI @@ -112,7 +104,7 @@ KeArmInitThreadWithContext(IN PKTHREAD Thread, // // Set the previous mode as kernel // - //Thread->PreviousMode = KernelMode; + Thread->PreviousMode = KernelMode; // // Context switch frame to setup below @@ -123,7 +115,7 @@ KeArmInitThreadWithContext(IN PKTHREAD Thread, // // Now setup the context switch frame // - CtxSwitchFrame->SwapReturn = (ULONG)KiThreadStartup; + CtxSwitchFrame->Lr = (ULONG)KiThreadStartup; CtxSwitchFrame->R11 = (ULONG)(ExceptionFrame ? ExceptionFrame : CtxSwitchFrame); // @@ -138,4 +130,5 @@ KeArmInitThreadWithContext(IN PKTHREAD Thread, // Save back the new value of the kernel stack // Thread->KernelStack = (PVOID)CtxSwitchFrame; + DPRINT1("NEW THREAD %p WITH EX FRAME AT: %p\n", Thread, Thread->KernelStack); } diff --git a/reactos/ntoskrnl/ke/arm/trapc.c b/reactos/ntoskrnl/ke/arm/trapc.c index 05e5f7dafd4..cd098d9acae 100644 --- a/reactos/ntoskrnl/ke/arm/trapc.c +++ b/reactos/ntoskrnl/ke/arm/trapc.c @@ -37,12 +37,34 @@ VOID KiSwapContextInternal(IN PKTHREAD OldThread, IN PKTHREAD NewThread) { - // - // FIXME: TODO - // + PKEXCEPTION_FRAME ExFrame = NewThread->KernelStack; DPRINT1("Switching from: %p to %p\n", OldThread, NewThread); DPRINT1("Stacks: %p %p\n", OldThread->KernelStack, NewThread->KernelStack); - while (TRUE); + DPRINT1("Thread Registers:\n" + "R4: %lx\n" + "R5: %lx\n" + "R6: %lx\n" + "R7: %lx\n" + "R8: %lx\n" + "R9: %lx\n" + "R10: %lx\n" + "R11: %lx\n" + "Psr: %lx\n" + "Lr: %lx\n", + ExFrame->R4, + ExFrame->R5, + ExFrame->R6, + ExFrame->R7, + ExFrame->R8, + ExFrame->R9, + ExFrame->R10, + ExFrame->R11, + ExFrame->Psr, + ExFrame->Lr); + + // + // FIXME: Todo + // } VOID