[ros-diffs] [sir_richard] 49541: [NTOS]: Fix bugs in MiAllocateContiguousPages. Fixes an ASSERT Caemyr was seeting a lot (the cont-able ASSERT).

sir_richard at svn.reactos.org sir_richard at svn.reactos.org
Tue Nov 9 13:26:27 UTC 2010


Author: sir_richard
Date: Tue Nov  9 13:26:26 2010
New Revision: 49541

URL: http://svn.reactos.org/svn/reactos?rev=49541&view=rev
Log:
[NTOS]: Fix bugs in MiAllocateContiguousPages. Fixes an ASSERT Caemyr was seeting a lot (the cont-able ASSERT).

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

Modified: trunk/reactos/ntoskrnl/mm/ARM3/contmem.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/mm/ARM3/contmem.c?rev=49541&r1=49540&r2=49541&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/mm/ARM3/contmem.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/mm/ARM3/contmem.c [iso-8859-1] Tue Nov  9 13:26:26 2010
@@ -30,13 +30,16 @@
     ULONG i = 0;
     PMMPFN Pfn1, EndPfn;
     KIRQL OldIrql;
-    PAGED_CODE ();
+    PAGED_CODE();
     ASSERT(SizeInPages != 0);
         
     //
     // Convert the boundary PFN into an alignment mask
     //
     BoundaryMask = ~(BoundaryPfn - 1);
+
+    /* Disable APCs */
+    KeEnterGuardedRegion();
     
     //
     // Loop all the physical memory blocks
@@ -69,12 +72,17 @@
         // Now scan all the relevant PFNs in this run
         //
         Length = 0;
-        for (Pfn1 = MiGetPfnEntry(Page); Page < LastPage; Page++, Pfn1++)
+        for (Pfn1 = MI_PFN_ELEMENT(Page); Page < LastPage; Page++, Pfn1++)
         {
             //
             // If this PFN is in use, ignore it
             //
-            if (MiIsPfnInUse(Pfn1)) continue;
+            if (MiIsPfnInUse(Pfn1))
+            {
+                //DPRINT1("In use: reset\n");
+                Length = 0;
+                continue;
+            }
             
             //
             // If we haven't chosen a start PFN yet and the caller specified an
@@ -86,6 +94,7 @@
                 //
                 // It does not, so bail out
                 //
+                //DPRINT1("Doesn't match restrictions: reset\n");
                 continue;
             }
             
@@ -164,14 +173,17 @@
                         // Quick sanity check that the last PFN is consistent
                         //
                         EndPfn = Pfn1 + SizeInPages;
-                        ASSERT(EndPfn == MiGetPfnEntry(Page + 1));
+                        ASSERT(EndPfn == MI_PFN_ELEMENT(Page + 1));
                         
                         //
                         // Compute the first page, and make sure it's consistent
                         //
-                        Page -= SizeInPages - 1;
-                        ASSERT(Pfn1 == MiGetPfnEntry(Page));
+                        Page = Page - SizeInPages + 1;
+                        ASSERT(Pfn1 == MI_PFN_ELEMENT(Page));
                         ASSERT(Page != 0);
+                        
+                        /* Enable APCs and return the page */
+                        KeLeaveGuardedRegion();
                         return Page;                                
                     }
                     

Modified: trunk/reactos/ntoskrnl/mm/ARM3/miarm.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/mm/ARM3/miarm.h?rev=49541&r1=49540&r2=49541&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/mm/ARM3/miarm.h [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/mm/ARM3/miarm.h [iso-8859-1] Tue Nov  9 13:26:26 2010
@@ -851,6 +851,18 @@
     return ProtoPte;
 }
 
+//
+// Returns the PFN Database entry for the given page number
+// Warning: This is not necessarily a valid PFN database entry!
+//
+FORCEINLINE
+PMMPFN
+MI_PFN_ELEMENT(IN PFN_NUMBER Pfn)
+{
+    /* Get the entry */
+    return &MmPfnDatabase[Pfn];
+};
+
 BOOLEAN
 NTAPI
 MmArmInitSystem(




More information about the Ros-diffs mailing list