mirror of
https://github.com/reactos/reactos.git
synced 2025-01-01 12:04:51 +00:00
[NTOS:MM] Fix paged pool initialization on x64
This commit is contained in:
parent
ffc96d26ec
commit
3d17a7590d
1 changed files with 14 additions and 11 deletions
|
@ -1755,7 +1755,7 @@ MiBuildPagedPool(VOID)
|
||||||
MMPDE TempPde = ValidKernelPde;
|
MMPDE TempPde = ValidKernelPde;
|
||||||
PFN_NUMBER PageFrameIndex;
|
PFN_NUMBER PageFrameIndex;
|
||||||
KIRQL OldIrql;
|
KIRQL OldIrql;
|
||||||
SIZE_T Size;
|
SIZE_T Size, NumberOfPages, NumberOfPdes;
|
||||||
ULONG BitMapSize;
|
ULONG BitMapSize;
|
||||||
#if (_MI_PAGING_LEVELS >= 3)
|
#if (_MI_PAGING_LEVELS >= 3)
|
||||||
MMPPE TempPpe = ValidKernelPpe;
|
MMPPE TempPpe = ValidKernelPpe;
|
||||||
|
@ -1814,17 +1814,17 @@ MiBuildPagedPool(VOID)
|
||||||
//
|
//
|
||||||
Size = MmSizeOfPagedPoolInBytes;
|
Size = MmSizeOfPagedPoolInBytes;
|
||||||
if (Size < MI_MIN_INIT_PAGED_POOLSIZE) Size = MI_MIN_INIT_PAGED_POOLSIZE;
|
if (Size < MI_MIN_INIT_PAGED_POOLSIZE) Size = MI_MIN_INIT_PAGED_POOLSIZE;
|
||||||
Size = BYTES_TO_PAGES(Size);
|
NumberOfPages = BYTES_TO_PAGES(Size);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Now check how many PTEs will be required for these many pages.
|
// Now check how many PDEs will be required for these many pages.
|
||||||
//
|
//
|
||||||
Size = (Size + (1024 - 1)) / 1024;
|
NumberOfPdes = (NumberOfPages + (PTE_PER_PAGE - 1)) / PTE_PER_PAGE;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Recompute the page-aligned size of the paged pool, in bytes and pages.
|
// Recompute the PDE-aligned size of the paged pool, in bytes and pages.
|
||||||
//
|
//
|
||||||
MmSizeOfPagedPoolInBytes = Size * PAGE_SIZE * 1024;
|
MmSizeOfPagedPoolInBytes = NumberOfPdes * PTE_PER_PAGE * PAGE_SIZE;
|
||||||
MmSizeOfPagedPoolInPages = MmSizeOfPagedPoolInBytes >> PAGE_SHIFT;
|
MmSizeOfPagedPoolInPages = MmSizeOfPagedPoolInBytes >> PAGE_SHIFT;
|
||||||
|
|
||||||
#ifdef _M_IX86
|
#ifdef _M_IX86
|
||||||
|
@ -1860,6 +1860,9 @@ MiBuildPagedPool(VOID)
|
||||||
/* It is not, so map a fresh zeroed page */
|
/* It is not, so map a fresh zeroed page */
|
||||||
TempPpe.u.Hard.PageFrameNumber = MiRemoveZeroPage(0);
|
TempPpe.u.Hard.PageFrameNumber = MiRemoveZeroPage(0);
|
||||||
MI_WRITE_VALID_PPE(PointerPpe, TempPpe);
|
MI_WRITE_VALID_PPE(PointerPpe, TempPpe);
|
||||||
|
MiInitializePfnForOtherProcess(TempPpe.u.Hard.PageFrameNumber,
|
||||||
|
(PMMPTE)PointerPpe,
|
||||||
|
PFN_FROM_PTE(MiAddressToPte(PointerPpe)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -1921,10 +1924,10 @@ MiBuildPagedPool(VOID)
|
||||||
//
|
//
|
||||||
// We'll also allocate the bitmap header itself part of the same buffer.
|
// We'll also allocate the bitmap header itself part of the same buffer.
|
||||||
//
|
//
|
||||||
Size = Size * 1024;
|
NumberOfPages = NumberOfPdes * PTE_PER_PAGE;
|
||||||
ASSERT(Size == MmSizeOfPagedPoolInPages);
|
ASSERT(NumberOfPages == MmSizeOfPagedPoolInPages);
|
||||||
BitMapSize = (ULONG)Size;
|
BitMapSize = (ULONG)NumberOfPages;
|
||||||
Size = sizeof(RTL_BITMAP) + (((Size + 31) / 32) * sizeof(ULONG));
|
Size = sizeof(RTL_BITMAP) + (((BitMapSize + 31) / 32) * sizeof(ULONG));
|
||||||
|
|
||||||
//
|
//
|
||||||
// Allocate the allocation bitmap, which tells us which regions have not yet
|
// Allocate the allocation bitmap, which tells us which regions have not yet
|
||||||
|
@ -1943,7 +1946,7 @@ MiBuildPagedPool(VOID)
|
||||||
(PULONG)(MmPagedPoolInfo.PagedPoolAllocationMap + 1),
|
(PULONG)(MmPagedPoolInfo.PagedPoolAllocationMap + 1),
|
||||||
BitMapSize);
|
BitMapSize);
|
||||||
RtlSetAllBits(MmPagedPoolInfo.PagedPoolAllocationMap);
|
RtlSetAllBits(MmPagedPoolInfo.PagedPoolAllocationMap);
|
||||||
RtlClearBits(MmPagedPoolInfo.PagedPoolAllocationMap, 0, 1024);
|
RtlClearBits(MmPagedPoolInfo.PagedPoolAllocationMap, 0, PTE_PER_PAGE);
|
||||||
|
|
||||||
//
|
//
|
||||||
// We have a second bitmap, which keeps track of where allocations end.
|
// We have a second bitmap, which keeps track of where allocations end.
|
||||||
|
|
Loading…
Reference in a new issue