kerneltest/f32test/demandpaging/t_paginginfo.cpp
author Tom Cosgrove <tom.cosgrove@nokia.com>
Fri, 28 May 2010 16:29:07 +0100
changeset 30 8aab599e3476
parent 6 0173bcd7697c
permissions -rw-r--r--
Fix for bug 2283 (RVCT 4.0 support is missing from PDK 3.0.h) Have multiple extension sections in the bld.inf, one for each version of the compiler. The RVCT version building the tools will build the runtime libraries for its version, but make sure we extract all the other versions from zip archives. Also add the archive for RVCT4.

// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
// All rights reserved.
// This component and the accompanying materials are made available
// under the terms of the License "Eclipse Public License v1.0"
// which accompanies this distribution, and is available
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
//
// Initial Contributors:
// Nokia Corporation - initial contribution.
//
// Contributors:
//
// Description:
// f32test\demandpaging\t_paginginfo.cpp
// 
//

#include <e32test.h>

RTest test(_L("t_paginginfo"));

#include <e32rom.h>
#include <e32svr.h>
#include <u32hal.h>
#include <f32file.h>
#include <f32dbg.h>
#include <d32locd.h>
#include "testdefs.h"
#include <hal.h>


TInt DriveNumber=-1;   // Parameter - Which drive?  -1 = autodetect.
TInt locDriveNumber;

TBusLocalDrive Drive;
TBool DisplayStats = ETrue;
TBool ManualTest = EFalse;

TInt findDataPagingDrive()
/** 
Find the drive containing a swap partition.

@return		Local drive identifier.
*/
	{
	TInt drive = KErrNotFound;
	
	test.Printf(_L("Searching for data paging drive:\n"));
	
	for(TInt i = 0; i < KMaxLocalDrives && drive < 0; ++i)
		{
		RLocalDrive	d;
		TBool		change = EFalse;
		
		if(d.Connect(i, change) == KErrNone)
			{
			test.Printf(_L("Connected to local drive %d\n"), i);
			TLocalDriveCapsV4			dc;
			TPckg<TLocalDriveCapsV4>	capsPack(dc);
			
			if(d.Caps(capsPack) == KErrNone)
				{
				if ((dc.iMediaAtt & KMediaAttPageable) &&
					(dc.iPartitionType == KPartitionTypePagedData))
					{
					test.Printf(_L("Found swap partition on local drive %d\n"), i);
					drive = i;

					TPageDeviceInfo pageDeviceInfo;

					TPtr8 pageDeviceInfoBuf((TUint8*) &pageDeviceInfo, sizeof(pageDeviceInfo));
					pageDeviceInfoBuf.FillZ();

					TInt r = d.QueryDevice(RLocalDrive::EQueryPageDeviceInfo, pageDeviceInfoBuf);

					test.Printf(_L("EQueryPageDeviceInfo on local drive %d returned %d\n"), i, r);
					}
				}
			d.Close();
			}
		}
	return drive;
	}



void DisplayPageDeviceInfo(TInt aDataPagingDrive)
	{
	test.Printf(_L("Stats: \n"));

	SMediaPagingInfo info;
	TInt r = UserSvr::HalFunction(EHalGroupMedia,EMediaHalGetPagingInfo,(TAny*) aDataPagingDrive, &info);
	test.Printf(_L("HAL: EMediaHalGetPagingInfo returned %d\n"), r);
	if (r == KErrNone)
		{
		test.Printf(_L("iRomPageInCount %d\n"), info.iRomPageInCount);
		test.Printf(_L("iCodePageInCount %d\n"), info.iCodePageInCount);
		test.Printf(_L("iDataPageInCount %d\n"), info.iDataPageInCount);
		test.Printf(_L("iDataPageOutCount %d\n"), info.iDataPageOutCount);
		test.Printf(_L("iDataPageOutBackgroundCount %d\n"), info.iDataPageOutBackgroundCount);
		}

	
	RLocalDrive	d;
	TBool change = EFalse;
	r = d.Connect(aDataPagingDrive, change);
	test (r == KErrNone);
		
	TPageDeviceInfo pageDeviceInfo;
	TPtr8 pageDeviceInfoBuf((TUint8*) &pageDeviceInfo, sizeof(pageDeviceInfo));
	pageDeviceInfoBuf.FillZ();
	r = d.QueryDevice(RLocalDrive::EQueryPageDeviceInfo, pageDeviceInfoBuf);
	test (r == KErrNone || r == KErrNotSupported);

	d.Close();
	test.Printf(_L("iReservoirBlockCount %d\n"),		pageDeviceInfo.iReservoirBlockCount);
	test.Printf(_L("iBadBlockCount %d\n"),	pageDeviceInfo.iBadBlockCount);

	}

//
// The gubbins that starts all the tests
//
// ParseCommandLine reads the arguments and sets globals accordingly.
//

void ParseCommandLine()
	{
	TBuf<32> args;
	User::CommandLine(args);
	TLex lex(args);
	
	FOREVER
		{
		
		TPtrC token=lex.NextToken();
		if(token.Length()!=0)
			{
			if ((token.Length()==2) && (token[1]==':'))
				DriveNumber=User::UpperCase(token[0])-'A';
			else if (token.Length()==1)
				{
				TChar driveLetter = User::UpperCase(token[0]); 
				if ((driveLetter>='A') && (driveLetter<='Z'))
					DriveNumber=driveLetter - (TChar) 'A';
				else 
					test.Printf(_L("Unknown argument '%S' was ignored.\n"), &token);
				}
			else if ((token==_L("help")) || (token==_L("-h")) || (token==_L("-?")))
				{
				test.Printf(_L("\nUsage:  t_paginginfo [enable] [disable] [stats]\n\n"));
				test.Getch();
				}
			else if (token==_L("stats"))
				{
				DisplayStats = ETrue;
				}
			else if (token==_L("-m"))
				{
				ManualTest = ETrue;
				}
			else
				test.Printf(_L("Unknown argument '%S' was ignored.\n"), &token);
			}
		else
			break;
		
		}
	}

//
// E32Main
//

TInt E32Main()
	{
	test.Title();

	test.Start(_L("Check that the rom is paged"));

	TRomHeader* romHeader = (TRomHeader*)UserSvr::RomHeaderAddress();

	if (romHeader->iPageableRomStart==NULL)
		{
		test.Printf(_L("Test ROM is not paged - test skipped!\r\n"));
		test.End();
		return 0;
		}
	ParseCommandLine();	

	TInt dataPagingDrive = findDataPagingDrive();
	if (dataPagingDrive == KErrNotFound)
		{
		test.Printf(_L("Swap partition not found - test skipped!\r\n"));
		test.End();
		return 0;
		}



	if (DisplayStats)
		{
		DisplayPageDeviceInfo(dataPagingDrive);

		if (ManualTest)
			test.Getch();

		test.End();
		return 0;
		}



	test.End();
	return 0;
	}