mirror of
https://github.com/reactos/reactos.git
synced 2025-02-23 17:05:46 +00:00
- 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:
parent
0adfdd1ace
commit
cbfbbdb7f1
6 changed files with 108 additions and 13 deletions
|
@ -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);
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue