[ros-diffs] [sir_richard] 45558: [NTOS]: Allocate and initialize color tables based on MmSecondaryColors (MiInitializeColorTables). [NTOS]: These come after the PFN database, so modify the MmPfnAllocation to account for them.

sir_richard at svn.reactos.org sir_richard at svn.reactos.org
Wed Feb 10 19:44:30 CET 2010


Author: sir_richard
Date: Wed Feb 10 19:44:30 2010
New Revision: 45558

URL: http://svn.reactos.org/svn/reactos?rev=45558&view=rev
Log:
[NTOS]: Allocate and initialize color tables based on MmSecondaryColors (MiInitializeColorTables).
[NTOS]: These come after the PFN database, so modify the MmPfnAllocation to account for them.

Modified:
    trunk/reactos/ntoskrnl/mm/ARM3/i386/init.c
    trunk/reactos/ntoskrnl/mm/ARM3/miarm.h

Modified: trunk/reactos/ntoskrnl/mm/ARM3/i386/init.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/mm/ARM3/i386/init.c?rev=45558&r1=45557&r2=45558&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/mm/ARM3/i386/init.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/mm/ARM3/i386/init.c [iso-8859-1] Wed Feb 10 19:44:30 2010
@@ -33,6 +33,19 @@
 MMPTE ValidKernelPde = {.u.Hard.Valid = 1, .u.Hard.Write = 1, .u.Hard.Dirty = 1, .u.Hard.Accessed = 1};
 MMPTE ValidKernelPte = {.u.Hard.Valid = 1, .u.Hard.Write = 1, .u.Hard.Dirty = 1, .u.Hard.Accessed = 1};
 
+/*
+ * For each page's worth bytes of L2 cache in a given set/way line, the zero and
+ * free lists are organized in what is called a "color".
+ *
+ * This array points to the two lists, so it can be thought of as a multi-dimensional
+ * array of MmFreePagesByColor[2][MmSecondaryColors]. Since the number is dynamic,
+ * we describe the array in pointer form instead.
+ *
+ * On a final note, the color tables themselves are right after the PFN database.
+ */
+C_ASSERT(FreePageList == 1);
+PMMCOLOR_TABLES MmFreePagesByColor[FreePageList + 1];
+
 /* Make the code cleaner with some definitions for size multiples */
 #define _1KB (1024)
 #define _1MB (1000 * _1KB)
@@ -209,6 +222,56 @@
     /* Compute the mask and store it */
     MmSecondaryColorMask = MmSecondaryColors - 1;
     KeGetCurrentPrcb()->SecondaryColorMask = MmSecondaryColorMask;    
+}
+
+VOID
+NTAPI
+MiInitializeColorTables(VOID)
+{
+    ULONG i;
+    PMMPTE PointerPte, LastPte;
+    MMPTE TempPte = ValidKernelPte;
+    
+    /* The color table starts after the PFN database */
+    MmFreePagesByColor[0] = (PMMCOLOR_TABLES)&MmPfnDatabase[MmHighestPhysicalPage + 1];
+    
+    /* Loop the PTEs. We have two color tables for each secondary color */
+    PointerPte = MiAddressToPte(&MmFreePagesByColor[0][0]);
+    LastPte = MiAddressToPte((ULONG_PTR)MmFreePagesByColor[0] +
+                             (2 * MmSecondaryColors * sizeof(MMCOLOR_TABLES))
+                             - 1);
+    while (PointerPte <= LastPte)
+    {
+        /* Check for valid PTE */
+        if (PointerPte->u.Hard.Valid == 0)
+        {
+            /* Get a page and map it */
+            TempPte.u.Hard.PageFrameNumber = MxGetNextPage(1);
+            ASSERT(TempPte.u.Hard.Valid == 1);
+            *PointerPte = TempPte;
+            
+            /* Zero out the page */
+            RtlZeroMemory(MiPteToAddress(PointerPte), PAGE_SIZE);
+        }
+        
+        /* Next */
+        PointerPte++;
+    }
+    
+    /* Now set the address of the next list, right after this one */
+    MmFreePagesByColor[1] = &MmFreePagesByColor[0][MmSecondaryColors];
+    
+    /* Now loop the lists to set them up */
+    for (i = 0; i < MmSecondaryColors; i++)
+    {
+        /* Set both free and zero lists for each color */
+        MmFreePagesByColor[ZeroedPageList][i].Flink = 0xFFFFFFFF;
+        MmFreePagesByColor[ZeroedPageList][i].Blink = (PVOID)0xFFFFFFFF;
+        MmFreePagesByColor[ZeroedPageList][i].Count = 0;
+        MmFreePagesByColor[FreePageList][i].Flink = 0xFFFFFFFF;
+        MmFreePagesByColor[FreePageList][i].Blink = (PVOID)0xFFFFFFFF;
+        MmFreePagesByColor[FreePageList][i].Count = 0;
+    }
 }
 
 NTSTATUS
@@ -373,10 +436,11 @@
     MiComputeColorInformation();
     
     //
-    // Calculate the number of bytes for the PFN database
+    // Calculate the number of bytes for the PFN database, and the color tables,
     // and then convert to pages
     //
     MxPfnAllocation = (MmHighestPhysicalPage + 1) * sizeof(MMPFN);
+    MxPfnAllocation += (MmSecondaryColors * sizeof(MMCOLOR_TABLES) * 2);
     MxPfnAllocation >>= PAGE_SHIFT;
     
     //
@@ -688,6 +752,9 @@
     //
     MxFreeDescriptor->BasePage = FreePage;
     MxFreeDescriptor->PageCount = FreePageCount;
+    
+    /* Initialize the color tables */
+    MiInitializeColorTables();
 
     /* Call back into shitMM to setup the PFN database */
     MmInitializePageList();

Modified: trunk/reactos/ntoskrnl/mm/ARM3/miarm.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/mm/ARM3/miarm.h?rev=45558&r1=45557&r2=45558&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/mm/ARM3/miarm.h [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/mm/ARM3/miarm.h [iso-8859-1] Wed Feb 10 19:44:30 2010
@@ -129,6 +129,13 @@
     ULONG NumberOfPages;
     PHYSICAL_MEMORY_RUN Run[1];
 } PHYSICAL_MEMORY_DESCRIPTOR, *PPHYSICAL_MEMORY_DESCRIPTOR;
+
+typedef struct _MMCOLOR_TABLES
+{
+    PFN_NUMBER Flink;
+    PVOID Blink;
+    PFN_NUMBER Count;
+} MMCOLOR_TABLES, *PMMCOLOR_TABLES;
 
 extern MMPTE HyperTemplatePte;
 extern MMPTE ValidKernelPde;




More information about the Ros-diffs mailing list