- Update to trunk
[reactos.git] / ntoskrnl / mm / rmap.c
index 8d6b7a6..8d6867e 100644 (file)
@@ -10,6 +10,9 @@
 /* INCLUDES *****************************************************************/
 
 #include <ntoskrnl.h>
+#ifdef NEWCC
+#include "../cache/section/newmm.h"
+#endif
 #define NDEBUG
 #include <debug.h>
 
 
 /* TYPES ********************************************************************/
 
-typedef struct _MM_RMAP_ENTRY
-{
-   struct _MM_RMAP_ENTRY* Next;
-   PEPROCESS Process;
-   PVOID Address;
-#if DBG
-   PVOID Caller;
-#endif
-}
-MM_RMAP_ENTRY, *PMM_RMAP_ENTRY;
-
 /* GLOBALS ******************************************************************/
 
-static FAST_MUTEX RmapListLock;
 static NPAGED_LOOKASIDE_LIST RmapLookasideList;
+FAST_MUTEX RmapListLock;
 
 /* FUNCTIONS ****************************************************************/
 
@@ -76,6 +68,7 @@ MmPageOutPhysicalAddress(PFN_NUMBER Page)
    Process = entry->Process;
 
    Address = entry->Address;
+
    if ((((ULONG_PTR)Address) & 0xFFF) != 0)
    {
       KeBugCheck(MEMORY_MANAGEMENT);
@@ -204,8 +197,11 @@ MmSetCleanAllRmaps(PFN_NUMBER Page)
    }
    while (current_entry != NULL)
    {
-      MmSetCleanPage(current_entry->Process, current_entry->Address);
-      current_entry = current_entry->Next;
+#ifdef NEWCC
+         if (!RMAP_IS_SEGMENT(current_entry->Address))
+#endif
+                 MmSetCleanPage(current_entry->Process, current_entry->Address);
+         current_entry = current_entry->Next;
    }
    ExReleaseFastMutex(&RmapListLock);
 }
@@ -225,7 +221,10 @@ MmSetDirtyAllRmaps(PFN_NUMBER Page)
    }
    while (current_entry != NULL)
    {
-      MmSetDirtyPage(current_entry->Process, current_entry->Address);
+#ifdef NEWCC
+         if (!RMAP_IS_SEGMENT(current_entry->Address))
+#endif
+                 MmSetDirtyPage(current_entry->Process, current_entry->Address);
       current_entry = current_entry->Next;
    }
    ExReleaseFastMutex(&RmapListLock);
