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/ntosk…
==============================================================================
--- 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/ntosk…
==============================================================================
--- 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();
+}