sync to trunk (44770)
[reactos.git] / reactos / ntoskrnl / mm / freelist.c
index 5e31a4c..894fb23 100644 (file)
 //
 // ReactOS to NT Physical Page Descriptor Entry Legacy Mapping Definitions
 //
-//        REACTOS                 NT
-//
-#define Consumer             PageLocation
-#define Type                 CacheAttribute
-#define Zero                 PrototypePte
-#define LockCount            u3.e1.PageColor
-#define RmapListHead         AweReferenceCount
-#define SavedSwapEntry       u4.EntireFrame
-#define Flags                u3.e1
-#define ReferenceCount       u3.ReferenceCount
-#define RemoveEntryList(x)   RemoveEntryList((PLIST_ENTRY)x)
-#define InsertTailList(x, y) InsertTailList(x, (PLIST_ENTRY)y)
-#define ListEntry            u1
-#define PHYSICAL_PAGE        MMPFN
-#define PPHYSICAL_PAGE       PMMPFN
-
-PPHYSICAL_PAGE MmPfnDatabase;
+
+typedef union
+{
+    MMPFN Pfn;
+
+    struct
+    {
+        LIST_ENTRY ListEntry; // 0x000
+        ULONG_PTR RmapListHead;   // 0x008
+        USHORT ReferenceCount; // 0x00C
+        struct // 0x00$
+        {
+            USHORT _unused1:1;
+            USHORT StartOfAllocation:1;
+            USHORT EndOfAllocation:1;
+            USHORT Zero:1; 
+            USHORT LockCount:4;
+            USHORT Consumer:3;
+            USHORT _unused2:1;
+            USHORT Type:2;
+            USHORT _unused3:1;
+            USHORT _unused4:1;
+        } Flags;
+        LONG MapCount; // 0x10
+        ULONG_PTR SavedSwapEntry; // 0x018
+    };
+} PHYSICAL_PAGE, *PPHYSICAL_PAGE;
+
+C_ASSERT(sizeof(PHYSICAL_PAGE) == sizeof(MMPFN));
+
+#define MiGetPfnEntry(Pfn) ((PPHYSICAL_PAGE)MiGetPfnEntry(Pfn))
+#define MiGetPfnEntryIndex(x) MiGetPfnEntryIndex((struct _MMPFN*)x)
+#define LockCount            Flags.LockCount
+
+PMMPFN MmPfnDatabase;
+#define MmPfnDatabase ((PPHYSICAL_PAGE)MmPfnDatabase)
+
+#define MMPFN PHYSICAL_PAGE
+#define PMMPFN PPHYSICAL_PAGE
 
 ULONG MmAvailablePages;
 ULONG MmResidentAvailablePages;
@@ -83,7 +105,7 @@ static ULONG UnzeroedPageCount = 0;
 
 /* FUNCTIONS *************************************************************/
 
-PFN_TYPE
+PFN_NUMBER
 NTAPI
 MmGetLRUFirstUserPage(VOID)
 {
@@ -99,14 +121,14 @@ MmGetLRUFirstUserPage(VOID)
       return 0;
    }
    PageDescriptor = CONTAINING_RECORD(NextListEntry, PHYSICAL_PAGE, ListEntry);
-   ASSERT_PFN(PageDescriptor);
+   ASSERT_PFN(&PageDescriptor->Pfn);
    KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql);
    return PageDescriptor - MmPfnDatabase;
 }
 
 VOID
 NTAPI
-MmInsertLRULastUserPage(PFN_TYPE Pfn)
+MmInsertLRULastUserPage(PFN_NUMBER Pfn)
 {
    KIRQL oldIrql;
    PPHYSICAL_PAGE Page;
@@ -120,9 +142,9 @@ MmInsertLRULastUserPage(PFN_TYPE Pfn)
    KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql);
 }
 
-PFN_TYPE
+PFN_NUMBER
 NTAPI
