dbgagents/trkagent/eka2driver/TrkKernelDriver.h
author bdonegan
Thu, 30 Sep 2010 16:15:48 +0100
changeset 3 b667e5204120
parent 0 c6b0df440bee
permissions -rw-r--r--
Remove reference to cinidata in order to allow TrkEngine to build

/*
* Copyright (c) 2004 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: 
*
*/


#ifndef __TRKKERNELDRIVER_H__
#define __TRKKERNELDRIVER_H__

//
// class TCapsMetroTrkDriver
//
class TCapsMetroTrkDriver
{
public:
	TVersion	iVersion;
};


//
// class SEventInfo
//
class SEventInfo
{
public:

	enum TEventType
	{
		EUnknown = -1,
	    EThreadBreakPoint,
	    EThreadException,
	    EThreadPanic,
	    EProcessPanic,
	    ELibraryLoaded,
	    ELibraryUnloaded,
	    EUserTrace,
	    EProcessAdded
	};

	inline SEventInfo() { Reset(); };

	inline void Reset() { iProcessId = 0;
						  iThreadId = 0;
						  iCurrentPC = 0;
						  iExceptionNumber = 0;
						  iFileName.FillZ();
						  iPanicCategory.FillZ();
						  iCodeAddress = 0;
						  iDataAddress = 0;
						  iEventType = EUnknown; 
						  iTraceData.FillZ();
						  iTraceDataLen = 0; 
						  iPanicReason = 0; 
						  iUid = 0; 
						  };
public:

    TUint32 				iProcessId;
    TUint32 				iThreadId;
    TUint32					iCurrentPC;
    TInt					iExceptionNumber; // from TExcType
    TBuf8<KMaxName>			iFileName;
    TBuf8<KMaxName>			iPanicCategory;
	TUint32					iCodeAddress;
	TUint32					iDataAddress;
    TEventType				iEventType;
    TBuf8<260>				iTraceData;
    TInt					iTraceDataLen;
    // START_PANIC
    TInt					iPanicReason;
    // END_PANIC
    TUint32 				iUid;
};


//
// class TMetroTrkBreakInfo
//
class TMetroTrkBreakInfo
{
public:

	inline TMetroTrkBreakInfo(const TUint32 aAddress, const TBool aThumbMode, TInt32 *aId, const TUint32 aProcessId)
				: iAddress(aAddress),
				  iThumbMode(aThumbMode),
				  iId(aId),
				  iProcessId(aProcessId) {};

public:

	TUint32 iAddress;
	TBool iThumbMode;
	TInt32* iId;
	TUint32 iProcessId;
};


//
// class TMetroTrkMemoryInfo
//
class TMetroTrkMemoryInfo
{
public:

	inline TMetroTrkMemoryInfo(const TUint32 aAddress, const TInt32 aLength, TDesC8 *aData)
				: iAddress(aAddress),
				  iLength(aLength),
				  iData(aData) {};
	
public:

	TUint32 iAddress;
	TInt16	iLength;
	TDesC8*	iData;
};


//
// class TMetroTrkRegisterInfo
//
class TMetroTrkRegisterInfo
{
public:

	inline TMetroTrkRegisterInfo(const TInt16 aFirstRegister, const TInt16 aLastRegister, TDesC8 *aValues)
				: iFirstRegister(aFirstRegister),
				  iLastRegister(aLastRegister),
				  iValues(aValues) {};
	
public:

	TInt16	iFirstRegister;
	TInt16	iLastRegister;
	TDesC8*	iValues;
};


//
// class TMetroTrkTaskInfo
//
class TMetroTrkTaskInfo
{
public:

	inline TMetroTrkTaskInfo(TUint32 aOtherId)
				: iId(0),
				  iOtherId(aOtherId),
				  iPriority(0) { iName.FillZ(); };

public:

	TUint32 iId;
	TUint32 iOtherId;
	TUint32 iPriority;	
	TBuf8<KMaxName> iName;
};


//
// class TMetroTrkStepInfo
//
class TMetroTrkStepInfo
{
public:

	inline TMetroTrkStepInfo(const TUint32 aStartAddress, const TUint32 aStopAddress, const TBool aStepInto)
				: iStartAddress(aStartAddress),
				  iStopAddress(aStopAddress),
				  iStepInto(aStepInto) {};

public:

	TUint32 iStartAddress;
	TUint32 iStopAddress;
	TBool iStepInto;
};


//
// class TMetroTrkDriverInfo
//
class TMetroTrkDriverInfo
{
public:

	TUint32 iPanic1Address;
	TUint32 iPanic2Address;
	TUint32 iException1Address;
	TUint32 iException2Address;
	TUint32 iLibraryLoadedAddress;
	TUint32 iUserLibraryEnd;
};


//
// class TMetroTrkProcessInfo
//
class TMetroTrkProcessInfo
{
public:

	inline TMetroTrkProcessInfo(TUint32 *aCodeAddress, TUint32 *aDataAddress)
				: iCodeAddress(aCodeAddress),
				  iDataAddress(aDataAddress) {};

public:

	TUint32* iCodeAddress;
	TUint32* iDataAddress;
};

class TMetroTrkLibInfo
{
public:

	inline TMetroTrkLibInfo(TUint32 aLength, TDesC8* aFileName)
				: iCodeAddress(0xFFFFFFFF),
				  iDataAddress(0xFFFFFFFF),
				  iAttachProcessId(0),
				  iAttachThreadId(0),
				  iFileNameLength(aLength),
				  iFileName(aFileName)
				  {};
	
public:
	//TBuf8<KMaxFileName> iFileName;
	TUint32 iCodeAddress;
	TUint32 iDataAddress;
	TUint32 iAttachProcessId;
	TUint32 iAttachThreadId;
	TUint32 iFileNameLength;
	TDesC8* iFileName;		
};

class TMetroTrkExeInfo
{
public:

	inline TMetroTrkExeInfo(TUint32 aUid, TUint32 aLength, TDesC8* aFileName)
				: iProcessID(0),
				  iThreadID(0),
				  iUid(aUid),
				  iCodeAddress(0xFFFFFFFF),
				  iDataAddress(0xFFFFFFFF),
				  iFileNameLength(aLength),
				  iFileName(aFileName)
				  {};
	
public:
	TUint32 iProcessID;
	TUint32 iThreadID;
	TUint32 iUid;
	TUint32 iCodeAddress;
	TUint32 iDataAddress;
	TUint32 iFileNameLength;
	TDesC8* iFileName;		
};

class TMetroTrkProcUidInfo
{
public:
	inline TMetroTrkProcUidInfo(TUint32 aProcID)
				: iProcessID(aProcID),				  
				  iUid1(0),
				  iUid2(0),
				  iUid3(0),
				  iSecurID(0),
				  iVendorID(0)
				  {};
	
public:
	TUint32 iProcessID;
	TUint32 iUid1;
	TUint32 iUid2;
	TUint32 iUid3;
	TUint32 iSecurID;
	TUint32 iVendorID;
};

class TTrkLibName
{
	public:
		inline TTrkLibName() { iName.FillZ(); iEmptySlot = ETrue;};
		inline TTrkLibName(TDesC8 aName) { iName.Copy(aName); iEmptySlot = EFalse; };

		TBuf8<KMaxLibraryName> iName;
		TBool iEmptySlot;
};

//
// class RMetroTrkDriver
//
class RMetroTrkDriver : public RBusLogicalChannel
{
public:

	enum TControl
	{
		EControlSetBreak = 0,
		EControlClearBreak,
		EControlChangeBreakThread,
		EControlSuspendThread,
		EControlResumeThread,
		EControlStepRange,
		EControlReadMemory,
		EControlWriteMemory,
		EControlReadRegisters,
		EControlWriteRegisters,
		EControlGetProcessInfo,
		EControlGetThreadInfo,
		EControlGetProcessAddresses,
		EControlGetStaticLibraryInfo,
		EControlEnableLibLoadedEvent,
		EControlDisableLibLoadedEvent,
		EControlGetLibraryInfo,
		EControlGetExeInfo,
		EControlGetProcUidInfo,
		EControlDetachProcess
	};
	
	enum TRequest
	{
		ERequestGetEvent=0x0, ERequestGetEventCancel=0x1
	};	
		
public:

	inline TInt Open(const TMetroTrkDriverInfo aDriverInfo);
	inline TInt	SetBreak(const TUint32 aProcessId, const TUint32 aThreadId, const TUint32 aAddr, const TBool aThumbMode, TInt32 &aId);
	inline TInt	ClearBreak(const TInt32 aId);
	inline TInt	ChangeBreakThread(const TUint32 aThreadId, const TInt32 aId);
	inline TInt	SuspendThread(const TUint32 aThreadId);
	inline TInt	ResumeThread(const TUint32 aThreadId);
	inline TInt	StepRange(const TUint32 aThreadId, const TUint32 aStartAddress, const TUint32 aStopAddress, TBool aStepInto);
	inline TInt ReadMemory(const TUint32 aThreadId, const TUint32 aAddress, const TInt16 aLength, TDes8 &aData);
	inline TInt WriteMemory(const TUint32 aThreadId, const TUint32 aAddress, const TInt16 aLength, TDesC8 &aData);
	inline TInt ReadRegisters(const TUint32 aThreadId, const TInt32 aFirstRegister, const TInt32 aLastRegister, TDes8 &aValues);
	inline TInt WriteRegisters(const TUint32 aThreadId, const TInt32 aFirstRegister, const TInt32 aLastRegister, TDesC8 &aValues);
	inline void GetEvent(TRequestStatus &aStatus, SEventInfo &aEventInfo);
	inline void CancelGetEvent();
	inline TInt GetProcessInfo(const TInt aIndex, TMetroTrkTaskInfo &aInfo);
	inline TInt GetThreadInfo(const TInt aIndex, TMetroTrkTaskInfo &aInfo);
	inline TInt GetProcessAddresses(const TUint32 aThreadId, TUint32 &aCodeAddress, TUint32 &aDataAddress);
	inline TInt GetStaticLibraryInfo(const TInt aIndex, SEventInfo &aInfo);
	inline TInt EnableLibLoadedEvent();
	inline TInt DisableLibLoadedEvent();
	inline TInt GetLibraryInfo(TMetroTrkLibInfo &aInfo);
	inline TInt GetExeInfo(TMetroTrkExeInfo &aInfo);
	inline TInt GetProcUidInfo(TMetroTrkProcUidInfo &aInfo);
	inline TInt DetachProcess(const TUint32 &aProcessId);

};


_LIT(KMetroTrkDriverName,"Trk Driver");

// Version information
const TInt KMajorVersionNumber=2;
const TInt KMinorVersionNumber=0;
const TInt KBuildVersionNumber=3;


inline TInt RMetroTrkDriver::Open(const TMetroTrkDriverInfo aDriverInfo)
{
	TBuf8<32> buf;
	buf.Append((TUint8*)&aDriverInfo.iPanic1Address, 4);
	buf.Append((TUint8*)&aDriverInfo.iPanic2Address, 4);
	buf.Append((TUint8*)&aDriverInfo.iException1Address, 4);
	buf.Append((TUint8*)&aDriverInfo.iException2Address, 4);
	buf.Append((TUint8*)&aDriverInfo.iLibraryLoadedAddress, 4);
	buf.Append((TUint8*)&aDriverInfo.iUserLibraryEnd, 4);
	
	#ifdef EKA2
	return DoCreate(KMetroTrkDriverName, TVersion(KMajorVersionNumber, KMinorVersionNumber, KBuildVersionNumber), KNullUnit, NULL, &buf);
	#else
	return DoCreate(KMetroTrkDriverName, TVersion(KMajorVersionNumber, KMinorVersionNumber, KBuildVersionNumber), NULL, KNullUnit, NULL, &buf);
	#endif
}

inline TInt RMetroTrkDriver::SetBreak(const TUint32 aProcessId, const TUint32 aThreadId, const TUint32 aAddr, const TBool aThumbMode, TInt32 &aId)
{
	TMetroTrkBreakInfo info(aAddr, aThumbMode, &aId, aProcessId);
	return DoSvControl(EControlSetBreak, reinterpret_cast<TAny*>(aThreadId), (TAny*)&info);
}

inline TInt RMetroTrkDriver::ClearBreak(const TInt32 aId)
{
	return DoSvControl(EControlClearBreak, reinterpret_cast<TAny*>(aId));
}

inline TInt RMetroTrkDriver::ChangeBreakThread(const TUint32 aThreadId, const TInt32 aId)
{
	return DoControl(EControlChangeBreakThread, reinterpret_cast<TAny*>(aThreadId), reinterpret_cast<TAny*>(aId));
}

inline TInt RMetroTrkDriver::SuspendThread(const TUint32 aThreadId)
{
	return DoControl(EControlSuspendThread, reinterpret_cast<TAny*>(aThreadId));
}

inline TInt RMetroTrkDriver::ResumeThread(const TUint32 aThreadId)
{
	return DoSvControl(EControlResumeThread, reinterpret_cast<TAny*>(aThreadId));
}

inline TInt RMetroTrkDriver::StepRange(const TUint32 aThreadId, const TUint32 aStartAddress, const TUint32 aStopAddress, TBool aStepInto)
{
	TMetroTrkStepInfo info(aStartAddress, aStopAddress, aStepInto);
	return DoSvControl(EControlStepRange, reinterpret_cast<TAny*>(aThreadId), (TAny*)&info);
}

inline TInt RMetroTrkDriver::ReadMemory(const TUint32 aThreadId, const TUint32 aAddress, const TInt16 aLength, TDes8 &aData)
{
	TMetroTrkMemoryInfo info(aAddress, aLength, &aData);
	return DoControl(EControlReadMemory, reinterpret_cast<TAny*>(aThreadId), (TAny*)&info);
}

inline TInt RMetroTrkDriver::WriteMemory(const TUint32 aThreadId, const TUint32 aAddress, const TInt16 aLength, TDesC8 &aData)
{
	TMetroTrkMemoryInfo info(aAddress, aLength, &aData);
	return DoControl(EControlWriteMemory, reinterpret_cast<TAny*>(aThreadId), (TAny*)&info);
}

inline TInt RMetroTrkDriver::ReadRegisters(const TUint32 aThreadId, const TInt32 aFirstRegister, const TInt32 aLastRegister, TDes8 &aValues)
{
	TMetroTrkRegisterInfo info(aFirstRegister, aLastRegister, &aValues);
	return DoControl(EControlReadRegisters, reinterpret_cast<TAny*>(aThreadId), (TAny*)&info);
}

inline TInt RMetroTrkDriver::WriteRegisters(const TUint32 aThreadId, const TInt32 aFirstRegister, const TInt32 aLastRegister, TDesC8 &aValues)
{
	TMetroTrkRegisterInfo info(aFirstRegister, aLastRegister, &aValues);
	return DoControl(EControlWriteRegisters, reinterpret_cast<TAny*>(aThreadId), (TAny*)&info);
}

inline void RMetroTrkDriver::GetEvent(TRequestStatus &aStatus, SEventInfo &aEventInfo)
{
	DoRequest(ERequestGetEvent, aStatus, (TAny*)&aEventInfo);
}

inline void RMetroTrkDriver::CancelGetEvent()
{
	DoCancel(ERequestGetEventCancel);
}

inline TInt RMetroTrkDriver::GetProcessInfo(const TInt aIndex, TMetroTrkTaskInfo &aInfo)
{
	return DoControl(EControlGetProcessInfo, reinterpret_cast<TAny*>(aIndex), (TAny*)&aInfo);
}

inline TInt RMetroTrkDriver::GetThreadInfo(const TInt aIndex, TMetroTrkTaskInfo &aInfo)
{
	return DoControl(EControlGetThreadInfo, reinterpret_cast<TAny*>(aIndex), (TAny*)&aInfo);
}

inline TInt RMetroTrkDriver::GetProcessAddresses(const TUint32 aThreadId, TUint32 &aCodeAddress, TUint32 &aDataAddress)
{
	TMetroTrkProcessInfo info(&aCodeAddress, &aDataAddress);
	return DoControl(EControlGetProcessAddresses, reinterpret_cast<TAny*>(aThreadId), (TAny*)&info);
}

inline TInt RMetroTrkDriver::GetStaticLibraryInfo(const TInt aIndex, SEventInfo &aInfo)
{
	return DoControl(EControlGetStaticLibraryInfo, reinterpret_cast<TAny*>(aIndex), (TAny*)&aInfo);
}

inline TInt RMetroTrkDriver::EnableLibLoadedEvent()
{
	return DoControl(EControlEnableLibLoadedEvent);
}

inline TInt RMetroTrkDriver::DisableLibLoadedEvent()
{
	return DoControl(EControlDisableLibLoadedEvent);
}

inline TInt RMetroTrkDriver::GetLibraryInfo(TMetroTrkLibInfo &aInfo)
{
	return DoControl(EControlGetLibraryInfo, (TAny*)&aInfo);
}

inline TInt RMetroTrkDriver::GetExeInfo(TMetroTrkExeInfo &aInfo)
{
	return DoControl(EControlGetExeInfo, (TAny*)&aInfo);
}

inline TInt RMetroTrkDriver::GetProcUidInfo(TMetroTrkProcUidInfo &aInfo)
{
	return DoControl(EControlGetProcUidInfo, (TAny*)&aInfo);
}

inline TInt RMetroTrkDriver::DetachProcess(const TUint32 &aProcessId)
{
    return DoControl(EControlDetachProcess, (TAny*)&aProcessId);
}
#endif // __TRKKERNELDRIVER_H__