[ros-diffs] [tkreuzer] 35526: Move KiSystemStartup again to kiinit.c, implement an intermediate function KiInitializeKernelAndGotoIdleLoop that is now called from the asm function KiSetupStackAndInitializeKernel. This way we avoid using "hardcoded" constants.

tkreuzer at svn.reactos.org tkreuzer at svn.reactos.org
Fri Aug 22 13:13:51 CEST 2008


Author: tkreuzer
Date: Fri Aug 22 06:13:51 2008
New Revision: 35526

URL: http://svn.reactos.org/svn/reactos?rev=35526&view=rev
Log:
Move KiSystemStartup again to kiinit.c, implement an intermediate function KiInitializeKernelAndGotoIdleLoop that is now called from the asm function KiSetupStackAndInitializeKernel. This way we avoid using "hardcoded" constants.

Modified:
    branches/ros-amd64-bringup/reactos/ntoskrnl/ke/amd64/boot.S
    branches/ros-amd64-bringup/reactos/ntoskrnl/ke/amd64/kiinit.c

Modified: branches/ros-amd64-bringup/reactos/ntoskrnl/ke/amd64/boot.S
URL: http://svn.reactos.org/svn/reactos/branches/ros-amd64-bringup/reactos/ntoskrnl/ke/amd64/boot.S?rev=35526&r1=35525&r2=35526&view=diff
==============================================================================
--- branches/ros-amd64-bringup/reactos/ntoskrnl/ke/amd64/boot.S [iso-8859-1] (original)
+++ branches/ros-amd64-bringup/reactos/ntoskrnl/ke/amd64/boot.S [iso-8859-1] Fri Aug 22 06:13:51 2008
@@ -28,28 +28,18 @@
 _KiDoubleFaultStack:
 
 /* FUNCTIONS *****************************************************************/
-.global _KiSystemStartup
+
 .text
-.func KiSystemStartup
-_KiSystemStartup:
-
-    /* NTLDR Boot: Call the main kernel initialization */
-    test rcx, 0x80000000
-    jnz _KiSystemStartupReal
-
-    /* FREELDR Boot: Cal the FreeLDR wrapper */
-    jmp _KiRosPrepareForSystemStartup
-.endfunc
 
 /**
  * VOID
  * KiSetupStackAndInitializeKernel(
- *             esp+4 = ? -> rcx
- *             esp+8 = ? -> rdx
- *        PVOID pNewstack     // esp+12 = new stack -> r8
- *               esp+16 -> r9
- *               esp+20 -> rsp + 8
- *               esp+24 -> rsp + 16?
+ *     IN PKPROCESS InitProcess,               <rsp + 0x08, rcx>
+ *     IN PKTHREAD InitThread,                 <rsp + 0x10, rdx>
+ *     IN PVOID IdleStack,                     <rsp + 0x18, r8>
+ *     IN PKPRCB Prcb,                         <rsp + 0x20, r9>
+ *     IN CCHAR Number,                        <rsp + 0x28>
+ *     IN PLOADER_PARAMETER_BLOCK LoaderBlock) <rsp + 0x30>
  */
 .globl _KiSetupStackAndInitializeKernel
 .func KiSetupStackAndInitializeKernel
@@ -60,27 +50,18 @@
 
     /* Setup the new stack */
     mov rsp, r8
-    sub rsp, NPX_FRAME_LENGTH + KTRAP_FRAME_ALIGN + KTRAP_FRAME_LENGTH
-    push CR0_EM + CR0_TS + CR0_MP
 
     /* Copy stack parameters to the new stack */
-    push [rsi + 16]
-    push [rsi + 8]
-    xor rbp, rbp
-    call _KiInitializeKernel
+    sub rsp, 0x38
+    mov rdi, rsp
+    movsq
+    movsq
+    movsq
+    movsq
+    movsq
+    movsq
+    movsq
 
-    /* Set the priority of this thread to 0 */
-    mov rbx, PCR[KPCR_CURRENT_THREAD]
-    mov byte ptr [rbx+KTHREAD_PRIORITY], 0
+    jmp _KiInitializeKernelAndGotoIdleLoop
 
-    /* Force interrupts enabled and lower IRQL back to DISPATCH_LEVEL */
-    sti
-    mov rcx, DISPATCH_LEVEL
-    mov cr8, rcx
-
-    /* Set the right wait IRQL */
-    mov byte ptr [rbx+KTHREAD_WAIT_IRQL], DISPATCH_LEVEL;
-
-    /* Jump into the idle loop */
-    jmp _KiIdleLoop
 .endfunc

