- More initialization cleanup.

svn path=/trunk/; revision=23866
This commit is contained in:
Alex Ionescu 2006-09-01 13:13:08 +00:00
parent 562f8391e8
commit a85e942346
4 changed files with 91 additions and 144 deletions

View file

@ -611,8 +611,9 @@ Phase1Initialization(PVOID Context);
VOID VOID
NTAPI NTAPI
KeInit1( KiSystemStartup(
VOID IN PROS_LOADER_PARAMETER_BLOCK LoaderBlock,
IN ULONG DriverBase // FIXME: hackhack
); );
VOID VOID

View file

@ -149,12 +149,14 @@ KiInitSpinLocks(IN PKPRCB Prcb,
VOID VOID
NTAPI NTAPI
KeInit1(VOID) KiSystemStartup(IN PROS_LOADER_PARAMETER_BLOCK LoaderBlock,
IN ULONG DriverBase) // FIXME: hackhack
{ {
PKIPCR KPCR; PKIPCR KPCR;
PKPRCB Prcb; PKPRCB Prcb;
BOOLEAN NpxPresent; BOOLEAN NpxPresent;
ULONG FeatureBits; ULONG FeatureBits;
ULONG DriverSize;
extern USHORT KiBootGdt[]; extern USHORT KiBootGdt[];
extern KTSS KiBootTss; extern KTSS KiBootTss;
@ -187,6 +189,12 @@ KeInit1(VOID)
KeInitExceptions(); KeInitExceptions();
KeInitInterrupts(); KeInitInterrupts();
/* Load the Kernel with the PE Loader */
LdrSafePEProcessModule((PVOID)KERNEL_BASE,
(PVOID)KERNEL_BASE,
(PVOID)DriverBase,
&DriverSize);
/* Detect and set the CPU Type */ /* Detect and set the CPU Type */
KiSetProcessorType(); KiSetProcessorType();
@ -246,40 +254,79 @@ KeInit1(VOID)
} }
} }
if (KeFeatureBits & KF_GLOBAL_PAGE) if (KeFeatureBits & KF_GLOBAL_PAGE)
{ {
ULONG Flags; ULONG Flags;
/* Enable global pages */ /* Enable global pages */
Ke386GlobalPagesEnabled = TRUE; Ke386GlobalPagesEnabled = TRUE;
Ke386SaveFlags(Flags); Ke386SaveFlags(Flags);
Ke386DisableInterrupts(); Ke386DisableInterrupts();
Ke386SetCr4(Ke386GetCr4() | X86_CR4_PGE); Ke386SetCr4(Ke386GetCr4() | X86_CR4_PGE);
Ke386RestoreFlags(Flags); Ke386RestoreFlags(Flags);
} }
if (KeFeatureBits & KF_FAST_SYSCALL) if (KeFeatureBits & KF_FAST_SYSCALL)
{ {
extern void KiFastCallEntry(void); extern void KiFastCallEntry(void);
/* CS Selector of the target segment. */ /* CS Selector of the target segment. */
Ke386Wrmsr(0x174, KGDT_R0_CODE, 0); Ke386Wrmsr(0x174, KGDT_R0_CODE, 0);
/* Target ESP. */ /* Target ESP. */
Ke386Wrmsr(0x175, 0, 0); Ke386Wrmsr(0x175, 0, 0);
/* Target EIP. */ /* Target EIP. */
Ke386Wrmsr(0x176, (ULONG_PTR)KiFastCallEntry, 0); Ke386Wrmsr(0x176, (ULONG_PTR)KiFastCallEntry, 0);
} }
/* Does the CPU Support 'prefetchnta' (SSE) */ /* Does the CPU Support 'prefetchnta' (SSE) */
if(KeFeatureBits & KF_XMMI) if(KeFeatureBits & KF_XMMI)
{ {
ULONG Protect; ULONG Protect;
Protect = MmGetPageProtect(NULL, (PVOID)RtlPrefetchMemoryNonTemporal); Protect = MmGetPageProtect(NULL, (PVOID)RtlPrefetchMemoryNonTemporal);
MmSetPageProtect(NULL, (PVOID)RtlPrefetchMemoryNonTemporal, Protect | PAGE_IS_WRITABLE); MmSetPageProtect(NULL, (PVOID)RtlPrefetchMemoryNonTemporal, Protect | PAGE_IS_WRITABLE);
/* Replace the ret by a nop */ /* Replace the ret by a nop */
*(PCHAR)RtlPrefetchMemoryNonTemporal = 0x90; *(PCHAR)RtlPrefetchMemoryNonTemporal = 0x90;
MmSetPageProtect(NULL, (PVOID)RtlPrefetchMemoryNonTemporal, Protect); MmSetPageProtect(NULL, (PVOID)RtlPrefetchMemoryNonTemporal, Protect);
} }
/* Initialize the Debugger */
KdInitSystem (0, &KeLoaderBlock);
/* Initialize HAL */
HalInitSystem (0, (PLOADER_PARAMETER_BLOCK)&KeLoaderBlock);
/* Initialize the Processor with HAL */
HalInitializeProcessor(KeNumberProcessors, (PLOADER_PARAMETER_BLOCK)&KeLoaderBlock);
/* Initialize the Kernel Executive */
ExpInitializeExecutive();
/* Create the IOPM Save Area */
Ki386IopmSaveArea = ExAllocatePoolWithTag(NonPagedPool,
PAGE_SIZE * 2,
TAG('K', 'e', ' ', ' '));
/* Free Initial Memory */
MiFreeInitMemory();
/* Never returns */
#if 0
/* FIXME:
* The initial thread isn't a real ETHREAD object, we cannot call PspExitThread.
*/
PspExitThread(STATUS_SUCCESS);
#else
while (1)
{
LARGE_INTEGER Timeout;
Timeout.QuadPart = 0x7fffffffffffffffLL;
KeDelayExecutionThread(KernelMode, FALSE, &Timeout);
}
#endif
/* Bug Check and loop forever if anything failed */
KEBUGCHECK(0);
for(;;);
} }
VOID VOID
@ -287,41 +334,13 @@ INIT_FUNCTION
NTAPI NTAPI
KeInit2(VOID) KeInit2(VOID)
{ {
ULONG Protect; ULONG Protect;
PKIPCR Pcr = (PKIPCR)KeGetPcr();
PKPRCB Prcb = Pcr->Prcb;
KiInitializeBugCheck(); KiInitializeBugCheck();
KeInitializeDispatcher(); KeInitializeDispatcher();
KiInitializeSystemClock(); KiInitializeSystemClock();
DPRINT1("CPU Detection Complete.\n" /* Set IDT to writable */
"CPUID: %lx\n" Protect = MmGetPageProtect(NULL, (PVOID)KiIdt);
"Step : %lx\n" MmSetPageProtect(NULL, (PVOID)KiIdt, Protect | PAGE_IS_WRITABLE);
"Type : %lx\n"
"ID : %s\n"
"FPU : %lx\n"
"XMMI : %lx\n"
"Fxsr : %lx\n"
"Feat : %lx\n"
"Ftrs : %lx\n"
"Cache: %lx\n"
"CR0 : %lx\n"
"CR4 : %lx\n",
Prcb->CpuID,
Prcb->CpuStep,
Prcb->CpuType,
Prcb->VendorString,
KeI386NpxPresent,
KeI386XMMIPresent,
KeI386FxsrPresent,
Prcb->FeatureBits,
KeFeatureBits,
Pcr->SecondLevelCacheSize,
Ke386GetCr0(),
Ke386GetCr4());
/* Set IDT to writable */
Protect = MmGetPageProtect(NULL, (PVOID)KiIdt);
MmSetPageProtect(NULL, (PVOID)KiIdt, Protect | PAGE_IS_WRITABLE);
} }

