mirror of
https://github.com/reactos/reactos.git
synced 2025-07-24 13:13:40 +00:00
- Move some PTE/PDE macros from i386/page.c into arch-specific mm.h. Also change some macros operation from integer division to bit shifting.
- Remove unused/#if0-ed stuff from mm.h. svn path=/trunk/; revision=32629
This commit is contained in:
parent
746ac9c644
commit
a5ffbcd185
2 changed files with 32 additions and 47 deletions
|
@ -5,29 +5,27 @@
|
|||
#ifndef __NTOSKRNL_INCLUDE_INTERNAL_I386_MM_H
|
||||
#define __NTOSKRNL_INCLUDE_INTERNAL_I386_MM_H
|
||||
|
||||
#if 0
|
||||
/*
|
||||
* Page access attributes (or these together)
|
||||
*/
|
||||
#define PA_READ (1<<0)
|
||||
#define PA_WRITE ((1<<0)+(1<<1))
|
||||
#define PA_EXECUTE PA_READ
|
||||
#define PA_PCD (1<<4)
|
||||
#define PA_PWT (1<<3)
|
||||
|
||||
/*
|
||||
* Page attributes
|
||||
*/
|
||||
#define PA_USER (1<<2)
|
||||
#define PA_SYSTEM (0)
|
||||
#endif
|
||||
|
||||
struct _EPROCESS;
|
||||
PULONG MmGetPageDirectory(VOID);
|
||||
|
||||
|
||||
|
||||
#define PAGE_MASK(x) ((x)&(~0xfff))
|
||||
#define PAE_PAGE_MASK(x) ((x)&(~0xfffLL))
|
||||
|
||||
/* Base addresses of PTE and PDE */
|
||||
#define PAGETABLE_MAP (0xc0000000)
|
||||
#define PAGEDIRECTORY_MAP (0xc0000000 + (PAGETABLE_MAP / (1024)))
|
||||
|
||||
/* Converting address to a corresponding PDE or PTE entry */
|
||||
#define MiAddressToPde(x) \
|
||||
((PMMPTE)(((((ULONG)(x)) >> 22) << 2) + PAGEDIRECTORY_MAP))
|
||||
#define MiAddressToPte(x) \
|
||||
((PMMPTE)(((((ULONG)(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)
|
||||
|
||||
/* Easy accessing PFN in PTE */
|
||||
#define PFN_FROM_PTE(v) ((v)->u.Hard.PageFrameNumber)
|
||||
|
||||
#endif /* __NTOSKRNL_INCLUDE_INTERNAL_I386_MM_H */
|
||||
|
|
|
@ -39,9 +39,6 @@
|
|||
#define PA_ACCESSED (1 << PA_BIT_ACCESSED)
|
||||
#define PA_GLOBAL (1 << PA_BIT_GLOBAL)
|
||||
|
||||
#define PAGETABLE_MAP (0xc0000000)
|
||||
#define PAGEDIRECTORY_MAP (0xc0000000 + (PAGETABLE_MAP / (1024)))
|
||||
|
||||
#define HYPERSPACE (0xc0400000)
|
||||
#define IS_HYPERSPACE(v) (((ULONG)(v) >= HYPERSPACE && (ULONG)(v) < HYPERSPACE + 0x400000))
|
||||
|
||||
|
@ -142,17 +139,6 @@ ProtectToPTE(ULONG flProtect)
|
|||
return(Attributes);
|
||||
}
|
||||
|
||||
#define ADDR_TO_PAGE_TABLE(v) (((ULONG)(v)) / (1024 * PAGE_SIZE))
|
||||
|
||||
#define ADDR_TO_PDE(v) (PULONG)(PAGEDIRECTORY_MAP + \
|
||||
((((ULONG)(v)) / (1024 * 1024))&(~0x3)))
|
||||
#define ADDR_TO_PTE(v) (PULONG)(PAGETABLE_MAP + ((((ULONG)(v) / 1024))&(~0x3)))
|
||||
|
||||
#define ADDR_TO_PDE_OFFSET(v) ((((ULONG)(v)) / (1024 * PAGE_SIZE)))
|
||||
|
||||
#define ADDR_TO_PTE_OFFSET(v) ((((ULONG)(v)) % (1024 * PAGE_SIZE)) / PAGE_SIZE)
|
||||
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
Mmi386ReleaseMmInfo(PEPROCESS Process)
|
||||
|
@ -294,8 +280,9 @@ MmDeletePageTable(PEPROCESS Process, PVOID Address)
|
|||
KeAttachProcess(&Process->Pcb);
|
||||
}
|
||||
|
||||
*(ADDR_TO_PDE(Address)) = 0;
|
||||
MiFlushTlb(ADDR_TO_PDE(Address), ADDR_TO_PTE(Address));
|
||||
MiAddressToPde(Address)->u.Long = 0;
|
||||
MiFlushTlb((PULONG)MiAddressToPde(Address),
|
||||
MiAddressToPte(Address));
|
||||
|
||||
if (Address >= MmSystemRangeStart)
|
||||
{
|
||||
|
@ -323,7 +310,7 @@ MmFreePageTable(PEPROCESS Process, PVOID Address)
|
|||
KeAttachProcess(&Process->Pcb);
|
||||
}
|
||||
|
||||
PageTable = (PULONG)PAGE_ROUND_DOWN((PVOID)ADDR_TO_PTE(Address));
|
||||
PageTable = (PULONG)PAGE_ROUND_DOWN((PVOID)MiAddressToPte(Address));
|
||||
for (i = 0; i < 1024; i++)
|
||||
{
|
||||
if (PageTable[i] != 0)
|
||||
|
@ -333,9 +320,9 @@ MmFreePageTable(PEPROCESS Process, PVOID Address)
|
|||
KEBUGCHECK(0);
|
||||
}
|
||||
}
|
||||
Pfn = PTE_TO_PFN(*(ADDR_TO_PDE(Address)));
|
||||
*(ADDR_TO_PDE(Address)) = 0;
|
||||
MiFlushTlb(ADDR_TO_PDE(Address), ADDR_TO_PTE(Address));
|
||||
Pfn = MiAddressToPde(Address)->u.Hard.PageFrameNumber;
|
||||
MiAddressToPde(Address)->u.Long = 0;
|
||||
MiFlushTlb((PULONG)MiAddressToPde(Address), MiAddressToPte(Address));
|
||||
|
||||
if (Address >= MmSystemRangeStart)
|
||||
{
|
||||
|
@ -399,7 +386,7 @@ MmGetPageTableForProcess(PEPROCESS Process, PVOID Address, BOOLEAN Create)
|
|||
}
|
||||
return Pt + ADDR_TO_PTE_OFFSET(Address);
|
||||
}
|
||||
PageDir = ADDR_TO_PDE(Address);
|
||||
PageDir = (PULONG)MiAddressToPde(Address);
|
||||
if (0 == InterlockedCompareExchangeUL(PageDir, 0, 0))
|
||||
{
|
||||
if (Address >= MmSystemRangeStart)
|
||||
|
@ -445,7 +432,7 @@ MmGetPageTableForProcess(PEPROCESS Process, PVOID Address, BOOLEAN Create)
|
|||
}
|
||||
}
|
||||
}
|
||||
return (PULONG)ADDR_TO_PTE(Address);
|
||||
return (PULONG)MiAddressToPte(Address);
|
||||
}
|
||||
|
||||
BOOLEAN MmUnmapPageTable(PULONG Pt)
|
||||
|
@ -693,7 +680,7 @@ BOOLEAN
|
|||
Mmi386MakeKernelPageTableGlobal(PVOID PAddress)
|
||||
{
|
||||
PULONG Pt, Pde;
|
||||
Pde = ADDR_TO_PDE(PAddress);
|
||||
Pde = (PULONG)MiAddressToPde(PAddress);
|
||||
if (*Pde == 0)
|
||||
{
|
||||
Pt = MmGetPageTableForProcess(NULL, PAddress, FALSE);
|
||||
|
@ -1274,7 +1261,7 @@ MmCreateHyperspaceMapping(PFN_TYPE Page)
|
|||
ULONG Entry;
|
||||
PULONG Pte;
|
||||
Entry = PFN_TO_PTE(Page) | PA_PRESENT | PA_READWRITE;
|
||||
Pte = ADDR_TO_PTE(HYPERSPACE) + Page % 1024;
|
||||
Pte = (PULONG)MiAddressToPte(HYPERSPACE) + Page % 1024;
|
||||
if (Page & 1024)
|
||||
{
|
||||
for (i = Page % 1024; i < 1024; i++, Pte++)
|
||||
|
@ -1286,7 +1273,7 @@ MmCreateHyperspaceMapping(PFN_TYPE Page)
|
|||
}
|
||||
if (i >= 1024)
|
||||
{
|
||||
Pte = ADDR_TO_PTE(HYPERSPACE);
|
||||
Pte = (PULONG)MiAddressToPte(HYPERSPACE);
|
||||
for (i = 0; i < Page % 1024; i++, Pte++)
|
||||
{
|
||||
if (0 == InterlockedCompareExchange((PLONG)Pte, (LONG)Entry, 0))
|
||||
|
@ -1311,7 +1298,7 @@ MmCreateHyperspaceMapping(PFN_TYPE Page)
|
|||
}
|
||||
if ((LONG)i < 0)
|
||||
{
|
||||
Pte = ADDR_TO_PTE(HYPERSPACE) + 1023;
|
||||
Pte = (PULONG)MiAddressToPte(HYPERSPACE) + 1023;
|
||||
for (i = 1023; i > Page % 1024; i--, Pte--)
|
||||
{
|
||||
if (0 == InterlockedCompareExchange((PLONG)Pte, (LONG)Entry, 0))
|
||||
|
@ -1339,7 +1326,7 @@ MmChangeHyperspaceMapping(PVOID Address, PFN_TYPE NewPage)
|
|||
|
||||
ASSERT (IS_HYPERSPACE(Address));
|
||||
|
||||
Entry = InterlockedExchange((PLONG)ADDR_TO_PTE(Address), PFN_TO_PTE(NewPage) | PA_PRESENT | PA_READWRITE);
|
||||
Entry = InterlockedExchange((PLONG)MiAddressToPte(Address), PFN_TO_PTE(NewPage) | PA_PRESENT | PA_READWRITE);
|
||||
Pfn = PTE_TO_PFN(Entry);
|
||||
|
||||
__invlpg(Address);
|
||||
|
@ -1355,7 +1342,7 @@ MmDeleteHyperspaceMapping(PVOID Address)
|
|||
|
||||
ASSERT (IS_HYPERSPACE(Address));
|
||||
|
||||
Entry = InterlockedExchange((PLONG)ADDR_TO_PTE(Address), 0);
|
||||
Entry = InterlockedExchange((PLONG)MiAddressToPte(Address), 0);
|
||||
Pfn = PTE_TO_PFN(Entry);
|
||||
|
||||
__invlpg(Address);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue