Author: ion
Date: Sun Oct 1 22:01:38 2006
New Revision: 24346
URL:
http://svn.reactos.org/svn/reactos?rev=24346&view=rev
Log:
- 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.
Modified:
trunk/reactos/ntoskrnl/ex/init.c
trunk/reactos/ntoskrnl/ex/lookas.c
trunk/reactos/ntoskrnl/include/internal/ex.h
trunk/reactos/ntoskrnl/include/internal/ntoskrnl.h
trunk/reactos/ntoskrnl/ke/freeldr.c
trunk/reactos/ntoskrnl/ke/i386/kiinit.c
Modified: trunk/reactos/ntoskrnl/ex/init.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ex/init.c?rev=243…
==============================================================================
--- trunk/reactos/ntoskrnl/ex/init.c (original)
+++ trunk/reactos/ntoskrnl/ex/init.c Sun Oct 1 22:01:38 2006
@@ -44,19 +44,13 @@
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 ****************************************************************/
@@ -482,10 +476,64 @@
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);
Modified: trunk/reactos/ntoskrnl/ex/lookas.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ex/lookas.c?rev=2…
==============================================================================
--- trunk/reactos/ntoskrnl/ex/lookas.c (original)
+++ trunk/reactos/ntoskrnl/ex/lookas.c Sun Oct 1 22:01:38 2006
@@ -24,9 +24,42 @@
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
Modified: trunk/reactos/ntoskrnl/include/internal/ex.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/include/internal/…
==============================================================================
--- trunk/reactos/ntoskrnl/include/internal/ex.h (original)
+++ trunk/reactos/ntoskrnl/include/internal/ex.h Sun Oct 1 22:01:38 2006
@@ -76,7 +76,10 @@
VOID
NTAPI
-ExpInitializeExecutive(VOID);
+ExpInitializeExecutive(
+ IN ULONG Cpu,
+ IN PLOADER_PARAMETER_BLOCK LoaderBlock
+);
VOID
NTAPI
@@ -109,6 +112,10 @@
VOID
NTAPI
ExpResourceInitialization(VOID);
+
+VOID
+NTAPI
+ExInitPoolLookasidePointers(VOID);
/* Rundown Functions ********************************************************/
Modified: trunk/reactos/ntoskrnl/include/internal/ntoskrnl.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/include/internal/…
==============================================================================
--- trunk/reactos/ntoskrnl/include/internal/ntoskrnl.h (original)
+++ trunk/reactos/ntoskrnl/include/internal/ntoskrnl.h Sun Oct 1 22:01:38 2006
@@ -310,8 +310,8 @@
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);
Modified: trunk/reactos/ntoskrnl/ke/freeldr.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/freeldr.c?rev=…
==============================================================================
--- trunk/reactos/ntoskrnl/ke/freeldr.c (original)
+++ trunk/reactos/ntoskrnl/ke/freeldr.c Sun Oct 1 22:01:38 2006
@@ -41,6 +41,7 @@
/* 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 @@
/* 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
Modified: trunk/reactos/ntoskrnl/ke/i386/kiinit.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/i386/kiinit.c?…
==============================================================================
--- trunk/reactos/ntoskrnl/ke/i386/kiinit.c (original)
+++ trunk/reactos/ntoskrnl/ke/i386/kiinit.c Sun Oct 1 22:01:38 2006
@@ -189,7 +189,7 @@
Prcb->IdleThread = InitThread;
/* Initialize the Kernel Executive */
- ExpInitializeExecutive();
+ ExpInitializeExecutive(Number, LoaderBlock);
/* Only do this on the boot CPU */
if (!Number)