os/kernelhwsrv/kerneltest/e32test/mmu/t_chunk2.cpp
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
     1 // Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
     2 // All rights reserved.
     3 // This component and the accompanying materials are made available
     4 // under the terms of the License "Eclipse Public License v1.0"
     5 // which accompanies this distribution, and is available
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
     7 //
     8 // Initial Contributors:
     9 // Nokia Corporation - initial contribution.
    10 //
    11 // Contributors:
    12 //
    13 // Description:
    14 // e32test\mmu\t_chunk2.cpp
    15 // Overview:
    16 // Test RChunk class
    17 // API Information:
    18 // RChunk
    19 // Details:
    20 // - Test creating local chunks and moving chunks home address, verify
    21 // results are as expected.
    22 // - Create numerous local chunks, test allocating more space by 
    23 // adjusting chunk size, check for allocation failure, verify results 
    24 // are as expected.
    25 // Platforms/Drives/Compatibility:
    26 // All.
    27 // Assumptions/Requirement/Pre-requisites:
    28 // Failures and causes:
    29 // Base Port information:
    30 // 
    31 //
    32 
    33 #define __E32TEST_EXTENSION__
    34 #include <e32test.h>
    35 #include <e32hal.h>
    36 #include <e32panic.h>
    37 #include "mmudetect.h"
    38 #include "d_gobble.h"
    39 #include "freeram.h"
    40 
    41 TInt GlobalValue=299792458;
    42 TInt *GlobalPtr=&GlobalValue;
    43 
    44 LOCAL_D RTest test(_L("T_CHUNK2"));
    45 LOCAL_D RTest t(_L("ShareThread"));
    46 LOCAL_D RChunk gChunk;
    47 
    48 LOCAL_D TPtr nullPtr(NULL,0);
    49 
    50 LOCAL_C void TestAllocFailure(RChunk& c1, RChunk& c2)
    51 	{
    52 	TInt free=FreeRam();
    53 	test.Printf(_L("Free RAM %dK\n"),free/1024);
    54 	TInt size1=free-0x80000;	// 512K less than available
    55 	TInt size2=0xFF000;			// 255 pages
    56 	test.Printf(_L("Adjusting chunk 1 to size %dK\n"),size1/1024);
    57 	TInt r=c1.Adjust(size1);
    58 	test(r==KErrNone);
    59 	test.Printf(_L("Attempting to adjust chunk 2 to size %dK\n"),size2/1024);
    60 	r=c2.Adjust(size2);
    61 	test(r==KErrNoMemory);
    62 	TInt size3=FreeRam();
    63 	test.Printf(_L("Attempting to adjust chunk 2 to size %dK\n"),size3/1024);
    64 	r=c2.Adjust(size3);
    65 	TInt free2=FreeRam();
    66 	if (r==KErrNone)
    67 		{
    68 		test.Printf(_L("Succeeded - free RAM now %dK\n"),free2/1024);
    69 		test.Printf(_L("Freeing chunk 2\n"));
    70 		r=c2.Adjust(0);
    71 		test(r==KErrNone);
    72 		}
    73 	else
    74 		test.Printf(_L("Failed - free RAM now %dK\n"),free2/1024);
    75 	test.Printf(_L("Freeing chunk 1\n"));
    76 	r=c1.Adjust(0);
    77 	test(r==KErrNone);
    78 	test.Printf(_L("Checking free RAM\n"));
    79 	UserSvr::HalFunction(EHalGroupKernel, EKernelHalSupervisorBarrier, 0, 0);
    80 	free2=FreeRam();
    81 	test.Printf(_L("Free RAM %dK\n"),free2/1024);
    82 	test(free==free2);
    83 	}
    84 
    85 void TestInterleavedAlloc()
    86 	{
    87 	TInt pageSize;
    88 	RChunk c1;
    89 	RChunk c2;
    90 	TInt r;
    91 	r=UserHal::PageSizeInBytes(pageSize);
    92 	test(r==KErrNone);
    93 	r=c1.CreateLocal(0,0x100000);
    94 	test(r==KErrNone);
    95 	r=c2.CreateLocal(0,0x100000);
    96 	test(r==KErrNone);
    97 	TInt step;
    98 	for (step=1; step<=32; ++step)
    99 		{
   100 		test.Printf(_L("Step size %x\n"),step*pageSize);
   101 		while (c1.Size()<64*pageSize)
   102 			{
   103 			r=c1.Adjust(c1.Size()+step*pageSize);
   104 			test(r==KErrNone);
   105 			r=c2.Adjust(c2.Size()+step*pageSize);
   106 			test(r==KErrNone);
   107 			}
   108 		c1.Adjust(0);
   109 		c2.Adjust(0);
   110 		}
   111 	c1.Close();
   112 	c2.Close();
   113 	}
   114 
   115 TInt E32Main()
   116 //
   117 //	Test RChunk class
   118 //
   119 	{
   120 
   121 	test.Title();
   122 	if (!HaveVirtMem())
   123 		{
   124 		test.Printf(_L("This test requires an MMU\n"));
   125 		return KErrNone;
   126 		}
   127 	TestInterleavedAlloc();
   128 	test.Start(_L("Test moving chunks home addresses"));
   129 	test.Printf(_L("GlobalValue=%d\n"),*GlobalPtr);
   130 	++*GlobalPtr;
   131 	test.Printf(_L("GlobalValue=%d\n"),GlobalValue);
   132 
   133 	test.Next(_L("Load gobbler LDD"));
   134 	TInt r = User::LoadLogicalDevice(KGobblerLddFileName);
   135 	test(r==KErrNone || r==KErrAlreadyExists);
   136 	RGobbler gobbler;
   137 	r = gobbler.Open();
   138 	test(r==KErrNone);
   139 	TUint32 taken = gobbler.GobbleRAM(128*1024*1024);
   140 	test.Printf(_L("Gobbled: %dK\n"), taken/1024);
   141 
   142 	TInt free=FreeRam();
   143 	test.Printf(_L("Free RAM 0x%08X bytes\n"),free);
   144 
   145 	RChunk chunk1;
   146 	r=chunk1.CreateLocal(0x400,0x800000);
   147 	test (r==KErrNone);
   148 	TInt i;
   149 	TInt *p=(TInt*)chunk1.Base();
   150 	test.Printf(_L("Chunk 1 Base %08X\n"),p);
   151 	for (i=0; i<0x100; i++)
   152 		*p++=i*i+41;
   153 	RChunk chunk2;
   154 	r=chunk2.CreateLocal(0x400,0x800000);
   155 	test (r==KErrNone);
   156 	TInt *p2=(TInt*)chunk2.Base();
   157 	test.Printf(_L("Chunk 2 Base %08X\n"),p2);
   158 	for (i=0; i<0x100; i++)
   159 		*p2++=i*i*i+487;
   160 	r=chunk1.Adjust(0x120000);
   161 	test (r==KErrNone);
   162 	for (i=0x100; i<0x48000; i++)
   163 		*p++=i*i+41;
   164 	r=chunk2.Adjust(0x120000);
   165 	test (r==KErrNone);
   166 	for (i=0x100; i<0x48000; i++)
   167 		*p2++=i*i*i+487;
   168 	p=(TInt*)chunk1.Base();
   169 	p2=(TInt*)chunk2.Base();
   170 	for(i=0; i<0x48000; i++)
   171 		{
   172 		TInt read1=*p++;
   173 		TInt read2=*p2++;
   174 		if (read1 != (i*i+41))
   175 			{
   176 			test.Printf(_L("Chunk 1 i=%X, read %08X expected %08X\n"),i,read1,i*i+41);
   177 			//test.Getch();
   178 			}
   179 		if (read2 != (i*i*i+487))
   180 			{
   181 			test.Printf(_L("Chunk 2 i=%X, read %08X expected %08X\n"),i,read2,i*i*i+487);
   182 			//test.Getch();
   183 			}
   184 		}
   185 	chunk1.Close();
   186 	chunk2.Close();
   187 	
   188 	TInt free2=FreeRam();
   189 	test.Printf(_L("Free RAM 0x%08X bytes\n"),free2);
   190 	test(free2==free);
   191 
   192 	// Chunks must not be paged otherwise they will not effect the amount 
   193 	// of free ram reported plus on h4 swap size is less than the total ram.
   194 	TChunkCreateInfo createInfo;
   195 	createInfo.SetNormal(0, free+2097152);
   196 	createInfo.SetPaging(TChunkCreateInfo::EUnpaged);
   197 	RChunk c1;
   198 	test_KErrNone(c1.Create(createInfo));
   199 	createInfo.SetNormal(0, 0x1000000);
   200 	RChunk c2;
   201 	RChunk c3;
   202 	RChunk c4;
   203 	RChunk c5;
   204 	RChunk c6;
   205 	test_KErrNone(c2.Create(createInfo));
   206 	test_KErrNone(c3.Create(createInfo));
   207 	test_KErrNone(c4.Create(createInfo));
   208 	test_KErrNone(c5.Create(createInfo));
   209 	test_KErrNone(c6.Create(createInfo));
   210 
   211 	TestAllocFailure(c1,c2);
   212 	r=c3.Adjust(1024);
   213 	test(r==KErrNone);
   214 	TestAllocFailure(c1,c2);
   215 	r=c4.Adjust(1024);
   216 	test(r==KErrNone);
   217 	TestAllocFailure(c1,c2);
   218 	r=c5.Adjust(1024);
   219 	test(r==KErrNone);
   220 	TestAllocFailure(c1,c2);
   221 	r=c6.Adjust(1024);
   222 	test(r==KErrNone);
   223 	TestAllocFailure(c1,c2);
   224 
   225 	c1.Close();
   226 	c2.Close();
   227 	c3.Close();
   228 	c4.Close();
   229 	c5.Close();
   230 	c6.Close();
   231 	gobbler.Close();
   232 
   233 	test.End();
   234 	test.Close();
   235 	return(KErrNone);
   236 	}
   237 
   238