Implement MmUpdatePageDir

svn path=/branches/ros-amd64-bringup/; revision=35737
This commit is contained in:
Timo Kreuzer
2008-08-29 00:24:55 +00:00
parent 01a5044354
commit ae1e57e747
2 changed files with 46 additions and 9 deletions
+14 -8
View File
@@ -2,8 +2,8 @@
* Lowlevel memory managment definitions
*/
#ifndef __NTOSKRNL_INCLUDE_INTERNAL_I386_MM_H
#define __NTOSKRNL_INCLUDE_INTERNAL_I386_MM_H
#ifndef __NTOSKRNL_INCLUDE_INTERNAL_AMD64_MM_H
#define __NTOSKRNL_INCLUDE_INTERNAL_AMD64_MM_H
struct _EPROCESS;
PULONG_PTR MmGetPageDirectory(VOID);
@@ -17,15 +17,21 @@ PULONG_PTR MmGetPageDirectory(VOID);
/* Converting address to a corresponding PDE or PTE entry */
#define MiAddressToPde(x) \
((PMMPTE)(((((ULONG)(x)) >> 22) << 2) + PAGEDIRECTORY_MAP))
((PMMPTE)(((((ULONG64)(x)) >> 22) << 2) + PAGEDIRECTORY_MAP))
#define MiAddressToPte(x) \
((PMMPTE)(((((ULONG)(x)) >> 12) << 2) + PAGETABLE_MAP))
((PMMPTE)(((((ULONG64)(x)) >> 12) << 2) + PAGETABLE_MAP))
//#define ADDR_TO_PAGE_TABLE(v) (((ULONG)(v)) / (1024 * PAGE_SIZE))
//#define ADDR_TO_PDE_OFFSET(v) ((((ULONG)(v)) / (1024 * PAGE_SIZE)))
//#define ADDR_TO_PTE_OFFSET(v) ((((ULONG)(v)) % (1024 * PAGE_SIZE)) / PAGE_SIZE)
#define VAtoPXI(va) ((((ULONG64)va) >> PXI_SHIFT) & 0x1FF)
#define VAtoPPI(va) ((((ULONG64)va) >> PPI_SHIFT) & 0x1FF)
#define VAtoPDI(va) ((((ULONG64)va) >> PDI_SHIFT) & 0x1FF)
#define VAtoPTI(va) ((((ULONG64)va) >> PTI_SHIFT) & 0x1FF)
#define ADDR_TO_PAGE_TABLE(v) (((ULONG)(v)) / (1024 * PAGE_SIZE))
#define ADDR_TO_PDE_OFFSET(v) ((((ULONG)(v)) / (1024 * PAGE_SIZE)))
#define ADDR_TO_PTE_OFFSET(v) ((((ULONG)(v)) % (1024 * PAGE_SIZE)) / PAGE_SIZE)
/* Easy accessing PFN in PTE */
#define PFN_FROM_PTE(v) ((v)->u.Hard.PageFrameNumber)
#endif /* __NTOSKRNL_INCLUDE_INTERNAL_I386_MM_H */
#endif /* __NTOSKRNL_INCLUDE_INTERNAL_AMD64_MM_H */
+32 -1
View File
@@ -21,6 +21,7 @@
/* GLOBALS *****************************************************************/
ULONG64 MmGlobalKernelPageDirectory[512];
/* FUNCTIONS ***************************************************************/
@@ -301,7 +302,37 @@ VOID
NTAPI
MmUpdatePageDir(PEPROCESS Process, PVOID Address, ULONG Size)
{
UNIMPLEMENTED;
ULONG StartIndex, EndIndex, Index;
PULONG64 Pde;
/* Sanity check */
if (Address < MmSystemRangeStart)
{
KEBUGCHECK(0);
}
/* Get pointer to the page directory to update */
if (Process != NULL && Process != PsGetCurrentProcess())
{
// Pde = MmCreateHyperspaceMapping(PTE_TO_PFN(Process->Pcb.DirectoryTableBase[0]));
}
else
{
Pde = (PULONG64)PXE_BASE;
}
/* Update PML4 entries */
StartIndex = VAtoPXI(Address);
EndIndex = VAtoPXI((ULONG64)Address + Size);
for (Index = StartIndex; Index <= EndIndex; Index++)
{
if (Index != VAtoPXI(PXE_BASE))
{
(void)InterlockedCompareExchangePointer((PVOID*)&Pde[Index],
MmGlobalKernelPageDirectory[Index],
0);
}
}
}
VOID