kerneltest/e32test/debug/d_debugapi.h
author Tom Cosgrove <tom.cosgrove@nokia.com>
Fri, 28 May 2010 16:29:07 +0100
changeset 30 8aab599e3476
parent 0 a41df078684a
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) 2005-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:
// e32test/debug/d_debugapi.h
// 
//

#ifndef __D_DEBUGAPI_H__
#define __D_DEBUGAPI_H__

#ifdef __KERNEL_MODE__
	#include <kernel/kdebug.h>
#else
	#include <e32std.h>
#endif

_LIT(KTestLddName, "TestDebugAPI");

class RDebugAPIChecker: public RBusLogicalChannel
	{
public:
	enum 
		{
		ETProcess,
		ETChunk,
		ETThread,
		ETIPAccess
		};
	/**Used to pass arguments to ldd when checking inter-process data access*/
	struct IPAccessArgs
		{
		TUint  iProcessID;
		TUint iAddress;
		TUint  iValue;
		};

public:
	static inline TVersion Version() { return TVersion(1, 0, 1); }
#ifndef __KERNEL_MODE__
public:
	inline TInt Open();
	inline TInt Process();
	inline TInt Chunk();
	inline TInt Thread();
	inline TInt IPAccess(RDebugAPIChecker::IPAccessArgs* aArgs);
#endif
	};


#ifndef __KERNEL_MODE__

inline TInt RDebugAPIChecker::Open()
	{
	return DoCreate(KTestLddName, Version(), NULL, NULL, NULL, EOwnerThread);
	}
inline TInt RDebugAPIChecker::Process()
	{
	return DoControl(ETProcess);
	}
inline TInt RDebugAPIChecker::Chunk()
	{
	return DoControl(ETChunk);
	}
inline TInt RDebugAPIChecker::Thread()
	{
	return DoControl(ETThread);
	}
inline TInt RDebugAPIChecker::IPAccess(RDebugAPIChecker::IPAccessArgs* aArgs)
	{
	return DoControl(ETIPAccess, aArgs);
	}

#endif //#ifndef __KERNEL_MODE__

#ifdef __KERNEL_MODE__

/**
Holds the offsets common to all memory models. 
@see TOffsetTableEntry.
*/
struct TDebugOffsetTable
	{
	// debugger info
	TInt iDebugger_ObjectOffsetTable;
	TInt iDebugger_ObjectOffsetTableCount;
	TInt iDebugger_ThreadContextTable;
	TInt iDebugger_Version;
	TInt iDebugger_OSVersion;
	TInt iDebugger_Reserved;
	TInt iDebugger_Containers;
	TInt iDebugger_Scheduler;
	TInt iDebugger_CurrentThread;
	TInt iDebugger_CodeSegGlobalList;
	TInt iDebugger_CodeSegLock;
	TInt iDebugger_Change;
	// DMutex info
	TInt iMutex_HoldCount;
	// more debugger info
	TInt iDebugger_ShadowPages;
	TInt iDebugger_ShadowPageCount;
	TInt iDebugger_EventMask;
	// DObjectCon info
	TInt iObjectCon_Mutex;
	TInt iObjectCon_Objects;
	TInt iObjectCon_Count;
	// more debugger info
	TInt iDebugger_EventHandlerBreakpoint;
	TInt iDebuggerOffset_Reserved6;
	TInt iDebuggerOffset_Reserved7;
	TInt iDebuggerOffset_Reserved8;
	// thread info
	TInt iThread_Name;
	TInt iThread_Id;
	TInt iThread_OwningProcess;
	TInt iThread_NThread;
	TInt iThread_SupervisorStack;
	TInt iThread_SupervisorStackSize;
	TInt iThread_UserStackRunAddress;
	TInt iThread_UserStackSize;
	TInt iThread_UserContextType;
	TInt iThread_SavedSupervisorSP;
	TInt iThread_Priority;
	TInt iThread_ThreadType;
	TInt iDebuggerOffset_Reserved12;
	// process info
	TInt iProcess_Name;
	TInt iProcess_Id;
	TInt iProcess_Attributes;
	TInt iProcess_CodeSeg;
	TInt iProcess_DataBssRunAddress;
	TInt iProcess_DataBssStackChunk;
	TInt iProcess_ChunkCount;			//ARMv5 specific
	TInt iProcess_Chunks;				//ARMv5 specific
	TInt iDebuggerOffset_Reserved13;
	TInt iDebuggerOffset_Reserved14;
	TInt iDebuggerOffset_Reserved15;
	TInt iDebuggerOffset_Reserved16;
	// chunkinfo info
	TInt iChunkInfo_DataSectionBase;	//ARMv5 specific
	TInt iChunkInfo_Chunk;				//ARMv5 specific
	TInt iDebuggerOffset_Reserved36;
	TInt iDebuggerOffset_Reserved37;
	// chunk info
	TInt iChunk_OwningProcess;			//ARMv5 specific
	TInt iChunk_Size;
	TInt iChunk_Attributes;
	TInt iChunk_ChunkType;
	TInt iChunk_ChunkState;				//ARMv5 specific
	TInt iChunk_HomeBase;				//ARMv5 specific
	TInt iDebuggerOffset_Reserved17;
	TInt iDebuggerOffset_Reserved18;
	TInt iDebuggerOffset_Reserved19;
	TInt iDebuggerOffset_Reserved20;
	// library info
	TInt iLibrary_MapCount;
	TInt iLibrary_State;
	TInt iLibrary_CodeSeg;
	TInt iDebuggerOffset_Reserved21;
	TInt iDebuggerOffset_Reserved22;
	TInt iDebuggerOffset_Reserved23;
	TInt iDebuggerOffset_Reserved24;
	// code seg info
	TInt iCodeSeg_Next;
	TInt iCodeSeg_Prev;
	TInt iCodeSeg_Deps;
	TInt iCodeSeg_DepsCount;
	TInt iCodeSeg_FileName;
	TInt iCodeSeg_XIP;
	TInt iCodeSeg_Info;
	TInt iDebuggerOffset_Reserved25;
	TInt iDebuggerOffset_Reserved26;
	TInt iDebuggerOffset_Reserved27;
	TInt iDebuggerOffset_Reserved28;
	// scheduler info
	TInt iScheduler_KernCSLocked;
	TInt iScheduler_LockWaiting;
	TInt iScheduler_CurrentThread;
	TInt iScheduler_AddressSpace;
	TInt iDebuggerOffset_Reserved29;
	TInt iDebuggerOffset_Reserved30;
	TInt iDebuggerOffset_Reserved31;
	TInt iDebuggerOffset_Reserved32;
	// code segment information non-XIP
	TInt iCodeSegInfoRAM_CodeSize;
	TInt iCodeSegInfoRAM_TextSize;
	TInt iCodeSegInfoRAM_DataSize;
	TInt iCodeSegInfoRAM_BssSize;
	TInt iCodeSegInfoRAM_CodeRunAddress;
	TInt iCodeSegInfoRAM_CodeLoadAddress;
	TInt iCodeSegInfoRAM_DataRunAddr;
	TInt iCodeSegInfoRAM_DataLoadAddr;
	TInt iCodeSegInfoRAM_ConstOffset;
	TInt iCodeSegInfoRAM_ExportDir;
	TInt iCodeSegInfoRAM_ExportDirCount;
	TInt iDebuggerOffset_Reserved38;
	TInt iDebuggerOffset_Reserved39;
	TInt iDebuggerOffset_Reserved40;
	TInt iDebuggerOffset_Reserved41;
	// code segment information XIP
	TInt iCodeSegInfoXIP_CodeAddress;
	TInt iCodeSegInfoXIP_DataAddress;
	TInt iCodeSegInfoXIP_DataRunAddress;
	TInt iCodeSegInfoXIP_CodeSize;
	TInt iCodeSegInfoXIP_TextSize;
	TInt iCodeSegInfoXIP_DataSize;
	TInt iCodeSegInfoXIP_BssSize;
	TInt iCodeSegInfoXIP_ExportDir;
	TInt iCodeSegInfoXIP_ExportDirCount;
	TInt iDebuggerOffset_Reserved42;
	TInt iDebuggerOffset_Reserved43;
	TInt iDebuggerOffset_Reserved44;
	TInt iDebuggerOffset_Reserved45;
	};

