First public contribution.
1 // Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
2 // All rights reserved.
3 // This component and the accompanying materials are made available
4 // under the terms of the License "Eclipse Public License v1.0"
5 // which accompanies this distribution, and is available
6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
8 // Initial Contributors:
9 // Nokia Corporation - initial contribution.
14 // Defines the DebugFunctionality class. This is responsible for
15 // providing configuration data needed by a host debugger to be able
16 // to correctly use the functionality provided by the run-mode debug subsystem.
20 #include <e32def_private.h>
22 #include <e32cmn_private.h>
24 #include <kernel/kernel.h>
25 #include <rm_debug_api.h>
26 #include <sm_debug_api.h>
27 #include "d_rmd_breakpoints.h"
28 #include "rm_debug_kerneldriver.h"
29 #include "d_debug_functionality.h"
30 #include "d_buffer_manager.h"
32 using namespace Debug;
35 const TTag DebugFunctionalityCoreInfo[] =
37 {ECoreEvents,ETagTypeBoolean,0,ETrue},
38 {ECoreStartStop,ETagTypeBoolean,0,ETrue},
39 {ECoreMemory,ETagTypeBoolean,0,ETrue},
40 {ECoreRegister,ETagTypeBoolean,0,ETrue},
41 {ECoreBreakpoint,ETagTypeBoolean,0,ETrue},
42 {ECoreStepping,ETagTypeBoolean,0,ETrue},
43 {ECoreLists,ETagTypeBoolean,0,ETrue},
44 {ECoreLogging,ETagTypeBoolean,0,EFalse},
45 {ECoreHardware,ETagTypeBoolean,0,EFalse},
46 {ECoreApiConstants,ETagTypeBoolean,0,ETrue},
47 {ECoreKillObjects,ETagTypeBoolean,0,ETrue},
48 {ECoreSecurity,ETagTypeBoolean,0,ETrue},
49 {ECoreStopModeFunctions,ETagTypeBoolean,0,EFalse},
50 {ECoreStopModeBuffers,ETagTypeBoolean,0,EFalse},
53 const TSubBlock DebugFunctionalityCore[] =
55 ETagHeaderIdCore,ECoreLast,
56 (TTag*)DebugFunctionalityCoreInfo
60 const TTag StopModeFunctionalityCoreInfo[] =
62 {ECoreEvents,ETagTypeBoolean,0,EFalse},
63 {ECoreStartStop,ETagTypeBoolean,0,EFalse},
64 {ECoreMemory,ETagTypeBoolean,0,EFalse},
65 {ECoreRegister,ETagTypeBoolean,0,EFalse},
66 {ECoreBreakpoint,ETagTypeBoolean,0,EFalse},
67 {ECoreStepping,ETagTypeBoolean,0,EFalse},
68 {ECoreLists,ETagTypeBoolean,0,ETrue},
69 {ECoreLogging,ETagTypeBoolean,0,EFalse},
70 {ECoreHardware,ETagTypeBoolean,0,EFalse},
71 {ECoreApiConstants,ETagTypeBoolean,0,EFalse},
72 {ECoreKillObjects, ETagTypeBoolean,0, EFalse},
73 {ECoreSecurity, ETagTypeBoolean,0,EFalse},
74 {ECoreStopModeFunctions,ETagTypeBoolean,0,ETrue},
75 {ECoreStopModeBuffers,ETagTypeBoolean,0,ETrue},
78 const TSubBlock StopModeFunctionalityCore[] =
80 ETagHeaderIdCore,ECoreLast,
81 (TTag*)StopModeFunctionalityCoreInfo
84 const TSubBlock StopModeFunctionalityBuffers[]=
86 ETagHeaderIdBuffers,EBuffersLast,
90 const TTag StopModeFunctionalityFunctionsInfo[] =
92 #ifdef __LAUNCH_AS_EXTENSION__
93 {EStopModeFunctionsExitPoint,ETagTypePointer,0,(TUint32)&StopModeDebug::ExitPoint},
94 {EStopModeFunctionsGetList,ETagTypePointer,0,(TUint32)&StopModeDebug::GetList},
95 {EStopModeFunctionsTestAPI,ETagTypePointer,0,(TUint32)&StopModeDebug::TestAPI}
97 {EStopModeFunctionsExitPoint,ETagTypePointer,0,NULL},
98 {EStopModeFunctionsGetList,ETagTypePointer,0,NULL},
99 {EStopModeFunctionsTestAPI,ETagTypePointer,0,NULL}
103 const TSubBlock StopModeFunctionalityFunctions[]=
105 ETagHeaderIdStopModeFunctions,EStopModeFunctionsLast,
106 (TTag*)StopModeFunctionalityFunctionsInfo
111 const TTag DebugFunctionalityMemoryInfo[] =
113 {EMemoryRead,ETagTypeBoolean,0,ETrue},
114 {EMemoryWrite,ETagTypeBoolean,0,ETrue},
115 {EMemoryAccess64,ETagTypeBoolean,0,EFalse},
116 {EMemoryAccess32,ETagTypeBoolean,0,ETrue},
117 {EMemoryAccess16,ETagTypeBoolean,0,EFalse},
118 {EMemoryAccess8,ETagTypeBoolean,0,EFalse},
119 {EMemoryBE8,ETagTypeBoolean,0,EFalse},
120 {EMemoryBE32,ETagTypeBoolean,0,EFalse},
121 {EMemoryLE8,ETagTypeBoolean,0,ETrue},
122 {EMemoryMaxBlockSize,ETagTypeTUint32,0,16 * KKilo /* 16Kbytes */} // binaryMax size of memory requests in bytes
125 const TSubBlock DebugFunctionalityMemory[]=
127 ETagHeaderIdMemory,EMemoryLast,
128 (TTag*)DebugFunctionalityMemoryInfo
132 const TTag DebugFunctionalityKillObjectsInfo[] =
134 {EFunctionalityKillThread,ETagTypeBoolean,0,EFalse},
135 {EFunctionalityKillProcess,ETagTypeBoolean,0,ETrue}
138 const TSubBlock DebugFunctionalityKillObjects[]=
140 ETagHeaderIdKillObjects,EFunctionalityKillObjectLast,
141 (TTag*)DebugFunctionalityKillObjectsInfo
145 const TTag DebugFunctionalityRegistersCoreInfo[] =
147 {ERegisterR0,ETagTypeEnum, 4,EAccessReadWrite},
148 {ERegisterR1,ETagTypeEnum, 4,EAccessReadWrite},
149 {ERegisterR2,ETagTypeEnum, 4,EAccessReadWrite},
150 {ERegisterR3,ETagTypeEnum, 4,EAccessReadWrite},
151 {ERegisterR4,ETagTypeEnum, 4,EAccessReadWrite},
152 {ERegisterR5,ETagTypeEnum, 4,EAccessReadWrite},
153 {ERegisterR6,ETagTypeEnum, 4,EAccessReadWrite},
154 {ERegisterR7,ETagTypeEnum, 4,EAccessReadWrite},
155 {ERegisterR8,ETagTypeEnum, 4,EAccessReadWrite},
156 {ERegisterR9,ETagTypeEnum, 4,EAccessReadWrite},
157 {ERegisterR10,ETagTypeEnum, 4,EAccessReadWrite},
158 {ERegisterR11,ETagTypeEnum, 4,EAccessReadWrite},
159 {ERegisterR12,ETagTypeEnum, 4,EAccessReadWrite},
160 {ERegisterR13,ETagTypeEnum, 4,EAccessReadWrite},
161 {ERegisterR14,ETagTypeEnum, 4,EAccessReadWrite},
162 {ERegisterR15,ETagTypeEnum, 4,EAccessReadWrite},
163 {ERegisterCpsr,ETagTypeEnum, 4,EAccessReadWrite},
164 {ERegisterR13Svc,ETagTypeEnum, 4,EAccessNone},
165 {ERegisterR14Svc,ETagTypeEnum, 4,EAccessNone},
166 {ERegisterSpsrSvc,ETagTypeEnum, 4,EAccessNone},
167 {ERegisterR13Abt,ETagTypeEnum, 4,EAccessNone},
168 {ERegisterR14Abt,ETagTypeEnum, 4,EAccessNone},
169 {ERegisterSpsrAbt,ETagTypeEnum, 4,EAccessNone},
170 {ERegisterR13Und,ETagTypeEnum, 4,EAccessNone},
171 {ERegisterR14Und,ETagTypeEnum, 4,EAccessNone},
172 {ERegisterSpsrUnd,ETagTypeEnum, 4,EAccessNone},
173 {ERegisterR13Irq,ETagTypeEnum, 4,EAccessNone},
174 {ERegisterR14Irq,ETagTypeEnum, 4,EAccessNone},
175 {ERegisterSpsrIrq,ETagTypeEnum, 4,EAccessNone},
176 {ERegisterR8Fiq,ETagTypeEnum, 4,EAccessNone},
177 {ERegisterR9Fiq,ETagTypeEnum, 4,EAccessNone},
178 {ERegisterR10Fiq,ETagTypeEnum, 4,EAccessNone},
179 {ERegisterR11Fiq,ETagTypeEnum, 4,EAccessNone},
180 {ERegisterR12Fiq,ETagTypeEnum, 4,EAccessNone},
181 {ERegisterR13Fiq,ETagTypeEnum, 4,EAccessNone},
182 {ERegisterR14Fiq,ETagTypeEnum, 4,EAccessNone},
183 {ERegisterSpsrFiq, ETagTypeEnum, 4,EAccessNone}
186 const TSubBlock DebugFunctionalityRegistersCore[] =
188 ETagHeaderIdRegistersCore, ERegisterLast,
189 (TTag*)DebugFunctionalityRegistersCoreInfo
192 // Co-processor registers
193 const TTag DebugFunctionalityRegistersCoProInfo[]=
195 //this is the DACR register
196 {0x00300f01, ETagTypeTUint32, 4, EAccessReadWrite}
199 const TSubBlock DebugFunctionalityRegistersCoPro[]=
201 ETagHeaderIdCoProRegisters,1,
202 (TTag*)DebugFunctionalityRegistersCoProInfo
206 const TTag DebugFunctionalityBreakpointsInfo[]=
208 {EBreakpointThread,ETagTypeBoolean,0,ETrue},
209 {EBreakpointProcess,ETagTypeBoolean,0,ETrue},
210 {EBreakpointSystem,ETagTypeBoolean,0,EFalse},
211 {EBreakpointArm,ETagTypeBoolean,0,ETrue},
212 {EBreakpointThumb,ETagTypeBoolean,0,ETrue},
213 {EBreakpointT2EE,ETagTypeBoolean,0,ETrue},
214 {EBreakpointArmInst,ETagTypeBoolean,0,EFalse},
215 {EBreakpointThumbInst,ETagTypeBoolean,0,EFalse},
216 {EBreakpointT2EEInst,ETagTypeBoolean,0,ETrue},
217 {EBreakpointSetArmInst,ETagTypeBoolean,0,EFalse},
218 {EBreakpointSetThumbInst,ETagTypeBoolean,0,EFalse},
219 {EBreakpointSetT2EEInst,ETagTypeBoolean,0,ETrue}
222 const TSubBlock DebugFunctionalityBreakpoints[] =
224 ETagHeaderIdBreakpoints, EBreakpointLast,
225 (TTag*)DebugFunctionalityBreakpointsInfo
229 const TTag DebugFunctionalitySteppingInfo[]=
231 {EStep,ETagTypeBoolean,0,ETrue}
234 const TSubBlock DebugFunctionalityStepping[] =
236 ETagHeaderIdStepping, EStepLast,
237 (TTag*)DebugFunctionalitySteppingInfo
241 const TTag DebugFunctionalityExecutionInfo[]=
243 {EExecThreadSuspendResume,ETagTypeBoolean,0,ETrue},
244 {EExecProcessSuspendResume,ETagTypeBoolean,0,EFalse},
245 {EExecSystemSuspendResume,ETagTypeBoolean,0,EFalse},
248 const TSubBlock DebugFunctionalityExecution[]=
250 ETagHeaderIdExecution, EExecLast,
251 (TTag*)DebugFunctionalityExecutionInfo
255 const TTag DebugFunctionalityEventsInfo[]=
257 {EEventsBreakPoint,ETagTypeEnum,0,EActionSuspend},
258 {EEventsProcessBreakPoint,ETagTypeEnum,0,EActionSuspend},
259 {EEventsSwExc,ETagTypeEnum,0,EActionSuspend},
260 {EEventsHwExc,ETagTypeEnum,0,EActionSuspend},
261 {EEventsKillThread,ETagTypeEnum,0,EActionContinue},
262 {EEventsAddLibrary,ETagTypeEnum,0,EActionSuspend},
263 {EEventsRemoveLibrary,ETagTypeEnum,0,EActionSuspend},
264 {EEventsUserTrace,ETagTypeEnum,0,EActionSuspend},
265 {EEventsStartThread,ETagTypeEnum,0,EActionSuspend},
266 {EEventsBufferFull,ETagTypeEnum,0,EActionContinue},
267 {EEventsUnknown,ETagTypeEnum,0,EActionContinue},
268 {EEventsUserTracesLost, ETagTypeEnum, 0, EActionContinue},
269 {EEventsAddProcess,ETagTypeEnum,0,EActionContinue},
270 {EEventsRemoveProcess,ETagTypeEnum,0,EActionContinue}
273 const TSubBlock DebugFunctionalityEvents[] =
275 ETagHeaderIdEvents, EEventsLast,
276 (TTag*)DebugFunctionalityEventsInfo
280 const TTag DebugFunctionalityApiConstantsInfo[]=
282 {EApiConstantsTEventInfoSize,ETagTypeTUint32,0,sizeof(TEventInfo)},
285 const TSubBlock DebugFunctionalityApiConstants[] =
287 ETagHeaderIdApiConstants, EApiConstantsLast,
288 (TTag*)DebugFunctionalityApiConstantsInfo
292 const TTag DebugFunctionalityListInfo[] =
294 {EProcesses,ETagTypeBitField,0,EScopeGlobal},
295 {EThreads,ETagTypeBitField,0,EScopeGlobal|EScopeProcessSpecific|EScopeThreadSpecific},
296 {ECodeSegs,ETagTypeBitField,0,EScopeGlobal|EScopeProcessSpecific|EScopeThreadSpecific},
297 {EXipLibraries,ETagTypeBitField,0,EScopeGlobal},
298 {EExecutables,ETagTypeBitField,0,EScopeGlobal},
299 {ELogicalDevices,ETagTypeBitField,0,EScopeNone},
300 {EMutexes,ETagTypeBitField,0,EScopeNone},
301 {EServers,ETagTypeBitField,0,EScopeNone},
302 {ESessions,ETagTypeBitField,0,EScopeNone},
303 {ESemaphores,ETagTypeBitField,0,EScopeNone},
304 {EChunks,ETagTypeBitField,0,EScopeNone},
305 {EBreakpoints,ETagTypeBitField,0,EScopeNone},
306 {ESetBreak,ETagTypeBitField,0,EScopeNone},
307 {ERemoveBreak,ETagTypeBitField,0,EScopeNone},
308 {EModifyBreak,ETagTypeBitField,0,EScopeNone},
311 const TSubBlock DebugFunctionalityList[] =
313 ETagHeaderList, EListLast,
314 (TTag*)DebugFunctionalityListInfo
318 const TTag StopModeFunctionalityListInfo[] =
320 {EProcesses,ETagTypeBitField,0,EScopeNone},
321 {EThreads,ETagTypeBitField,0,EScopeNone},
322 {ECodeSegs,ETagTypeBitField,0,EScopeGlobal|EScopeThreadSpecific},
323 {EXipLibraries,ETagTypeBitField,0,EScopeNone},
324 {EExecutables,ETagTypeBitField,0,EScopeNone},
325 {ELogicalDevices,ETagTypeBitField,0,EScopeNone},
326 {EMutexes,ETagTypeBitField,0,EScopeNone},
327 {EServers,ETagTypeBitField,0,EScopeNone},
328 {ESessions,ETagTypeBitField,0,EScopeNone},
329 {ESemaphores,ETagTypeBitField,0,EScopeNone},
330 {EChunks,ETagTypeBitField,0,EScopeNone},
331 {EBreakpoints,ETagTypeBitField,0,EScopeNone},
332 {ESetBreak,ETagTypeBitField,0,EScopeNone},
333 {ERemoveBreak,ETagTypeBitField,0,EScopeNone},
334 {EModifyBreak,ETagTypeBitField,0,EScopeNone},
337 const TSubBlock StopModeFunctionalityList[] =
339 ETagHeaderList, EListLast,
340 (TTag*)StopModeFunctionalityListInfo
354 const TTag DebugFunctionalitySecurityInfo[]=
356 {ESecurityOEMDebugToken,ETagTypeBoolean,0,ETrue}
359 const TSubBlock DebugFunctionalitySecurity[] =
361 ETagHeaderIdSecurity, ESecurityLast,
362 (TTag*)DebugFunctionalitySecurityInfo
365 TUint32 TDebugFunctionality::GetDebugFunctionalityBufSize(void)
369 df_size += ComputeBlockSize((const TSubBlock&)DebugFunctionalityCore);
370 df_size += ComputeBlockSize((const TSubBlock&)DebugFunctionalityMemory);
371 df_size += ComputeBlockSize((const TSubBlock&)DebugFunctionalityRegistersCore);
372 df_size += ComputeBlockSize((const TSubBlock&)DebugFunctionalityRegistersCoPro);
373 df_size += ComputeBlockSize((const TSubBlock&)DebugFunctionalityBreakpoints);
374 df_size += ComputeBlockSize((const TSubBlock&)DebugFunctionalityStepping);
375 df_size += ComputeBlockSize((const TSubBlock&)DebugFunctionalityExecution);
376 df_size += ComputeBlockSize((const TSubBlock&)DebugFunctionalityEvents);
377 df_size += ComputeBlockSize((const TSubBlock&)DebugFunctionalityApiConstants);
378 df_size += ComputeBlockSize((const TSubBlock&)DebugFunctionalityList);
379 df_size += ComputeBlockSize((const TSubBlock&)DebugFunctionalityKillObjects);
380 df_size += ComputeBlockSize((const TSubBlock&)DebugFunctionalitySecurity);
385 TUint32 TDebugFunctionality::GetStopModeFunctionalityBufSize(void)
389 // First four bytes are length field
390 // Next four are version
391 // Last four bytes will be the checksum
393 ComputeBlockSize((const TSubBlock&)StopModeFunctionalityCore) +
394 ComputeBlockSize((const TSubBlock&)StopModeFunctionalityBuffers) +
395 ComputeBlockSize((const TSubBlock&)StopModeFunctionalityFunctions) +
396 ComputeBlockSize((const TSubBlock&)StopModeFunctionalityList);
401 TBool TDebugFunctionality::GetStopModeFunctionality(TDes8& aDFBlock)
403 TUint32 size = GetStopModeFunctionalityBufSize();
404 if (aDFBlock.MaxLength() < size)
406 // Insufficient space to contain the debug functionality block
410 TUint8* ptr = (TUint8*)&size;
411 aDFBlock.SetLength(0);
412 aDFBlock.Append(ptr, 4);
413 TVersion version = TVersion(KStopModeMajorVersionNumber, KStopModeMinorVersionNumber, KStopModePatchVersionNumber);
414 ptr = (TUint8*)&version;
415 aDFBlock.Append(ptr, sizeof(TVersion));
417 AppendBlock((const TSubBlock&)StopModeFunctionalityCore,aDFBlock);
418 AppendBlock((const TSubBlock&)StopModeFunctionalityFunctions,aDFBlock);
419 AppendBlock((const TSubBlock&)StopModeFunctionalityList,aDFBlock);
421 const TTagHeader& header = StopModeFunctionalityBuffers->iHeader;
422 aDFBlock.Append((TUint8*)&header, sizeof(TTagHeader));
424 for(TInt i=0; i<EBuffersLast; i++)
427 TheDBufferManager.GetBufferDetails((TBufferType)i, tag);
428 aDFBlock.Append((TUint8*)&tag, sizeof(TTag));
431 if(aDFBlock.Length() != size - 4)
436 TUint32* ptr32 = (TUint32*)aDFBlock.Ptr();
437 TUint32 checksum = 0;
438 for(TInt i=0; i<aDFBlock.Length(); i+=4)
444 ptr = (TUint8*)&checksum;
445 aDFBlock.Append(ptr, 4);
450 TBool TDebugFunctionality::GetDebugFunctionality(TDes8& aDFBlock)
452 if (aDFBlock.MaxLength() < GetDebugFunctionalityBufSize() )
454 // Insufficient space to contain the debug functionality block
458 AppendBlock((const TSubBlock&)DebugFunctionalityCore,aDFBlock);
459 AppendBlock((const TSubBlock&)DebugFunctionalityMemory,aDFBlock);
460 AppendBlock((const TSubBlock&)DebugFunctionalityRegistersCore,aDFBlock);
461 AppendBlock((const TSubBlock&)DebugFunctionalityRegistersCoPro,aDFBlock);
462 AppendBlock((const TSubBlock&)DebugFunctionalityBreakpoints,aDFBlock);
463 AppendBlock((const TSubBlock&)DebugFunctionalityStepping,aDFBlock);
464 AppendBlock((const TSubBlock&)DebugFunctionalityExecution,aDFBlock);
465 AppendBlock((const TSubBlock&)DebugFunctionalityEvents,aDFBlock);
466 AppendBlock((const TSubBlock&)DebugFunctionalityApiConstants,aDFBlock);
467 AppendBlock((const TSubBlock&)DebugFunctionalityList,aDFBlock);
468 AppendBlock((const TSubBlock&)DebugFunctionalityKillObjects,aDFBlock);
469 AppendBlock((const TSubBlock&)DebugFunctionalitySecurity,aDFBlock);
475 * Get the register information associated with aRegisterInfo. If aRegisterInfo is
476 * an unsupported register then an entry of the form:
477 * {aRegisterInfo, x, 0, EAccessUnknown}
478 * will be returned where x is an arbitrary value.
480 * @param aRegisterInfo register id information
481 * @param aTag The functionality information for this register.
482 * @return One of the system wide error codes
484 TInt TDebugFunctionality::GetRegister(const TRegisterInfo aRegisterInfo, TTag& aTag)
486 if(Register::IsCoreReg(aRegisterInfo))
488 for(TInt i=0; i<ERegisterLast; i++)
490 if(Register::GetCoreRegId(DebugFunctionalityRegistersCoreInfo[i].iTagId) == Register::GetCoreRegId(aRegisterInfo))
492 aTag = DebugFunctionalityRegistersCoreInfo[i];
497 else if(Register::IsCoproReg(aRegisterInfo))
499 //get aRegisterInfo's details
500 TUint32 crn = Register::GetCRn(aRegisterInfo);
501 TUint32 crm = Register::GetCRm(aRegisterInfo);
502 TUint32 opcode1 = Register::GetOpcode1(aRegisterInfo);
503 TUint32 opcode2 = Register::GetOpcode2(aRegisterInfo);
504 TUint32 coproNum = Register::GetCoproNum(aRegisterInfo);
506 for(TInt i=0; i<sizeof(DebugFunctionalityRegistersCoProInfo)/sizeof(TTag); i++)
508 TUint32 tagId = DebugFunctionalityRegistersCoProInfo[i].iTagId;
510 //if this entry is the DACR
511 if((Register::GetCRm(tagId) == 3) && (Register::GetCoproNum(tagId) == 15))
513 if((crm == 3) && (coproNum == 15))
515 aTag = DebugFunctionalityRegistersCoProInfo[i];
519 //each coprocessor register that is supported will need logic adding here
522 else // in the future there could be other types of register supported
524 //for now just fall through to unsupported case
527 //found an unsupported register so just return EAccessUnknown as the access level
528 aTag.iTagId = aRegisterInfo;
530 aTag.iValue = EAccessUnknown;
532 return KErrNotSupported;
536 * Returns the maximum memory block size which can be read or written.
537 * @return the maximum memory block size which can be read or written
539 TUint32 TDebugFunctionality::GetMemoryOperationMaxBlockSize()
541 return DebugFunctionalityMemoryInfo[EMemoryMaxBlockSize].iValue;
545 * Helper function to append a DebugFunctionalityXXX SubBlock
548 void TDebugFunctionality::AppendBlock(const TSubBlock& aDFSubBlock, TDes8& aDFBlock)
550 // Copy the aSubDFBlock.header into aDFBlock (Note we don't put in a TSubBlock structure
551 // as the block is just that - a flat block so the pointer is not required)
552 TPtr8 SubDFBlockHdrPtr((TUint8*)&aDFSubBlock.iHeader,sizeof(TTagHeader),sizeof(TTagHeader));
554 aDFBlock.Append(SubDFBlockHdrPtr);
556 // Append all the Tags
557 for (TUint i=0; i<aDFSubBlock.iHeader.iNumTags; i++)
559 TPtr8 tmpPtr((TUint8*)&aDFSubBlock.iTagArray[i],sizeof(TTag),sizeof(TTag));
561 aDFBlock.Append(tmpPtr);
566 * Computes the size in bytes of aDFBlock
568 * @return TUint32 size of sub block
570 TUint32 TDebugFunctionality::ComputeBlockSize(const TSubBlock& aDFSubBlock)
575 size += sizeof(TTagHeader);
577 // size of all the tags within the header:
578 size += aDFSubBlock.iHeader.iNumTags * sizeof(TTag);