dbgsrv/coredumpserver/interface/datasource/crashdatasource.h
changeset 0 c6b0df440bee
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dbgsrv/coredumpserver/interface/datasource/crashdatasource.h	Tue Mar 02 10:33:16 2010 +0530
@@ -0,0 +1,397 @@
+// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "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:
+// Definition of Data Source API that supplies crash information.
+//
+
+/**
+ @file
+ @publishedPartner
+ @released
+*/
+
+#ifndef CRASH_DATA_SOURCE_H
+#define CRASH_DATA_SOURCE_H
+
+#include <e32std.h>
+#include <e32base.h>
+#include <scmdatatypes.h>
+#include <crashdata.h>
+#include <processdata.h>
+#include <executabledata.h>
+#include <threaddata.h>
+
+#ifdef __MARM__
+#include <rm_debug_api.h>
+#endif
+
+/**
+Definition of the Data Source API. This API is used by formatters to obtain crash data from
+the Core Dump Server. The Core Dump Server derives and implements this API.
+*/
+class CCrashDataSource : public CBase
+{
+protected:
+
+	/** Standard second-phase constructor. */
+	virtual void ConstructL() = 0;
+
+public:
+
+	/**
+	This call returns information on all available registers. It does not
+	return the register contents. This is used to establish which registers
+	a caller could ask for, in particular for Co Processor registers.
+	The callee (not the caller) allocates aRegisterList.
+	This method is used by a formatter to establish which registers it can ask for,
+	and thus need only be called once per session.
+
+    @param aRegisterList Returned register list with available registers.
+
+    @see TRegisterData.
+	@see RRegisterList.
+	*/
+	virtual void GetRegisterListL( RRegisterList  &	aRegisterList ) = 0;
+
+	/**
+	Ask the Core Dump server for some register data. The caller allocates
+	the array and fills in the details of the registers for which it would like
+	the contents.
+	@param aThreadId Thread to read registers from.
+	@param aRegisterList Returned register list with current values.
+
+    @see TRegisterData.
+	@see GetRegisterListL().
+	@see RRegisterList.
+	*/
+	virtual void ReadRegistersL( const TUint64 aThreadId, RRegisterList &aRegisterList ) = 0;
+
+	/**
+ 	Read data from target relative to a particular thread.
+	The caller assumes ownership of the resulting data descriptor.
+
+ 	@param aThreadId Memory read is relative to this thread parameter
+	@param aAddress Virtual address to read from
+    @param aLength Number of bytes to read
+	@param aData Descriptor for read data
+	*/
+	virtual void ReadMemoryL(
+                   const TUint64    aThreadId,
+                   const TUint32    aAddress,
+                   const TUint32    aLength,
+                   TDes8          & aData ) = 0;
+
+	/**
+ 	Read the current process list.
+	The caller assumes ownership of resulting data.
+	@param aData Array of currently running processes .
+
+	@see RProcessPointerList.
+	@see CProcessInfo.
+	*/
+	virtual void GetProcessListL( RProcessPointerList & aData )
+		{
+		TUint totalProcessListDescSize;
+		GetProcessListL( aData, totalProcessListDescSize );
+		};
+
+	/**
+ 	Read the current process list.
+	The caller assumes ownership of the resulting data.
+	This call is only useful if the total descriptor size required for
+	transferring across the client-server boundary must be known.
+
+ 	@param aData	Array of currently running processes.
+	@param aTotalProcessListDescSize Total descriptor size required
+	to transfer the list across the client-server interface.
+	@leave One of the OS wide codes
+    @see RProcessPointerList.
+	@see CProcessInfo.
+	*/
+	virtual void GetProcessListL( RProcessPointerList & aData,
+						         TUint & aTotalProcessListDescSize ) = 0;
+
+	/**
+ 	Read the current executable list. The caller assumes ownership of the resulting data.
+	@param aData Array of current executables.
+ 	@leave One of the OS wide codes
+	@see RExecutablePointerList.
+	@see CExecutableInfo
+	*/
+	virtual void GetExecutableListL( RExecutablePointerList & aData )
+		{
+		TUint totalExecutableListDescSize;
+		GetExecutableListL( aData, totalExecutableListDescSize );
+		};
+
+	/**
+ 	Read the current executable list.
+	The caller assumes ownership of the resulting data.
+	This call is only useful if the total descriptor size required for
+	transferring across the client-server boundary must be known.
+
+ 	@param aData	Array of current executables.
+	@param aTotalExecutableListDescSize	Total descriptor size required
+	to transfer the list across the client-server interface.
+	@leave One of the OS wide codes
+	@see RExecutablePointerList.
+	@see CExecutableInfo
+	*/
+	virtual void GetExecutableListL( RExecutablePointerList & aData,
+						         TUint & aTotalExecutableListDescSize ) = 0;
+
+ 	/**
+	Read the current thread list.
+	This call is only useful if the total descriptor size required for
+	transferring across the client-server boundary must be known.
+
+	@param aProcessId If this argument is -1, all the threads in the
+	system are returned. Otherwise the threads under the process with the id
+	aProcessId are returned.
+ 	@param aThreadList Array of currently running threads.
+	@param aTotalThreadListDescSize Size in bytes of the descriptor
+	required to transfer the data over the client server interface.
+ 	@leave One of the OS wide codes
+  	@see CThreadInfo
+    @see RThreadPointerList.
+	@see GetThreadListL
+	*/
+	virtual void GetThreadListL( const TUint64 aProcessId,
+						RThreadPointerList & aThreadList,
+						TUint & aTotalThreadListDescSize ) = 0;
+
+	/**
+ 	Read the current thread list.
+	The caller assumes ownership of the resulting data.
+
+	@param aProcessId If this argument is -1, all the threads in the
+	system are returned. Otherwise the threads under the process with the id
+	aProcessId are returned.
+ 	@param aThreadList	Array of currently running threads.
+	@leave One of the OS wide codes
+	@see CThreadInfo
+	@see RThreadPointerList
+	*/
+  	virtual void GetThreadListL( const TUint64 aProcessId,
+								 RThreadPointerList & aThreadList )
+		{
+		TUint totalThreadListDescSize;
+		GetThreadListL(	aProcessId, aThreadList, totalThreadListDescSize );
+		};
+
+    /**
+	Obtain a list of the code segments for a process.
+
+	@param aTid Thread identifier to obtain code segments for.
+	@param aCodeSegs Array of code segments.
+	@param aTotalCodeSegListDescSize Size in bytes of the descriptor
+	required to transfer the data over the client server interface.
+ 	@leave One of the OS wide codes
+	@see RCodeSegPointerList
+	@see TSegmentInfo
+	*/
+    virtual void GetCodeSegmentsL(const TUint64 aTid,
+									RCodeSegPointerList &aCodeSegs,
+									TUint &aTotalCodeSegListDescSize ) = 0;
+
+    /**
+	Obtain a list of the code segments for a process.
+
+	@param aTid Thread identifier to obtain code segments for.
+	@param aCodeSegs Array of code segments.
+    @leave One of the OS wide codes
+	@see RCodeSegPointerList
+	@see TSegmentInfo
+	*/
+    virtual void GetCodeSegmentsL(const TUint64 aTid, RCodeSegPointerList &aCodeSegs)
+        {
+        TUint totalThreadListDescSize;
+        GetCodeSegmentsL(aTid, aCodeSegs, totalThreadListDescSize);
+        };
+
+    /**
+     * Returns the size of the trace buffer that is available. Should be used in conjunction with ReadTraceBufferL to
+     * determine the size of the buffer you need to pass in.
+     * @return Trace Buffer Size
+     * @leave One of the OS wide codes
+     * @see ReadTraceBufferL
+     */
+    virtual TUint GetAvailableTraceSizeL() {User::Leave(KErrNotSupported); return 0;};
+
+	/**
+	 * Reads trace data from trace buffer at time of crash. If the resulting
+	 * descriptor is of size zero then no trace data is available. Use GetAvailableTraceSizeL to see what size buffer to supply.
+	 * @param aTraceData Descriptor to store trace data
+	 * @param aPos Position in the trace buffer from which to read. It will read to the end or until the supplied descriptor is full, whichever happens first.
+	 * @leave One of the OS wide codes
+	 * @see GetAvailableTraceSizeL
+	 */
+	virtual void ReadTraceBufferL(TDes8 &aTraceData, TUint aPos = 0 ) {User::Leave(KErrNotSupported); };
+
+	/**
+	 * Reads locks data
+	 * @param aLockData Descriptor to store trace data
+	 * @leave One of the OS wide codes
+	 * @see TSCMLockData
+	 */
+	virtual void GetLocksL(TSCMLockData& aLockData) {User::Leave(KErrNotSupported); };
+
+	/**
+	 * Reads the ROM Build Info
+	 * @param aRomHeader Contains the ROM header info after the call if succesful
+	 * @leave One of the OS wide codes
+	 * @see TRomHeaderData
+	 */
+	virtual void GetROMBuildInfoL(TRomHeaderData& aRomHeader) {User::Leave(KErrNotSupported); };
+
+	/**
+	 * Gets the size of any variant specific information that might be available. Should
+	 * be used in conjunction with GetVariantSpecificDataL to determine the size of descriptor
+	 * required to be passed in	 *
+	 * @return One of the system wide error codes
+	 * @param aDataSize Stores the datasize after the call
+	 * @see GetVariantSpecificData
+	 */
+	virtual TInt GetVariantSpecificDataSize(TUint& aDataSize) = 0;
+
+	/**
+	 * Gets any variant specific data that might be available
+	 * @return One of the system wide error codes
+	 * @param aVarSpecData Reference to descriptor to store data. Must be large enough
+	 *			to store the data. If this returns size zero, no data was available
+	 * @see GetVariantSpecificDataSize
+	 */
+	virtual TInt GetVariantSpecificData(TDes8& aVarSpecData) = 0;
+
+#ifdef __MARM__
+
+	/**
+	 * If the stack for the given mode is available, this will return the size of it
+	 * @return The size of the stack
+	 * @param aMode Processer mode of interest
+	 * @leave One of the OS wide codes
+	 * @see Debug::TArmProcessorModes
+	 * @see GetExceptionStackL
+	 */
+	virtual TUint GetExceptionStackSizeL(const Debug::TArmProcessorModes aMode) {User::Leave(KErrNotSupported); };
+
+	/**
+	 * Reads the exception stack for a given exception mode into the descriptor. Will start reading
+	 * aStartReadPoint bytes into the stack and will fill up the descriptor as much as possible. The intention
+	 * is to make multiple calls of this so you don't have to allocate a large buffer at the start.
+	 * @param aMode Processer mode of interest
+	 * @param aStack Descriptor to put stack into
+	 * @param aStartReadPoint Will start reading aStartReadPoint bytes into the stack
+	 * @see GetExceptionStackSizeL
+	 */
+	virtual void GetExceptionStackL(const Debug::TArmProcessorModes aMode, TDes8& aStack, TUint aStartReadPoint) {User::Leave(KErrNotSupported); };
+#endif   //MARM_ARMV5
+
+	/**
+	 * Returns the version of this implementation of the data source
+	 * @return TVersion Data Source version
+	 */
+	virtual TVersion GetVersion() const  { return TVersion(1,0,0);};
+
+	/**
+	 * Returns the buffer size that will be required to read the Data Source
+	 * functionality block
+	 * @param aBufSize Size of the buffer required
+	 * @return One of the OS wide codes
+	 * @see GetDataSourceFunctionality
+	 */
+	virtual TInt GetDataSourceFunctionalityBufSize(TUint& aBufSize)   {return 0;};
+
+	/**
+	 * Returns the Data Source Functionality block. Should be used in conjunction with
+	 * GetDataSourceFunctionalityBufSize to determine how big a buffer should be passed through.
+	 *
+	 * Information in the debug functionality block is represented as a concatenation
+	 * of TTag objects and a TTagHeader.
+	 *
+	 * @param aBuffer Contains the functionality block
+	 * @return One of the OS wide codes
+	 * @see GetDataSourceFunctionalityBufSize
+	 * @see Debug::TTag
+	 * @see Debug::TTagType
+	 * @see Debug::TTagHeader
+	 */
+	virtual TInt GetDataSourceFunctionality(TDes8& aFuncBuffer)   { return 0;};
+
+	/** For future expansion
+	@internalTechnology */
+	TUint32 iSpare1;
+
+	/** @internalTechnology */
+	TUint32 iSpare2;
+
+public:
+
+	/**
+	 * These tags define what kinds of core functionality is supported by a given implementation of
+	 * the data source. TTag structures associated with the ETagHeaderIdCore sub-block will have iTagId values from this enumeration.
+	 * See each enumerator for an explanation of how a TTag with that iTagId should be interpreted.
+	 */
+	enum TDataSourceFunctionalityCore
+	{
+		ECodeSegments = 0,        /**< Indicates whether getting code segments is supported */
+		EExecutableList = 1,     /**< Indicates whether getting the executable list is supported */
+		EProcessList = 2,        /**< Indicates whether getting the process list is supported */
+		ERegisterList = 3,      /**< Indicates whether getting the register list is supported */
+		EThreadList = 4,    /**< Indicates whether getting the thread list */
+		EReadMemory = 5,      /**< Indicates whether reading memory is supported. */
+		EReadRegisters = 6,         /**< Indicates whether reading registers is supported. */
+		EReadTraceBuffer = 7,       /**< Indicates whether reading the trace buffer is supported. */
+		ERomBuildInfo = 8,      /**< Indicates whether obtaining the ROM build info is supported */
+		ESystemLocks = 9,  /**< Indicates whether obtaining the System Locks info is supported */
+		EExceptionStacks = 10,  /**< Indicates whether obtaining the exception stacks is supported */
+		/**
+		  @internalTechnology
+		  A debug agent should find the number of core tags from the DFBlock rather than this enumerator.
+		  */
+		ECoreLast
+	};
+
+	/**
+	 * Information in the Data Source functionality block is represented as a concatenation
+	 * of pairs of TDataSourceTagHeader structures and arrays of TTag objects.
+	 * @see Debug::TTag
+	 * @see GetDataSourceFunctionality
+	  */
+	struct TDataSourceTagHeader
+	{
+		/** Value identifying the contents of this TTagHeader, should be interpreted as an enumerator from TTagHeaderId.
+		  @see TTagHeaderId
+		  */
+		TUint16	iTagHdrId;
+		/** The number of TTag elements in the array associated with this TTagHeader. */
+		TUint16 iNumTags;
+	};
+
+	/**
+	 * Enumeration used to identify TDataSourceTagHeader structures, TDataSourceTagHeader::iTagHdrId elements take
+	 * these enumerators as values.
+	 * @see TDataSourceTagHeader
+	 */
+	enum TDataSourceTagHeaderId
+	{
+		ETagHeaderIdCore = 0,            /**< Identifies a TTagHeader with associated TTag elements with iTagId values from TDataSourceFunctionalityCore. */
+		/**
+		 * @internalTechnology
+		 */
+		ELast
+	};
+
+};
+
+#endif // CRASH_DATA_SOURCE_H