diff --git a/reactos/ntoskrnl/ke/freeldr.c b/reactos/ntoskrnl/ke/freeldr.c index eca793b029d..8b47b5ad3d1 100644 --- a/reactos/ntoskrnl/ke/freeldr.c +++ b/reactos/ntoskrnl/ke/freeldr.c @@ -244,8 +244,9 @@ KiRosFrldrLpbToNtLpb(IN PROS_LOADER_PARAMETER_BLOCK RosLoaderBlock, } VOID -NTAPI -KiRosPrepareForSystemStartup(IN PROS_LOADER_PARAMETER_BLOCK LoaderBlock) +FASTCALL +KiRosPrepareForSystemStartup(IN ULONG Dummy, + IN PROS_LOADER_PARAMETER_BLOCK LoaderBlock) { ULONG i; ULONG size; diff --git a/reactos/ntoskrnl/ke/i386/boot.S b/reactos/ntoskrnl/ke/i386/boot.S index 000a5d9bc40..c0a68014fc4 100644 --- a/reactos/ntoskrnl/ke/i386/boot.S +++ b/reactos/ntoskrnl/ke/i386/boot.S @@ -1,7 +1,7 @@ /* * FILE: ntoskrnl/ke/i386/boot.S * COPYRIGHT: See COPYING in the top level directory - * PURPOSE: Kernel Bootstrap Code + * PURPOSE: FreeLDR Wrapper Bootstrap Code * PROGRAMMER: Alex Ionescu (alex@relsoft.net) */ @@ -30,16 +30,6 @@ _KiDoubleFaultStack: .text .func NtProcessStartup _NtProcessStartup: - - /* Load the initial kernel stack */ - lea eax, _P0BootStack - sub eax, (NPX_FRAME_LENGTH + KTRAP_FRAME_LENGTH + KTRAP_FRAME_ALIGN) - mov esp, eax - - /* Save initial CR0 state */ - push CR0_EM + CR0_TS + CR0_MP - /* Call the main kernel initialization */ - push edx - call _KiRosPrepareForSystemStartup@4 + jmp @KiRosPrepareForSystemStartup@8 .endfunc diff --git a/reactos/ntoskrnl/ke/i386/kiinit.c b/reactos/ntoskrnl/ke/i386/kiinit.c index 54980a609ec..154be617d13 100644 --- a/reactos/ntoskrnl/ke/i386/kiinit.c +++ b/reactos/ntoskrnl/ke/i386/kiinit.c @@ -281,7 +281,7 @@ KiSystemStartup(IN PLOADER_PARAMETER_BLOCK LoaderBlock) { ULONG Cpu; PKTHREAD InitialThread; - PVOID InitialStack; + ULONG InitialStack; PKGDTENTRY Gdt; PKIDTENTRY Idt; PKTSS Tss; @@ -302,7 +302,7 @@ KiSystemStartup(IN PLOADER_PARAMETER_BLOCK LoaderBlock) } /* Save the initial thread and stack */ - InitialStack = (PVOID)LoaderBlock->KernelStack; + InitialStack = LoaderBlock->KernelStack; InitialThread = (PKTHREAD)LoaderBlock->Thread; /* Clean the APC List Head */ @@ -375,13 +375,21 @@ AppCpuInit: /* Raise to HIGH_LEVEL */ KfRaiseIrql(HIGH_LEVEL); + /* Align stack and make space for the trap frame and NPX frame */ + InitialStack &= ~KTRAP_FRAME_ALIGN; + __asm__ __volatile__("movl %0,%%esp" : :"r" (InitialStack)); + __asm__ __volatile__("subl %0,%%esp" : :"r" (NPX_FRAME_LENGTH + + KTRAP_FRAME_LENGTH + + KTRAP_FRAME_ALIGN)); + __asm__ __volatile__("push %0" : :"r" (CR0_EM + CR0_TS + CR0_MP)); + /* Call main kernel initialization */ KiInitializeKernel(&KiInitialProcess.Pcb, InitialThread, - InitialStack, + (PVOID)InitialStack, (PKPRCB)__readfsdword(KPCR_PRCB), Cpu, - LoaderBlock); + KeLoaderBlock); /* Set the priority of this thread to 0 */ KeGetCurrentThread()->Priority = 0;