Author: fireball Date: Sun Mar 9 15:30:28 2008 New Revision: 32629
URL: http://svn.reactos.org/svn/reactos?rev=3D32629&view=3Drev Log: - Move some PTE/PDE macros from i386/page.c into arch-specific mm.h. Also c= hange some macros operation from integer division to bit shifting. - Remove unused/#if0-ed stuff from mm.h.
Modified: trunk/reactos/ntoskrnl/include/internal/i386/mm.h trunk/reactos/ntoskrnl/mm/i386/page.c
Modified: trunk/reactos/ntoskrnl/include/internal/i386/mm.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/include/inte= rnal/i386/mm.h?rev=3D32629&r1=3D32628&r2=3D32629&view=3Ddiff =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- trunk/reactos/ntoskrnl/include/internal/i386/mm.h (original) +++ trunk/reactos/ntoskrnl/include/internal/i386/mm.h Sun Mar 9 15:30:28 2= 008 @@ -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 */
Modified: trunk/reactos/ntoskrnl/mm/i386/page.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/mm/i386/page= .c?rev=3D32629&r1=3D32628&r2=3D32629&view=3Ddiff =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- trunk/reactos/ntoskrnl/mm/i386/page.c (original) +++ trunk/reactos/ntoskrnl/mm/i386/page.c Sun Mar 9 15:30:28 2008 @@ -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) >=3D HYPERSPACE && (ULONG)(v) < HYPE= RSPACE + 0x400000)) =
@@ -141,17 +138,6 @@ } 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))&(~0= x3))) - -#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 @@ -294,8 +280,9 @@ KeAttachProcess(&Process->Pcb); } =
- *(ADDR_TO_PDE(Address)) =3D 0; - MiFlushTlb(ADDR_TO_PDE(Address), ADDR_TO_PTE(Address)); + MiAddressToPde(Address)->u.Long =3D 0; + MiFlushTlb((PULONG)MiAddressToPde(Address), + MiAddressToPte(Address)); =
if (Address >=3D MmSystemRangeStart) { @@ -323,7 +310,7 @@ KeAttachProcess(&Process->Pcb); } =
- PageTable =3D (PULONG)PAGE_ROUND_DOWN((PVOID)ADDR_TO_PTE(Address)); + PageTable =3D (PULONG)PAGE_ROUND_DOWN((PVOID)MiAddressToPte(Address)= ); for (i =3D 0; i < 1024; i++) { if (PageTable[i] !=3D 0) @@ -333,9 +320,9 @@ KEBUGCHECK(0); } } - Pfn =3D PTE_TO_PFN(*(ADDR_TO_PDE(Address))); - *(ADDR_TO_PDE(Address)) =3D 0; - MiFlushTlb(ADDR_TO_PDE(Address), ADDR_TO_PTE(Address)); + Pfn =3D MiAddressToPde(Address)->u.Hard.PageFrameNumber; + MiAddressToPde(Address)->u.Long =3D 0; + MiFlushTlb((PULONG)MiAddressToPde(Address), MiAddressToPte(Address)); =
if (Address >=3D MmSystemRangeStart) { @@ -399,7 +386,7 @@ } return Pt + ADDR_TO_PTE_OFFSET(Address); } - PageDir =3D ADDR_TO_PDE(Address); + PageDir =3D (PULONG)MiAddressToPde(Address); if (0 =3D=3D InterlockedCompareExchangeUL(PageDir, 0, 0)) { if (Address >=3D MmSystemRangeStart) @@ -445,7 +432,7 @@ } } } - return (PULONG)ADDR_TO_PTE(Address); + return (PULONG)MiAddressToPte(Address); } =
BOOLEAN MmUnmapPageTable(PULONG Pt) @@ -693,7 +680,7 @@ Mmi386MakeKernelPageTableGlobal(PVOID PAddress) { PULONG Pt, Pde; - Pde =3D ADDR_TO_PDE(PAddress); + Pde =3D (PULONG)MiAddressToPde(PAddress); if (*Pde =3D=3D 0) { Pt =3D MmGetPageTableForProcess(NULL, PAddress, FALSE); @@ -1274,7 +1261,7 @@ ULONG Entry; PULONG Pte; Entry =3D PFN_TO_PTE(Page) | PA_PRESENT | PA_READWRITE; - Pte =3D ADDR_TO_PTE(HYPERSPACE) + Page % 1024; + Pte =3D (PULONG)MiAddressToPte(HYPERSPACE) + Page % 1024; if (Page & 1024) { for (i =3D Page % 1024; i < 1024; i++, Pte++) @@ -1286,7 +1273,7 @@ } if (i >=3D 1024) { - Pte =3D ADDR_TO_PTE(HYPERSPACE); + Pte =3D (PULONG)MiAddressToPte(HYPERSPACE); for (i =3D 0; i < Page % 1024; i++, Pte++) { if (0 =3D=3D InterlockedCompareExchange((PLONG)Pte, (LONG)E= ntry, 0)) @@ -1311,7 +1298,7 @@ } if ((LONG)i < 0) { - Pte =3D ADDR_TO_PTE(HYPERSPACE) + 1023; + Pte =3D (PULONG)MiAddressToPte(HYPERSPACE) + 1023; for (i =3D 1023; i > Page % 1024; i--, Pte--) { if (0 =3D=3D InterlockedCompareExchange((PLONG)Pte, (LONG)E= ntry, 0)) @@ -1339,7 +1326,7 @@ =
ASSERT (IS_HYPERSPACE(Address)); =
- Entry =3D InterlockedExchange((PLONG)ADDR_TO_PTE(Address), PFN_TO_PT= E(NewPage) | PA_PRESENT | PA_READWRITE); + Entry =3D InterlockedExchange((PLONG)MiAddressToPte(Address), PFN_TO= _PTE(NewPage) | PA_PRESENT | PA_READWRITE); Pfn =3D PTE_TO_PFN(Entry); =
__invlpg(Address); @@ -1355,7 +1342,7 @@ =
ASSERT (IS_HYPERSPACE(Address)); =
- Entry =3D InterlockedExchange((PLONG)ADDR_TO_PTE(Address), 0); + Entry =3D InterlockedExchange((PLONG)MiAddressToPte(Address), 0); Pfn =3D PTE_TO_PFN(Entry); =
__invlpg(Address);