kerneltest/e32test/mmu/t_shadow.cpp
changeset 291 206a6eaaeb71
parent 245 647ab20fee2e
child 293 0659d0e1a03c
--- a/kerneltest/e32test/mmu/t_shadow.cpp	Wed Oct 13 13:34:03 2010 +0100
+++ b/kerneltest/e32test/mmu/t_shadow.cpp	Mon Oct 18 15:31:10 2010 +0100
@@ -78,7 +78,11 @@
 TUint8* PageBuffer2 = NULL;
 TUint8* PageBuffer3 = NULL;
 
-void TestShadowPage(TLinAddr aPageAddr, TPaged aPageType)
+// A buffer used to test shadowing of paged ROM.  It is two pages in size so that it will always
+// contain at least one memory page.
+const TUint8 RomToShadow[8192] = { 1 };
+
+void TestShadowPage(TLinAddr aPageAddr, TPaged aPageType, TBool aCanModify)
 	{
 	test.Start(_L("Test shadowing a page"));	
 	test.Printf(_L("  addr == 0x%08x, type == %d\n"), aPageAddr, aPageType);
@@ -130,16 +134,19 @@
 	test.Next(_L("Check page following shadow page is unaltered"));
 	test_Equal(0, Mem::Compare((TUint8*)(secondPage),PageSize,PageBuffer3,PageSize));
 
-	test.Next(_L("Write data into shadow page"));
-	for(TInt i=0; i<PageSize; i++)
+	if (aCanModify)
 		{
-		TInt i2=i*i;
-		PageBuffer2[i]=TUint8(i2^(i2>>8)^(i2>>16));
+		test.Next(_L("Write data into shadow page"));
+		for(TInt i=0; i<PageSize; i++)
+			{
+			TInt i2=i*i;
+			PageBuffer2[i]=TUint8(i2^(i2>>8)^(i2>>16));
+			}
+		test_KErrNone(Shadow.Write(aPageAddr,PageBuffer2));
+
+		test.Next(_L("Check data written into shadow page"));
+		test_Equal(0, Mem::Compare((TUint8*)aPageAddr,PageSize,PageBuffer2,PageSize));
 		}
-	test_KErrNone(Shadow.Write(aPageAddr,PageBuffer2));
-
-	test.Next(_L("Check data written into shadow page"));
-	test_Equal(0, Mem::Compare((TUint8*)aPageAddr,PageSize,PageBuffer2,PageSize));
 	
 	test.Next(_L("Check page following shadow page is unaltered"));
 	test_Equal(0, Mem::Compare((TUint8*)(secondPage),PageSize,PageBuffer3,PageSize));
@@ -460,6 +467,18 @@
 	User::Free(PageBuffer3);
 	}
 
+static TLinAddr PageToShadow(TBool aPaged)
+	{
+	if (aPaged)
+		{
+		test(RomPagingSupported);
+		test(sizeof(RomToShadow) >= ((TUint)(2 * PageSize)));
+		return _ALIGN_UP((TLinAddr)RomToShadow, PageSize);
+		}
+	else
+		return Shadow.GetUnpagedPage();
+	}
+
 GLDEF_C TInt E32Main()
 //
 // Test ROM shadowing
@@ -484,22 +503,28 @@
 	test.Start(_L("Testing ROM shadowing"));
 	Initialise();
 
-	TestRomIsSectionMapped(); 
+	TestRomIsSectionMapped();
 
-	TestShadowPage(RomUnpagedStart, EUnpaged);
-	TestShadowPage(RomUnpagedStart + PageSize, EUnpaged);
-	TestShadowPage(RomUnpagedEnd - PageSize, EUnpaged);
-	TestNoFreeRAM(RomUnpagedStart);
-	TestShadowPageOOM(RomUnpagedStart);
+	TLinAddr unpagedPage = PageToShadow(EFalse);
+	
+	TestShadowPage(unpagedPage,              EUnpaged, ETrue);
+	TestShadowPage(RomUnpagedStart,          EUnpaged, EFalse);
+	TestShadowPage(RomUnpagedEnd - PageSize, EUnpaged, EFalse);
+	
+	TestNoFreeRAM(unpagedPage);
+	TestShadowPageOOM(unpagedPage);
 	
 	if (RomPagingSupported)
 		{
-		TestShadowPage(RomPagedStart, EPaged);
-		TestShadowPage(RomPagedStart + PageSize, EPaged);
-		TestShadowPage(RomPagedEnd - PageSize, EPaged);
-		TestNoFreeRAM(RomPagedEnd - PageSize);
-		TestShadowPageOOM(RomPagedStart);
-		TestInteractionWithPinning(RomPagedStart);
+		TLinAddr pagedPage = PageToShadow(ETrue);
+	
+		TestShadowPage(pagedPage,              EPaged, ETrue);
+		TestShadowPage(RomPagedStart,          EPaged, EFalse);
+		TestShadowPage(RomPagedEnd - PageSize, EPaged, EFalse);
+		
+		TestNoFreeRAM(pagedPage);
+		TestShadowPageOOM(pagedPage);
+		TestInteractionWithPinning(pagedPage);
 		}
 
 	// todo: add test when reforming section mappings is implemented