-MmGetLRUNextUserPage(PFN_TYPE PreviousPfn)
+MmGetLRUNextUserPage(PFN_NUMBER PreviousPfn)
 {
    PLIST_ENTRY NextListEntry;
    PHYSICAL_PAGE* PageDescriptor;
@@ -147,7 +169,7 @@ MmGetLRUNextUserPage(PFN_TYPE PreviousPfn)
 
 VOID
 NTAPI
-MmRemoveLRUUserPage(PFN_TYPE Page)
+MmRemoveLRUUserPage(PFN_NUMBER Page)
 {
    RemoveEntryList(&MiGetPfnEntry(Page)->ListEntry);
 }
@@ -731,12 +753,10 @@ MmInitializePageList(VOID)
          NextEntry != &KeLoaderBlock->MemoryDescriptorListHead;
          NextEntry = NextEntry->Flink)
     {
-#undef ListEntry
         /* Get the descriptor */
         Md = CONTAINING_RECORD(NextEntry,
                                MEMORY_ALLOCATION_DESCRIPTOR,
                                ListEntry);
-#define ListEntry            u1        
 
         /* Skip bad memory */
         if ((Md->MemoryType == LoaderFirmwarePermanent) ||
@@ -795,18 +815,18 @@ MmInitializePageList(VOID)
 
 VOID
 NTAPI
-MmSetRmapListHeadPage(PFN_TYPE Pfn, struct _MM_RMAP_ENTRY* ListHead)
+MmSetRmapListHeadPage(PFN_NUMBER Pfn, struct _MM_RMAP_ENTRY* ListHead)
 {
    KIRQL oldIrql;
     
    oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
-   MiGetPfnEntry(Pfn)->RmapListHead = (LONG)ListHead;
+   MiGetPfnEntry(Pfn)->RmapListHead = (LONG_PTR)ListHead;
    KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql);
 }
 
 struct _MM_RMAP_ENTRY*
 NTAPI
-MmGetRmapListHeadPage(PFN_TYPE Pfn)
+MmGetRmapListHeadPage(PFN_NUMBER Pfn)
 {
    KIRQL oldIrql;
    struct _MM_RMAP_ENTRY* ListHead;
@@ -820,7 +840,7 @@ MmGetRmapListHeadPage(PFN_TYPE Pfn)
 
 VOID
 NTAPI
-MmSetSavedSwapEntryPage(PFN_TYPE Pfn,  SWAPENTRY SwapEntry)
+MmSetSavedSwapEntryPage(PFN_NUMBER Pfn,  SWAPENTRY SwapEntry)
 {
    KIRQL oldIrql;
 
@@ -831,7 +851,7 @@ MmSetSavedSwapEntryPage(PFN_TYPE Pfn,  SWAPENTRY SwapEntry)
 
 SWAPENTRY
 NTAPI
-MmGetSavedSwapEntryPage(PFN_TYPE Pfn)
+MmGetSavedSwapEntryPage(PFN_NUMBER Pfn)
 {
    SWAPENTRY SwapEntry;
    KIRQL oldIrql;
@@ -845,7 +865,7 @@ MmGetSavedSwapEntryPage(PFN_TYPE Pfn)
 
 VOID
 NTAPI
-MmReferencePage(PFN_TYPE Pfn)
+MmReferencePage(PFN_NUMBER Pfn)
 {
    PPHYSICAL_PAGE Page;
 
@@ -869,7 +889,7 @@ MmReferencePage(PFN_TYPE Pfn)
 
 ULONG
 NTAPI
-MmGetReferenceCountPage(PFN_TYPE Pfn)
+MmGetReferenceCountPage(PFN_NUMBER Pfn)
 {
    KIRQL oldIrql;
    ULONG RCount;
@@ -894,7 +914,7 @@ MmGetReferenceCountPage(PFN_TYPE Pfn)
 
 BOOLEAN
 NTAPI
-MmIsPageInUse(PFN_TYPE Pfn)
+MmIsPageInUse(PFN_NUMBER Pfn)
 {
 
    DPRINT("MmIsPageInUse(PhysicalAddress %x)\n", Pfn << PAGE_SHIFT);
@@ -904,7 +924,7 @@ MmIsPageInUse(PFN_TYPE Pfn)
 
 VOID
 NTAPI
-MmDereferencePage(PFN_TYPE Pfn)
+MmDereferencePage(PFN_NUMBER Pfn)
 {
    PPHYSICAL_PAGE Page;
 
@@ -929,7 +949,7 @@ MmDereferencePage(PFN_TYPE Pfn)
    {
       MmAvailablePages++;
       if (Page->Flags.Consumer == MC_USER) RemoveEntryList(&Page->ListEntry);
-      if (Page->RmapListHead != (LONG)NULL)
+      if (Page->RmapListHead != (LONG_PTR)NULL)
       {
          DPRINT1("Freeing page with rmap entries.\n");
          KeBugCheck(MEMORY_MANAGEMENT);
@@ -964,7 +984,7 @@ MmDereferencePage(PFN_TYPE Pfn)
 
 ULONG
 NTAPI
-MmGetLockCountPage(PFN_TYPE Pfn)
+MmGetLockCountPage(PFN_NUMBER Pfn)
 {
    KIRQL oldIrql;
    ULONG CurrentLockCount;
@@ -990,7 +1010,7 @@ MmGetLockCountPage(PFN_TYPE Pfn)
 
 VOID
 NTAPI
-MmLockPage(PFN_TYPE Pfn)
+MmLockPage(PFN_NUMBER Pfn)
 {
    PPHYSICAL_PAGE Page;
 
@@ -1009,7 +1029,7 @@ MmLockPage(PFN_TYPE Pfn)
 
 VOID
 NTAPI
-MmUnlockPage(PFN_TYPE Pfn)
+MmUnlockPage(PFN_NUMBER Pfn)
 {
    PPHYSICAL_PAGE Page;
 
@@ -1026,11 +1046,11 @@ MmUnlockPage(PFN_TYPE Pfn)
    Page->LockCount--;
 }
 
-PFN_TYPE
+PFN_NUMBER
 NTAPI
 MmAllocPage(ULONG Consumer, SWAPENTRY SwapEntry)
 {
-   PFN_TYPE PfnOffset;
+   PFN_NUMBER PfnOffset;
    PLIST_ENTRY ListEntry;
    PPHYSICAL_PAGE PageDescriptor;
    BOOLEAN NeedClear = FALSE;
@@ -1092,7 +1112,7 @@ MmAllocPage(ULONG Consumer, SWAPENTRY SwapEntry)
 
 NTSTATUS
 NTAPI
-MiZeroPage(PFN_TYPE Page)
+MiZeroPage(PFN_NUMBER Page)
 {
     KIRQL Irql;
     PVOID TempAddress;
@@ -1117,7 +1137,7 @@ MmZeroPageThreadMain(PVOID Ignored)
    KIRQL oldIrql;
    PLIST_ENTRY ListEntry;
    PPHYSICAL_PAGE PageDescriptor;
-   PFN_TYPE Pfn;
+   PFN_NUMBER Pfn;
    ULONG Count;
 
    /* Free initial kernel memory */