diff -r 000000000000 -r a41df078684a kerneltest/e32test/debug/d_debugapi.h --- /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 +#else + #include +#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__