View file

@ -49,29 +49,11 @@ _NtProcessStartup:
mov es, ax mov es, ax
.att_syntax .att_syntax
cmpl $AP_MAGIC, %ecx
jne .m1
pushl $0
popfl
/*
* Reserve space for the floating point save area.
*/
subl $SIZEOF_FX_SAVE_AREA, %esp
/*
* Call the application processor initialization code
*/
pushl $0
call _KiSystemStartup@4
.m1:
/* Load the initial kernel stack */ /* Load the initial kernel stack */
lea _kernel_stack_top, %eax lea _kernel_stack_top, %eax
sub $(SIZEOF_FX_SAVE_AREA), %eax sub $(SIZEOF_FX_SAVE_AREA), %eax
movl %eax, %esp movl %eax, %esp
/* Call the main kernel initialization */ /* Call the main kernel initialization */
pushl %edx pushl %edx
call _KiRosPrepareForSystemStartup@4 call _KiRosPrepareForSystemStartup@4

View file

@ -86,53 +86,7 @@ KeGetRecommendedSharedDataAlignment(VOID)
VOID VOID
NTAPI NTAPI
KiSystemStartup(BOOLEAN BootProcessor) KiRosPrepareForSystemStartup(IN PROS_LOADER_PARAMETER_BLOCK LoaderBlock)
{
DPRINT("KiSystemStartup(%d)\n", BootProcessor);
/* Initialize the Debugger */
KdInitSystem (0, &KeLoaderBlock);
/* Initialize HAL */
HalInitSystem (0, (PLOADER_PARAMETER_BLOCK)&KeLoaderBlock);
/* Initialize the Processor with HAL */
HalInitializeProcessor(KeNumberProcessors, (PLOADER_PARAMETER_BLOCK)&KeLoaderBlock);
/* Initialize the Kernel Executive */
ExpInitializeExecutive();
/* Create the IOPM Save Area */
Ki386IopmSaveArea = ExAllocatePoolWithTag(NonPagedPool,
PAGE_SIZE * 2,
TAG('K', 'e', ' ', ' '));
/* Free Initial Memory */
MiFreeInitMemory();
/* Never returns */
#if 0
/* FIXME:
* The initial thread isn't a real ETHREAD object, we cannot call PspExitThread.
*/
PspExitThread(STATUS_SUCCESS);
#else
while (1)
{
LARGE_INTEGER Timeout;
Timeout.QuadPart = 0x7fffffffffffffffLL;
KeDelayExecutionThread(KernelMode, FALSE, &Timeout);
}
#endif
/* Bug Check and loop forever if anything failed */
KEBUGCHECK(0);
for(;;);
}
VOID
NTAPI
KiRosPrepareForSystemStartup(PROS_LOADER_PARAMETER_BLOCK LoaderBlock)
{ {
ULONG i; ULONG i;
ULONG size; ULONG size;
@ -266,21 +220,12 @@ KiRosPrepareForSystemStartup(PROS_LOADER_PARAMETER_BLOCK LoaderBlock)
/* Increase the last kernel address with the size of HAL */ /* Increase the last kernel address with the size of HAL */
LastKernelAddress += PAGE_ROUND_UP(DriverSize); LastKernelAddress += PAGE_ROUND_UP(DriverSize);
/* FIXME: We need to do this in KiSystemStartup! */
KeInit1();
/* Load the Kernel with the PE Loader */
LdrSafePEProcessModule((PVOID)KERNEL_BASE,
(PVOID)KERNEL_BASE,
(PVOID)DriverBase,
&DriverSize);
/* Now select the final beginning and ending Kernel Addresses */ /* Now select the final beginning and ending Kernel Addresses */
FirstKrnlPhysAddr = KeLoaderModules[0].ModStart - KERNEL_BASE + 0x200000; FirstKrnlPhysAddr = KeLoaderModules[0].ModStart - KERNEL_BASE + 0x200000;
LastKrnlPhysAddr = LastKernelAddress - KERNEL_BASE + 0x200000; LastKrnlPhysAddr = LastKernelAddress - KERNEL_BASE + 0x200000;
/* Do general System Startup */ /* Do general System Startup */
KiSystemStartup(1); KiSystemStartup(LoaderBlock, DriverBase);
} }
/* EOF */ /* EOF */