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/ntoskr... ============================================================================== --- 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/ntoskr... ============================================================================== --- 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(); +}