@@ -246,7 +245,11 @@ MmIsDirtyPageRmap(PFN_NUMBER Page)
    }
    while (current_entry != NULL)
    {
-      if (MmIsDirtyPage(current_entry->Process, current_entry->Address))
+         if (
+#ifdef NEWCC
+             !RMAP_IS_SEGMENT(current_entry->Address) && 
+#endif
+                 MmIsDirtyPage(current_entry->Process, current_entry->Address))
       {
          ExReleaseFastMutex(&RmapListLock);
          return(TRUE);
@@ -265,8 +268,10 @@ MmInsertRmap(PFN_NUMBER Page, PEPROCESS Process,
    PMM_RMAP_ENTRY current_entry;
    PMM_RMAP_ENTRY new_entry;
    ULONG PrevSize;
-
-   Address = (PVOID)PAGE_ROUND_DOWN(Address);
+#ifdef NEWCC
+   if (!RMAP_IS_SEGMENT(Address))
+#endif
+          Address = (PVOID)PAGE_ROUND_DOWN(Address);
 
    new_entry = ExAllocateFromNPagedLookasideList(&RmapLookasideList);
    if (new_entry == NULL)
@@ -283,7 +288,11 @@ MmInsertRmap(PFN_NUMBER Page, PEPROCESS Process,
 #endif
 #endif
 
-   if (MmGetPfnForProcess(Process, Address) != Page)
+   if (
+#ifdef NEWCC
+       !RMAP_IS_SEGMENT(Address) && 
+#endif
+          MmGetPfnForProcess(Process, Address) != Page)
    {
       DPRINT1("Insert rmap (%d, 0x%.8X) 0x%.8X which doesn't match physical "
               "address 0x%.8X\n", Process->UniqueProcessId, Address,
@@ -313,17 +322,22 @@ MmInsertRmap(PFN_NUMBER Page, PEPROCESS Process,
 #endif
    MmSetRmapListHeadPage(Page, new_entry);
    ExReleaseFastMutex(&RmapListLock);
-   if (Process == NULL)
-   {
-      Process = PsInitialSystemProcess;
-   }
-   if (Process)
+#ifdef NEWCC
+   if (!RMAP_IS_SEGMENT(Address)) 
+#endif
    {
-      PrevSize = InterlockedExchangeAddUL(&Process->Vm.WorkingSetSize, PAGE_SIZE);
-      if (PrevSize >= Process->Vm.PeakWorkingSetSize)
-      {
-         Process->Vm.PeakWorkingSetSize = PrevSize + PAGE_SIZE;
-      }
+          if (Process == NULL)
+          {
+                  Process = PsInitialSystemProcess;
+          }
+          if (Process)
+          {
+                  PrevSize = InterlockedExchangeAddUL(&Process->Vm.WorkingSetSize, PAGE_SIZE);
+                  if (PrevSize >= Process->Vm.PeakWorkingSetSize)
+                  {
+                          Process->Vm.PeakWorkingSetSize = PrevSize + PAGE_SIZE;
+                  }
+          }
    }
 }
 
@@ -350,21 +364,32 @@ MmDeleteAllRmaps(PFN_NUMBER Page, PVOID Context,
    {
       previous_entry = current_entry;
       current_entry = current_entry->Next;
-      if (DeleteMapping)
-      {
-         DeleteMapping(Context, previous_entry->Process,
-                       previous_entry->Address);
-      }
-      Process = previous_entry->Process;
-      ExFreeToNPagedLookasideList(&RmapLookasideList, previous_entry);
-      if (Process == NULL)
-      {
-         Process = PsInitialSystemProcess;
-      }
-      if (Process)
-      {
-         (void)InterlockedExchangeAddUL(&Process->Vm.WorkingSetSize, -PAGE_SIZE);
-      }
+#ifdef NEWCC
+         if (!RMAP_IS_SEGMENT(current_entry->Address)) 
+#endif
+         {
+                 if (DeleteMapping)
+                 {
+                         DeleteMapping(Context, previous_entry->Process,
+                                                       previous_entry->Address);
+                 }
+                 Process = previous_entry->Process;
+                 ExFreeToNPagedLookasideList(&RmapLookasideList, previous_entry);
+                 if (Process == NULL)
+                 {
+                         Process = PsInitialSystemProcess;
+                 }
+                 if (Process)
+                 {
+                         (void)InterlockedExchangeAddUL(&Process->Vm.WorkingSetSize, -PAGE_SIZE);
+                 }
+         } 
+#ifdef NEWCC
+         else 
+         {
+                 ExFreeToNPagedLookasideList(&RmapLookasideList, previous_entry);
+         }
+#endif
    }
 }
 
@@ -394,18 +419,83 @@ MmDeleteRmap(PFN_NUMBER Page, PEPROCESS Process,
          }
          ExReleaseFastMutex(&RmapListLock);
          ExFreeToNPagedLookasideList(&RmapLookasideList, current_entry);
-         if (Process == NULL)
+#ifdef NEWCC
+                if (!RMAP_IS_SEGMENT(Address))
+#endif
+                {
+                        if (Process == NULL)
+                        {
+                                Process = PsInitialSystemProcess;
+                        }
+                        if (Process)
+                        {
+                                (void)InterlockedExchangeAddUL(&Process->Vm.WorkingSetSize, -PAGE_SIZE);
+                        }
+                }
+         return;
+      }
+      previous_entry = current_entry;
+      current_entry = current_entry->Next;
+   }
+   KeBugCheck(MEMORY_MANAGEMENT);
+}
+
+#ifdef NEWCC
+PVOID
+NTAPI
+MmGetSegmentRmap(PFN_NUMBER Page, PULONG RawOffset)
+{
+   PCACHE_SECTION_PAGE_TABLE Result = NULL;
+   PMM_RMAP_ENTRY current_entry, previous_entry;
+
+   ExAcquireFastMutex(&RmapListLock);
+   previous_entry = NULL;
+   current_entry = MmGetRmapListHeadPage(Page);
+   while (current_entry != NULL)
+   {
+         if (RMAP_IS_SEGMENT(current_entry->Address))
+      {
+                Result = (PCACHE_SECTION_PAGE_TABLE)current_entry->Process;
+                *RawOffset = (ULONG_PTR)current_entry->Address & ~RMAP_SEGMENT_MASK;
+                InterlockedIncrementUL(&Result->Segment->ReferenceCount);
+         ExReleaseFastMutex(&RmapListLock);
+                return Result;
+      }
+      previous_entry = current_entry;
+      current_entry = current_entry->Next;
+   }
+   ExReleaseFastMutex(&RmapListLock);
+   return NULL;
+}
+
+VOID
+NTAPI
+MmDeleteSectionAssociation(PFN_NUMBER Page)
+{
+   PMM_RMAP_ENTRY current_entry, previous_entry;
+
+   ExAcquireFastMutex(&RmapListLock);
+   previous_entry = NULL;
+   current_entry = MmGetRmapListHeadPage(Page);
+   while (current_entry != NULL)
+   {
+         if (RMAP_IS_SEGMENT(current_entry->Address))
+      {
+         if (previous_entry == NULL)
          {
-            Process = PsInitialSystemProcess;
+            MmSetRmapListHeadPage(Page, current_entry->Next);
          }
-         if (Process)
+         else
          {
-            (void)InterlockedExchangeAddUL(&Process->Vm.WorkingSetSize, -PAGE_SIZE);
+            previous_entry->Next = current_entry->Next;
          }
+         ExReleaseFastMutex(&RmapListLock);
+         ExFreeToNPagedLookasideList(&RmapLookasideList, current_entry);
          return;
       }
       previous_entry = current_entry;
       current_entry = current_entry->Next;
    }
-   KeBugCheck(MEMORY_MANAGEMENT);
+   ExReleaseFastMutex(&RmapListLock);
 }
+#endif