From ae1e57e747da8b8c45989e913ffd377ad5be37dd Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Fri, 29 Aug 2008 00:24:55 +0000 Subject: [PATCH] Implement MmUpdatePageDir svn path=/branches/ros-amd64-bringup/; revision=35737 --- reactos/ntoskrnl/include/internal/amd64/mm.h | 22 ++++++++----- reactos/ntoskrnl/mm/amd64/page.c | 33 +++++++++++++++++++- 2 files changed, 46 insertions(+), 9 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/amd64/mm.h b/reactos/ntoskrnl/include/internal/amd64/mm.h index c106a2f45c1..fa8da9a6434 100644 --- a/reactos/ntoskrnl/include/internal/amd64/mm.h +++ b/reactos/ntoskrnl/include/internal/amd64/mm.h @@ -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 */ diff --git a/reactos/ntoskrnl/mm/amd64/page.c b/reactos/ntoskrnl/mm/amd64/page.c index ba46336fe08..97848d66d6e 100644 --- a/reactos/ntoskrnl/mm/amd64/page.c +++ b/reactos/ntoskrnl/mm/amd64/page.c @@ -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