mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 21:53:06 +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;
|
BOOLEAN SetupMode = TRUE;
|
||||||
static BOOLEAN ForceAcpiDisable = FALSE;
|
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
|
BOOLEAN
|
||||||
NTAPI
|
NTAPI
|
||||||
PspInitPhase0(
|
PspInitPhase0(
|
||||||
VOID
|
VOID
|
||||||
);
|
);
|
||||||
|
|
||||||
|
ULONG ExpInitializationPhase;
|
||||||
|
|
||||||
/* FUNCTIONS ****************************************************************/
|
/* FUNCTIONS ****************************************************************/
|
||||||
|
|
||||||
static
|
static
|
||||||
|
@ -482,10 +476,64 @@ ExInit3(VOID)
|
||||||
ExpInitUuids();
|
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
|
VOID
|
||||||
NTAPI
|
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 */
|
/* Initialize HAL */
|
||||||
HalInitSystem (0, KeLoaderBlock);
|
HalInitSystem (0, KeLoaderBlock);
|
||||||
|
|
||||||
|
|
|
@ -24,9 +24,42 @@ LIST_ENTRY ExpNonPagedLookasideListHead;
|
||||||
KSPIN_LOCK ExpNonPagedLookasideListLock;
|
KSPIN_LOCK ExpNonPagedLookasideListLock;
|
||||||
LIST_ENTRY ExpPagedLookasideListHead;
|
LIST_ENTRY ExpPagedLookasideListHead;
|
||||||
KSPIN_LOCK ExpPagedLookasideListLock;
|
KSPIN_LOCK ExpPagedLookasideListLock;
|
||||||
|
PNPAGED_LOOKASIDE_LIST ExpSmallNPagedPoolLookasideLists;
|
||||||
|
PPAGED_LOOKASIDE_LIST ExpSmallPagedPoolLookasideLists;
|
||||||
|
|
||||||
/* FUNCTIONS *****************************************************************/
|
/* 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
|
VOID
|
||||||
INIT_FUNCTION
|
INIT_FUNCTION
|
||||||
STDCALL
|
STDCALL
|
||||||
|
|
|
@ -76,7 +76,10 @@ ExpInitUuids(VOID);
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
NTAPI
|
NTAPI
|
||||||
ExpInitializeExecutive(VOID);
|
ExpInitializeExecutive(
|
||||||
|
IN ULONG Cpu,
|
||||||
|
IN PLOADER_PARAMETER_BLOCK LoaderBlock
|
||||||
|
);
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
NTAPI
|
NTAPI
|
||||||
|
@ -110,6 +113,10 @@ VOID
|
||||||
NTAPI
|
NTAPI
|
||||||
ExpResourceInitialization(VOID);
|
ExpResourceInitialization(VOID);
|
||||||
|
|
||||||
|
VOID
|
||||||
|
NTAPI
|
||||||
|
ExInitPoolLookasidePointers(VOID);
|
||||||
|
|
||||||
/* Rundown Functions ********************************************************/
|
/* Rundown Functions ********************************************************/
|
||||||
|
|
||||||
VOID
|
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, SavedExceptionStack) == TF_SAVED_EXCEPTION_STACK);
|
||||||
C_ASSERT(FIELD_OFFSET(KV86M_TRAP_FRAME, regs) == TF_REGS);
|
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(KV86M_TRAP_FRAME, orig_ebp) == TF_ORIG_EBP);
|
||||||
C_ASSERT(FIELD_OFFSET(KPCR, Tib.ExceptionList) == KPCR_EXCEPTION_LIST);
|
//C_ASSERT(FIELD_OFFSET(KPCR, Tib.ExceptionList) == KPCR_EXCEPTION_LIST);
|
||||||
C_ASSERT(FIELD_OFFSET(KPCR, Self) == KPCR_SELF);
|
//C_ASSERT(FIELD_OFFSET(KPCR, Self) == KPCR_SELF);
|
||||||
C_ASSERT(FIELD_OFFSET(KPCR, IRR) == KPCR_IRR);
|
C_ASSERT(FIELD_OFFSET(KPCR, IRR) == KPCR_IRR);
|
||||||
C_ASSERT(FIELD_OFFSET(KPCR, IDR) == KPCR_IDR);
|
C_ASSERT(FIELD_OFFSET(KPCR, IDR) == KPCR_IDR);
|
||||||
C_ASSERT(FIELD_OFFSET(KPCR, Irql) == KPCR_IRQL);
|
C_ASSERT(FIELD_OFFSET(KPCR, Irql) == KPCR_IRQL);
|
||||||
|
|
|
@ -41,6 +41,7 @@ extern LDR_DATA_TABLE_ENTRY HalModuleObject;
|
||||||
|
|
||||||
/* NT Loader Data */
|
/* NT Loader Data */
|
||||||
LOADER_PARAMETER_BLOCK BldrLoaderBlock;
|
LOADER_PARAMETER_BLOCK BldrLoaderBlock;
|
||||||
|
LOADER_PARAMETER_EXTENSION BldrExtensionBlock;
|
||||||
CHAR BldrCommandLine[256];
|
CHAR BldrCommandLine[256];
|
||||||
LDR_DATA_TABLE_ENTRY BldrModules[64];
|
LDR_DATA_TABLE_ENTRY BldrModules[64];
|
||||||
MEMORY_ALLOCATION_DESCRIPTOR BldrMemoryDescriptors[64];
|
MEMORY_ALLOCATION_DESCRIPTOR BldrMemoryDescriptors[64];
|
||||||
|
@ -241,6 +242,12 @@ KiRosFrldrLpbToNtLpb(IN PROS_LOADER_PARAMETER_BLOCK RosLoaderBlock,
|
||||||
/* Setup command line */
|
/* Setup command line */
|
||||||
LoaderBlock->LoadOptions = BldrCommandLine;
|
LoaderBlock->LoadOptions = BldrCommandLine;
|
||||||
strcpy(BldrCommandLine, KeLoaderCommandLine);
|
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
|
VOID
|
||||||
|
|
|
@ -189,7 +189,7 @@ KiInitializeKernel(IN PKPROCESS InitProcess,
|
||||||
Prcb->IdleThread = InitThread;
|
Prcb->IdleThread = InitThread;
|
||||||
|
|
||||||
/* Initialize the Kernel Executive */
|
/* Initialize the Kernel Executive */
|
||||||
ExpInitializeExecutive();
|
ExpInitializeExecutive(Number, LoaderBlock);
|
||||||
|
|
||||||
/* Only do this on the boot CPU */
|
/* Only do this on the boot CPU */
|
||||||
if (!Number)
|
if (!Number)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue