kerneltest/f32test/loader/t_ldrtst.h
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) 1999-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\loader\t_ldrtst.h
// 
//

#ifndef __T_LDRTST_H__
#define __T_LDRTST_H__

#define __INCLUDE_DEPENDENCY_GRAPH

#include <e32svr.h>
#include <e32test.h>
#include <e32ver.h>
#include "dlltree.h"
#include "dllt.h"
#include "exetifc.h"
#include <d_ldrtst.h>
#include <f32file.h>
#include <f32dbg.h>
#include <e32rom.h>

GLREF_D RTest test;

class TModuleList;
class TModuleSet
	{
public:
	TModuleSet();
	TModuleSet(const TModuleList&, TInt aMask, TInt aVal);
	void Add(TInt aModule);
	void Remove(TInt aModule);
	void Remove(const TModuleList&);
	void Display(const TDesC& aTitle) const;
	inline TBool Present(TInt aModule) const
		{ return iBitMap[aModule>>3]&(1<<(aModule&7)); }
public:
	TInt iCount;
	TUint8 iBitMap[(KNumModules+7)/8];
	};

class TModuleList
	{
public:
	TModuleList();
	void SetCount();
	void Display(const TDesC& aTitle) const;
	TBool IsPresent(TInt aModNum) const;
	TInt Find(TInt aModNum) const;
	void Add(const SDllInfo& a);
public:
	TInt iCount;
	SDllInfo iInfo[KNumModules];
	};

class LoaderTest
	{
public:
	static LoaderTest* New();
	void Close();
	void Init();
public:
	void TestOneByOne();
	void TestMultipleExeInstances();
	void TestOOM();
	void TestMultipleLoads();
private:
	TBool IsRomAddress(TLinAddr a);
	TBool IsRamCodeAddress(TLinAddr a);
	TBool CheckDataAddress(TLinAddr a, TInt aDllNum, TInt aExeNum);
	TInt DetermineDllLoadResult(TInt aDllNum, TInt aExeNum);
	TInt DetermineDllLoadResult(TInt aDllNum, TInt aExeNum1, TInt aExeNum2);
	TInt DetermineLoadExe2Result(TInt aExeNum);
	void DumpModuleList(const TModuleList& aList, TInt aExeNum);
	void DumpModuleInfo(const SDllInfo& aInfo, TInt aExeNum);
	void CheckModuleList(TInt aRoot, const TModuleList& aList);
public:
	void TraceOn();
	void TraceOff();
private:
	LoaderTest();
	~LoaderTest();
public:
	RFs iFs;
	RLdrTest iDev;
	TUint32 iMemModelAtt;
	TInt iCmdLine[8];
	};


const TInt KMaxHandlesPerDll=4;
const TInt KMaxHandles=KMaxHandlesPerDll*KNumModules;

struct SModuleInstance
	{
	TInt iAccessCount;
	TInt iModNum;
	TLinAddr iEntryPointAddress;
	TModuleHandle iModuleHandle;
	TLinAddr iData;
	TAny* iCodeSeg;
	};

class CGlobalModuleList;
class CPerProcessInfo : public CBase
	{
public:
	static CPerProcessInfo* New(TInt aExeNum, CGlobalModuleList& aG);
	virtual ~CPerProcessInfo();
	void GetModuleSet(TModuleSet& aSet);
	void Check();
	void Unlink(const SDllInfo& a, TModuleList& aList);
	TInt Load(TInt aDllNum);
	TInt AddModules(TInt aDllNum, TModuleList* aCList, TModuleList* aIList);
	TInt CloseHandle(TInt aHandle);
private:
	CPerProcessInfo();
	TInt Init();
public:
	TInt iExeNum;
	TRequestStatus iStatus;
	RProcess iProcess;
	RLoaderTest iSession;
	RLdrTest iDev;
	CGlobalModuleList* iGlobalList;
	TInt iModuleNum[KMaxHandles];
	TInt iHandleCount[KNumModules];
	SModuleInstance* iModules[KNumModules];
	};

class CGlobalModuleList : public CBase
	{
public:
	static CGlobalModuleList* New(const LoaderTest&);
	virtual ~CGlobalModuleList();
	void Close(SModuleInstance* a);
	void Free(SModuleInstance* a);
	SModuleInstance* GetMI();
	TAny* CodeSegFromHandle(TModuleHandle aModHandle);
	void CheckAll();
	TInt Load(TInt aExeNum, TInt aDllNum);
	TInt CloseHandle(TInt aExeNum, TInt aDllNum);
private:
	CGlobalModuleList();
	void Init();
public:
	TInt iMaxModules;
	TInt iNumExes;
	TInt iFixedExes;
	TInt iParam;
	RLdrTest iDev;
	TUint32 iMemModelAtt;
	CPerProcessInfo* iPPInfo[KNumModules];
	RPointerArray<SModuleInstance> iModules;
	SModuleInstance* iModuleAlloc;
	SModuleInstance* iFreeModules;
	};

void GetNonZFileName(const TDesC& aOrigName, TDes& aNonZName);

#endif