Author: arty
Date: Tue Jun 1 11:22:10 2010
New Revision: 47510
URL:
http://svn.reactos.org/svn/reactos?rev=47510&view=rev
Log:
Add invariant checks and fix a bug: Copy+Paste error misusing OldFlink
Modified:
trunk/reactos/ntoskrnl/mm/ARM3/pfnlist.c
Modified: trunk/reactos/ntoskrnl/mm/ARM3/pfnlist.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/mm/ARM3/pfnlist.c…
==============================================================================
--- trunk/reactos/ntoskrnl/mm/ARM3/pfnlist.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/mm/ARM3/pfnlist.c [iso-8859-1] Tue Jun 1 11:22:10 2010
@@ -15,6 +15,16 @@
#line 15 "ARM³::PFNLIST"
#define MODULE_INVOLVED_IN_ARM3
#include "../ARM3/miarm.h"
+
+#define ASSERT_LIST_INVARIANT(x) \
+do { \
+ ASSERT(((x)->Total == 0 && \
+ (x)->Flink == LIST_HEAD && \
+ (x)->Blink == LIST_HEAD) || \
+ ((x)->Total != 0 && \
+ (x)->Flink != LIST_HEAD && \
+ (x)->Blink != LIST_HEAD)); \
+} while (0)
/* GLOBALS ********************************************************************/
@@ -49,6 +59,9 @@
{
PFN_NUMBER OldBlink, EntryIndex = MiGetPfnEntryIndex(Entry);
+ ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);
+ ASSERT_LIST_INVARIANT(ListHead);
+
/* Get the back link */
OldBlink = ListHead->Blink;
if (OldBlink != LIST_HEAD)
@@ -69,6 +82,7 @@
/* And now the head points back to us, since we are last */
ListHead->Blink = EntryIndex;
ListHead->Total++;
+ ASSERT_LIST_INVARIANT(ListHead);
}
VOID
@@ -97,6 +111,7 @@
/* Use the zero list */
ListHead = &MmZeroedPageListHead;
+ ASSERT_LIST_INVARIANT(ListHead);
ListHead->Total++;
/* Get the back link */
@@ -136,6 +151,9 @@
/* Otherwise check if we reached the high threshold and signal the event */
KeSetEvent(MiHighMemoryEvent, 0, FALSE);
}
+
+ ASSERT_LIST_INVARIANT(ListHead);
+
#if 0
/* Get the page color */
Color = EntryIndex & MmSecondaryColorMask;
@@ -177,7 +195,7 @@
/* Make sure the PFN lock is held */
ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);
-
+
/* Make sure the PFN entry isn't in-use */
ASSERT(Entry->u3.e1.WriteInProgress == 0);
ASSERT(Entry->u3.e1.ReadInProgress == 0);
@@ -187,6 +205,7 @@
ListName = ListHead->ListName;
ASSERT(ListHead != NULL);
ASSERT(ListName <= FreePageList);
+ ASSERT_LIST_INVARIANT(ListHead);
/* Remove one count */
ASSERT(ListHead->Total != 0);
@@ -205,7 +224,7 @@
else
{
/* Set the list head's backlink instead */
- ListHead->Blink = OldFlink;
+ ListHead->Blink = OldBlink;
}
/* Check if the back entry is the list head */
@@ -222,6 +241,7 @@
/* We are not on a list anymore */
Entry->u1.Flink = Entry->u2.Blink = 0;
+ ASSERT_LIST_INVARIANT(ListHead);
/* FIXME: Deal with color list */
@@ -272,6 +292,7 @@
/* Could be either on free or zero list */
ListHead = MmPageLocationList[Pfn1->u3.e1.PageLocation];
+ ASSERT_LIST_INVARIANT(ListHead);
ListName = ListHead->ListName;
ASSERT(ListName <= FreePageList);
@@ -313,6 +334,9 @@
Pfn1->u3.e2.ShortFlags = 0;
Pfn1->u3.e1.PageColor = OldColor;
Pfn1->u3.e1.CacheAttribute = OldCache;
+
+ ASSERT_LIST_INVARIANT(ListHead);
+
#if 0 // When switching to ARM3
/* Get the first page on the color list */
ColorTable = &MmFreePagesByColor[ListName][Color];
@@ -379,12 +403,13 @@
{
#endif
/* Check the free list */
+ ASSERT_LIST_INVARIANT(&MmFreePageListHead);
PageIndex = MmFreePageListHead.Flink;
Color = PageIndex & MmSecondaryColorMask;
if (PageIndex == LIST_HEAD)
{
/* Check the zero list */
- ASSERT(MmFreePageListHead.Total == 0);
+ ASSERT_LIST_INVARIANT(&MmZeroedPageListHead);
PageIndex = MmZeroedPageListHead.Flink;
Color = PageIndex & MmSecondaryColorMask;
ASSERT(PageIndex != LIST_HEAD);
@@ -410,6 +435,9 @@
ASSERT(Pfn1->u2.ShareCount == 0);
/* Return the page */
+ ASSERT_LIST_INVARIANT(&MmFreePageListHead);
+ ASSERT_LIST_INVARIANT(&MmZeroedPageListHead);
+
return PageIndex;
}
@@ -420,6 +448,9 @@
PFN_NUMBER Entry, Flink;
PMMPFN Pfn1;
+ ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);
+ ASSERT_LIST_INVARIANT(ListHead);
+
/* Get the entry that's currently first on the list */
Entry = ListHead->Flink;
Pfn1 = MiGetPfnEntry(Entry);
@@ -444,6 +475,8 @@
Pfn1->u1.Flink = Pfn1->u2.Blink = 0;
ListHead->Total--;
+ ASSERT_LIST_INVARIANT(ListHead);
+
/* Return the head element */
return Pfn1;
}
@@ -461,6 +494,7 @@
PMMCOLOR_TABLES ColorTable;
#endif
/* Make sure the page index is valid */
+ ASSERT(KeGetCurrentIrql() >= DISPATCH_LEVEL);
ASSERT((PageFrameIndex != 0) &&
(PageFrameIndex <= MmHighestPhysicalPage) &&
(PageFrameIndex >= MmLowestPhysicalPage));
@@ -477,6 +511,7 @@
/* Get the free page list and increment its count */
ListHead = &MmFreePageListHead;
+ ASSERT_LIST_INVARIANT(ListHead);
ListHead->Total++;
/* Get the last page on the list */
@@ -521,6 +556,8 @@
/* Otherwise check if we reached the high threshold and signal the event */
KeSetEvent(MiHighMemoryEvent, 0, FALSE);
}
+
+ ASSERT_LIST_INVARIANT(ListHead);
#if 0 // When using ARM3 PFN
/* Get the page color */
@@ -641,6 +678,8 @@
}
/* Grab a page */
+ ASSERT_LIST_INVARIANT(&MmFreePageListHead);
+ ASSERT_LIST_INVARIANT(&MmZeroedPageListHead);
PageFrameIndex = MiRemoveAnyPage(0);
/* Write the software PTE */
@@ -652,6 +691,8 @@
MiInitializePfn(PageFrameIndex, PointerPte, TRUE);
/* Release the PFN lock and return the page */
+ ASSERT_LIST_INVARIANT(&MmFreePageListHead);
+ ASSERT_LIST_INVARIANT(&MmZeroedPageListHead);
KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql);
return PageFrameIndex;
}