sl@0: // Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of the License "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // sl@0: sl@0: sl@0: sl@0: /** sl@0: @file sl@0: @internalTechnology sl@0: @released sl@0: */ sl@0: sl@0: #ifndef __RM_DEBUG_KERNELDRIVER_H__ sl@0: #define __RM_DEBUG_KERNELDRIVER_H__ sl@0: sl@0: #include sl@0: sl@0: /** sl@0: Used to store a value read from or written to an ARM register sl@0: */ sl@0: typedef TUint32 T4ByteRegisterValue; sl@0: sl@0: sl@0: /** sl@0: Provides static methods for accessing the information stored in a TRegisterInfo sl@0: object. sl@0: */ sl@0: class Register sl@0: { sl@0: public: sl@0: static TBool IsCoreReg(const Debug::TRegisterInfo aRegister); sl@0: static TBool IsCoproReg(const Debug::TRegisterInfo aRegister); sl@0: static TUint32 GetCoreRegId(const Debug::TRegisterInfo aRegister); sl@0: static TUint32 GetCRm(const Debug::TRegisterInfo aRegister); sl@0: static TUint32 GetCRn(const Debug::TRegisterInfo aRegister); sl@0: static TUint32 GetOpcode1(const Debug::TRegisterInfo aRegister); sl@0: static TUint32 GetOpcode2(const Debug::TRegisterInfo aRegister); sl@0: static TUint32 GetCoproNum(const Debug::TRegisterInfo aRegister); sl@0: }; sl@0: sl@0: /** sl@0: Identify whether aRegister is a core register sl@0: @param aRegister register ID to analyse sl@0: @return ETrue if core register, EFalse otherwise sl@0: */ sl@0: inline TBool Register::IsCoreReg(const Debug::TRegisterInfo aRegister) sl@0: { sl@0: return ((aRegister & 0xff) == 0x0); sl@0: } sl@0: sl@0: /** sl@0: Identify whether aRegister is a coprocessor register sl@0: @param aRegister register ID to analyse sl@0: @return ETrue if coprocessor register, EFalse otherwise sl@0: */ sl@0: inline TBool Register::IsCoproReg(const Debug::TRegisterInfo aRegister) sl@0: { sl@0: return ((aRegister & 0xff) == 0x1); sl@0: } sl@0: sl@0: /** sl@0: Get the ID of the core register sl@0: @param aRegister register ID to analyse sl@0: @return ID of the core register sl@0: */ sl@0: inline TUint32 Register::GetCoreRegId(const Debug::TRegisterInfo aRegister) sl@0: { sl@0: return ((aRegister >> 8) & 0xff); sl@0: } sl@0: sl@0: /** sl@0: Get the CRm value of a coprocessor register sl@0: @param aRegister register ID to analyse sl@0: @return the CRm value of a coprocessor register sl@0: */ sl@0: inline TUint32 Register::GetCRm(const Debug::TRegisterInfo aRegister) sl@0: { sl@0: return ((aRegister >> 16) & 0xf); sl@0: } sl@0: sl@0: /** sl@0: Get the CRm value of a coprocessor register sl@0: @param aRegister register ID to analyse sl@0: @return the CRm value of a coprocessor register sl@0: */ sl@0: inline TUint32 Register::GetCRn(const Debug::TRegisterInfo aRegister) sl@0: { sl@0: return ((aRegister >> 20) & 0xf); sl@0: } sl@0: sl@0: /** sl@0: Get the Opcode1 value of a coprocessor register sl@0: @param aRegister register ID to analyse sl@0: @return the Opcode1 value of a coprocessor register sl@0: */ sl@0: inline TUint32 Register::GetOpcode1(const Debug::TRegisterInfo aRegister) sl@0: { sl@0: return ((aRegister >> 24) & 0x8); sl@0: } sl@0: sl@0: /** sl@0: Get the Opcode2 value of a coprocessor register sl@0: @param aRegister register ID to analyse sl@0: @return the Opcode2 value of a coprocessor register sl@0: */ sl@0: inline TUint32 Register::GetOpcode2(const Debug::TRegisterInfo aRegister) sl@0: { sl@0: return ((aRegister >> 27) & 0x8); sl@0: } sl@0: sl@0: /** sl@0: Get the coprocessor number of a coprocessor register sl@0: @param aRegister register ID to analyse sl@0: @return the coprocessor number of a coprocessor register sl@0: */ sl@0: inline TUint32 Register::GetCoproNum(const Debug::TRegisterInfo aRegister) sl@0: { sl@0: return ((aRegister >> 8) & 0xff); sl@0: } sl@0: sl@0: // sl@0: // class TCapsRM_DebugDriver sl@0: // sl@0: class TCapsRM_DebugDriver sl@0: { sl@0: public: sl@0: TVersion iVersion; sl@0: }; sl@0: sl@0: /** sl@0: Stores listings information for passing between the DSS and the kernel driver sl@0: */ sl@0: class TListInformation sl@0: { sl@0: public: sl@0: inline TListInformation(const Debug::TListId aType=(Debug::TListId)NULL, const Debug::TListScope aListScope=(Debug::TListScope)NULL, TDes8* aBuffer=NULL, TUint32* aDataSize=NULL, TUint64 aTargetId=0) sl@0: : iType(aType), sl@0: iListScope(aListScope), sl@0: iBuffer(aBuffer), sl@0: iDataSize(aDataSize), sl@0: iTargetId(aTargetId) {}; sl@0: public: sl@0: Debug::TListId iType; sl@0: Debug::TListScope iListScope; sl@0: TDes8* iBuffer; sl@0: TUint32* iDataSize; sl@0: TUint64 iTargetId; sl@0: }; sl@0: sl@0: /** sl@0: Data structure to hold information to the crash flash sl@0: (Possibly: Could be expanded to hold on configuration data too) sl@0: */ sl@0: class TFlashInfo sl@0: { sl@0: public: sl@0: inline TFlashInfo(TUint32 aPos, TUint32* aSize, TDes8* aData) sl@0: :iPos(aPos), sl@0: iSize(aSize), sl@0: iData(aData){}; sl@0: public: sl@0: TUint32 iPos; sl@0: TUint32* iSize; sl@0: TDes8* iData; sl@0: }; sl@0: // sl@0: // class TRM_DebugMemoryInfo sl@0: // sl@0: class TRM_DebugMemoryInfo sl@0: { sl@0: public: sl@0: sl@0: inline TRM_DebugMemoryInfo(const TUint32 aAddress, const TUint32 aLength, TDesC8 *aData) sl@0: : iAddress(aAddress), sl@0: iLength(aLength), sl@0: iData(aData) {}; sl@0: sl@0: public: sl@0: sl@0: TUint32 iAddress; sl@0: TUint32 iLength; sl@0: TDesC8* iData; sl@0: }; sl@0: sl@0: sl@0: /** sl@0: @deprecated sl@0: This class is only used by TRK phase 1 functions. sl@0: sl@0: @see TRM_DebugRegisterInformation which offers similar storage suitable for use sl@0: with the TRK pahse 2 API. sl@0: */ sl@0: class TRM_DebugRegisterInfo sl@0: { sl@0: public: sl@0: sl@0: inline TRM_DebugRegisterInfo(const TInt16 aFirstRegister, const TInt16 aLastRegister, TDesC8 *aValues) sl@0: : iFirstRegister(aFirstRegister), sl@0: iLastRegister(aLastRegister), sl@0: iValues(aValues) {}; sl@0: sl@0: public: sl@0: sl@0: TInt16 iFirstRegister; sl@0: TInt16 iLastRegister; sl@0: TDesC8* iValues; sl@0: }; sl@0: sl@0: /** sl@0: Structure used to store information about registers sl@0: */ sl@0: class TRM_DebugRegisterInformation sl@0: { sl@0: public: sl@0: sl@0: inline TRM_DebugRegisterInformation(const TDes8 *aRegisterIds=NULL, TDes8 *aRegisterValues=NULL, TDes8 *aRegisterFlags=NULL) sl@0: : iRegisterIds(aRegisterIds), sl@0: iRegisterValues(aRegisterValues), sl@0: iRegisterFlags(aRegisterFlags) {}; sl@0: sl@0: public: sl@0: sl@0: const TDes8* iRegisterIds; sl@0: TDes8* iRegisterValues; sl@0: TDes8* iRegisterFlags; sl@0: }; sl@0: sl@0: // sl@0: // class TRM_DebugTaskInfo sl@0: // sl@0: class TRM_DebugTaskInfo sl@0: { sl@0: public: sl@0: sl@0: inline TRM_DebugTaskInfo(TUint32 aOtherId) sl@0: : iId(0), sl@0: iOtherId(aOtherId), sl@0: iPriority(0) { iName.FillZ(); }; sl@0: sl@0: public: sl@0: sl@0: TUint32 iId; sl@0: TUint32 iOtherId; sl@0: TUint32 iPriority; sl@0: TBuf8 iName; sl@0: }; sl@0: sl@0: // sl@0: // class TRM_DebugStepInfo sl@0: // sl@0: class TRM_DebugStepInfo sl@0: { sl@0: public: sl@0: sl@0: inline TRM_DebugStepInfo(const TUint32 aStartAddress, const TUint32 aStopAddress, const TBool aStepInto) sl@0: : iStartAddress(aStartAddress), sl@0: iStopAddress(aStopAddress), sl@0: iStepInto(aStepInto) {}; sl@0: sl@0: public: sl@0: sl@0: TUint32 iStartAddress; sl@0: TUint32 iStopAddress; sl@0: TBool iStepInto; sl@0: }; sl@0: sl@0: sl@0: // sl@0: // class TRM_DebugDriverInfo sl@0: // sl@0: class TRM_DebugDriverInfo sl@0: { sl@0: public: sl@0: sl@0: TUint32 iPanic1Address; sl@0: TUint32 iPanic2Address; sl@0: TUint32 iException1Address; sl@0: TUint32 iException2Address; sl@0: TUint32 iLibraryLoadedAddress; sl@0: TUint32 iUserLibraryEnd; sl@0: }; sl@0: sl@0: sl@0: // sl@0: // class TRM_DebugProcessInfo sl@0: // sl@0: class TRM_DebugProcessInfo sl@0: { sl@0: public: sl@0: sl@0: inline TRM_DebugProcessInfo(TUint32 *aCodeAddress, TUint32 *aDataAddress) sl@0: : iCodeAddress(aCodeAddress), sl@0: iDataAddress(aDataAddress) {}; sl@0: sl@0: public: sl@0: sl@0: TUint32* iCodeAddress; sl@0: TUint32* iDataAddress; sl@0: }; sl@0: sl@0: // sl@0: // class TRM_DebugEventActionInfo sl@0: // sl@0: class TRM_DebugEventActionInfo sl@0: { sl@0: public: sl@0: inline TRM_DebugEventActionInfo(TUint32 aEvent, TUint32 aAction, TUint64 aAgentId) sl@0: : iEvent(aEvent), sl@0: iAction(aAction), sl@0: iAgentId(aAgentId) {}; sl@0: public: sl@0: TUint32 iEvent; sl@0: TUint32 iAction; sl@0: TUint64 iAgentId; sl@0: }; sl@0: sl@0: // sl@0: // class TRM_DebugEventInfo sl@0: // sl@0: class TRM_DebugEventInfo sl@0: { sl@0: public: sl@0: inline TRM_DebugEventInfo(TDesC8& aProcessName, TUint32& aBufSize) sl@0: : iProcessName(aProcessName), sl@0: iBufSize(aBufSize) {}; sl@0: sl@0: public: sl@0: TDesC8& iProcessName; sl@0: TUint32& iBufSize; sl@0: }; sl@0: sl@0: // sl@0: // class TRMD_DebugAgentId sl@0: // sl@0: class TRM_DebugAgentId sl@0: { sl@0: public: sl@0: inline TRM_DebugAgentId(TUint64 aAgentId) sl@0: : iAgentId(aAgentId) {}; sl@0: sl@0: public: sl@0: TUint64 iAgentId; sl@0: }; sl@0: sl@0: // sl@0: // Class TRMD_DebugCancelInfo sl@0: // sl@0: class TRMD_DebugCancelInfo sl@0: { sl@0: public: sl@0: inline TRMD_DebugCancelInfo(TUint32 aCancelRequest,TDesC8& aProcessName, TUint64 aAgentId) sl@0: : iCancelRequest(aCancelRequest), sl@0: iProcessName(aProcessName), sl@0: iAgentId(aAgentId) {}; sl@0: sl@0: inline TRMD_DebugCancelInfo(void) sl@0: : iCancelRequest(0), sl@0: iAgentId(0) sl@0: { sl@0: }; sl@0: sl@0: public: sl@0: TUint32 iCancelRequest; sl@0: TBuf8 iProcessName; sl@0: TUint64 iAgentId; sl@0: }; sl@0: sl@0: class TEventMetaData sl@0: { sl@0: public: sl@0: TBuf8 iTargetProcessName; sl@0: TUint64 iDebugAgentProcessId; sl@0: }; sl@0: sl@0: /** sl@0: @internalComponent sl@0: */ sl@0: class TSetBreakInfo sl@0: { sl@0: public: sl@0: sl@0: inline TSetBreakInfo(Debug::TBreakId* aBreakId, sl@0: TUint64 aId,\ sl@0: TUint32 aAddress,\ sl@0: Debug::TArchitectureMode aMode, sl@0: TBool aThreadSpecific) sl@0: : iBreakId(aBreakId), sl@0: iId(aId), sl@0: iAddress(aAddress), sl@0: iMode(aMode), sl@0: iThreadSpecific(aThreadSpecific) {}; sl@0: sl@0: inline TSetBreakInfo(void) sl@0: : iBreakId((Debug::TBreakId*)0), sl@0: iId(0), sl@0: iAddress(0), sl@0: iMode(Debug::EArmMode), sl@0: iThreadSpecific(ETrue) {}; sl@0: sl@0: sl@0: public: sl@0: Debug::TBreakId* iBreakId; sl@0: TUint64 iId; sl@0: TUint32 iAddress; sl@0: Debug::TArchitectureMode iMode; sl@0: TBool iThreadSpecific; sl@0: }; sl@0: sl@0: /** sl@0: @internalComponent sl@0: */ sl@0: class TModifyBreakInfo sl@0: { sl@0: public: sl@0: sl@0: inline TModifyBreakInfo(Debug::TBreakId aBreakId,\ sl@0: const TUint64 aThreadId,\ sl@0: const TUint32 aAddress,\ sl@0: const Debug::TArchitectureMode aMode) sl@0: : iBreakId(aBreakId), sl@0: iThreadId(aThreadId), sl@0: iAddress(aAddress), sl@0: iMode(aMode) {}; sl@0: sl@0: public: sl@0: const Debug::TBreakId iBreakId; sl@0: const TUint64 iThreadId; sl@0: const TUint32 iAddress; sl@0: const Debug::TArchitectureMode iMode; sl@0: }; sl@0: sl@0: /** sl@0: @internalComponent sl@0: */ sl@0: class TModifyProcessBreakInfo sl@0: { sl@0: public: sl@0: sl@0: inline TModifyProcessBreakInfo(Debug::TBreakId aBreakId,\ sl@0: const TUint64 aProcessId,\ sl@0: const TUint32 aAddress,\ sl@0: const Debug::TArchitectureMode aMode) sl@0: : iBreakId(aBreakId), sl@0: iProcessId(aProcessId), sl@0: iAddress(aAddress), sl@0: iMode(aMode) {}; sl@0: sl@0: public: sl@0: const Debug::TBreakId iBreakId; sl@0: const TUint64 iProcessId; sl@0: const TUint32 iAddress; sl@0: const Debug::TArchitectureMode iMode; sl@0: }; sl@0: sl@0: /** sl@0: @internalComponent sl@0: */ sl@0: class TGetBreakInfo sl@0: { sl@0: public: sl@0: sl@0: inline TGetBreakInfo(Debug::TBreakId aBreakId,\ sl@0: TUint64& aId,\ sl@0: TUint32& aAddress,\ sl@0: Debug::TArchitectureMode& aMode, sl@0: TBool& aThreadSpecific) sl@0: : iBreakId(aBreakId), sl@0: iId(&aId), sl@0: iAddress(&aAddress), sl@0: iMode(&aMode), sl@0: iThreadSpecific(&aThreadSpecific) {}; sl@0: sl@0: inline TGetBreakInfo() sl@0: : iBreakId((Debug::TBreakId)0), sl@0: iId((TUint64*)0), sl@0: iAddress((TUint32*)0), sl@0: iMode((Debug::TArchitectureMode*)0), sl@0: iThreadSpecific((TBool*)0) {}; sl@0: sl@0: public: sl@0: const Debug::TBreakId iBreakId; sl@0: TUint64* iId; sl@0: TUint32* iAddress; sl@0: Debug::TArchitectureMode* iMode; sl@0: TBool* iThreadSpecific; sl@0: }; sl@0: sl@0: // sl@0: // class RRM_DebugDriver sl@0: // sl@0: class RRM_DebugDriver : public RBusLogicalChannel sl@0: { sl@0: public: sl@0: sl@0: enum TControl sl@0: { sl@0: EControlSetBreak = 0, sl@0: EControlClearBreak, sl@0: EControlModifyBreak, sl@0: EControlBreakInfo, sl@0: EControlSuspendThread, sl@0: EControlResumeThread, sl@0: EControlStepRange, sl@0: EControlReadMemory, sl@0: EControlWriteMemory, sl@0: EControlReadRegisters, sl@0: EControlWriteRegisters, sl@0: EControlGetStaticLibraryInfo, sl@0: EControlGetDebugFunctionalityBufSize, sl@0: EControlGetDebugFunctionality, sl@0: EControlReadRegistersLegacy, sl@0: EControlWriteRegistersLegacy, sl@0: EControlGetMemoryOperationMaxBlockSize, sl@0: EControlAttachProcess, sl@0: EControlDetachProcess, sl@0: EControlDetachAgent, sl@0: EControlSetEventAction, sl@0: EControlGetList, sl@0: EControlStep, sl@0: EControlIsDebuggable, sl@0: EControlKillProcess, sl@0: EControlModifyProcessBreak, sl@0: }; sl@0: sl@0: enum TRequest sl@0: { sl@0: ERequestGetEvent=0x0, ERequestGetEventCancel=0x1 sl@0: }; sl@0: sl@0: public: sl@0: sl@0: inline TInt Open(const TRM_DebugDriverInfo aDriverInfo); sl@0: sl@0: inline TInt SetBreak(Debug::TBreakId &aBreakId,const TUint32 aThreadId, const TUint32 aAddress, const Debug::TArchitectureMode aThumbMode ); sl@0: inline TInt SetProcessBreak(Debug::TBreakId &aBreakId,const TUint32 aProcessId, const TUint32 aAddress, const Debug::TArchitectureMode aThumbMode ); sl@0: sl@0: inline TInt ClearBreak(const TInt32 aBreakId); sl@0: sl@0: inline TInt ModifyBreak(const Debug::TBreakId aBreakId, const TUint32 aThreadId, const TUint32 aAddress, const Debug::TArchitectureMode aArchitectureMode ); sl@0: inline TInt ModifyProcessBreak(const Debug::TBreakId aBreakId, const TUint32 aProcessId, const TUint32 aAddress, const Debug::TArchitectureMode aArchitectureMode ); sl@0: sl@0: inline TInt BreakInfo(const Debug::TBreakId aBreakId, TUint64& aId, TUint32& aAddress, Debug::TArchitectureMode& aMode, TBool& aThreadSpecific); sl@0: sl@0: inline TInt SuspendThread(const TUint32 aThreadId); sl@0: inline TInt ResumeThread(const TUint32 aThreadId); sl@0: inline TInt StepRange(const TUint32 aThreadId, const TUint32 aStartAddress, const TUint32 aStopAddress, TBool aStepInto); sl@0: inline TInt ReadMemory(const TUint32 aThreadId, const TUint32 aAddress, const TUint32 aLength, TDes8 &aData); sl@0: inline TInt WriteMemory(const TUint32 aThreadId, const TUint32 aAddress, const TUint32 aLength, const TDesC8 &aData); sl@0: inline TInt ReadRegisters(const TUint32 aThreadId, const TDes8 &aRegisterIds, TDes8 &aRegisterValues, TDes8 &aRegisterFlags); sl@0: inline TInt WriteRegisters(const TUint32 aThreadId, const TDes8 &aRegisterIds, const TDes8 &aRegisterValues, TDes8 &aRegisterFlags); sl@0: inline TInt ReadRegisters(const TUint32 aThreadId, const TInt32 aFirstRegister, const TInt32 aLastRegister, TDes8 &aValues); sl@0: inline TInt WriteRegisters(const TUint32 aThreadId, const TInt32 aFirstRegister, const TInt32 aLastRegister, TDesC8 &aValues); sl@0: inline void GetEvent(TDesC8& aProcessName, TUint64 aAgentId, TRequestStatus &aStatus, Debug::TEventInfo &aEventInfo); sl@0: inline void CancelGetEvent(TDesC8& aProcessName, TUint64 aAgentId); sl@0: // inline TInt GetProcessInfo(const TInt aIndex, TRM_DebugTaskInfo &aInfo); sl@0: // inline TInt GetThreadInfo(const TInt aIndex, TRM_DebugTaskInfo &aInfo); sl@0: inline TInt GetStaticLibraryInfo(const TInt aIndex, Debug::TEventInfo &aInfo); sl@0: inline TInt GetDebugFunctionalityBufSize(TUint32 &aBufSize); sl@0: inline TInt GetDebugFunctionality(TDes8& aDebugFunctionality); sl@0: inline TInt GetMemoryOperationMaxBlockSize(TUint32 &aMaxSize); sl@0: inline TInt AttachProcess(TDesC8& aProcessName, TUint64 aAgentId); sl@0: inline TInt DetachProcess(TDesC8& aProcessName, TUint64 aAgentId); sl@0: inline TInt DetachAgent(TUint64 aAgentId); sl@0: inline TInt SetEventAction(TDesC8& aProcessName, Debug::TEventType aEvent, Debug::TKernelEventAction aEventAction, TUint64 aAgentId); sl@0: inline TInt GetList(const Debug::TListId aType, const Debug::TListScope aListScope, const TUint64 aTargetId, const TUint64 aDebugProcessId, TDes8& aBuffer, TUint32& aDataSize); sl@0: inline TInt Step(const TUint32 aThreadId, const TUint32 aNumSteps); sl@0: inline TInt IsDebuggable(const TUint32 aProcessId); sl@0: inline TInt KillProcess(const TUint32 aProcessId, const TInt32 aReason); sl@0: }; sl@0: sl@0: _LIT(KRM_DebugDriverName,"RM Debug Driver"); sl@0: sl@0: //priority set equal to that of KDfcThread0Priority defined in e32/kernel/sinit.cpp sl@0: const TInt KRmDebugDriverThreadPriority = 27; sl@0: sl@0: // Version information sl@0: const TInt KMajorVersionNumber=2; sl@0: const TInt KMinorVersionNumber=1; sl@0: const TInt KBuildVersionNumber=0; sl@0: sl@0: sl@0: inline TInt RRM_DebugDriver::Open(const TRM_DebugDriverInfo aDriverInfo) sl@0: { sl@0: TBuf8<32> buf; sl@0: buf.Append((TUint8*)&aDriverInfo.iPanic1Address, 4); sl@0: buf.Append((TUint8*)&aDriverInfo.iPanic2Address, 4); sl@0: buf.Append((TUint8*)&aDriverInfo.iException1Address, 4); sl@0: buf.Append((TUint8*)&aDriverInfo.iException2Address, 4); sl@0: buf.Append((TUint8*)&aDriverInfo.iLibraryLoadedAddress, 4); sl@0: buf.Append((TUint8*)&aDriverInfo.iUserLibraryEnd, 4); sl@0: sl@0: #ifdef EKA2 sl@0: return DoCreate(KRM_DebugDriverName, TVersion(KMajorVersionNumber, KMinorVersionNumber, KBuildVersionNumber), KNullUnit, NULL, &buf); sl@0: #else sl@0: return DoCreate(KRM_DebugDriverName, TVersion(KMajorVersionNumber, KMinorVersionNumber, KBuildVersionNumber), NULL, KNullUnit, NULL, &buf); sl@0: #endif sl@0: } sl@0: sl@0: inline TInt RRM_DebugDriver::SetBreak(Debug::TBreakId &aBreakId, const TUint32 aThreadId, const TUint32 aAddress, const Debug::TArchitectureMode aMode ) sl@0: { sl@0: TSetBreakInfo info(&aBreakId, aThreadId, aAddress, aMode, ETrue); sl@0: return DoSvControl(EControlSetBreak, reinterpret_cast(&info),0); sl@0: } sl@0: inline TInt RRM_DebugDriver::SetProcessBreak(Debug::TBreakId &aBreakId, const TUint32 aProcessId, const TUint32 aAddress, const Debug::TArchitectureMode aMode ) sl@0: { sl@0: TSetBreakInfo info(&aBreakId, aProcessId, aAddress, aMode, EFalse); sl@0: return DoSvControl(EControlSetBreak, reinterpret_cast(&info),0); sl@0: } sl@0: sl@0: inline TInt RRM_DebugDriver::ClearBreak(const Debug::TBreakId aBreakId) sl@0: { sl@0: return DoSvControl(EControlClearBreak, reinterpret_cast(aBreakId), 0); sl@0: } sl@0: sl@0: inline TInt RRM_DebugDriver::ModifyBreak(const Debug::TBreakId aBreakId, const TUint32 aThreadId, const TUint32 aAddress, const Debug::TArchitectureMode aMode) sl@0: { sl@0: TModifyBreakInfo info(aBreakId, aThreadId, aAddress, aMode); sl@0: return DoControl(EControlModifyBreak, reinterpret_cast(&info), 0); sl@0: } sl@0: sl@0: inline TInt RRM_DebugDriver::ModifyProcessBreak(const Debug::TBreakId aBreakId, const TUint32 aProcessId, const TUint32 aAddress, const Debug::TArchitectureMode aMode) sl@0: { sl@0: TModifyProcessBreakInfo info(aBreakId, aProcessId, aAddress, aMode); sl@0: return DoControl(EControlModifyProcessBreak, reinterpret_cast(&info), 0); sl@0: } sl@0: sl@0: inline TInt RRM_DebugDriver::BreakInfo(const Debug::TBreakId aBreakId, TUint64& aId, TUint32& aAddress, Debug::TArchitectureMode& aMode, TBool& aThreadSpecific) sl@0: { sl@0: TGetBreakInfo info(aBreakId, aId, aAddress, aMode, aThreadSpecific); sl@0: return DoControl(EControlBreakInfo, reinterpret_cast(&info), 0); sl@0: } sl@0: sl@0: inline TInt RRM_DebugDriver::SuspendThread(const TUint32 aThreadId) sl@0: { sl@0: return DoControl(EControlSuspendThread, reinterpret_cast(aThreadId)); sl@0: } sl@0: sl@0: inline TInt RRM_DebugDriver::ResumeThread(const TUint32 aThreadId) sl@0: { sl@0: return DoSvControl(EControlResumeThread, reinterpret_cast(aThreadId)); sl@0: } sl@0: sl@0: inline TInt RRM_DebugDriver::StepRange(const TUint32 aThreadId, const TUint32 aStartAddress, const TUint32 aStopAddress, TBool aStepInto) sl@0: { sl@0: TRM_DebugStepInfo info(aStartAddress, aStopAddress, aStepInto); sl@0: return DoSvControl(EControlStepRange, reinterpret_cast(aThreadId), (TAny*)&info); sl@0: } sl@0: sl@0: inline TInt RRM_DebugDriver::ReadMemory(const TUint32 aThreadId, const TUint32 aAddress, const TUint32 aLength, TDes8 &aData) sl@0: { sl@0: TRM_DebugMemoryInfo info(aAddress, aLength, &aData); sl@0: return DoControl(EControlReadMemory, reinterpret_cast(aThreadId), (TAny*)&info); sl@0: } sl@0: sl@0: inline TInt RRM_DebugDriver::WriteMemory(const TUint32 aThreadId, const TUint32 aAddress, const TUint32 aLength, const TDesC8 &aData) sl@0: { sl@0: TRM_DebugMemoryInfo info(aAddress, aLength, (TDesC8*)&aData); sl@0: return DoControl(EControlWriteMemory, reinterpret_cast(aThreadId), (TAny*)&info); sl@0: } sl@0: sl@0: inline TInt RRM_DebugDriver::ReadRegisters(const TUint32 aThreadId, const TDes8 &aRegisterIds, TDes8 &aRegisterValues, TDes8 &aRegisterFlags) sl@0: { sl@0: TRM_DebugRegisterInformation info(&aRegisterIds, &aRegisterValues, &aRegisterFlags); sl@0: return DoControl(EControlReadRegisters, reinterpret_cast(aThreadId), (TAny*)&info); sl@0: } sl@0: sl@0: inline TInt RRM_DebugDriver::WriteRegisters(const TUint32 aThreadId, const TDes8 &aRegisterIds, const TDes8 &aRegisterValues, TDes8 &aRegisterFlags) sl@0: { sl@0: TRM_DebugRegisterInformation info(&aRegisterIds, (TDes8*)&aRegisterValues, &aRegisterFlags); sl@0: return DoControl(EControlWriteRegisters, reinterpret_cast(aThreadId), (TAny*)&info); sl@0: } sl@0: sl@0: inline TInt RRM_DebugDriver::ReadRegisters(const TUint32 aThreadId, const TInt32 aFirstRegister, const TInt32 aLastRegister, TDes8 &aValues) sl@0: { sl@0: TRM_DebugRegisterInfo info(aFirstRegister, aLastRegister, &aValues); sl@0: return DoControl(EControlReadRegistersLegacy, reinterpret_cast(aThreadId), (TAny*)&info); sl@0: } sl@0: sl@0: inline TInt RRM_DebugDriver::WriteRegisters(const TUint32 aThreadId, const TInt32 aFirstRegister, const TInt32 aLastRegister, TDesC8 &aValues) sl@0: { sl@0: TRM_DebugRegisterInfo info(aFirstRegister, aLastRegister, &aValues); sl@0: return DoControl(EControlWriteRegistersLegacy, reinterpret_cast(aThreadId), (TAny*)&info); sl@0: } sl@0: sl@0: inline void RRM_DebugDriver::GetEvent(TDesC8& aProcessName, TUint64 aAgentId, TRequestStatus &aStatus, Debug::TEventInfo &aEventInfo) sl@0: { sl@0: // temporary object not needed beyond the DoRequest call sl@0: TEventMetaData eventMetaData; sl@0: eventMetaData.iTargetProcessName.Copy(aProcessName); sl@0: eventMetaData.iDebugAgentProcessId = aAgentId; sl@0: DoRequest(ERequestGetEvent, aStatus, (TAny*)&aEventInfo, (TAny*)&eventMetaData); sl@0: } sl@0: sl@0: inline void RRM_DebugDriver::CancelGetEvent(TDesC8& aProcessName, TUint64 aAgentId) sl@0: { sl@0: TRMD_DebugCancelInfo info(ERequestGetEventCancel,aProcessName,aAgentId); sl@0: DoCancel(reinterpret_cast(&info)); sl@0: } sl@0: sl@0: inline TInt RRM_DebugDriver::GetStaticLibraryInfo(const TInt aIndex, Debug::TEventInfo &aInfo) sl@0: { sl@0: return DoControl(EControlGetStaticLibraryInfo, reinterpret_cast(aIndex), (TAny*)&aInfo); sl@0: } sl@0: sl@0: inline TInt RRM_DebugDriver::GetDebugFunctionalityBufSize(TUint32 &aBufSize) sl@0: { sl@0: return DoControl(EControlGetDebugFunctionalityBufSize, reinterpret_cast(&aBufSize)); sl@0: } sl@0: sl@0: inline TInt RRM_DebugDriver::GetDebugFunctionality(TDes8& aDebugFunctionality) sl@0: { sl@0: return DoControl(EControlGetDebugFunctionality,reinterpret_cast(&aDebugFunctionality)); sl@0: } sl@0: sl@0: inline TInt RRM_DebugDriver::GetMemoryOperationMaxBlockSize(TUint32 &aMaxSize) sl@0: { sl@0: return DoControl(EControlGetMemoryOperationMaxBlockSize, reinterpret_cast(&aMaxSize)); sl@0: } sl@0: sl@0: inline TInt RRM_DebugDriver::AttachProcess(TDesC8& aProcessName, TUint64 aAgentId) sl@0: { sl@0: TRM_DebugAgentId info(aAgentId); sl@0: return DoControl(EControlAttachProcess,reinterpret_cast(&aProcessName),reinterpret_cast(&info)); sl@0: } sl@0: sl@0: inline TInt RRM_DebugDriver::DetachProcess(TDesC8& aProcessName, TUint64 aAgentId) sl@0: { sl@0: TRM_DebugAgentId info(aAgentId); sl@0: return DoControl(EControlDetachProcess,reinterpret_cast(&aProcessName),reinterpret_cast(&info)); sl@0: } sl@0: sl@0: inline TInt RRM_DebugDriver::DetachAgent(TUint64 aAgentId) sl@0: { sl@0: TRM_DebugAgentId info(aAgentId); sl@0: return DoControl(EControlDetachAgent,reinterpret_cast(&info),0); sl@0: } sl@0: sl@0: inline TInt RRM_DebugDriver::SetEventAction(TDesC8& aProcessName, Debug::TEventType aEvent, Debug::TKernelEventAction aEventAction, TUint64 aAgentId) sl@0: { sl@0: TRM_DebugEventActionInfo info (aEvent,aEventAction, aAgentId); sl@0: return DoControl(EControlSetEventAction,reinterpret_cast(&aProcessName),(TAny*)&info); sl@0: } sl@0: sl@0: inline TInt RRM_DebugDriver::GetList(const Debug::TListId aType, const Debug::TListScope aListScope, const TUint64 aTargetId, const TUint64 aDebugProcessId, TDes8& aBuffer, TUint32& aDataSize) sl@0: { sl@0: TListInformation info(aType, aListScope, &aBuffer, &aDataSize, aTargetId); sl@0: return DoControl(EControlGetList, (TAny*)&info); sl@0: } sl@0: sl@0: inline TInt RRM_DebugDriver::Step(const TUint32 aThreadId, const TUint32 aNumSteps) sl@0: { sl@0: return DoControl(EControlStep,reinterpret_cast(aThreadId),reinterpret_cast(aNumSteps)); sl@0: } sl@0: sl@0: inline TInt RRM_DebugDriver::IsDebuggable(const TUint32 aProcessId) sl@0: { sl@0: return DoControl(EControlIsDebuggable,reinterpret_cast(aProcessId),NULL); sl@0: } sl@0: sl@0: inline TInt RRM_DebugDriver::KillProcess(const TUint32 aProcessId, const TInt32 aReason) sl@0: { sl@0: return DoControl(EControlKillProcess,reinterpret_cast(aProcessId),reinterpret_cast(aReason)); sl@0: } sl@0: sl@0: #endif // __RM_DEBUG_KERNELDRIVER_H__ sl@0: