X-Git-Url: https://git.reactos.org/?p=reactos.git;a=blobdiff_plain;f=ntoskrnl%2Fmm%2Fi386%2Fpage.c;h=1bc842deeb36233698672741708c25c9e2553c70;hp=6d63d243e34084241a7ef68efa497a8dd5d9b7a6;hb=1014d50a4be27ab91988a3c6ddd0eb07b2b3a5d8;hpb=25445ea35f5286c9367faa6bcac147ff4d371d2e diff --git a/ntoskrnl/mm/i386/page.c b/ntoskrnl/mm/i386/page.c index 6d63d243e34..1bc842deeb3 100644 --- a/ntoskrnl/mm/i386/page.c +++ b/ntoskrnl/mm/i386/page.c @@ -12,13 +12,14 @@ #include #define NDEBUG #include -#include "../ARM3/miarm.h" +#include #if defined (ALLOC_PRAGMA) #pragma alloc_text(INIT, MmInitGlobalKernelPageDirectory) -#pragma alloc_text(INIT, MiInitPageDirectoryMap) #endif +#define ADDR_TO_PDE_OFFSET MiAddressToPdeOffset +#define ADDR_TO_PAGE_TABLE(v) (((ULONG)(v)) / (1024 * PAGE_SIZE)) /* GLOBALS *****************************************************************/ @@ -40,22 +41,12 @@ #define PA_ACCESSED (1 << PA_BIT_ACCESSED) #define PA_GLOBAL (1 << PA_BIT_GLOBAL) -#define HYPERSPACE (0xc0400000) -#define IS_HYPERSPACE(v) (((ULONG)(v) >= HYPERSPACE && (ULONG)(v) < HYPERSPACE + 0x400000)) +#define IS_HYPERSPACE(v) (((ULONG)(v) >= HYPER_SPACE && (ULONG)(v) <= HYPER_SPACE_END)) #define PTE_TO_PFN(X) ((X) >> PAGE_SHIFT) #define PFN_TO_PTE(X) ((X) << PAGE_SHIFT) -#if defined(__GNUC__) -#define PTE_TO_PAGE(X) ((LARGE_INTEGER)(LONGLONG)(PAGE_MASK(X))) -#else -__inline LARGE_INTEGER PTE_TO_PAGE(ULONG npage) -{ - LARGE_INTEGER dummy; - dummy.QuadPart = (LONGLONG)(PAGE_MASK(npage)); - return dummy; -} -#endif +#define PAGE_MASK(x) ((x)&(~0xfff)) const ULONG @@ -146,7 +137,7 @@ ULONG MmProtectToValue[32] = /* FUNCTIONS ***************************************************************/ -BOOLEAN MmUnmapPageTable(PULONG Pt); +static BOOLEAN MmUnmapPageTable(PULONG Pt); VOID MiFlushTlb(PULONG Pt, PVOID Address) @@ -198,31 +189,9 @@ ProtectToPTE(ULONG flProtect) return(Attributes); } -/* Taken from ARM3/pagfault.c */ -BOOLEAN -FORCEINLINE -MiSynchronizeSystemPde(PMMPDE PointerPde) -{ - MMPDE SystemPde; - ULONG Index; - - /* Get the Index from the PDE */ - Index = ((ULONG_PTR)PointerPde & (SYSTEM_PD_SIZE - 1)) / sizeof(MMPTE); - - /* Copy the PDE from the double-mapped system page directory */ - SystemPde = MmSystemPagePtes[Index]; - *PointerPde = SystemPde; - - /* Make sure we re-read the PDE and PTE */ - KeMemoryBarrierWithoutFence(); - - /* Return, if we had success */ - return SystemPde.u.Hard.Valid != 0; -} - NTSTATUS NTAPI -MiDispatchFault(IN BOOLEAN StoreInstruction, +MiDispatchFault(IN ULONG FaultCode, IN PVOID Address, IN PMMPTE PointerPte, IN PMMPTE PointerProtoPte, @@ -293,7 +262,8 @@ MmGetPageTableForProcess(PEPROCESS Process, PVOID Address, BOOLEAN Create) ASSERT(PointerPde->u.Long == 0); MI_WRITE_INVALID_PTE(PointerPde, DemandZeroPde); - Status = MiDispatchFault(TRUE, + // Tiny HACK: Parameter 1 is the architecture specific FaultCode for an access violation (i.e. page is present) + Status = MiDispatchFault(0x1, Pt, PointerPde, NULL, @@ -326,7 +296,7 @@ MmGetPageTableForProcess(PEPROCESS Process, PVOID Address, BOOLEAN Create) return Pt; } -BOOLEAN MmUnmapPageTable(PULONG Pt) +static BOOLEAN MmUnmapPageTable(PULONG Pt) { if (!IS_HYPERSPACE(Pt)) { @@ -371,70 +341,7 @@ MmGetPfnForProcess(PEPROCESS Process, VOID NTAPI -MmDisableVirtualMapping(PEPROCESS Process, PVOID Address, BOOLEAN* WasDirty, PPFN_NUMBER Page) -/* - * FUNCTION: Delete a virtual mapping - */ -{ - BOOLEAN WasValid; - ULONG Pte; - PULONG Pt; - - Pt = MmGetPageTableForProcess(Process, Address, FALSE); - if (Pt == NULL) - { - KeBugCheck(MEMORY_MANAGEMENT); - } - - /* - * Atomically disable the present bit and get the old value. - */ - do - { - Pte = *Pt; - } while (Pte != InterlockedCompareExchangePte(Pt, Pte & ~PA_PRESENT, Pte)); - - MiFlushTlb(Pt, Address); - - WasValid = (Pte & PA_PRESENT); - if (!WasValid) - { - KeBugCheck(MEMORY_MANAGEMENT); - } - - /* - * Return some information to the caller - */ - if (WasDirty != NULL) - { - *WasDirty = Pte & PA_DIRTY; - } - if (Page != NULL) - { - *Page = PTE_TO_PFN(Pte); - } -} - -VOID -NTAPI -MmRawDeleteVirtualMapping(PVOID Address) -{ - PULONG Pt; - - Pt = MmGetPageTableForProcess(NULL, Address, FALSE); - if (Pt && *Pt) - { - /* - * Set the entry to zero - */ - InterlockedExchangePte(Pt, 0); - MiFlushTlb(Pt, Address); - } -} - -VOID -NTAPI -MmDeleteVirtualMapping(PEPROCESS Process, PVOID Address, BOOLEAN FreePage, +MmDeleteVirtualMapping(PEPROCESS Process, PVOID Address, BOOLEAN* WasDirty, PPFN_NUMBER Page) /* * FUNCTION: Delete a virtual mapping @@ -445,8 +352,8 @@ MmDeleteVirtualMapping(PEPROCESS Process, PVOID Address, BOOLEAN FreePage, ULONG Pte; PULONG Pt; - DPRINT("MmDeleteVirtualMapping(%p, %p, %u, %p, %p)\n", - Process, Address, FreePage, WasDirty, Page); + DPRINT("MmDeleteVirtualMapping(%p, %p, %p, %p)\n", + Process, Address, WasDirty, Page); Pt = MmGetPageTableForProcess(Process, Address, FALSE); @@ -486,12 +393,6 @@ MmDeleteVirtualMapping(PEPROCESS Process, PVOID Address, BOOLEAN FreePage, } Pfn = PTE_TO_PFN(Pte); - - if (FreePage) - { - MmReleasePageMemoryConsumer(MC_SYSTEM, Pfn); - Pfn = 0; - } } else { @@ -667,35 +568,6 @@ MmSetDirtyPage(PEPROCESS Process, PVOID Address) } } -VOID -NTAPI -MmEnableVirtualMapping(PEPROCESS Process, PVOID Address) -{ - PULONG Pt; - ULONG Pte; - - Pt = MmGetPageTableForProcess(Process, Address, FALSE); - if (Pt == NULL) - { - //HACK to get DPH working, waiting for MM rewrite :-/ - //KeBugCheck(MEMORY_MANAGEMENT); - return; - } - - /* Do not mark a 0 page as present */ - if(0 == InterlockedCompareExchangePte(Pt, 0, 0)) - return; - - do - { - Pte = *Pt; - } while (Pte != InterlockedCompareExchangePte(Pt, Pte | PA_PRESENT, Pte)); - - /* We don't need to flush the TLB here because it - * won't cache translations for non-present pages */ - MmUnmapPageTable(Pt); -} - BOOLEAN NTAPI MmIsPagePresent(PEPROCESS Process, PVOID Address) @@ -872,7 +744,7 @@ MmCreateVirtualMappingUnsafe(PEPROCESS Process, /* There should not be anything valid here */ if (Pte != 0) { - DPRINT1("Bad PTE %lx\n", Pte); + DPRINT1("Bad PTE %lx at %p for %p + %lu\n", Pte, Pt, Address, i); KeBugCheck(MEMORY_MANAGEMENT); } @@ -1004,32 +876,6 @@ MmSetPageProtect(PEPROCESS Process, PVOID Address, ULONG flProtect) MmUnmapPageTable(Pt); } -/* - * @implemented - */ -PHYSICAL_ADDRESS NTAPI -MmGetPhysicalAddress(PVOID vaddr) -/* - * FUNCTION: Returns the physical address corresponding to a virtual address - */ -{ - PHYSICAL_ADDRESS p; - ULONG Pte; - - DPRINT("MmGetPhysicalAddress(vaddr %p)\n", vaddr); - Pte = MmGetPageEntryForProcess(NULL, vaddr); - if (Pte != 0 && (Pte & PA_PRESENT)) - { - p.QuadPart = PAGE_MASK(Pte); - p.u.LowPart |= (ULONG_PTR)vaddr & (PAGE_SIZE - 1); - } - else - { - p.QuadPart = 0; - } - return p; -} - VOID INIT_FUNCTION NTAPI