Author: ros-arm-bringup
Date: Wed Jun 11 19:40:53 2008
New Revision: 33937
URL: 
http://svn.reactos.org/svn/reactos?rev=33937&view=rev
Log:
- We now implement a super-basic (and probably broken) context switching mechanism.
- We completely ignore setting the thread to the right scheduler state, and don't do
any APC delivery checking, or any other work.
- We now implement a basic KiThreadStartup, which behaves properly (we believe).
Doesn't handle user-mode threads yet, though.
- This gets us through PspSystemThreadStartup, and..
- We now reach Phase1InitializationDiscard! A major step has been reached, now it's
time to cleanup what has been done until now and verify it to be correct.
- Then we move on... the next two things will be 1) Hal Initialization (setting up the
timer) and 2) Displaying the boot logo.
- Graphics will require using the PL-110 LCD Controller.
Modified:
    trunk/reactos/include/ndk/arm/ketypes.h
    trunk/reactos/ntoskrnl/ex/init.c
    trunk/reactos/ntoskrnl/ke/arm/ctxswtch.s
    trunk/reactos/ntoskrnl/ke/arm/thrdini.c
    trunk/reactos/ntoskrnl/ke/arm/trapc.c
Modified: trunk/reactos/include/ndk/arm/ketypes.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/include/ndk/arm/ketypes.h?…
==============================================================================
--- trunk/reactos/include/ndk/arm/ketypes.h [iso-8859-1] (original)
+++ trunk/reactos/include/ndk/arm/ketypes.h [iso-8859-1] Wed Jun 11 19:40:53 2008
@@ -101,11 +101,11 @@
     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;
 //
Modified: trunk/reactos/ntoskrnl/ex/init.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ex/init.c?rev=339…
==============================================================================
--- trunk/reactos/ntoskrnl/ex/init.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/ex/init.c [iso-8859-1] Wed Jun 11 19:40:53 2008
@@ -1265,6 +1265,12 @@
     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,
Modified: trunk/reactos/ntoskrnl/ke/arm/ctxswtch.s
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/arm/ctxswtch.s…
==============================================================================
--- trunk/reactos/ntoskrnl/ke/arm/ctxswtch.s [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/ke/arm/ctxswtch.s [iso-8859-1] Wed Jun 11 19:40:53 2008
@@ -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
Modified: trunk/reactos/ntoskrnl/ke/arm/thrdini.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/arm/thrdini.c?…
==============================================================================
--- trunk/reactos/ntoskrnl/ke/arm/thrdini.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/ke/arm/thrdini.c [iso-8859-1] Wed Jun 11 19:40:53 2008
@@ -30,15 +30,7 @@
 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 @@
         //
         // Set the previous mode as kernel
         //
-        //Thread->PreviousMode = KernelMode;
+        Thread->PreviousMode = KernelMode;
         //
         // Context switch frame to setup below
@@ -123,7 +115,7 @@
     //
     // Now setup the context switch frame
     //
-    CtxSwitchFrame->SwapReturn = (ULONG)KiThreadStartup;
+    CtxSwitchFrame->Lr = (ULONG)KiThreadStartup;
     CtxSwitchFrame->R11 = (ULONG)(ExceptionFrame ? ExceptionFrame : CtxSwitchFrame);
     //
@@ -138,4 +130,5 @@
     // 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);
 }
Modified: trunk/reactos/ntoskrnl/ke/arm/trapc.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/arm/trapc.c?re…
==============================================================================
--- trunk/reactos/ntoskrnl/ke/arm/trapc.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/ke/arm/trapc.c [iso-8859-1] Wed Jun 11 19:40:53 2008
@@ -37,12 +37,34 @@
 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