mirror of
https://github.com/reactos/reactos.git
synced 2025-05-30 22:49:12 +00:00
[NTOSKRNL]
- Session space address layout is architecture specific, move its initialization into MiInitializeSesseionSpaceLayout() in architecture specific file - Use dedicated constants for setting MmSystemRangeStart, MmUserProbeAddress and MmHighestUserAddress isnetad of making assumptions. svn path=/trunk/; revision=53825
This commit is contained in:
parent
bf4b896e65
commit
0ce2f14276
5 changed files with 148 additions and 286 deletions
|
@ -11,6 +11,9 @@
|
||||||
#define PAE_PAGE_MASK(x) ((x)&(~0xfffLL))
|
#define PAE_PAGE_MASK(x) ((x)&(~0xfffLL))
|
||||||
|
|
||||||
/* Memory layout base addresses */
|
/* Memory layout base addresses */
|
||||||
|
#define MI_HIGHEST_USER_ADDRESS (PVOID)0x000007FFFFFEFFFFULL
|
||||||
|
#define MI_USER_PROBE_ADDRESS (PVOID)0x000007FFFFFF0000ULL
|
||||||
|
#define MI_DEFAULT_SYSTEM_RANGE_START (PVOID)0xFFFF080000000000ULL
|
||||||
#define HYPER_SPACE 0xFFFFF70000000000ULL
|
#define HYPER_SPACE 0xFFFFF70000000000ULL
|
||||||
#define HYPER_SPACE_END 0xFFFFF77FFFFFFFFFULL
|
#define HYPER_SPACE_END 0xFFFFF77FFFFFFFFFULL
|
||||||
#define MI_SESSION_SPACE_MINIMUM (PVOID)0xFFFFF90000000000ULL
|
#define MI_SESSION_SPACE_MINIMUM (PVOID)0xFFFFF90000000000ULL
|
||||||
|
|
|
@ -29,10 +29,83 @@ MMPTE DemandZeroPte = {{MM_READWRITE << MM_PTE_SOFTWARE_PROTECTION_BITS}};
|
||||||
MMPTE PrototypePte = {{(MM_READWRITE << MM_PTE_SOFTWARE_PROTECTION_BITS) |
|
MMPTE PrototypePte = {{(MM_READWRITE << MM_PTE_SOFTWARE_PROTECTION_BITS) |
|
||||||
PTE_PROTOTYPE | (MI_PTE_LOOKUP_NEEDED << PAGE_SHIFT)}};
|
PTE_PROTOTYPE | (MI_PTE_LOOKUP_NEEDED << PAGE_SHIFT)}};
|
||||||
|
|
||||||
extern PFN_NUMBER MiNumberOfFreePages;
|
|
||||||
|
|
||||||
/* PRIVATE FUNCTIONS **********************************************************/
|
/* PRIVATE FUNCTIONS **********************************************************/
|
||||||
|
|
||||||
|
VOID
|
||||||
|
NTAPI
|
||||||
|
INIT_FUNCTION
|
||||||
|
MiInitializeSessionSpaceLayout()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Set the size of session view, pool, and image
|
||||||
|
//
|
||||||
|
MmSessionSize = MI_SESSION_SIZE;
|
||||||
|
MmSessionViewSize = MI_SESSION_VIEW_SIZE;
|
||||||
|
MmSessionPoolSize = MI_SESSION_POOL_SIZE;
|
||||||
|
MmSessionImageSize = MI_SESSION_IMAGE_SIZE;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Set the size of system view
|
||||||
|
//
|
||||||
|
MmSystemViewSize = MI_SYSTEM_VIEW_SIZE;
|
||||||
|
|
||||||
|
//
|
||||||
|
// This is where it all ends
|
||||||
|
//
|
||||||
|
MiSessionImageEnd = (PVOID)PTE_BASE;
|
||||||
|
|
||||||
|
//
|
||||||
|
// This is where we will load Win32k.sys and the video driver
|
||||||
|
//
|
||||||
|
MiSessionImageStart = (PVOID)((ULONG_PTR)MiSessionImageEnd -
|
||||||
|
MmSessionImageSize);
|
||||||
|
|
||||||
|
//
|
||||||
|
// So the view starts right below the session working set (itself below
|
||||||
|
// the image area)
|
||||||
|
//
|
||||||
|
MiSessionViewStart = (PVOID)((ULONG_PTR)MiSessionImageEnd -
|
||||||
|
MmSessionImageSize -
|
||||||
|
MI_SESSION_WORKING_SET_SIZE -
|
||||||
|
MmSessionViewSize);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Session pool follows
|
||||||
|
//
|
||||||
|
MiSessionPoolEnd = MiSessionViewStart;
|
||||||
|
MiSessionPoolStart = (PVOID)((ULONG_PTR)MiSessionPoolEnd -
|
||||||
|
MmSessionPoolSize);
|
||||||
|
|
||||||
|
//
|
||||||
|
// And it all begins here
|
||||||
|
//
|
||||||
|
MmSessionBase = MiSessionPoolStart;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Sanity check that our math is correct
|
||||||
|
//
|
||||||
|
ASSERT((ULONG_PTR)MmSessionBase + MmSessionSize == PTE_BASE);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Session space ends wherever image session space ends
|
||||||
|
//
|
||||||
|
MiSessionSpaceEnd = MiSessionImageEnd;
|
||||||
|
|
||||||
|
//
|
||||||
|
// System view space ends at session space, so now that we know where
|
||||||
|
// this is, we can compute the base address of system view space itself.
|
||||||
|
//
|
||||||
|
MiSystemViewStart = (PVOID)((ULONG_PTR)MmSessionBase -
|
||||||
|
MmSystemViewSize);
|
||||||
|
|
||||||
|
/* Compute the PTE addresses for all the addresses we carved out */
|
||||||
|
MiSessionImagePteStart = MiAddressToPte(MiSessionImageStart);
|
||||||
|
MiSessionImagePteEnd = MiAddressToPte(MiSessionImageEnd);
|
||||||
|
MiSessionBasePte = MiAddressToPte(MmSessionBase);
|
||||||
|
MiSessionLastPte = MiAddressToPte(MiSessionSpaceEnd);
|
||||||
|
}
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
NTAPI
|
NTAPI
|
||||||
INIT_FUNCTION
|
INIT_FUNCTION
|
||||||
|
|
|
@ -28,6 +28,9 @@
|
||||||
|
|
||||||
#define MI_SYSTEM_VIEW_SIZE (16 * _1MB)
|
#define MI_SYSTEM_VIEW_SIZE (16 * _1MB)
|
||||||
|
|
||||||
|
#define MI_HIGHEST_USER_ADDRESS (PVOID)0x7FFEFFFF
|
||||||
|
#define MI_USER_PROBE_ADDRESS (PVOID)0x7FFF0000
|
||||||
|
#define MI_DEFAULT_SYSTEM_RANGE_START (PVOID)0x80000000
|
||||||
#define MI_SYSTEM_CACHE_WS_START (PVOID)0xC0C00000
|
#define MI_SYSTEM_CACHE_WS_START (PVOID)0xC0C00000
|
||||||
#define MI_PAGED_POOL_START (PVOID)0xE1000000
|
#define MI_PAGED_POOL_START (PVOID)0xE1000000
|
||||||
#define MI_NONPAGED_POOL_END (PVOID)0xFFBE0000
|
#define MI_NONPAGED_POOL_END (PVOID)0xFFBE0000
|
||||||
|
@ -526,6 +529,14 @@ extern KEVENT MmZeroingPageEvent;
|
||||||
extern ULONG MmSystemPageColor;
|
extern ULONG MmSystemPageColor;
|
||||||
extern ULONG MmProcessColorSeed;
|
extern ULONG MmProcessColorSeed;
|
||||||
extern PMMWSL MmWorkingSetList;
|
extern PMMWSL MmWorkingSetList;
|
||||||
|
extern PFN_NUMBER MiNumberOfFreePages;
|
||||||
|
extern SIZE_T MmSessionViewSize;
|
||||||
|
extern SIZE_T MmSessionPoolSize;
|
||||||
|
extern SIZE_T MmSessionImageSize;
|
||||||
|
extern PVOID MiSystemViewStart;
|
||||||
|
extern PVOID MiSessionPoolEnd; // 0xBE000000
|
||||||
|
extern PVOID MiSessionPoolStart; // 0xBD000000
|
||||||
|
extern PVOID MiSessionViewStart; // 0xBE000000
|
||||||
|
|
||||||
//
|
//
|
||||||
// Figures out the hardware bits for a PTE
|
// Figures out the hardware bits for a PTE
|
||||||
|
@ -910,6 +921,10 @@ MmArmInitSystem(
|
||||||
IN PLOADER_PARAMETER_BLOCK LoaderBlock
|
IN PLOADER_PARAMETER_BLOCK LoaderBlock
|
||||||
);
|
);
|
||||||
|
|
||||||
|
VOID
|
||||||
|
NTAPI
|
||||||
|
MiInitializeSessionSpaceLayout();
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
NTAPI
|
NTAPI
|
||||||
MiInitMachineDependent(
|
MiInitMachineDependent(
|
||||||
|
|
|
@ -410,7 +410,7 @@ MiScanMemoryDescriptors(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
|
||||||
if (Descriptor->MemoryType != LoaderBad)
|
if (Descriptor->MemoryType != LoaderBad)
|
||||||
{
|
{
|
||||||
/* Count this in the total of pages */
|
/* Count this in the total of pages */
|
||||||
MmNumberOfPhysicalPages += Descriptor->PageCount;
|
MmNumberOfPhysicalPages += (PFN_COUNT)Descriptor->PageCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check if this is the new lowest page */
|
/* Check if this is the new lowest page */
|
||||||
|
@ -1898,9 +1898,9 @@ MmArmInitSystem(IN ULONG Phase,
|
||||||
//
|
//
|
||||||
// Define the basic user vs. kernel address space separation
|
// Define the basic user vs. kernel address space separation
|
||||||
//
|
//
|
||||||
MmSystemRangeStart = (PVOID)KSEG0_BASE;
|
MmSystemRangeStart = (PVOID)MI_DEFAULT_SYSTEM_RANGE_START;
|
||||||
MmUserProbeAddress = (ULONG_PTR)MmSystemRangeStart - 0x10000;
|
MmUserProbeAddress = (ULONG_PTR)MI_HIGHEST_USER_ADDRESS;
|
||||||
MmHighestUserAddress = (PVOID)(MmUserProbeAddress - 1);
|
MmHighestUserAddress = (PVOID)MI_HIGHEST_USER_ADDRESS;
|
||||||
|
|
||||||
/* Highest PTE and PDE based on the addresses above */
|
/* Highest PTE and PDE based on the addresses above */
|
||||||
MiHighestUserPte = MiAddressToPte(MmHighestUserAddress);
|
MiHighestUserPte = MiAddressToPte(MmHighestUserAddress);
|
||||||
|
@ -1922,73 +1922,8 @@ MmArmInitSystem(IN ULONG Phase,
|
||||||
MmBootImageSize = (MmBootImageSize + PDE_MAPPED_VA - 1) & ~(PDE_MAPPED_VA - 1);
|
MmBootImageSize = (MmBootImageSize + PDE_MAPPED_VA - 1) & ~(PDE_MAPPED_VA - 1);
|
||||||
ASSERT((MmBootImageSize % PDE_MAPPED_VA) == 0);
|
ASSERT((MmBootImageSize % PDE_MAPPED_VA) == 0);
|
||||||
|
|
||||||
//
|
/* Initialize session space address layout */
|
||||||
// Set the size of session view, pool, and image
|
MiInitializeSessionSpaceLayout();
|
||||||
//
|
|
||||||
MmSessionSize = MI_SESSION_SIZE;
|
|
||||||
MmSessionViewSize = MI_SESSION_VIEW_SIZE;
|
|
||||||
MmSessionPoolSize = MI_SESSION_POOL_SIZE;
|
|
||||||
MmSessionImageSize = MI_SESSION_IMAGE_SIZE;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Set the size of system view
|
|
||||||
//
|
|
||||||
MmSystemViewSize = MI_SYSTEM_VIEW_SIZE;
|
|
||||||
|
|
||||||
//
|
|
||||||
// This is where it all ends
|
|
||||||
//
|
|
||||||
MiSessionImageEnd = (PVOID)PTE_BASE;
|
|
||||||
|
|
||||||
//
|
|
||||||
// This is where we will load Win32k.sys and the video driver
|
|
||||||
//
|
|
||||||
MiSessionImageStart = (PVOID)((ULONG_PTR)MiSessionImageEnd -
|
|
||||||
MmSessionImageSize);
|
|
||||||
|
|
||||||
//
|
|
||||||
// So the view starts right below the session working set (itself below
|
|
||||||
// the image area)
|
|
||||||
//
|
|
||||||
MiSessionViewStart = (PVOID)((ULONG_PTR)MiSessionImageEnd -
|
|
||||||
MmSessionImageSize -
|
|
||||||
MI_SESSION_WORKING_SET_SIZE -
|
|
||||||
MmSessionViewSize);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Session pool follows
|
|
||||||
//
|
|
||||||
MiSessionPoolEnd = MiSessionViewStart;
|
|
||||||
MiSessionPoolStart = (PVOID)((ULONG_PTR)MiSessionPoolEnd -
|
|
||||||
MmSessionPoolSize);
|
|
||||||
|
|
||||||
//
|
|
||||||
// And it all begins here
|
|
||||||
//
|
|
||||||
MmSessionBase = MiSessionPoolStart;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Sanity check that our math is correct
|
|
||||||
//
|
|
||||||
ASSERT((ULONG_PTR)MmSessionBase + MmSessionSize == PTE_BASE);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Session space ends wherever image session space ends
|
|
||||||
//
|
|
||||||
MiSessionSpaceEnd = MiSessionImageEnd;
|
|
||||||
|
|
||||||
//
|
|
||||||
// System view space ends at session space, so now that we know where
|
|
||||||
// this is, we can compute the base address of system view space itself.
|
|
||||||
//
|
|
||||||
MiSystemViewStart = (PVOID)((ULONG_PTR)MmSessionBase -
|
|
||||||
MmSystemViewSize);
|
|
||||||
|
|
||||||
/* Compute the PTE addresses for all the addresses we carved out */
|
|
||||||
MiSessionImagePteStart = MiAddressToPte(MiSessionImageStart);
|
|
||||||
MiSessionImagePteEnd = MiAddressToPte(MiSessionImageEnd);
|
|
||||||
MiSessionBasePte = MiAddressToPte(MmSessionBase);
|
|
||||||
MiSessionLastPte = MiAddressToPte(MiSessionSpaceEnd);
|
|
||||||
|
|
||||||
/* Initialize the user mode image list */
|
/* Initialize the user mode image list */
|
||||||
InitializeListHead(&MmLoadedUserImageList);
|
InitializeListHead(&MmLoadedUserImageList);
|
||||||
|
|
|
@ -40,16 +40,16 @@ MMPTE PrototypePte = {{(MM_READWRITE << MM_PTE_SOFTWARE_PROTECTION_BITS) |
|
||||||
|
|
||||||
/* Sizes */
|
/* Sizes */
|
||||||
///SIZE_T MmSessionSize = MI_SESSION_SIZE;
|
///SIZE_T MmSessionSize = MI_SESSION_SIZE;
|
||||||
SIZE_T MmSessionViewSize = MI_SESSION_VIEW_SIZE;
|
extern SIZE_T MmSessionViewSize;
|
||||||
SIZE_T MmSessionPoolSize = MI_SESSION_POOL_SIZE;
|
extern SIZE_T MmSessionPoolSize;
|
||||||
SIZE_T MmSessionImageSize = MI_SESSION_IMAGE_SIZE;
|
extern SIZE_T MmSessionImageSize;
|
||||||
SIZE_T MmSystemViewSize = MI_SYSTEM_VIEW_SIZE;
|
extern SIZE_T MmSystemViewSize;
|
||||||
SIZE_T MiNonPagedSystemSize;
|
SIZE_T MiNonPagedSystemSize;
|
||||||
|
|
||||||
/* Address ranges */
|
/* Address ranges */
|
||||||
ULONG64 MmUserProbeAddress = 0x7FFFFFF0000ULL;
|
//ULONG64 MmUserProbeAddress = 0x7FFFFFF0000ULL;
|
||||||
PVOID MmHighestUserAddress = (PVOID)0x7FFFFFEFFFFULL;
|
//PVOID MmHighestUserAddress = (PVOID)0x7FFFFFEFFFFULL;
|
||||||
PVOID MmSystemRangeStart = (PVOID)0xFFFF080000000000ULL;
|
//PVOID MmSystemRangeStart = (PVOID)0xFFFF080000000000ULL;
|
||||||
PVOID MmSessionBase; // FFFFF90000000000 = MiSessionPoolStart
|
PVOID MmSessionBase; // FFFFF90000000000 = MiSessionPoolStart
|
||||||
PVOID MiSessionPoolStart; // FFFFF90000000000 = MiSessionPoolEnd - MmSessionPoolSize
|
PVOID MiSessionPoolStart; // FFFFF90000000000 = MiSessionPoolEnd - MmSessionPoolSize
|
||||||
PVOID MiSessionPoolEnd; // = MiSessionViewStart
|
PVOID MiSessionPoolEnd; // = MiSessionViewStart
|
||||||
|
@ -75,7 +75,6 @@ ULONG64 MxPfnSizeInBytes;
|
||||||
|
|
||||||
PMEMORY_ALLOCATION_DESCRIPTOR MxFreeDescriptor;
|
PMEMORY_ALLOCATION_DESCRIPTOR MxFreeDescriptor;
|
||||||
MEMORY_ALLOCATION_DESCRIPTOR MxOldFreeDescriptor;
|
MEMORY_ALLOCATION_DESCRIPTOR MxOldFreeDescriptor;
|
||||||
ULONG MiNumberDescriptors = 0;
|
|
||||||
PFN_NUMBER MiSystemPages = 0;
|
PFN_NUMBER MiSystemPages = 0;
|
||||||
BOOLEAN MiIncludeType[LoaderMaximum];
|
BOOLEAN MiIncludeType[LoaderMaximum];
|
||||||
|
|
||||||
|
@ -88,92 +87,53 @@ BOOLEAN MiPfnsInitialized = FALSE;
|
||||||
|
|
||||||
/* FUNCTIONS *****************************************************************/
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
||||||
|
VOID
|
||||||
|
NTAPI
|
||||||
|
INIT_FUNCTION
|
||||||
|
MiInitializeSessionSpaceLayout()
|
||||||
|
{
|
||||||
|
MmSessionViewSize = MI_SESSION_VIEW_SIZE;
|
||||||
|
MmSessionPoolSize = MI_SESSION_POOL_SIZE;
|
||||||
|
MmSessionImageSize = MI_SESSION_IMAGE_SIZE;
|
||||||
|
MmSystemViewSize = MI_SYSTEM_VIEW_SIZE;
|
||||||
|
|
||||||
|
/* Set up session space */
|
||||||
|
MiSessionSpaceEnd = (PVOID)MI_SESSION_SPACE_END;
|
||||||
|
|
||||||
|
/* This is where we will load Win32k.sys and the video driver */
|
||||||
|
MiSessionImageEnd = MiSessionSpaceEnd;
|
||||||
|
MiSessionImageStart = (PCHAR)MiSessionImageEnd - MmSessionImageSize;
|
||||||
|
|
||||||
|
/* The view starts right below the session working set (itself below
|
||||||
|
* the image area) */
|
||||||
|
MiSessionViewEnd = MI_SESSION_VIEW_END;
|
||||||
|
MiSessionViewStart = (PCHAR)MiSessionViewEnd - MmSessionViewSize;
|
||||||
|
ASSERT(IS_PAGE_ALIGNED(MiSessionViewStart));
|
||||||
|
|
||||||
|
/* Session pool follows */
|
||||||
|
MiSessionPoolEnd = MiSessionViewStart;
|
||||||
|
MiSessionPoolStart = (PCHAR)MiSessionPoolEnd - MmSessionPoolSize;
|
||||||
|
ASSERT(IS_PAGE_ALIGNED(MiSessionPoolStart));
|
||||||
|
|
||||||
|
/* And it all begins here */
|
||||||
|
MmSessionBase = MiSessionPoolStart;
|
||||||
|
|
||||||
|
/* System view space ends at session space, so now that we know where
|
||||||
|
* this is, we can compute the base address of system view space itself. */
|
||||||
|
MiSystemViewStart = (PCHAR)MmSessionBase - MmSystemViewSize;
|
||||||
|
ASSERT(IS_PAGE_ALIGNED(MiSystemViewStart));
|
||||||
|
|
||||||
|
/* Sanity checks */
|
||||||
|
ASSERT(MiSessionViewEnd <= MiSessionImageStart);
|
||||||
|
ASSERT(MmSessionBase <= MiSessionPoolStart);
|
||||||
|
}
|
||||||
|
|
||||||
ULONG
|
ULONG
|
||||||
NoDbgPrint(const char *Format, ...)
|
NoDbgPrint(const char *Format, ...)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
|
||||||
NTAPI
|
|
||||||
MiEvaluateMemoryDescriptors(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
|
|
||||||
{
|
|
||||||
PMEMORY_ALLOCATION_DESCRIPTOR Descriptor;
|
|
||||||
PLIST_ENTRY ListEntry;
|
|
||||||
PFN_NUMBER LastPage;
|
|
||||||
ULONG i;
|
|
||||||
|
|
||||||
/* Get the size of the boot loader's image allocations */
|
|
||||||
MmBootImageSize = KeLoaderBlock->Extension->LoaderPagesSpanned * PAGE_SIZE;
|
|
||||||
MmBootImageSize = ROUND_UP(MmBootImageSize, 4 * 1024 * 1024);
|
|
||||||
|
|
||||||
/* Instantiate memory that we don't consider RAM/usable */
|
|
||||||
for (i = 0; i < LoaderMaximum; i++) MiIncludeType[i] = TRUE;
|
|
||||||
MiIncludeType[LoaderBad] = FALSE;
|
|
||||||
MiIncludeType[LoaderFirmwarePermanent] = FALSE;
|
|
||||||
MiIncludeType[LoaderSpecialMemory] = FALSE;
|
|
||||||
MiIncludeType[LoaderBBTMemory] = FALSE;
|
|
||||||
|
|
||||||
/* Loop the memory descriptors */
|
|
||||||
for (ListEntry = LoaderBlock->MemoryDescriptorListHead.Flink;
|
|
||||||
ListEntry != &LoaderBlock->MemoryDescriptorListHead;
|
|
||||||
ListEntry = ListEntry->Flink)
|
|
||||||
{
|
|
||||||
/* Get the memory descriptor */
|
|
||||||
Descriptor = CONTAINING_RECORD(ListEntry,
|
|
||||||
MEMORY_ALLOCATION_DESCRIPTOR,
|
|
||||||
ListEntry);
|
|
||||||
|
|
||||||
/* Count it */
|
|
||||||
MiNumberDescriptors++;
|
|
||||||
|
|
||||||
/* Skip pages that are not part of the PFN database */
|
|
||||||
if (!MiIncludeType[Descriptor->MemoryType])
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Add this to the total of pages */
|
|
||||||
MmNumberOfPhysicalPages += (PFN_COUNT)Descriptor->PageCount;
|
|
||||||
|
|
||||||
/* Check if this is the new lowest page */
|
|
||||||
if (Descriptor->BasePage < MmLowestPhysicalPage)
|
|
||||||
{
|
|
||||||
/* Update the lowest page */
|
|
||||||
MmLowestPhysicalPage = Descriptor->BasePage;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Check if this is the new highest page */
|
|
||||||
LastPage = Descriptor->BasePage + Descriptor->PageCount - 1;
|
|
||||||
if (LastPage > MmHighestPhysicalPage)
|
|
||||||
{
|
|
||||||
/* Update the highest page */
|
|
||||||
MmHighestPhysicalPage = LastPage;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Check if this is currently free memory */
|
|
||||||
if ((Descriptor->MemoryType == LoaderFree) ||
|
|
||||||
(Descriptor->MemoryType == LoaderLoadedProgram) ||
|
|
||||||
(Descriptor->MemoryType == LoaderFirmwareTemporary) ||
|
|
||||||
(Descriptor->MemoryType == LoaderOsloaderStack))
|
|
||||||
{
|
|
||||||
/* Check if this is the largest memory descriptor */
|
|
||||||
if (Descriptor->PageCount > MxFreePageCount)
|
|
||||||
{
|
|
||||||
/* For now, it is */
|
|
||||||
MxFreeDescriptor = Descriptor;
|
|
||||||
MxFreePageBase = Descriptor->BasePage;
|
|
||||||
MxFreePageCount = Descriptor->PageCount;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* Add it to the amount of system used pages */
|
|
||||||
MiSystemPages += Descriptor->PageCount;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
PFN_NUMBER
|
PFN_NUMBER
|
||||||
NTAPI
|
NTAPI
|
||||||
MiEarlyAllocPage()
|
MiEarlyAllocPage()
|
||||||
|
@ -341,41 +301,6 @@ MiPreparePfnDatabse(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
VOID
|
|
||||||
NTAPI
|
|
||||||
MiInitializeSessionSpace(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
|
|
||||||
{
|
|
||||||
/* Set up session space */
|
|
||||||
MiSessionSpaceEnd = (PVOID)MI_SESSION_SPACE_END;
|
|
||||||
|
|
||||||
/* This is where we will load Win32k.sys and the video driver */
|
|
||||||
MiSessionImageEnd = MiSessionSpaceEnd;
|
|
||||||
MiSessionImageStart = (PCHAR)MiSessionImageEnd - MmSessionImageSize;
|
|
||||||
|
|
||||||
/* The view starts right below the session working set (itself below
|
|
||||||
* the image area) */
|
|
||||||
MiSessionViewEnd = MI_SESSION_VIEW_END;
|
|
||||||
MiSessionViewStart = (PCHAR)MiSessionViewEnd - MmSessionViewSize;
|
|
||||||
ASSERT(IS_PAGE_ALIGNED(MiSessionViewStart));
|
|
||||||
|
|
||||||
/* Session pool follows */
|
|
||||||
MiSessionPoolEnd = MiSessionViewStart;
|
|
||||||
MiSessionPoolStart = (PCHAR)MiSessionPoolEnd - MmSessionPoolSize;
|
|
||||||
ASSERT(IS_PAGE_ALIGNED(MiSessionPoolStart));
|
|
||||||
|
|
||||||
/* And it all begins here */
|
|
||||||
MmSessionBase = MiSessionPoolStart;
|
|
||||||
|
|
||||||
/* System view space ends at session space, so now that we know where
|
|
||||||
* this is, we can compute the base address of system view space itself. */
|
|
||||||
MiSystemViewStart = (PCHAR)MmSessionBase - MmSystemViewSize;
|
|
||||||
ASSERT(IS_PAGE_ALIGNED(MiSystemViewStart));
|
|
||||||
|
|
||||||
/* Sanity checks */
|
|
||||||
ASSERT(MiSessionViewEnd <= MiSessionImageStart);
|
|
||||||
ASSERT(MmSessionBase <= MiSessionPoolStart);
|
|
||||||
}
|
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
MiInitializePageTable()
|
MiInitializePageTable()
|
||||||
{
|
{
|
||||||
|
@ -605,92 +530,6 @@ MiBuildSystemPteSpace()
|
||||||
MiFirstReservedZeroingPte->u.Hard.PageFrameNumber = MI_ZERO_PTES - 1;
|
MiFirstReservedZeroingPte->u.Hard.PageFrameNumber = MI_ZERO_PTES - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
|
||||||
NTAPI
|
|
||||||
MiBuildPhysicalMemoryBlock(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
|
|
||||||
{
|
|
||||||
PPHYSICAL_MEMORY_DESCRIPTOR Buffer;
|
|
||||||
PMEMORY_ALLOCATION_DESCRIPTOR Descriptor;
|
|
||||||
PLIST_ENTRY ListEntry;
|
|
||||||
PFN_NUMBER NextPage = -1;
|
|
||||||
PULONG Bitmap;
|
|
||||||
ULONG Runs = 0;
|
|
||||||
ULONG_PTR Size;
|
|
||||||
|
|
||||||
/* Calculate size for the PFN bitmap */
|
|
||||||
Size = ROUND_UP(MmHighestPhysicalPage + 1, sizeof(ULONG));
|
|
||||||
|
|
||||||
/* Allocate the PFN bitmap */
|
|
||||||
Bitmap = ExAllocatePoolWithTag(NonPagedPool, Size, ' mM');
|
|
||||||
|
|
||||||
/* Allocate enough memory for the physical memory block */
|
|
||||||
Buffer = ExAllocatePoolWithTag(NonPagedPool,
|
|
||||||
sizeof(PHYSICAL_MEMORY_DESCRIPTOR) +
|
|
||||||
sizeof(PHYSICAL_MEMORY_RUN) *
|
|
||||||
(MiNumberDescriptors - 1),
|
|
||||||
'lMmM');
|
|
||||||
if (!Bitmap || !Buffer)
|
|
||||||
{
|
|
||||||
/* This is critical */
|
|
||||||
KeBugCheckEx(INSTALL_MORE_MEMORY,
|
|
||||||
MmNumberOfPhysicalPages,
|
|
||||||
MmLowestPhysicalPage,
|
|
||||||
MmHighestPhysicalPage,
|
|
||||||
0x101);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Initialize the bitmap and clear all bits */
|
|
||||||
RtlInitializeBitMap(&MiPfnBitMap,
|
|
||||||
Bitmap,
|
|
||||||
(ULONG)MmHighestPhysicalPage + 1);
|
|
||||||
RtlClearAllBits(&MiPfnBitMap);
|
|
||||||
|
|
||||||
/* Loop the memory descriptors */
|
|
||||||
for (ListEntry = LoaderBlock->MemoryDescriptorListHead.Flink;
|
|
||||||
ListEntry != &LoaderBlock->MemoryDescriptorListHead;
|
|
||||||
ListEntry = ListEntry->Flink)
|
|
||||||
{
|
|
||||||
/* Get the memory descriptor */
|
|
||||||
Descriptor = CONTAINING_RECORD(ListEntry,
|
|
||||||
MEMORY_ALLOCATION_DESCRIPTOR,
|
|
||||||
ListEntry);
|
|
||||||
|
|
||||||
/* Skip pages that are not part of the PFN database */
|
|
||||||
if (!MiIncludeType[Descriptor->MemoryType])
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Does the memory block begin where the last ended? */
|
|
||||||
if (Descriptor->BasePage == NextPage)
|
|
||||||
{
|
|
||||||
/* Add it to the current run */
|
|
||||||
Buffer->Run[Runs - 1].PageCount += Descriptor->PageCount;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* Create a new run */
|
|
||||||
Runs++;
|
|
||||||
Buffer->Run[Runs - 1].BasePage = Descriptor->BasePage;
|
|
||||||
Buffer->Run[Runs - 1].PageCount = Descriptor->PageCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Set the bits in the PFN bitmap */
|
|
||||||
RtlSetBits(&MiPfnBitMap,
|
|
||||||
(ULONG)Descriptor->BasePage,
|
|
||||||
(ULONG)Descriptor->PageCount);
|
|
||||||
|
|
||||||
/* Set the next page */
|
|
||||||
NextPage = Descriptor->BasePage + Descriptor->PageCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
// FIXME: allocate a buffer of better size
|
|
||||||
|
|
||||||
Buffer->NumberOfRuns = Runs;
|
|
||||||
Buffer->NumberOfPages = MmNumberOfPhysicalPages;
|
|
||||||
MmPhysicalMemoryBlock = Buffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
NTAPI
|
NTAPI
|
||||||
MiBuildPagedPool_x(VOID)
|
MiBuildPagedPool_x(VOID)
|
||||||
|
@ -824,7 +663,7 @@ MmArmInitSystem_x(IN ULONG Phase,
|
||||||
MmBootImageSize = ROUND_UP(MmBootImageSize, PAGE_SIZE);
|
MmBootImageSize = ROUND_UP(MmBootImageSize, PAGE_SIZE);
|
||||||
|
|
||||||
/* Parse memory descriptors, find free pages */
|
/* Parse memory descriptors, find free pages */
|
||||||
MiEvaluateMemoryDescriptors(LoaderBlock);
|
//MiEvaluateMemoryDescriptors(LoaderBlock);
|
||||||
|
|
||||||
/* Start PFN database at hardcoded address */
|
/* Start PFN database at hardcoded address */
|
||||||
MmPfnDatabase = MI_PFN_DATABASE;
|
MmPfnDatabase = MI_PFN_DATABASE;
|
||||||
|
@ -832,9 +671,6 @@ MmArmInitSystem_x(IN ULONG Phase,
|
||||||
/* Prepare PFN database mappings */
|
/* Prepare PFN database mappings */
|
||||||
MiPreparePfnDatabse(LoaderBlock);
|
MiPreparePfnDatabse(LoaderBlock);
|
||||||
|
|
||||||
/* Initialize the session space */
|
|
||||||
MiInitializeSessionSpace(LoaderBlock);
|
|
||||||
|
|
||||||
/* Initialize some mappings */
|
/* Initialize some mappings */
|
||||||
MiInitializePageTable();
|
MiInitializePageTable();
|
||||||
|
|
||||||
|
@ -859,7 +695,7 @@ MmArmInitSystem_x(IN ULONG Phase,
|
||||||
MiBuildSystemPteSpace();
|
MiBuildSystemPteSpace();
|
||||||
|
|
||||||
/* Build the physical memory block */
|
/* Build the physical memory block */
|
||||||
MiBuildPhysicalMemoryBlock(LoaderBlock);
|
//MiBuildPhysicalMemoryBlock(LoaderBlock);
|
||||||
|
|
||||||
/* Size up paged pool and build the shadow system page directory */
|
/* Size up paged pool and build the shadow system page directory */
|
||||||
//MiBuildPagedPool();
|
//MiBuildPagedPool();
|
||||||
|
|
Loading…
Reference in a new issue