kerneltest/e32test/debug/d_debugapi.h
changeset 0 a41df078684a
child 279 957c583b417b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/e32test/debug/d_debugapi.h	Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,302 @@
+// 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__