/**
Holds the offsets specific to moving memory models.
@see TOffsetMovingTableEntry
*/
struct TMovingDebugOffsetTable
	{
	TInt iProcess_ChunkCount;
	TInt iProcess_Chunks;

	TInt iChunkInfo_DataSectionBase;
	TInt iChunkInfo_Chunk;

	TInt iChunk_OwningProcess;
	TInt iChunk_ChunkState;
	TInt iChunk_HomeBase;

	TInt iReserved1;
	TInt iReserved2;
	TInt iReserved3;
	TInt iReserved4;
	};

/**
Holds the offsets specific to multiple memory models.
@see TOffsetMultipleTableEntry
*/
struct TMultipleDebugOffsetTable 
	{
	TInt iProcess_OsAsid;
	TInt iProcess_LocalPageDir;
	TInt iProcess_ChunkCount;
	TInt iProcess_Chunks;
	TInt iChunkInfo_Chunk;
	TInt iChunk_OwningProcess;
	TInt iReserved1;
	TInt iReserved2;
	TInt iReserved3;
	TInt iReserved4;
	};

class DDebugAPIChecker : public DLogicalChannelBase
	{
public:
	virtual ~DDebugAPIChecker();
protected:
	// from DLogicalChannelBase
	virtual TInt DoCreate(TInt aUnit, const TDesC8* aInfo, const TVersion& aVer);
	virtual TInt Request(TInt aFunction, TAny* a1, TAny* a2);
private:
	inline TInt8 Read8(void* aBase, TInt aOffset)	{return *((TInt8*)aBase + aOffset);}
	inline TInt  Read(void* aBase, TInt aOffset)	{return (TInt) (*((TInt*)((TInt8*)aBase + aOffset)));}
	
	TInt Process();
	TInt Chunk();
	TInt Thread();
	TInt IPAccess(TAny* a1);
	TUint8* ExtractName(TInt aSymbianName, TUint8* aCharName);
	TInt GetOffsets();

	TInt ReadFromOtherProcessArmv6();

private:
	DDebuggerInfo* iDebugInfo;
	TDebugOffsetTable* iOffsetTable;/**Contains the offsets common to all memory models*/ 
	TMemoryModelType iMMUType;		/**Identifies the memory model*/
	void* iVariantOffsetTable;		/**Contains memory-model-spacific offsets*/
	TInt* iScheduler;				/**Will hold the address of the scheduler*/

	TInt iCurrentProcess_OsAsid;		//Used to call ReadFromOtherProcessArmv6
	TInt iCurrentProcess_LocalPageDir;	//Used to call ReadFromOtherProcessArmv6
	TInt iOtherProcess_OsAsid;			//Used to call ReadFromOtherProcessArmv6
	TInt iOtherProcess_LocalPageDir;	//Used to call ReadFromOtherProcessArmv6
	TInt iAddress;						//Used to call ReadFromOtherProcessArmv6
	};

#endif //#ifdef __KERNEL_MODE__

#endif // __D_DEBUGAPI_H__