Modified: branches/ros-amd64-bringup/reactos/ntoskrnl/ke/amd64/kiinit.c
URL: http://svn.reactos.org/svn/reactos/branches/ros-amd64-bringup/reactos/ntoskrnl/ke/amd64/kiinit.c?rev=35526&r1=35525&r2=35526&view=diff
==============================================================================
--- branches/ros-amd64-bringup/reactos/ntoskrnl/ke/amd64/kiinit.c [iso-8859-1] (original)
+++ branches/ros-amd64-bringup/reactos/ntoskrnl/ke/amd64/kiinit.c [iso-8859-1] Fri Aug 22 06:13:51 2008
@@ -366,6 +366,7 @@
 
     /* Start us out at PASSIVE_LEVEL */
 //    Pcr->Irql = PASSIVE_LEVEL;
+    KeSetCurrentIrql(PASSIVE_LEVEL);
 
     /* Set the GDI, IDT, TSS and DPC Stack */
     Pcr->GdtBase = (PVOID)Gdt;
@@ -386,6 +387,7 @@
                    IN CCHAR Number,
                    IN PLOADER_PARAMETER_BLOCK LoaderBlock)
 {
+    FrLdrDbgPrint("Enter KiInitializeKernel\n");
 #if 0
     BOOLEAN NpxPresent;
     ULONG FeatureBits;
@@ -642,6 +644,17 @@
                               (ULONG64)TssSelector.BaseUpper << 32);
 }
 
+// Hack
+VOID KiRosPrepareForSystemStartup(ULONG, PROS_LOADER_PARAMETER_BLOCK);
+
+VOID
+NTAPI
+KiSystemStartup(IN ULONG_PTR Dummy,
+                IN PROS_LOADER_PARAMETER_BLOCK LoaderBlock)
+{
+    KiRosPrepareForSystemStartup(Dummy, LoaderBlock);
+}
+
 VOID
 NTAPI
 KiSystemStartupReal(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
@@ -746,7 +759,7 @@
     {
         /* Loop until execution can continue */
         while (*(volatile PKSPIN_LOCK*)&KiFreezeExecutionLock == (PVOID)1);
-    } while(InterlockedBitTestAndSet((PLONG)&KiFreezeExecutionLock, 0));
+    } while(InterlockedBitTestAndSet64((PLONG64)&KiFreezeExecutionLock, 0));
 
     /* Setup CPU-related fields */
     Pcr->Prcb.Number = Cpu;
@@ -772,11 +785,9 @@
     /* Raise to HIGH_LEVEL */
     KfRaiseIrql(HIGH_LEVEL);
 
-    /* Align stack and make space for the trap frame and NPX frame */
-    InitialStack &= ~(KTRAP_FRAME_ALIGN - 1);
-
-FrLdrDbgPrint("Before KiSetupStackAndInitializeKernel\n");
-for(;;);
+    /* Align stack and make space for the trap frame */
+    InitialStack -= sizeof(KTRAP_FRAME) + 0x100; // FIXME
+    InitialStack &= ~(16 - 1);
 
     /* Switch to new kernel stack and start kernel bootstrapping */
     KiSetupStackAndInitializeKernel(&KiInitialProcess.Pcb,
@@ -786,3 +797,35 @@
                                     (CCHAR)Cpu,
                                     KeLoaderBlock);
 }
+
+
+VOID
+NTAPI
+KiInitializeKernelAndGotoIdleLoop(IN PKPROCESS InitProcess,
+                                  IN PKTHREAD InitThread,
+                                  IN PVOID IdleStack,
+                                  IN PKPRCB Prcb,
+                                  IN CCHAR Number,
+                                  IN PLOADER_PARAMETER_BLOCK LoaderBlock)
+{
+    /* Initialize kernel */
+    KiInitializeKernel(InitProcess,
+                       InitThread,
+                       IdleStack,
+                       Prcb,
+                       Number,
+                       KeLoaderBlock);
+
+    /* Set the priority of this thread to 0 */
+    InitThread->Priority = 0;
+
+    /* Force interrupts enabled and lower IRQL back to DISPATCH_LEVEL */
+    _enable();
+    KeLowerIrql(DISPATCH_LEVEL);
+
+    /* Set the right wait IRQL */
+    InitThread->WaitIrql = DISPATCH_LEVEL;
+
+    /* Jump into the idle loop */
+    KiIdleLoop();
+}



More information about the Ros-diffs mailing list