diff -r 07b41fa8d1dd -r ca8a1b6995f6 debugsrv/runmodedebug/rmdriver/src/d_debug_functionality.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/debugsrv/runmodedebug/rmdriver/src/d_debug_functionality.cpp Tue Aug 31 16:45:49 2010 +0300 @@ -0,0 +1,426 @@ +// 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 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: +// Defines the DebugFunctionality class. This is responsible for +// providing configuration data needed by a host debugger to be able +// to correctly use the functionality provided by the run-mode debug subsystem. +// + +#include +#include +#include +#include +#include +#include +#include +#include "d_rmd_breakpoints.h" +#include "rm_debug_kerneldriver.h" +#include "d_debug_functionality.h" + +using namespace Debug; + +// Core +const TTag DebugFunctionalityCoreInfo[] = + { + {ECoreEvents,ETagTypeBoolean,0,ETrue}, + {ECoreStartStop,ETagTypeBoolean,0,ETrue}, + {ECoreMemory,ETagTypeBoolean,0,ETrue}, + {ECoreRegister,ETagTypeBoolean,0,ETrue}, + {ECoreBreakpoint,ETagTypeBoolean,0,ETrue}, + {ECoreStepping,ETagTypeBoolean,0,ETrue}, + {ECoreLists,ETagTypeBoolean,0,ETrue}, + {ECoreLogging,ETagTypeBoolean,0,EFalse}, + {ECoreHardware,ETagTypeBoolean,0,EFalse}, + {ECoreApiConstants,ETagTypeBoolean,0,ETrue}, + {ECoreKillObjects,ETagTypeBoolean,0,ETrue}, + {ECoreSecurity,ETagTypeBoolean,0,ETrue}, + }; + +const TSubBlock DebugFunctionalityCore[] = + { + ETagHeaderIdCore,ECoreLast, + (TTag*)DebugFunctionalityCoreInfo + }; + +// Memory +const TTag DebugFunctionalityMemoryInfo[] = + { + {EMemoryRead,ETagTypeBoolean,0,ETrue}, + {EMemoryWrite,ETagTypeBoolean,0,ETrue}, + {EMemoryAccess64,ETagTypeBoolean,0,EFalse}, + {EMemoryAccess32,ETagTypeBoolean,0,ETrue}, + {EMemoryAccess16,ETagTypeBoolean,0,EFalse}, + {EMemoryAccess8,ETagTypeBoolean,0,EFalse}, + {EMemoryBE8,ETagTypeBoolean,0,EFalse}, + {EMemoryBE32,ETagTypeBoolean,0,EFalse}, + {EMemoryLE8,ETagTypeBoolean,0,ETrue}, + {EMemoryMaxBlockSize,ETagTypeTUint32,0,16 * KKilo /* 16Kbytes */} // binaryMax size of memory requests in bytes + }; + +const TSubBlock DebugFunctionalityMemory[]= + { + ETagHeaderIdMemory,EMemoryLast, + (TTag*)DebugFunctionalityMemoryInfo + }; + +// Kill Objects +const TTag DebugFunctionalityKillObjectsInfo[] = + { + {EFunctionalityKillThread,ETagTypeBoolean,0,EFalse}, + {EFunctionalityKillProcess,ETagTypeBoolean,0,ETrue} + }; + +const TSubBlock DebugFunctionalityKillObjects[]= + { + ETagHeaderIdKillObjects,EFunctionalityKillObjectLast, + (TTag*)DebugFunctionalityKillObjectsInfo + }; + +// Core Registers +const TTag DebugFunctionalityRegistersCoreInfo[] = + { + {ERegisterR0,ETagTypeEnum, 4,EAccessReadWrite}, + {ERegisterR1,ETagTypeEnum, 4,EAccessReadWrite}, + {ERegisterR2,ETagTypeEnum, 4,EAccessReadWrite}, + {ERegisterR3,ETagTypeEnum, 4,EAccessReadWrite}, + {ERegisterR4,ETagTypeEnum, 4,EAccessReadWrite}, + {ERegisterR5,ETagTypeEnum, 4,EAccessReadWrite}, + {ERegisterR6,ETagTypeEnum, 4,EAccessReadWrite}, + {ERegisterR7,ETagTypeEnum, 4,EAccessReadWrite}, + {ERegisterR8,ETagTypeEnum, 4,EAccessReadWrite}, + {ERegisterR9,ETagTypeEnum, 4,EAccessReadWrite}, + {ERegisterR10,ETagTypeEnum, 4,EAccessReadWrite}, + {ERegisterR11,ETagTypeEnum, 4,EAccessReadWrite}, + {ERegisterR12,ETagTypeEnum, 4,EAccessReadWrite}, + {ERegisterR13,ETagTypeEnum, 4,EAccessReadWrite}, + {ERegisterR14,ETagTypeEnum, 4,EAccessReadWrite}, + {ERegisterR15,ETagTypeEnum, 4,EAccessReadWrite}, + {ERegisterCpsr,ETagTypeEnum, 4,EAccessReadWrite}, + {ERegisterR13Svc,ETagTypeEnum, 4,EAccessNone}, + {ERegisterR14Svc,ETagTypeEnum, 4,EAccessNone}, + {ERegisterSpsrSvc,ETagTypeEnum, 4,EAccessNone}, + {ERegisterR13Abt,ETagTypeEnum, 4,EAccessNone}, + {ERegisterR14Abt,ETagTypeEnum, 4,EAccessNone}, + {ERegisterSpsrAbt,ETagTypeEnum, 4,EAccessNone}, + {ERegisterR13Und,ETagTypeEnum, 4,EAccessNone}, + {ERegisterR14Und,ETagTypeEnum, 4,EAccessNone}, + {ERegisterSpsrUnd,ETagTypeEnum, 4,EAccessNone}, + {ERegisterR13Irq,ETagTypeEnum, 4,EAccessNone}, + {ERegisterR14Irq,ETagTypeEnum, 4,EAccessNone}, + {ERegisterSpsrIrq,ETagTypeEnum, 4,EAccessNone}, + {ERegisterR8Fiq,ETagTypeEnum, 4,EAccessNone}, + {ERegisterR9Fiq,ETagTypeEnum, 4,EAccessNone}, + {ERegisterR10Fiq,ETagTypeEnum, 4,EAccessNone}, + {ERegisterR11Fiq,ETagTypeEnum, 4,EAccessNone}, + {ERegisterR12Fiq,ETagTypeEnum, 4,EAccessNone}, + {ERegisterR13Fiq,ETagTypeEnum, 4,EAccessNone}, + {ERegisterR14Fiq,ETagTypeEnum, 4,EAccessNone}, + {ERegisterSpsrFiq, ETagTypeEnum, 4,EAccessNone} + }; + +const TSubBlock DebugFunctionalityRegistersCore[] = + { + ETagHeaderIdRegistersCore, ERegisterLast, + (TTag*)DebugFunctionalityRegistersCoreInfo + }; + +// Co-processor registers +const TTag DebugFunctionalityRegistersCoProInfo[]= + { + //this is the DACR register + {0x00300f01, ETagTypeTUint32, 4, EAccessReadWrite} + }; + +const TSubBlock DebugFunctionalityRegistersCoPro[]= + { + ETagHeaderIdCoProRegisters,1, + (TTag*)DebugFunctionalityRegistersCoProInfo + }; + +// Breakpoints +const TTag DebugFunctionalityBreakpointsInfo[]= + { + {EBreakpointThread,ETagTypeBoolean,0,ETrue}, + {EBreakpointProcess,ETagTypeBoolean,0,ETrue}, + {EBreakpointSystem,ETagTypeBoolean,0,EFalse}, + {EBreakpointArm,ETagTypeBoolean,0,ETrue}, + {EBreakpointThumb,ETagTypeBoolean,0,ETrue}, + {EBreakpointT2EE,ETagTypeBoolean,0,ETrue}, + {EBreakpointArmInst,ETagTypeBoolean,0,EFalse}, + {EBreakpointThumbInst,ETagTypeBoolean,0,EFalse}, + {EBreakpointT2EEInst,ETagTypeBoolean,0,ETrue}, + {EBreakpointSetArmInst,ETagTypeBoolean,0,EFalse}, + {EBreakpointSetThumbInst,ETagTypeBoolean,0,EFalse}, + {EBreakpointSetT2EEInst,ETagTypeBoolean,0,ETrue} + }; + +const TSubBlock DebugFunctionalityBreakpoints[] = + { + ETagHeaderIdBreakpoints, EBreakpointLast, + (TTag*)DebugFunctionalityBreakpointsInfo + }; + +// Stepping +const TTag DebugFunctionalitySteppingInfo[]= + { + {EStep,ETagTypeBoolean,0,ETrue} + }; + +const TSubBlock DebugFunctionalityStepping[] = + { + ETagHeaderIdStepping, EStepLast, + (TTag*)DebugFunctionalitySteppingInfo + }; + +// Execution Control +const TTag DebugFunctionalityExecutionInfo[]= + { + {EExecThreadSuspendResume,ETagTypeBoolean,0,ETrue}, + {EExecProcessSuspendResume,ETagTypeBoolean,0,EFalse}, + {EExecSystemSuspendResume,ETagTypeBoolean,0,EFalse}, + }; + +const TSubBlock DebugFunctionalityExecution[]= + { + ETagHeaderIdExecution, EExecLast, + (TTag*)DebugFunctionalityExecutionInfo + }; + +// Events +const TTag DebugFunctionalityEventsInfo[]= + { + {EEventsBreakPoint,ETagTypeEnum,0,EActionSuspend}, + {EEventsProcessBreakPoint,ETagTypeEnum,0,EActionSuspend}, + {EEventsSwExc,ETagTypeEnum,0,EActionSuspend}, + {EEventsHwExc,ETagTypeEnum,0,EActionSuspend}, + {EEventsKillThread,ETagTypeEnum,0,EActionContinue}, + {EEventsAddLibrary,ETagTypeEnum,0,EActionSuspend}, + {EEventsRemoveLibrary,ETagTypeEnum,0,EActionSuspend}, + {EEventsUserTrace,ETagTypeEnum,0,EActionSuspend}, + {EEventsStartThread,ETagTypeEnum,0,EActionSuspend}, + {EEventsBufferFull,ETagTypeEnum,0,EActionContinue}, + {EEventsUnknown,ETagTypeEnum,0,EActionContinue}, + {EEventsUserTracesLost, ETagTypeEnum, 0, EActionContinue}, + {EEventsAddProcess,ETagTypeEnum,0,EActionContinue}, + {EEventsRemoveProcess,ETagTypeEnum,0,EActionContinue} + }; + +const TSubBlock DebugFunctionalityEvents[] = + { + ETagHeaderIdEvents, EEventsLast, + (TTag*)DebugFunctionalityEventsInfo + }; + +// API Constants +const TTag DebugFunctionalityApiConstantsInfo[]= + { + {EApiConstantsTEventInfoSize,ETagTypeTUint32,0,sizeof(TEventInfo)}, + }; + +const TSubBlock DebugFunctionalityApiConstants[] = + { + ETagHeaderIdApiConstants, EApiConstantsLast, + (TTag*)DebugFunctionalityApiConstantsInfo + }; + +// Listings +const TTag DebugFunctionalityListInfo[] = + { + {EProcesses,ETagTypeBitField,0,EScopeGlobal}, + {EThreads,ETagTypeBitField,0,EScopeGlobal|EScopeProcessSpecific|EScopeThreadSpecific}, + {ECodeSegs,ETagTypeBitField,0,EScopeGlobal|EScopeProcessSpecific|EScopeThreadSpecific}, + {EXipLibraries,ETagTypeBitField,0,EScopeGlobal}, + {EExecutables,ETagTypeBitField,0,EScopeGlobal}, + {ELogicalDevices,ETagTypeBitField,0,EScopeNone}, + {EMutexes,ETagTypeBitField,0,EScopeNone}, + {EServers,ETagTypeBitField,0,EScopeNone}, + {ESessions,ETagTypeBitField,0,EScopeNone}, + {ESemaphores,ETagTypeBitField,0,EScopeNone}, + {EChunks,ETagTypeBitField,0,EScopeNone}, + {EBreakpoints,ETagTypeBitField,0,EScopeNone}, + {ESetBreak,ETagTypeBitField,0,EScopeNone}, + {ERemoveBreak,ETagTypeBitField,0,EScopeNone}, + {EModifyBreak,ETagTypeBitField,0,EScopeNone}, + }; + +const TSubBlock DebugFunctionalityList[] = + { + ETagHeaderList, EListLast, + (TTag*)DebugFunctionalityListInfo + }; + +// Security +const TTag DebugFunctionalitySecurityInfo[]= + { + {ESecurityOEMDebugToken,ETagTypeBoolean,0,ETrue} + }; + +const TSubBlock DebugFunctionalitySecurity[] = + { + ETagHeaderIdSecurity, ESecurityLast, + (TTag*)DebugFunctionalitySecurityInfo + }; + +TUint32 TDebugFunctionality::GetDebugFunctionalityBufSize(void) + { + TUint32 df_size = 0; + + df_size += ComputeBlockSize((const TSubBlock&)DebugFunctionalityCore); + df_size += ComputeBlockSize((const TSubBlock&)DebugFunctionalityMemory); + df_size += ComputeBlockSize((const TSubBlock&)DebugFunctionalityRegistersCore); + df_size += ComputeBlockSize((const TSubBlock&)DebugFunctionalityRegistersCoPro); + df_size += ComputeBlockSize((const TSubBlock&)DebugFunctionalityBreakpoints); + df_size += ComputeBlockSize((const TSubBlock&)DebugFunctionalityStepping); + df_size += ComputeBlockSize((const TSubBlock&)DebugFunctionalityExecution); + df_size += ComputeBlockSize((const TSubBlock&)DebugFunctionalityEvents); + df_size += ComputeBlockSize((const TSubBlock&)DebugFunctionalityApiConstants); + df_size += ComputeBlockSize((const TSubBlock&)DebugFunctionalityList); + df_size += ComputeBlockSize((const TSubBlock&)DebugFunctionalityKillObjects); + df_size += ComputeBlockSize((const TSubBlock&)DebugFunctionalitySecurity); + + return df_size; + } + +TBool TDebugFunctionality::GetDebugFunctionality(TDes8& aDFBlock) + { + if (aDFBlock.MaxLength() < GetDebugFunctionalityBufSize() ) + { + // Insufficient space to contain the debug functionality block + return EFalse; + } + + AppendBlock((const TSubBlock&)DebugFunctionalityCore,aDFBlock); + AppendBlock((const TSubBlock&)DebugFunctionalityMemory,aDFBlock); + AppendBlock((const TSubBlock&)DebugFunctionalityRegistersCore,aDFBlock); + AppendBlock((const TSubBlock&)DebugFunctionalityRegistersCoPro,aDFBlock); + AppendBlock((const TSubBlock&)DebugFunctionalityBreakpoints,aDFBlock); + AppendBlock((const TSubBlock&)DebugFunctionalityStepping,aDFBlock); + AppendBlock((const TSubBlock&)DebugFunctionalityExecution,aDFBlock); + AppendBlock((const TSubBlock&)DebugFunctionalityEvents,aDFBlock); + AppendBlock((const TSubBlock&)DebugFunctionalityApiConstants,aDFBlock); + AppendBlock((const TSubBlock&)DebugFunctionalityList,aDFBlock); + AppendBlock((const TSubBlock&)DebugFunctionalityKillObjects,aDFBlock); + AppendBlock((const TSubBlock&)DebugFunctionalitySecurity,aDFBlock); + + return ETrue; + } + +/** + * Get the register information associated with aRegisterInfo. If aRegisterInfo is + * an unsupported register then an entry of the form: + * {aRegisterInfo, x, 0, EAccessUnknown} + * will be returned where x is an arbitrary value. + * + * @param aRegisterInfo register id information + * @param aTag The functionality information for this register. + * @return One of the system wide error codes + */ +TInt TDebugFunctionality::GetRegister(const TRegisterInfo aRegisterInfo, TTag& aTag) + { + if(Register::IsCoreReg(aRegisterInfo)) + { + for(TInt i=0; i