1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/os/kernelhwsrv/kernel/eka/drivers/debug/common/d_debug_functionality.cpp Fri Jun 15 03:10:57 2012 +0200
1.3 @@ -0,0 +1,582 @@
1.4 +// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
1.5 +// All rights reserved.
1.6 +// This component and the accompanying materials are made available
1.7 +// under the terms of the License "Eclipse Public License v1.0"
1.8 +// which accompanies this distribution, and is available
1.9 +// at the URL "http://www.eclipse.org/legal/epl-v10.html".
1.10 +//
1.11 +// Initial Contributors:
1.12 +// Nokia Corporation - initial contribution.
1.13 +//
1.14 +// Contributors:
1.15 +//
1.16 +// Description:
1.17 +// Defines the DebugFunctionality class. This is responsible for
1.18 +// providing configuration data needed by a host debugger to be able
1.19 +// to correctly use the functionality provided by the run-mode debug subsystem.
1.20 +//
1.21 +
1.22 +#include <e32def.h>
1.23 +#include <e32def_private.h>
1.24 +#include <e32cmn.h>
1.25 +#include <e32cmn_private.h>
1.26 +#include <u32std.h>
1.27 +#include <kernel/kernel.h>
1.28 +#include <rm_debug_api.h>
1.29 +#include <sm_debug_api.h>
1.30 +#include "d_rmd_breakpoints.h"
1.31 +#include "rm_debug_kerneldriver.h"
1.32 +#include "d_debug_functionality.h"
1.33 +#include "d_buffer_manager.h"
1.34 +
1.35 +using namespace Debug;
1.36 +
1.37 +// Core
1.38 +const TTag DebugFunctionalityCoreInfo[] =
1.39 + {
1.40 + {ECoreEvents,ETagTypeBoolean,0,ETrue},
1.41 + {ECoreStartStop,ETagTypeBoolean,0,ETrue},
1.42 + {ECoreMemory,ETagTypeBoolean,0,ETrue},
1.43 + {ECoreRegister,ETagTypeBoolean,0,ETrue},
1.44 + {ECoreBreakpoint,ETagTypeBoolean,0,ETrue},
1.45 + {ECoreStepping,ETagTypeBoolean,0,ETrue},
1.46 + {ECoreLists,ETagTypeBoolean,0,ETrue},
1.47 + {ECoreLogging,ETagTypeBoolean,0,EFalse},
1.48 + {ECoreHardware,ETagTypeBoolean,0,EFalse},
1.49 + {ECoreApiConstants,ETagTypeBoolean,0,ETrue},
1.50 + {ECoreKillObjects,ETagTypeBoolean,0,ETrue},
1.51 + {ECoreSecurity,ETagTypeBoolean,0,ETrue},
1.52 + {ECoreStopModeFunctions,ETagTypeBoolean,0,EFalse},
1.53 + {ECoreStopModeBuffers,ETagTypeBoolean,0,EFalse},
1.54 + };
1.55 +
1.56 +const TSubBlock DebugFunctionalityCore[] =
1.57 + {
1.58 + ETagHeaderIdCore,ECoreLast,
1.59 + (TTag*)DebugFunctionalityCoreInfo
1.60 + };
1.61 +
1.62 +// Core
1.63 +const TTag StopModeFunctionalityCoreInfo[] =
1.64 + {
1.65 + {ECoreEvents,ETagTypeBoolean,0,EFalse},
1.66 + {ECoreStartStop,ETagTypeBoolean,0,EFalse},
1.67 + {ECoreMemory,ETagTypeBoolean,0,EFalse},
1.68 + {ECoreRegister,ETagTypeBoolean,0,EFalse},
1.69 + {ECoreBreakpoint,ETagTypeBoolean,0,EFalse},
1.70 + {ECoreStepping,ETagTypeBoolean,0,EFalse},
1.71 + {ECoreLists,ETagTypeBoolean,0,ETrue},
1.72 + {ECoreLogging,ETagTypeBoolean,0,EFalse},
1.73 + {ECoreHardware,ETagTypeBoolean,0,EFalse},
1.74 + {ECoreApiConstants,ETagTypeBoolean,0,EFalse},
1.75 + {ECoreKillObjects, ETagTypeBoolean,0, EFalse},
1.76 + {ECoreSecurity, ETagTypeBoolean,0,EFalse},
1.77 + {ECoreStopModeFunctions,ETagTypeBoolean,0,ETrue},
1.78 + {ECoreStopModeBuffers,ETagTypeBoolean,0,ETrue},
1.79 + };
1.80 +
1.81 +const TSubBlock StopModeFunctionalityCore[] =
1.82 + {
1.83 + ETagHeaderIdCore,ECoreLast,
1.84 + (TTag*)StopModeFunctionalityCoreInfo
1.85 + };
1.86 +
1.87 +const TSubBlock StopModeFunctionalityBuffers[]=
1.88 + {
1.89 + ETagHeaderIdBuffers,EBuffersLast,
1.90 + (TTag*)NULL
1.91 + };
1.92 +
1.93 +const TTag StopModeFunctionalityFunctionsInfo[] =
1.94 + {
1.95 +#ifdef __LAUNCH_AS_EXTENSION__
1.96 + {EStopModeFunctionsExitPoint,ETagTypePointer,0,(TUint32)&StopModeDebug::ExitPoint},
1.97 + {EStopModeFunctionsGetList,ETagTypePointer,0,(TUint32)&StopModeDebug::GetList},
1.98 + {EStopModeFunctionsTestAPI,ETagTypePointer,0,(TUint32)&StopModeDebug::TestAPI}
1.99 +#else
1.100 + {EStopModeFunctionsExitPoint,ETagTypePointer,0,NULL},
1.101 + {EStopModeFunctionsGetList,ETagTypePointer,0,NULL},
1.102 + {EStopModeFunctionsTestAPI,ETagTypePointer,0,NULL}
1.103 +#endif
1.104 + };
1.105 +
1.106 +const TSubBlock StopModeFunctionalityFunctions[]=
1.107 + {
1.108 + ETagHeaderIdStopModeFunctions,EStopModeFunctionsLast,
1.109 + (TTag*)StopModeFunctionalityFunctionsInfo
1.110 + };
1.111 +
1.112 +
1.113 +// Memory
1.114 +const TTag DebugFunctionalityMemoryInfo[] =
1.115 + {
1.116 + {EMemoryRead,ETagTypeBoolean,0,ETrue},
1.117 + {EMemoryWrite,ETagTypeBoolean,0,ETrue},
1.118 + {EMemoryAccess64,ETagTypeBoolean,0,EFalse},
1.119 + {EMemoryAccess32,ETagTypeBoolean,0,ETrue},
1.120 + {EMemoryAccess16,ETagTypeBoolean,0,EFalse},
1.121 + {EMemoryAccess8,ETagTypeBoolean,0,EFalse},
1.122 + {EMemoryBE8,ETagTypeBoolean,0,EFalse},
1.123 + {EMemoryBE32,ETagTypeBoolean,0,EFalse},
1.124 + {EMemoryLE8,ETagTypeBoolean,0,ETrue},
1.125 + {EMemoryMaxBlockSize,ETagTypeTUint32,0,16 * KKilo /* 16Kbytes */} // binaryMax size of memory requests in bytes
1.126 + };
1.127 +
1.128 +const TSubBlock DebugFunctionalityMemory[]=
1.129 + {
1.130 + ETagHeaderIdMemory,EMemoryLast,
1.131 + (TTag*)DebugFunctionalityMemoryInfo
1.132 + };
1.133 +
1.134 +// Kill Objects
1.135 +const TTag DebugFunctionalityKillObjectsInfo[] =
1.136 + {
1.137 + {EFunctionalityKillThread,ETagTypeBoolean,0,EFalse},
1.138 + {EFunctionalityKillProcess,ETagTypeBoolean,0,ETrue}
1.139 + };
1.140 +
1.141 +const TSubBlock DebugFunctionalityKillObjects[]=
1.142 + {
1.143 + ETagHeaderIdKillObjects,EFunctionalityKillObjectLast,
1.144 + (TTag*)DebugFunctionalityKillObjectsInfo
1.145 + };
1.146 +
1.147 +// Core Registers
1.148 +const TTag DebugFunctionalityRegistersCoreInfo[] =
1.149 + {
1.150 + {ERegisterR0,ETagTypeEnum, 4,EAccessReadWrite},
1.151 + {ERegisterR1,ETagTypeEnum, 4,EAccessReadWrite},
1.152 + {ERegisterR2,ETagTypeEnum, 4,EAccessReadWrite},
1.153 + {ERegisterR3,ETagTypeEnum, 4,EAccessReadWrite},
1.154 + {ERegisterR4,ETagTypeEnum, 4,EAccessReadWrite},
1.155 + {ERegisterR5,ETagTypeEnum, 4,EAccessReadWrite},
1.156 + {ERegisterR6,ETagTypeEnum, 4,EAccessReadWrite},
1.157 + {ERegisterR7,ETagTypeEnum, 4,EAccessReadWrite},
1.158 + {ERegisterR8,ETagTypeEnum, 4,EAccessReadWrite},
1.159 + {ERegisterR9,ETagTypeEnum, 4,EAccessReadWrite},
1.160 + {ERegisterR10,ETagTypeEnum, 4,EAccessReadWrite},
1.161 + {ERegisterR11,ETagTypeEnum, 4,EAccessReadWrite},
1.162 + {ERegisterR12,ETagTypeEnum, 4,EAccessReadWrite},
1.163 + {ERegisterR13,ETagTypeEnum, 4,EAccessReadWrite},
1.164 + {ERegisterR14,ETagTypeEnum, 4,EAccessReadWrite},
1.165 + {ERegisterR15,ETagTypeEnum, 4,EAccessReadWrite},
1.166 + {ERegisterCpsr,ETagTypeEnum, 4,EAccessReadWrite},
1.167 + {ERegisterR13Svc,ETagTypeEnum, 4,EAccessNone},
1.168 + {ERegisterR14Svc,ETagTypeEnum, 4,EAccessNone},
1.169 + {ERegisterSpsrSvc,ETagTypeEnum, 4,EAccessNone},
1.170 + {ERegisterR13Abt,ETagTypeEnum, 4,EAccessNone},
1.171 + {ERegisterR14Abt,ETagTypeEnum, 4,EAccessNone},
1.172 + {ERegisterSpsrAbt,ETagTypeEnum, 4,EAccessNone},
1.173 + {ERegisterR13Und,ETagTypeEnum, 4,EAccessNone},
1.174 + {ERegisterR14Und,ETagTypeEnum, 4,EAccessNone},
1.175 + {ERegisterSpsrUnd,ETagTypeEnum, 4,EAccessNone},
1.176 + {ERegisterR13Irq,ETagTypeEnum, 4,EAccessNone},
1.177 + {ERegisterR14Irq,ETagTypeEnum, 4,EAccessNone},
1.178 + {ERegisterSpsrIrq,ETagTypeEnum, 4,EAccessNone},
1.179 + {ERegisterR8Fiq,ETagTypeEnum, 4,EAccessNone},
1.180 + {ERegisterR9Fiq,ETagTypeEnum, 4,EAccessNone},
1.181 + {ERegisterR10Fiq,ETagTypeEnum, 4,EAccessNone},
1.182 + {ERegisterR11Fiq,ETagTypeEnum, 4,EAccessNone},
1.183 + {ERegisterR12Fiq,ETagTypeEnum, 4,EAccessNone},
1.184 + {ERegisterR13Fiq,ETagTypeEnum, 4,EAccessNone},
1.185 + {ERegisterR14Fiq,ETagTypeEnum, 4,EAccessNone},
1.186 + {ERegisterSpsrFiq, ETagTypeEnum, 4,EAccessNone}
1.187 + };
1.188 +
1.189 +const TSubBlock DebugFunctionalityRegistersCore[] =
1.190 + {
1.191 + ETagHeaderIdRegistersCore, ERegisterLast,
1.192 + (TTag*)DebugFunctionalityRegistersCoreInfo
1.193 + };
1.194 +
1.195 +// Co-processor registers
1.196 +const TTag DebugFunctionalityRegistersCoProInfo[]=
1.197 + {
1.198 + //this is the DACR register
1.199 + {0x00300f01, ETagTypeTUint32, 4, EAccessReadWrite}
1.200 + };
1.201 +
1.202 +const TSubBlock DebugFunctionalityRegistersCoPro[]=
1.203 + {
1.204 + ETagHeaderIdCoProRegisters,1,
1.205 + (TTag*)DebugFunctionalityRegistersCoProInfo
1.206 + };
1.207 +
1.208 +// Breakpoints
1.209 +const TTag DebugFunctionalityBreakpointsInfo[]=
1.210 + {
1.211 + {EBreakpointThread,ETagTypeBoolean,0,ETrue},
1.212 + {EBreakpointProcess,ETagTypeBoolean,0,ETrue},
1.213 + {EBreakpointSystem,ETagTypeBoolean,0,EFalse},
1.214 + {EBreakpointArm,ETagTypeBoolean,0,ETrue},
1.215 + {EBreakpointThumb,ETagTypeBoolean,0,ETrue},
1.216 + {EBreakpointT2EE,ETagTypeBoolean,0,ETrue},
1.217 + {EBreakpointArmInst,ETagTypeBoolean,0,EFalse},
1.218 + {EBreakpointThumbInst,ETagTypeBoolean,0,EFalse},
1.219 + {EBreakpointT2EEInst,ETagTypeBoolean,0,ETrue},
1.220 + {EBreakpointSetArmInst,ETagTypeBoolean,0,EFalse},
1.221 + {EBreakpointSetThumbInst,ETagTypeBoolean,0,EFalse},
1.222 + {EBreakpointSetT2EEInst,ETagTypeBoolean,0,ETrue}
1.223 + };
1.224 +
1.225 +const TSubBlock DebugFunctionalityBreakpoints[] =
1.226 + {
1.227 + ETagHeaderIdBreakpoints, EBreakpointLast,
1.228 + (TTag*)DebugFunctionalityBreakpointsInfo
1.229 + };
1.230 +
1.231 +// Stepping
1.232 +const TTag DebugFunctionalitySteppingInfo[]=
1.233 + {
1.234 + {EStep,ETagTypeBoolean,0,ETrue}
1.235 + };
1.236 +
1.237 +const TSubBlock DebugFunctionalityStepping[] =
1.238 + {
1.239 + ETagHeaderIdStepping, EStepLast,
1.240 + (TTag*)DebugFunctionalitySteppingInfo
1.241 + };
1.242 +
1.243 +// Execution Control
1.244 +const TTag DebugFunctionalityExecutionInfo[]=
1.245 + {
1.246 + {EExecThreadSuspendResume,ETagTypeBoolean,0,ETrue},
1.247 + {EExecProcessSuspendResume,ETagTypeBoolean,0,EFalse},
1.248 + {EExecSystemSuspendResume,ETagTypeBoolean,0,EFalse},
1.249 + };
1.250 +
1.251 +const TSubBlock DebugFunctionalityExecution[]=
1.252 + {
1.253 + ETagHeaderIdExecution, EExecLast,
1.254 + (TTag*)DebugFunctionalityExecutionInfo
1.255 + };
1.256 +
1.257 +// Events
1.258 +const TTag DebugFunctionalityEventsInfo[]=
1.259 + {
1.260 + {EEventsBreakPoint,ETagTypeEnum,0,EActionSuspend},
1.261 + {EEventsProcessBreakPoint,ETagTypeEnum,0,EActionSuspend},
1.262 + {EEventsSwExc,ETagTypeEnum,0,EActionSuspend},
1.263 + {EEventsHwExc,ETagTypeEnum,0,EActionSuspend},
1.264 + {EEventsKillThread,ETagTypeEnum,0,EActionContinue},
1.265 + {EEventsAddLibrary,ETagTypeEnum,0,EActionSuspend},
1.266 + {EEventsRemoveLibrary,ETagTypeEnum,0,EActionSuspend},
1.267 + {EEventsUserTrace,ETagTypeEnum,0,EActionSuspend},
1.268 + {EEventsStartThread,ETagTypeEnum,0,EActionSuspend},
1.269 + {EEventsBufferFull,ETagTypeEnum,0,EActionContinue},
1.270 + {EEventsUnknown,ETagTypeEnum,0,EActionContinue},
1.271 + {EEventsUserTracesLost, ETagTypeEnum, 0, EActionContinue},
1.272 + {EEventsAddProcess,ETagTypeEnum,0,EActionContinue},
1.273 + {EEventsRemoveProcess,ETagTypeEnum,0,EActionContinue}
1.274 + };
1.275 +
1.276 +const TSubBlock DebugFunctionalityEvents[] =
1.277 + {
1.278 + ETagHeaderIdEvents, EEventsLast,
1.279 + (TTag*)DebugFunctionalityEventsInfo
1.280 + };
1.281 +
1.282 +// API Constants
1.283 +const TTag DebugFunctionalityApiConstantsInfo[]=
1.284 + {
1.285 + {EApiConstantsTEventInfoSize,ETagTypeTUint32,0,sizeof(TEventInfo)},
1.286 + };
1.287 +
1.288 +const TSubBlock DebugFunctionalityApiConstants[] =
1.289 + {
1.290 + ETagHeaderIdApiConstants, EApiConstantsLast,
1.291 + (TTag*)DebugFunctionalityApiConstantsInfo
1.292 + };
1.293 +
1.294 +// Listings
1.295 +const TTag DebugFunctionalityListInfo[] =
1.296 + {
1.297 + {EProcesses,ETagTypeBitField,0,EScopeGlobal},
1.298 + {EThreads,ETagTypeBitField,0,EScopeGlobal|EScopeProcessSpecific|EScopeThreadSpecific},
1.299 + {ECodeSegs,ETagTypeBitField,0,EScopeGlobal|EScopeProcessSpecific|EScopeThreadSpecific},
1.300 + {EXipLibraries,ETagTypeBitField,0,EScopeGlobal},
1.301 + {EExecutables,ETagTypeBitField,0,EScopeGlobal},
1.302 + {ELogicalDevices,ETagTypeBitField,0,EScopeNone},
1.303 + {EMutexes,ETagTypeBitField,0,EScopeNone},
1.304 + {EServers,ETagTypeBitField,0,EScopeNone},
1.305 + {ESessions,ETagTypeBitField,0,EScopeNone},
1.306 + {ESemaphores,ETagTypeBitField,0,EScopeNone},
1.307 + {EChunks,ETagTypeBitField,0,EScopeNone},
1.308 + {EBreakpoints,ETagTypeBitField,0,EScopeNone},
1.309 + {ESetBreak,ETagTypeBitField,0,EScopeNone},
1.310 + {ERemoveBreak,ETagTypeBitField,0,EScopeNone},
1.311 + {EModifyBreak,ETagTypeBitField,0,EScopeNone},
1.312 + };
1.313 +
1.314 +const TSubBlock DebugFunctionalityList[] =
1.315 + {
1.316 + ETagHeaderList, EListLast,
1.317 + (TTag*)DebugFunctionalityListInfo
1.318 + };
1.319 +
1.320 +// Listings
1.321 +const TTag StopModeFunctionalityListInfo[] =
1.322 + {
1.323 + {EProcesses,ETagTypeBitField,0,EScopeNone},
1.324 + {EThreads,ETagTypeBitField,0,EScopeNone},
1.325 + {ECodeSegs,ETagTypeBitField,0,EScopeGlobal|EScopeThreadSpecific},
1.326 + {EXipLibraries,ETagTypeBitField,0,EScopeNone},
1.327 + {EExecutables,ETagTypeBitField,0,EScopeNone},
1.328 + {ELogicalDevices,ETagTypeBitField,0,EScopeNone},
1.329 + {EMutexes,ETagTypeBitField,0,EScopeNone},
1.330 + {EServers,ETagTypeBitField,0,EScopeNone},
1.331 + {ESessions,ETagTypeBitField,0,EScopeNone},
1.332 + {ESemaphores,ETagTypeBitField,0,EScopeNone},
1.333 + {EChunks,ETagTypeBitField,0,EScopeNone},
1.334 + {EBreakpoints,ETagTypeBitField,0,EScopeNone},
1.335 + {ESetBreak,ETagTypeBitField,0,EScopeNone},
1.336 + {ERemoveBreak,ETagTypeBitField,0,EScopeNone},
1.337 + {EModifyBreak,ETagTypeBitField,0,EScopeNone},
1.338 + };
1.339 +
1.340 +const TSubBlock StopModeFunctionalityList[] =
1.341 + {
1.342 + ETagHeaderList, EListLast,
1.343 + (TTag*)StopModeFunctionalityListInfo
1.344 + };
1.345 + // not implemented
1.346 +
1.347 +// actionpoints
1.348 + // not implemented
1.349 +
1.350 +// codeapplets
1.351 + // not implemented
1.352 +
1.353 +// BTrace/UTrace
1.354 + // not implemented
1.355 +
1.356 +// Security
1.357 +const TTag DebugFunctionalitySecurityInfo[]=
1.358 + {
1.359 + {ESecurityOEMDebugToken,ETagTypeBoolean,0,ETrue}
1.360 + };
1.361 +
1.362 +const TSubBlock DebugFunctionalitySecurity[] =
1.363 + {
1.364 + ETagHeaderIdSecurity, ESecurityLast,
1.365 + (TTag*)DebugFunctionalitySecurityInfo
1.366 + };
1.367 +
1.368 +TUint32 TDebugFunctionality::GetDebugFunctionalityBufSize(void)
1.369 + {
1.370 + TUint32 df_size = 0;
1.371 +
1.372 + df_size += ComputeBlockSize((const TSubBlock&)DebugFunctionalityCore);
1.373 + df_size += ComputeBlockSize((const TSubBlock&)DebugFunctionalityMemory);
1.374 + df_size += ComputeBlockSize((const TSubBlock&)DebugFunctionalityRegistersCore);
1.375 + df_size += ComputeBlockSize((const TSubBlock&)DebugFunctionalityRegistersCoPro);
1.376 + df_size += ComputeBlockSize((const TSubBlock&)DebugFunctionalityBreakpoints);
1.377 + df_size += ComputeBlockSize((const TSubBlock&)DebugFunctionalityStepping);
1.378 + df_size += ComputeBlockSize((const TSubBlock&)DebugFunctionalityExecution);
1.379 + df_size += ComputeBlockSize((const TSubBlock&)DebugFunctionalityEvents);
1.380 + df_size += ComputeBlockSize((const TSubBlock&)DebugFunctionalityApiConstants);
1.381 + df_size += ComputeBlockSize((const TSubBlock&)DebugFunctionalityList);
1.382 + df_size += ComputeBlockSize((const TSubBlock&)DebugFunctionalityKillObjects);
1.383 + df_size += ComputeBlockSize((const TSubBlock&)DebugFunctionalitySecurity);
1.384 +
1.385 + return df_size;
1.386 + }
1.387 +
1.388 +TUint32 TDebugFunctionality::GetStopModeFunctionalityBufSize(void)
1.389 + {
1.390 + TUint32 bytes = 0;
1.391 +
1.392 + // First four bytes are length field
1.393 + // Next four are version
1.394 + // Last four bytes will be the checksum
1.395 + bytes = 12 +
1.396 + ComputeBlockSize((const TSubBlock&)StopModeFunctionalityCore) +
1.397 + ComputeBlockSize((const TSubBlock&)StopModeFunctionalityBuffers) +
1.398 + ComputeBlockSize((const TSubBlock&)StopModeFunctionalityFunctions) +
1.399 + ComputeBlockSize((const TSubBlock&)StopModeFunctionalityList);
1.400 +
1.401 + return bytes;
1.402 + }
1.403 +
1.404 +TBool TDebugFunctionality::GetStopModeFunctionality(TDes8& aDFBlock)
1.405 + {
1.406 + TUint32 size = GetStopModeFunctionalityBufSize();
1.407 + if (aDFBlock.MaxLength() < size)
1.408 + {
1.409 + // Insufficient space to contain the debug functionality block
1.410 + return EFalse;
1.411 + }
1.412 +
1.413 + TUint8* ptr = (TUint8*)&size;
1.414 + aDFBlock.SetLength(0);
1.415 + aDFBlock.Append(ptr, 4);
1.416 + TVersion version = TVersion(KStopModeMajorVersionNumber, KStopModeMinorVersionNumber, KStopModePatchVersionNumber);
1.417 + ptr = (TUint8*)&version;
1.418 + aDFBlock.Append(ptr, sizeof(TVersion));
1.419 +
1.420 + AppendBlock((const TSubBlock&)StopModeFunctionalityCore,aDFBlock);
1.421 + AppendBlock((const TSubBlock&)StopModeFunctionalityFunctions,aDFBlock);
1.422 + AppendBlock((const TSubBlock&)StopModeFunctionalityList,aDFBlock);
1.423 +
1.424 + const TTagHeader& header = StopModeFunctionalityBuffers->iHeader;
1.425 + aDFBlock.Append((TUint8*)&header, sizeof(TTagHeader));
1.426 +
1.427 + for(TInt i=0; i<EBuffersLast; i++)
1.428 + {
1.429 + TTag tag;
1.430 + TheDBufferManager.GetBufferDetails((TBufferType)i, tag);
1.431 + aDFBlock.Append((TUint8*)&tag, sizeof(TTag));
1.432 + }
1.433 +
1.434 + if(aDFBlock.Length() != size - 4)
1.435 + {
1.436 + return EFalse;
1.437 + }
1.438 +
1.439 + TUint32* ptr32 = (TUint32*)aDFBlock.Ptr();
1.440 + TUint32 checksum = 0;
1.441 + for(TInt i=0; i<aDFBlock.Length(); i+=4)
1.442 + {
1.443 + checksum^=*ptr32;
1.444 + ptr32++;
1.445 + }
1.446 +
1.447 + ptr = (TUint8*)&checksum;
1.448 + aDFBlock.Append(ptr, 4);
1.449 +
1.450 + return ETrue;
1.451 + }
1.452 +
1.453 +TBool TDebugFunctionality::GetDebugFunctionality(TDes8& aDFBlock)
1.454 + {
1.455 + if (aDFBlock.MaxLength() < GetDebugFunctionalityBufSize() )
1.456 + {
1.457 + // Insufficient space to contain the debug functionality block
1.458 + return EFalse;
1.459 + }
1.460 +
1.461 + AppendBlock((const TSubBlock&)DebugFunctionalityCore,aDFBlock);
1.462 + AppendBlock((const TSubBlock&)DebugFunctionalityMemory,aDFBlock);
1.463 + AppendBlock((const TSubBlock&)DebugFunctionalityRegistersCore,aDFBlock);
1.464 + AppendBlock((const TSubBlock&)DebugFunctionalityRegistersCoPro,aDFBlock);
1.465 + AppendBlock((const TSubBlock&)DebugFunctionalityBreakpoints,aDFBlock);
1.466 + AppendBlock((const TSubBlock&)DebugFunctionalityStepping,aDFBlock);
1.467 + AppendBlock((const TSubBlock&)DebugFunctionalityExecution,aDFBlock);
1.468 + AppendBlock((const TSubBlock&)DebugFunctionalityEvents,aDFBlock);
1.469 + AppendBlock((const TSubBlock&)DebugFunctionalityApiConstants,aDFBlock);
1.470 + AppendBlock((const TSubBlock&)DebugFunctionalityList,aDFBlock);
1.471 + AppendBlock((const TSubBlock&)DebugFunctionalityKillObjects,aDFBlock);
1.472 + AppendBlock((const TSubBlock&)DebugFunctionalitySecurity,aDFBlock);
1.473 +
1.474 + return ETrue;
1.475 + }
1.476 +
1.477 +/**
1.478 + * Get the register information associated with aRegisterInfo. If aRegisterInfo is
1.479 + * an unsupported register then an entry of the form:
1.480 + * {aRegisterInfo, x, 0, EAccessUnknown}
1.481 + * will be returned where x is an arbitrary value.
1.482 + *
1.483 + * @param aRegisterInfo register id information
1.484 + * @param aTag The functionality information for this register.
1.485 + * @return One of the system wide error codes
1.486 + */
1.487 +TInt TDebugFunctionality::GetRegister(const TRegisterInfo aRegisterInfo, TTag& aTag)
1.488 + {
1.489 + if(Register::IsCoreReg(aRegisterInfo))
1.490 + {
1.491 + for(TInt i=0; i<ERegisterLast; i++)
1.492 + {
1.493 + if(Register::GetCoreRegId(DebugFunctionalityRegistersCoreInfo[i].iTagId) == Register::GetCoreRegId(aRegisterInfo))
1.494 + {
1.495 + aTag = DebugFunctionalityRegistersCoreInfo[i];
1.496 + return KErrNone;
1.497 + }
1.498 + }
1.499 + }
1.500 + else if(Register::IsCoproReg(aRegisterInfo))
1.501 + {
1.502 + //get aRegisterInfo's details
1.503 + TUint32 crn = Register::GetCRn(aRegisterInfo);
1.504 + TUint32 crm = Register::GetCRm(aRegisterInfo);
1.505 + TUint32 opcode1 = Register::GetOpcode1(aRegisterInfo);
1.506 + TUint32 opcode2 = Register::GetOpcode2(aRegisterInfo);
1.507 + TUint32 coproNum = Register::GetCoproNum(aRegisterInfo);
1.508 +
1.509 + for(TInt i=0; i<sizeof(DebugFunctionalityRegistersCoProInfo)/sizeof(TTag); i++)
1.510 + {
1.511 + TUint32 tagId = DebugFunctionalityRegistersCoProInfo[i].iTagId;
1.512 +
1.513 + //if this entry is the DACR
1.514 + if((Register::GetCRm(tagId) == 3) && (Register::GetCoproNum(tagId) == 15))
1.515 + {
1.516 + if((crm == 3) && (coproNum == 15))
1.517 + {
1.518 + aTag = DebugFunctionalityRegistersCoProInfo[i];
1.519 + return KErrNone;
1.520 + }
1.521 + }
1.522 + //each coprocessor register that is supported will need logic adding here
1.523 + }
1.524 + }
1.525 + else // in the future there could be other types of register supported
1.526 + {
1.527 + //for now just fall through to unsupported case
1.528 + }
1.529 +
1.530 + //found an unsupported register so just return EAccessUnknown as the access level
1.531 + aTag.iTagId = aRegisterInfo;
1.532 + aTag.iSize = 0;
1.533 + aTag.iValue = EAccessUnknown;
1.534 +
1.535 + return KErrNotSupported;
1.536 + }
1.537 +
1.538 +/**
1.539 + * Returns the maximum memory block size which can be read or written.
1.540 + * @return the maximum memory block size which can be read or written
1.541 +*/
1.542 +TUint32 TDebugFunctionality::GetMemoryOperationMaxBlockSize()
1.543 + {
1.544 + return DebugFunctionalityMemoryInfo[EMemoryMaxBlockSize].iValue;
1.545 + }
1.546 +
1.547 +/**
1.548 + * Helper function to append a DebugFunctionalityXXX SubBlock
1.549 + * into a TDes buffer
1.550 + */
1.551 +void TDebugFunctionality::AppendBlock(const TSubBlock& aDFSubBlock, TDes8& aDFBlock)
1.552 + {
1.553 + // Copy the aSubDFBlock.header into aDFBlock (Note we don't put in a TSubBlock structure
1.554 + // as the block is just that - a flat block so the pointer is not required)
1.555 + TPtr8 SubDFBlockHdrPtr((TUint8*)&aDFSubBlock.iHeader,sizeof(TTagHeader),sizeof(TTagHeader));
1.556 +
1.557 + aDFBlock.Append(SubDFBlockHdrPtr);
1.558 +
1.559 + // Append all the Tags
1.560 + for (TUint i=0; i<aDFSubBlock.iHeader.iNumTags; i++)
1.561 + {
1.562 + TPtr8 tmpPtr((TUint8*)&aDFSubBlock.iTagArray[i],sizeof(TTag),sizeof(TTag));
1.563 +
1.564 + aDFBlock.Append(tmpPtr);
1.565 + }
1.566 + }
1.567 +
1.568 +/**
1.569 + * Computes the size in bytes of aDFBlock
1.570 + * @param aDFSubBlock
1.571 + * @return TUint32 size of sub block
1.572 + */
1.573 +TUint32 TDebugFunctionality::ComputeBlockSize(const TSubBlock& aDFSubBlock)
1.574 + {
1.575 + TUint32 size = 0;
1.576 +
1.577 + // Header size
1.578 + size += sizeof(TTagHeader);
1.579 +
1.580 + // size of all the tags within the header:
1.581 + size += aDFSubBlock.iHeader.iNumTags * sizeof(TTag);
1.582 +
1.583 + return size;
1.584 + }
1.585 +