- Implement ExpIsLoaderValid to validate the LOADER_PARAMETER_BLOCK's extension for the right size and version (we currently support 5.2 and over).

- Add code in KiRosFrldrLpbToNtLpb to setup a LOADER_PARAMETER_EXTENSION and set the right version and size.
- Initialize the per-CPU PRCB Paged/NPaged lookaslide pool lists.
- Add code to support application CPUs booting in ExpInitializeExecutive, and pass the loaderblock as a parameter.

svn path=/trunk/; revision=24346
This commit is contained in:
Alex Ionescu 2006-10-01 18:01:38 +00:00
parent 0adfdd1ace
commit cbfbbdb7f1
6 changed files with 108 additions and 13 deletions

View file

@ -44,20 +44,14 @@ static ULONG MaxMem = 0;
BOOLEAN SetupMode = TRUE;
static BOOLEAN ForceAcpiDisable = FALSE;
#if defined (ALLOC_PRAGMA)
#pragma alloc_text(INIT, InitSystemSharedUserPage)
#pragma alloc_text(INIT, ExpDisplayNotice)
#pragma alloc_text(INIT, ExpLoadInitialProcess)
#pragma alloc_text(INIT, ExpInitializeExecutive)
#pragma alloc_text(INIT, ExInit2)
#endif
BOOLEAN
NTAPI
PspInitPhase0(
VOID
);
ULONG ExpInitializationPhase;
/* FUNCTIONS ****************************************************************/
static
@ -482,10 +476,64 @@ ExInit3(VOID)
ExpInitUuids();
}
BOOLEAN
NTAPI
ExpIsLoaderValid(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
{
PLOADER_PARAMETER_EXTENSION Extension;
/* Get the loader extension */
Extension = LoaderBlock->Extension;
/* Validate the size (larger structures are OK, we'll just ignore them) */
if (Extension->Size < sizeof(LOADER_PARAMETER_EXTENSION)) return FALSE;
/* Don't validate upper versions */
if (Extension->MajorVersion > 5) return TRUE;
/* Fail if this is NT 4 */
if (Extension->MajorVersion < 5) return FALSE;
/* Fail if this is XP */
if (Extension->MinorVersion < 2) return FALSE;
/* This is 2003 or newer, aprove it */
return TRUE;
}
VOID
NTAPI
ExpInitializeExecutive(VOID)
ExpInitializeExecutive(IN ULONG Cpu,
IN PLOADER_PARAMETER_BLOCK LoaderBlock)
{
/* Validate Loader */
if (!ExpIsLoaderValid(LoaderBlock))
{
/* Invalid loader version */
KeBugCheckEx(MISMATCHED_HAL,
3,
LoaderBlock->Extension->Size,
LoaderBlock->Extension->MajorVersion,
LoaderBlock->Extension->MinorVersion);
}
/* Initialize PRCB pool lookaside pointers */
ExInitPoolLookasidePointers();
/* Check if this is an application CPU */
if (Cpu)
{
/* Then simply initialize it with HAL */
if (!HalInitSystem(ExpInitializationPhase, LoaderBlock))
{
/* Initialization failed */
KEBUGCHECK(HAL_INITIALIZATION_FAILED);
}
/* We're done */
return;
}
/* Initialize HAL */
HalInitSystem (0, KeLoaderBlock);

View file

@ -24,9 +24,42 @@ LIST_ENTRY ExpNonPagedLookasideListHead;
KSPIN_LOCK ExpNonPagedLookasideListLock;
LIST_ENTRY ExpPagedLookasideListHead;
KSPIN_LOCK ExpPagedLookasideListLock;
PNPAGED_LOOKASIDE_LIST ExpSmallNPagedPoolLookasideLists;
PPAGED_LOOKASIDE_LIST ExpSmallPagedPoolLookasideLists;
/* FUNCTIONS *****************************************************************/
VOID
NTAPI
ExInitPoolLookasidePointers(VOID)
{
ULONG i;
PPP_LOOKASIDE_LIST Entry;
PNPAGED_LOOKASIDE_LIST ListEntry;
PPAGED_LOOKASIDE_LIST PagedListEntry;
/* Loop for all CPUs */
for (i = 0; i < MAXIMUM_PROCESSORS; i++)
{
/* Initialize the non-paged list */
ListEntry = &ExpSmallNPagedPoolLookasideLists[i];
InitializeSListHead(&ListEntry->L.ListHead);
/* Bind to PRCB */
Entry = &KeGetCurrentPrcb()->PPPagedLookasideList[i];
Entry->L = &ListEntry->L;
Entry->P = &ListEntry->L;
/* Initialize the paged list */
PagedListEntry = &ExpSmallPagedPoolLookasideLists[i];
InitializeSListHead(&PagedListEntry->L.ListHead);
/* Bind to PRCB */
Entry = &KeGetCurrentPrcb()->PPNPagedLookasideList[i];
Entry->L = &PagedListEntry->L;
Entry->P = &PagedListEntry->L;
}
}
VOID
INIT_FUNCTION
STDCALL

View file

@ -76,7 +76,10 @@ ExpInitUuids(VOID);
VOID
NTAPI
ExpInitializeExecutive(VOID);
ExpInitializeExecutive(
IN ULONG Cpu,
IN PLOADER_PARAMETER_BLOCK LoaderBlock
);
VOID
NTAPI
@ -110,6 +113,10 @@ VOID
NTAPI
ExpResourceInitialization(VOID);
VOID
NTAPI
ExInitPoolLookasidePointers(VOID);
/* Rundown Functions ********************************************************/
VOID

View file

@ -310,8 +310,8 @@ C_ASSERT(FIELD_OFFSET(KPROCESS, LdtDescriptor) == KPROCESS_LDT_DESCRIPTOR0);
C_ASSERT(FIELD_OFFSET(KV86M_TRAP_FRAME, SavedExceptionStack) == TF_SAVED_EXCEPTION_STACK);
C_ASSERT(FIELD_OFFSET(KV86M_TRAP_FRAME, regs) == TF_REGS);
C_ASSERT(FIELD_OFFSET(KV86M_TRAP_FRAME, orig_ebp) == TF_ORIG_EBP);
C_ASSERT(FIELD_OFFSET(KPCR, Tib.ExceptionList) == KPCR_EXCEPTION_LIST);
C_ASSERT(FIELD_OFFSET(KPCR, Self) == KPCR_SELF);
//C_ASSERT(FIELD_OFFSET(KPCR, Tib.ExceptionList) == KPCR_EXCEPTION_LIST);
//C_ASSERT(FIELD_OFFSET(KPCR, Self) == KPCR_SELF);
C_ASSERT(FIELD_OFFSET(KPCR, IRR) == KPCR_IRR);
C_ASSERT(FIELD_OFFSET(KPCR, IDR) == KPCR_IDR);
C_ASSERT(FIELD_OFFSET(KPCR, Irql) == KPCR_IRQL);

View file

@ -41,6 +41,7 @@ extern LDR_DATA_TABLE_ENTRY HalModuleObject;
/* NT Loader Data */
LOADER_PARAMETER_BLOCK BldrLoaderBlock;
LOADER_PARAMETER_EXTENSION BldrExtensionBlock;
CHAR BldrCommandLine[256];
LDR_DATA_TABLE_ENTRY BldrModules[64];
MEMORY_ALLOCATION_DESCRIPTOR BldrMemoryDescriptors[64];
@ -241,6 +242,12 @@ KiRosFrldrLpbToNtLpb(IN PROS_LOADER_PARAMETER_BLOCK RosLoaderBlock,
/* Setup command line */
LoaderBlock->LoadOptions = BldrCommandLine;
strcpy(BldrCommandLine, KeLoaderCommandLine);
/* Setup the extension block */
LoaderBlock->Extension = &BldrExtensionBlock;
LoaderBlock->Extension->Size = sizeof(LOADER_PARAMETER_EXTENSION);
LoaderBlock->Extension->MajorVersion = 5;
LoaderBlock->Extension->MinorVersion = 2;
}
VOID

View file

@ -189,7 +189,7 @@ KiInitializeKernel(IN PKPROCESS InitProcess,
Prcb->IdleThread = InitThread;
/* Initialize the Kernel Executive */
ExpInitializeExecutive();
ExpInitializeExecutive(Number, LoaderBlock);
/* Only do this on the boot CPU */
if (!Number)