os/kernelhwsrv/kernel/eka/drivers/debug/common/d_debug_functionality.cpp
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
sl@0
     1
// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     2
// All rights reserved.
sl@0
     3
// This component and the accompanying materials are made available
sl@0
     4
// under the terms of the License "Eclipse Public License v1.0"
sl@0
     5
// which accompanies this distribution, and is available
sl@0
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     7
//
sl@0
     8
// Initial Contributors:
sl@0
     9
// Nokia Corporation - initial contribution.
sl@0
    10
//
sl@0
    11
// Contributors:
sl@0
    12
//
sl@0
    13
// Description:
sl@0
    14
// Defines the DebugFunctionality class. This is responsible for
sl@0
    15
// providing configuration data needed by a host debugger to be able
sl@0
    16
// to correctly use the functionality provided by the run-mode debug subsystem.
sl@0
    17
// 
sl@0
    18
sl@0
    19
#include <e32def.h>
sl@0
    20
#include <e32def_private.h>
sl@0
    21
#include <e32cmn.h>
sl@0
    22
#include <e32cmn_private.h>
sl@0
    23
#include <u32std.h>
sl@0
    24
#include <kernel/kernel.h>
sl@0
    25
#include <rm_debug_api.h>
sl@0
    26
#include <sm_debug_api.h>
sl@0
    27
#include "d_rmd_breakpoints.h"
sl@0
    28
#include "rm_debug_kerneldriver.h"
sl@0
    29
#include "d_debug_functionality.h"
sl@0
    30
#include "d_buffer_manager.h"
sl@0
    31
sl@0
    32
using namespace Debug;
sl@0
    33
sl@0
    34
// Core
sl@0
    35
const TTag DebugFunctionalityCoreInfo[] =
sl@0
    36
	{
sl@0
    37
	{ECoreEvents,ETagTypeBoolean,0,ETrue},
sl@0
    38
	{ECoreStartStop,ETagTypeBoolean,0,ETrue},
sl@0
    39
	{ECoreMemory,ETagTypeBoolean,0,ETrue},
sl@0
    40
	{ECoreRegister,ETagTypeBoolean,0,ETrue},
sl@0
    41
	{ECoreBreakpoint,ETagTypeBoolean,0,ETrue},
sl@0
    42
	{ECoreStepping,ETagTypeBoolean,0,ETrue},
sl@0
    43
	{ECoreLists,ETagTypeBoolean,0,ETrue},
sl@0
    44
	{ECoreLogging,ETagTypeBoolean,0,EFalse},
sl@0
    45
	{ECoreHardware,ETagTypeBoolean,0,EFalse},
sl@0
    46
	{ECoreApiConstants,ETagTypeBoolean,0,ETrue},
sl@0
    47
	{ECoreKillObjects,ETagTypeBoolean,0,ETrue},
sl@0
    48
	{ECoreSecurity,ETagTypeBoolean,0,ETrue},
sl@0
    49
	{ECoreStopModeFunctions,ETagTypeBoolean,0,EFalse},
sl@0
    50
	{ECoreStopModeBuffers,ETagTypeBoolean,0,EFalse},	
sl@0
    51
	};
sl@0
    52
sl@0
    53
const TSubBlock DebugFunctionalityCore[] =
sl@0
    54
	{
sl@0
    55
	ETagHeaderIdCore,ECoreLast,
sl@0
    56
	(TTag*)DebugFunctionalityCoreInfo
sl@0
    57
	};
sl@0
    58
sl@0
    59
// Core
sl@0
    60
const TTag StopModeFunctionalityCoreInfo[] =
sl@0
    61
	{
sl@0
    62
	{ECoreEvents,ETagTypeBoolean,0,EFalse},
sl@0
    63
	{ECoreStartStop,ETagTypeBoolean,0,EFalse},
sl@0
    64
	{ECoreMemory,ETagTypeBoolean,0,EFalse},
sl@0
    65
	{ECoreRegister,ETagTypeBoolean,0,EFalse},
sl@0
    66
	{ECoreBreakpoint,ETagTypeBoolean,0,EFalse},
sl@0
    67
	{ECoreStepping,ETagTypeBoolean,0,EFalse},
sl@0
    68
	{ECoreLists,ETagTypeBoolean,0,ETrue},
sl@0
    69
	{ECoreLogging,ETagTypeBoolean,0,EFalse},
sl@0
    70
	{ECoreHardware,ETagTypeBoolean,0,EFalse},
sl@0
    71
	{ECoreApiConstants,ETagTypeBoolean,0,EFalse},
sl@0
    72
	{ECoreKillObjects, ETagTypeBoolean,0, EFalse},
sl@0
    73
	{ECoreSecurity, ETagTypeBoolean,0,EFalse},
sl@0
    74
	{ECoreStopModeFunctions,ETagTypeBoolean,0,ETrue},
sl@0
    75
	{ECoreStopModeBuffers,ETagTypeBoolean,0,ETrue},
sl@0
    76
	};
sl@0
    77
sl@0
    78
const TSubBlock StopModeFunctionalityCore[] =
sl@0
    79
	{
sl@0
    80
	ETagHeaderIdCore,ECoreLast,
sl@0
    81
	(TTag*)StopModeFunctionalityCoreInfo
sl@0
    82
	};
sl@0
    83
sl@0
    84
const TSubBlock StopModeFunctionalityBuffers[]=
sl@0
    85
	{
sl@0
    86
	ETagHeaderIdBuffers,EBuffersLast,
sl@0
    87
	(TTag*)NULL
sl@0
    88
	};
sl@0
    89
sl@0
    90
const TTag StopModeFunctionalityFunctionsInfo[] =
sl@0
    91
	{
sl@0
    92
#ifdef __LAUNCH_AS_EXTENSION__
sl@0
    93
	{EStopModeFunctionsExitPoint,ETagTypePointer,0,(TUint32)&StopModeDebug::ExitPoint}, 
sl@0
    94
	{EStopModeFunctionsGetList,ETagTypePointer,0,(TUint32)&StopModeDebug::GetList},
sl@0
    95
	{EStopModeFunctionsTestAPI,ETagTypePointer,0,(TUint32)&StopModeDebug::TestAPI} 
sl@0
    96
#else
sl@0
    97
	{EStopModeFunctionsExitPoint,ETagTypePointer,0,NULL}, 
sl@0
    98
	{EStopModeFunctionsGetList,ETagTypePointer,0,NULL},
sl@0
    99
	{EStopModeFunctionsTestAPI,ETagTypePointer,0,NULL} 
sl@0
   100
#endif
sl@0
   101
	};
sl@0
   102
sl@0
   103
const TSubBlock StopModeFunctionalityFunctions[]=
sl@0
   104
	{
sl@0
   105
	ETagHeaderIdStopModeFunctions,EStopModeFunctionsLast,
sl@0
   106
	(TTag*)StopModeFunctionalityFunctionsInfo
sl@0
   107
	};
sl@0
   108
sl@0
   109
sl@0
   110
// Memory
sl@0
   111
const TTag DebugFunctionalityMemoryInfo[] =
sl@0
   112
	{
sl@0
   113
	{EMemoryRead,ETagTypeBoolean,0,ETrue}, 
sl@0
   114
	{EMemoryWrite,ETagTypeBoolean,0,ETrue},
sl@0
   115
	{EMemoryAccess64,ETagTypeBoolean,0,EFalse},
sl@0
   116
	{EMemoryAccess32,ETagTypeBoolean,0,ETrue},
sl@0
   117
	{EMemoryAccess16,ETagTypeBoolean,0,EFalse},
sl@0
   118
	{EMemoryAccess8,ETagTypeBoolean,0,EFalse},
sl@0
   119
	{EMemoryBE8,ETagTypeBoolean,0,EFalse},
sl@0
   120
	{EMemoryBE32,ETagTypeBoolean,0,EFalse},
sl@0
   121
	{EMemoryLE8,ETagTypeBoolean,0,ETrue},
sl@0
   122
	{EMemoryMaxBlockSize,ETagTypeTUint32,0,16 * KKilo /* 16Kbytes */}	// binaryMax size of memory requests in bytes
sl@0
   123
	};
sl@0
   124
sl@0
   125
const TSubBlock DebugFunctionalityMemory[]=
sl@0
   126
	{
sl@0
   127
	ETagHeaderIdMemory,EMemoryLast,
sl@0
   128
	(TTag*)DebugFunctionalityMemoryInfo
sl@0
   129
	};
sl@0
   130
sl@0
   131
// Kill Objects
sl@0
   132
const TTag DebugFunctionalityKillObjectsInfo[] =
sl@0
   133
	{
sl@0
   134
	{EFunctionalityKillThread,ETagTypeBoolean,0,EFalse}, 
sl@0
   135
	{EFunctionalityKillProcess,ETagTypeBoolean,0,ETrue}
sl@0
   136
	};
sl@0
   137
sl@0
   138
const TSubBlock DebugFunctionalityKillObjects[]=
sl@0
   139
	{
sl@0
   140
	ETagHeaderIdKillObjects,EFunctionalityKillObjectLast,
sl@0
   141
	(TTag*)DebugFunctionalityKillObjectsInfo
sl@0
   142
	};
sl@0
   143
sl@0
   144
// Core Registers
sl@0
   145
const TTag DebugFunctionalityRegistersCoreInfo[] =
sl@0
   146
	{
sl@0
   147
	{ERegisterR0,ETagTypeEnum, 4,EAccessReadWrite},
sl@0
   148
	{ERegisterR1,ETagTypeEnum, 4,EAccessReadWrite},
sl@0
   149
	{ERegisterR2,ETagTypeEnum, 4,EAccessReadWrite},
sl@0
   150
	{ERegisterR3,ETagTypeEnum, 4,EAccessReadWrite},
sl@0
   151
	{ERegisterR4,ETagTypeEnum, 4,EAccessReadWrite},
sl@0
   152
	{ERegisterR5,ETagTypeEnum, 4,EAccessReadWrite},
sl@0
   153
	{ERegisterR6,ETagTypeEnum, 4,EAccessReadWrite},
sl@0
   154
	{ERegisterR7,ETagTypeEnum, 4,EAccessReadWrite},
sl@0
   155
	{ERegisterR8,ETagTypeEnum, 4,EAccessReadWrite},
sl@0
   156
	{ERegisterR9,ETagTypeEnum, 4,EAccessReadWrite},
sl@0
   157
	{ERegisterR10,ETagTypeEnum, 4,EAccessReadWrite},
sl@0
   158
	{ERegisterR11,ETagTypeEnum, 4,EAccessReadWrite},
sl@0
   159
	{ERegisterR12,ETagTypeEnum, 4,EAccessReadWrite},
sl@0
   160
	{ERegisterR13,ETagTypeEnum, 4,EAccessReadWrite},
sl@0
   161
	{ERegisterR14,ETagTypeEnum, 4,EAccessReadWrite},
sl@0
   162
	{ERegisterR15,ETagTypeEnum, 4,EAccessReadWrite},
sl@0
   163
	{ERegisterCpsr,ETagTypeEnum, 4,EAccessReadWrite},
sl@0
   164
	{ERegisterR13Svc,ETagTypeEnum, 4,EAccessNone},
sl@0
   165
	{ERegisterR14Svc,ETagTypeEnum, 4,EAccessNone},
sl@0
   166
	{ERegisterSpsrSvc,ETagTypeEnum, 4,EAccessNone},
sl@0
   167
	{ERegisterR13Abt,ETagTypeEnum, 4,EAccessNone},
sl@0
   168
	{ERegisterR14Abt,ETagTypeEnum, 4,EAccessNone},
sl@0
   169
	{ERegisterSpsrAbt,ETagTypeEnum, 4,EAccessNone},
sl@0
   170
	{ERegisterR13Und,ETagTypeEnum, 4,EAccessNone},
sl@0
   171
	{ERegisterR14Und,ETagTypeEnum, 4,EAccessNone},
sl@0
   172
	{ERegisterSpsrUnd,ETagTypeEnum, 4,EAccessNone},
sl@0
   173
	{ERegisterR13Irq,ETagTypeEnum, 4,EAccessNone},
sl@0
   174
	{ERegisterR14Irq,ETagTypeEnum, 4,EAccessNone},
sl@0
   175
	{ERegisterSpsrIrq,ETagTypeEnum, 4,EAccessNone},
sl@0
   176
	{ERegisterR8Fiq,ETagTypeEnum, 4,EAccessNone},
sl@0
   177
	{ERegisterR9Fiq,ETagTypeEnum, 4,EAccessNone},
sl@0
   178
	{ERegisterR10Fiq,ETagTypeEnum, 4,EAccessNone},
sl@0
   179
	{ERegisterR11Fiq,ETagTypeEnum, 4,EAccessNone},
sl@0
   180
	{ERegisterR12Fiq,ETagTypeEnum, 4,EAccessNone},
sl@0
   181
	{ERegisterR13Fiq,ETagTypeEnum, 4,EAccessNone},
sl@0
   182
	{ERegisterR14Fiq,ETagTypeEnum, 4,EAccessNone},
sl@0
   183
	{ERegisterSpsrFiq, ETagTypeEnum, 4,EAccessNone}
sl@0
   184
	};
sl@0
   185
sl@0
   186
const TSubBlock DebugFunctionalityRegistersCore[] =
sl@0
   187
	{
sl@0
   188
	ETagHeaderIdRegistersCore, ERegisterLast,
sl@0
   189
	(TTag*)DebugFunctionalityRegistersCoreInfo
sl@0
   190
	};
sl@0
   191
sl@0
   192
// Co-processor registers
sl@0
   193
const TTag DebugFunctionalityRegistersCoProInfo[]=
sl@0
   194
	{
sl@0
   195
	//this is the DACR register
sl@0
   196
	{0x00300f01, ETagTypeTUint32, 4, EAccessReadWrite} 
sl@0
   197
	};
sl@0
   198
sl@0
   199
const TSubBlock DebugFunctionalityRegistersCoPro[]=
sl@0
   200
	{
sl@0
   201
	ETagHeaderIdCoProRegisters,1,
sl@0
   202
	(TTag*)DebugFunctionalityRegistersCoProInfo
sl@0
   203
	};
sl@0
   204
sl@0
   205
// Breakpoints
sl@0
   206
const TTag DebugFunctionalityBreakpointsInfo[]=
sl@0
   207
	{
sl@0
   208
	{EBreakpointThread,ETagTypeBoolean,0,ETrue},
sl@0
   209
	{EBreakpointProcess,ETagTypeBoolean,0,ETrue},
sl@0
   210
	{EBreakpointSystem,ETagTypeBoolean,0,EFalse},
sl@0
   211
	{EBreakpointArm,ETagTypeBoolean,0,ETrue},
sl@0
   212
	{EBreakpointThumb,ETagTypeBoolean,0,ETrue},
sl@0
   213
	{EBreakpointT2EE,ETagTypeBoolean,0,ETrue},
sl@0
   214
	{EBreakpointArmInst,ETagTypeBoolean,0,EFalse},
sl@0
   215
	{EBreakpointThumbInst,ETagTypeBoolean,0,EFalse},
sl@0
   216
	{EBreakpointT2EEInst,ETagTypeBoolean,0,ETrue},
sl@0
   217
	{EBreakpointSetArmInst,ETagTypeBoolean,0,EFalse},
sl@0
   218
	{EBreakpointSetThumbInst,ETagTypeBoolean,0,EFalse},
sl@0
   219
	{EBreakpointSetT2EEInst,ETagTypeBoolean,0,ETrue}
sl@0
   220
	};
sl@0
   221
sl@0
   222
const TSubBlock DebugFunctionalityBreakpoints[] =
sl@0
   223
	{
sl@0
   224
	ETagHeaderIdBreakpoints, EBreakpointLast,
sl@0
   225
	(TTag*)DebugFunctionalityBreakpointsInfo
sl@0
   226
	};
sl@0
   227
sl@0
   228
// Stepping
sl@0
   229
const TTag DebugFunctionalitySteppingInfo[]=
sl@0
   230
	{
sl@0
   231
	{EStep,ETagTypeBoolean,0,ETrue}
sl@0
   232
	};
sl@0
   233
sl@0
   234
const TSubBlock DebugFunctionalityStepping[] =
sl@0
   235
	{
sl@0
   236
	ETagHeaderIdStepping, EStepLast,
sl@0
   237
	(TTag*)DebugFunctionalitySteppingInfo
sl@0
   238
	};
sl@0
   239
sl@0
   240
// Execution Control
sl@0
   241
const TTag DebugFunctionalityExecutionInfo[]=
sl@0
   242
	{
sl@0
   243
	{EExecThreadSuspendResume,ETagTypeBoolean,0,ETrue},
sl@0
   244
	{EExecProcessSuspendResume,ETagTypeBoolean,0,EFalse},
sl@0
   245
	{EExecSystemSuspendResume,ETagTypeBoolean,0,EFalse},
sl@0
   246
	};
sl@0
   247
sl@0
   248
const TSubBlock DebugFunctionalityExecution[]=
sl@0
   249
	{
sl@0
   250
	ETagHeaderIdExecution, EExecLast,
sl@0
   251
	(TTag*)DebugFunctionalityExecutionInfo
sl@0
   252
	};
sl@0
   253
sl@0
   254
// Events
sl@0
   255
const TTag DebugFunctionalityEventsInfo[]=
sl@0
   256
	{
sl@0
   257
	{EEventsBreakPoint,ETagTypeEnum,0,EActionSuspend},
sl@0
   258
	{EEventsProcessBreakPoint,ETagTypeEnum,0,EActionSuspend},
sl@0
   259
	{EEventsSwExc,ETagTypeEnum,0,EActionSuspend},
sl@0
   260
	{EEventsHwExc,ETagTypeEnum,0,EActionSuspend},
sl@0
   261
	{EEventsKillThread,ETagTypeEnum,0,EActionContinue},
sl@0
   262
	{EEventsAddLibrary,ETagTypeEnum,0,EActionSuspend},
sl@0
   263
	{EEventsRemoveLibrary,ETagTypeEnum,0,EActionSuspend},
sl@0
   264
	{EEventsUserTrace,ETagTypeEnum,0,EActionSuspend},
sl@0
   265
	{EEventsStartThread,ETagTypeEnum,0,EActionSuspend},
sl@0
   266
	{EEventsBufferFull,ETagTypeEnum,0,EActionContinue},
sl@0
   267
	{EEventsUnknown,ETagTypeEnum,0,EActionContinue},
sl@0
   268
	{EEventsUserTracesLost, ETagTypeEnum, 0, EActionContinue},
sl@0
   269
	{EEventsAddProcess,ETagTypeEnum,0,EActionContinue},
sl@0
   270
	{EEventsRemoveProcess,ETagTypeEnum,0,EActionContinue}
sl@0
   271
	};
sl@0
   272
sl@0
   273
const TSubBlock DebugFunctionalityEvents[] =
sl@0
   274
	{
sl@0
   275
	ETagHeaderIdEvents, EEventsLast,
sl@0
   276
	(TTag*)DebugFunctionalityEventsInfo
sl@0
   277
	};
sl@0
   278
sl@0
   279
// API Constants
sl@0
   280
const TTag DebugFunctionalityApiConstantsInfo[]=
sl@0
   281
	{
sl@0
   282
	{EApiConstantsTEventInfoSize,ETagTypeTUint32,0,sizeof(TEventInfo)},
sl@0
   283
	};
sl@0
   284
sl@0
   285
const TSubBlock DebugFunctionalityApiConstants[] =
sl@0
   286
	{
sl@0
   287
	ETagHeaderIdApiConstants, EApiConstantsLast,
sl@0
   288
	(TTag*)DebugFunctionalityApiConstantsInfo
sl@0
   289
	};
sl@0
   290
sl@0
   291
// Listings
sl@0
   292
const TTag DebugFunctionalityListInfo[] =
sl@0
   293
	{
sl@0
   294
	{EProcesses,ETagTypeBitField,0,EScopeGlobal},
sl@0
   295
	{EThreads,ETagTypeBitField,0,EScopeGlobal|EScopeProcessSpecific|EScopeThreadSpecific},
sl@0
   296
	{ECodeSegs,ETagTypeBitField,0,EScopeGlobal|EScopeProcessSpecific|EScopeThreadSpecific},
sl@0
   297
	{EXipLibraries,ETagTypeBitField,0,EScopeGlobal},
sl@0
   298
	{EExecutables,ETagTypeBitField,0,EScopeGlobal},
sl@0
   299
	{ELogicalDevices,ETagTypeBitField,0,EScopeNone},
sl@0
   300
	{EMutexes,ETagTypeBitField,0,EScopeNone},
sl@0
   301
	{EServers,ETagTypeBitField,0,EScopeNone},
sl@0
   302
	{ESessions,ETagTypeBitField,0,EScopeNone},
sl@0
   303
	{ESemaphores,ETagTypeBitField,0,EScopeNone},
sl@0
   304
	{EChunks,ETagTypeBitField,0,EScopeNone},
sl@0
   305
	{EBreakpoints,ETagTypeBitField,0,EScopeNone},
sl@0
   306
	{ESetBreak,ETagTypeBitField,0,EScopeNone},
sl@0
   307
	{ERemoveBreak,ETagTypeBitField,0,EScopeNone},
sl@0
   308
	{EModifyBreak,ETagTypeBitField,0,EScopeNone},
sl@0
   309
	};
sl@0
   310
sl@0
   311
const TSubBlock DebugFunctionalityList[] =
sl@0
   312
	{
sl@0
   313
	ETagHeaderList, EListLast,
sl@0
   314
	(TTag*)DebugFunctionalityListInfo
sl@0
   315
	};
sl@0
   316
sl@0
   317
// Listings
sl@0
   318
const TTag StopModeFunctionalityListInfo[] =
sl@0
   319
	{
sl@0
   320
	{EProcesses,ETagTypeBitField,0,EScopeNone},
sl@0
   321
	{EThreads,ETagTypeBitField,0,EScopeNone},
sl@0
   322
	{ECodeSegs,ETagTypeBitField,0,EScopeGlobal|EScopeThreadSpecific},
sl@0
   323
	{EXipLibraries,ETagTypeBitField,0,EScopeNone},
sl@0
   324
	{EExecutables,ETagTypeBitField,0,EScopeNone},
sl@0
   325
	{ELogicalDevices,ETagTypeBitField,0,EScopeNone},
sl@0
   326
	{EMutexes,ETagTypeBitField,0,EScopeNone},
sl@0
   327
	{EServers,ETagTypeBitField,0,EScopeNone},
sl@0
   328
	{ESessions,ETagTypeBitField,0,EScopeNone},
sl@0
   329
	{ESemaphores,ETagTypeBitField,0,EScopeNone},
sl@0
   330
	{EChunks,ETagTypeBitField,0,EScopeNone},
sl@0
   331
	{EBreakpoints,ETagTypeBitField,0,EScopeNone},
sl@0
   332
	{ESetBreak,ETagTypeBitField,0,EScopeNone},
sl@0
   333
	{ERemoveBreak,ETagTypeBitField,0,EScopeNone},
sl@0
   334
	{EModifyBreak,ETagTypeBitField,0,EScopeNone},
sl@0
   335
	};
sl@0
   336
sl@0
   337
const TSubBlock StopModeFunctionalityList[] =
sl@0
   338
	{
sl@0
   339
	ETagHeaderList, EListLast,
sl@0
   340
	(TTag*)StopModeFunctionalityListInfo
sl@0
   341
	};
sl@0
   342
	// not implemented
sl@0
   343
sl@0
   344
// actionpoints
sl@0
   345
	// not implemented
sl@0
   346
sl@0
   347
// codeapplets
sl@0
   348
	// not implemented
sl@0
   349
sl@0
   350
// BTrace/UTrace
sl@0
   351
	// not implemented
sl@0
   352
sl@0
   353
// Security
sl@0
   354
const TTag DebugFunctionalitySecurityInfo[]=
sl@0
   355
	{
sl@0
   356
	{ESecurityOEMDebugToken,ETagTypeBoolean,0,ETrue}
sl@0
   357
	};
sl@0
   358
sl@0
   359
const TSubBlock DebugFunctionalitySecurity[] =
sl@0
   360
	{
sl@0
   361
	ETagHeaderIdSecurity, ESecurityLast,
sl@0
   362
	(TTag*)DebugFunctionalitySecurityInfo
sl@0
   363
	};
sl@0
   364
sl@0
   365
TUint32 TDebugFunctionality::GetDebugFunctionalityBufSize(void)
sl@0
   366
	{
sl@0
   367
	TUint32 df_size = 0;
sl@0
   368
sl@0
   369
	df_size += ComputeBlockSize((const TSubBlock&)DebugFunctionalityCore);
sl@0
   370
	df_size += ComputeBlockSize((const TSubBlock&)DebugFunctionalityMemory);
sl@0
   371
	df_size += ComputeBlockSize((const TSubBlock&)DebugFunctionalityRegistersCore);
sl@0
   372
	df_size += ComputeBlockSize((const TSubBlock&)DebugFunctionalityRegistersCoPro);
sl@0
   373
	df_size += ComputeBlockSize((const TSubBlock&)DebugFunctionalityBreakpoints);
sl@0
   374
	df_size += ComputeBlockSize((const TSubBlock&)DebugFunctionalityStepping);
sl@0
   375
	df_size += ComputeBlockSize((const TSubBlock&)DebugFunctionalityExecution);
sl@0
   376
	df_size += ComputeBlockSize((const TSubBlock&)DebugFunctionalityEvents);
sl@0
   377
	df_size += ComputeBlockSize((const TSubBlock&)DebugFunctionalityApiConstants);
sl@0
   378
	df_size += ComputeBlockSize((const TSubBlock&)DebugFunctionalityList);
sl@0
   379
	df_size += ComputeBlockSize((const TSubBlock&)DebugFunctionalityKillObjects);
sl@0
   380
	df_size += ComputeBlockSize((const TSubBlock&)DebugFunctionalitySecurity);
sl@0
   381
	
sl@0
   382
	return df_size;
sl@0
   383
	}
sl@0
   384
sl@0
   385
TUint32 TDebugFunctionality::GetStopModeFunctionalityBufSize(void)
sl@0
   386
	{
sl@0
   387
	TUint32 bytes = 0;
sl@0
   388
	
sl@0
   389
	// First four bytes are length field
sl@0
   390
	// Next four are version
sl@0
   391
	// Last four bytes will be the checksum	
sl@0
   392
	bytes = 12 +
sl@0
   393
            ComputeBlockSize((const TSubBlock&)StopModeFunctionalityCore) +
sl@0
   394
            ComputeBlockSize((const TSubBlock&)StopModeFunctionalityBuffers) +
sl@0
   395
            ComputeBlockSize((const TSubBlock&)StopModeFunctionalityFunctions) +
sl@0
   396
            ComputeBlockSize((const TSubBlock&)StopModeFunctionalityList);
sl@0
   397
            
sl@0
   398
	return bytes;
sl@0
   399
	}
sl@0
   400
sl@0
   401
TBool TDebugFunctionality::GetStopModeFunctionality(TDes8& aDFBlock)
sl@0
   402
	{
sl@0
   403
	TUint32 size = GetStopModeFunctionalityBufSize();
sl@0
   404
	if (aDFBlock.MaxLength() < size)
sl@0
   405
		{
sl@0
   406
		// Insufficient space to contain the debug functionality block
sl@0
   407
		return EFalse;
sl@0
   408
		}
sl@0
   409
sl@0
   410
	TUint8* ptr = (TUint8*)&size;
sl@0
   411
	aDFBlock.SetLength(0);
sl@0
   412
	aDFBlock.Append(ptr, 4);
sl@0
   413
	TVersion version = TVersion(KStopModeMajorVersionNumber, KStopModeMinorVersionNumber, KStopModePatchVersionNumber);
sl@0
   414
	ptr = (TUint8*)&version;
sl@0
   415
	aDFBlock.Append(ptr, sizeof(TVersion));
sl@0
   416
	
sl@0
   417
	AppendBlock((const TSubBlock&)StopModeFunctionalityCore,aDFBlock);
sl@0
   418
	AppendBlock((const TSubBlock&)StopModeFunctionalityFunctions,aDFBlock);
sl@0
   419
	AppendBlock((const TSubBlock&)StopModeFunctionalityList,aDFBlock);
sl@0
   420
	
sl@0
   421
	const TTagHeader& header = StopModeFunctionalityBuffers->iHeader;
sl@0
   422
	aDFBlock.Append((TUint8*)&header, sizeof(TTagHeader));
sl@0
   423
	
sl@0
   424
	for(TInt i=0; i<EBuffersLast; i++)
sl@0
   425
		{
sl@0
   426
		TTag tag;
sl@0
   427
		TheDBufferManager.GetBufferDetails((TBufferType)i, tag);
sl@0
   428
		aDFBlock.Append((TUint8*)&tag, sizeof(TTag));
sl@0
   429
		}
sl@0
   430
sl@0
   431
	if(aDFBlock.Length() != size - 4)
sl@0
   432
		{
sl@0
   433
		return EFalse;
sl@0
   434
		}
sl@0
   435
sl@0
   436
	TUint32* ptr32 = (TUint32*)aDFBlock.Ptr();
sl@0
   437
	TUint32 checksum = 0;
sl@0
   438
	for(TInt i=0; i<aDFBlock.Length(); i+=4)
sl@0
   439
		{
sl@0
   440
		checksum^=*ptr32;
sl@0
   441
		ptr32++;
sl@0
   442
		}
sl@0
   443
	
sl@0
   444
	ptr = (TUint8*)&checksum;
sl@0
   445
	aDFBlock.Append(ptr, 4);
sl@0
   446
	
sl@0
   447
	return ETrue;
sl@0
   448
	}
sl@0
   449
sl@0
   450
TBool TDebugFunctionality::GetDebugFunctionality(TDes8& aDFBlock)
sl@0
   451
	{
sl@0
   452
	if (aDFBlock.MaxLength() < GetDebugFunctionalityBufSize() )
sl@0
   453
		{
sl@0
   454
		// Insufficient space to contain the debug functionality block
sl@0
   455
		return EFalse;
sl@0
   456
		}
sl@0
   457
sl@0
   458
	AppendBlock((const TSubBlock&)DebugFunctionalityCore,aDFBlock);
sl@0
   459
	AppendBlock((const TSubBlock&)DebugFunctionalityMemory,aDFBlock);
sl@0
   460
	AppendBlock((const TSubBlock&)DebugFunctionalityRegistersCore,aDFBlock);
sl@0
   461
	AppendBlock((const TSubBlock&)DebugFunctionalityRegistersCoPro,aDFBlock);
sl@0
   462
	AppendBlock((const TSubBlock&)DebugFunctionalityBreakpoints,aDFBlock);
sl@0
   463
	AppendBlock((const TSubBlock&)DebugFunctionalityStepping,aDFBlock);
sl@0
   464
	AppendBlock((const TSubBlock&)DebugFunctionalityExecution,aDFBlock);
sl@0
   465
	AppendBlock((const TSubBlock&)DebugFunctionalityEvents,aDFBlock);
sl@0
   466
	AppendBlock((const TSubBlock&)DebugFunctionalityApiConstants,aDFBlock);
sl@0
   467
	AppendBlock((const TSubBlock&)DebugFunctionalityList,aDFBlock);
sl@0
   468
	AppendBlock((const TSubBlock&)DebugFunctionalityKillObjects,aDFBlock);
sl@0
   469
	AppendBlock((const TSubBlock&)DebugFunctionalitySecurity,aDFBlock);
sl@0
   470
sl@0
   471
	return ETrue;
sl@0
   472
	}
sl@0
   473
sl@0
   474
/**
sl@0
   475
 * Get the register information associated with aRegisterInfo. If aRegisterInfo is
sl@0
   476
 * an unsupported register then an entry of the form:
sl@0
   477
 *   {aRegisterInfo, x, 0, EAccessUnknown}
sl@0
   478
 *   will be returned where x is an arbitrary value.
sl@0
   479
 *   
sl@0
   480
 *   @param aRegisterInfo register id information
sl@0
   481
 *   @param aTag The functionality information for this register.
sl@0
   482
 *   @return One of the system wide error codes
sl@0
   483
 */
sl@0
   484
TInt TDebugFunctionality::GetRegister(const TRegisterInfo aRegisterInfo, TTag& aTag)
sl@0
   485
	{
sl@0
   486
	if(Register::IsCoreReg(aRegisterInfo))
sl@0
   487
		{
sl@0
   488
		for(TInt i=0; i<ERegisterLast; i++)
sl@0
   489
			{
sl@0
   490
			if(Register::GetCoreRegId(DebugFunctionalityRegistersCoreInfo[i].iTagId) == Register::GetCoreRegId(aRegisterInfo))
sl@0
   491
				{
sl@0
   492
				aTag = DebugFunctionalityRegistersCoreInfo[i];
sl@0
   493
				return KErrNone;
sl@0
   494
				}
sl@0
   495
			}
sl@0
   496
		}
sl@0
   497
	else if(Register::IsCoproReg(aRegisterInfo))
sl@0
   498
		{
sl@0
   499
		//get aRegisterInfo's details
sl@0
   500
		TUint32 crn = Register::GetCRn(aRegisterInfo);
sl@0
   501
		TUint32 crm = Register::GetCRm(aRegisterInfo);
sl@0
   502
		TUint32 opcode1 = Register::GetOpcode1(aRegisterInfo);
sl@0
   503
		TUint32 opcode2 = Register::GetOpcode2(aRegisterInfo);
sl@0
   504
		TUint32 coproNum = Register::GetCoproNum(aRegisterInfo);
sl@0
   505
sl@0
   506
		for(TInt i=0; i<sizeof(DebugFunctionalityRegistersCoProInfo)/sizeof(TTag); i++)
sl@0
   507
			{
sl@0
   508
			TUint32 tagId = DebugFunctionalityRegistersCoProInfo[i].iTagId;
sl@0
   509
sl@0
   510
			//if this entry is the DACR
sl@0
   511
			if((Register::GetCRm(tagId) == 3) && (Register::GetCoproNum(tagId) == 15))
sl@0
   512
				{
sl@0
   513
				if((crm == 3) && (coproNum == 15))
sl@0
   514
					{
sl@0
   515
					aTag = DebugFunctionalityRegistersCoProInfo[i];
sl@0
   516
					return KErrNone;
sl@0
   517
					}
sl@0
   518
				}
sl@0
   519
			//each coprocessor register that is supported will need logic adding here
sl@0
   520
			}
sl@0
   521
		}
sl@0
   522
	else // in the future there could be other types of register supported
sl@0
   523
		{
sl@0
   524
		//for now just fall through to unsupported case
sl@0
   525
		}
sl@0
   526
sl@0
   527
	//found an unsupported register so just return EAccessUnknown as the access level
sl@0
   528
	aTag.iTagId = aRegisterInfo;
sl@0
   529
	aTag.iSize = 0;
sl@0
   530
	aTag.iValue = EAccessUnknown;
sl@0
   531
sl@0
   532
	return KErrNotSupported;
sl@0
   533
	}
sl@0
   534
sl@0
   535
/**
sl@0
   536
 * Returns the maximum memory block size which can be read or written.
sl@0
   537
 * @return the maximum memory block size which can be read or written
sl@0
   538
*/
sl@0
   539
TUint32 TDebugFunctionality::GetMemoryOperationMaxBlockSize()
sl@0
   540
	{
sl@0
   541
	return DebugFunctionalityMemoryInfo[EMemoryMaxBlockSize].iValue;
sl@0
   542
	}
sl@0
   543
sl@0
   544
/**
sl@0
   545
 * Helper function to append a DebugFunctionalityXXX SubBlock 
sl@0
   546
 * into a TDes buffer
sl@0
   547
 */
sl@0
   548
void TDebugFunctionality::AppendBlock(const TSubBlock& aDFSubBlock, TDes8& aDFBlock)
sl@0
   549
	{
sl@0
   550
	// Copy the aSubDFBlock.header into aDFBlock (Note we don't put in a TSubBlock structure
sl@0
   551
	// as the block is just that - a flat block so the pointer is not required)
sl@0
   552
	TPtr8 SubDFBlockHdrPtr((TUint8*)&aDFSubBlock.iHeader,sizeof(TTagHeader),sizeof(TTagHeader));
sl@0
   553
sl@0
   554
	aDFBlock.Append(SubDFBlockHdrPtr);
sl@0
   555
sl@0
   556
	// Append all the Tags
sl@0
   557
	for (TUint i=0; i<aDFSubBlock.iHeader.iNumTags; i++)
sl@0
   558
		{
sl@0
   559
		TPtr8 tmpPtr((TUint8*)&aDFSubBlock.iTagArray[i],sizeof(TTag),sizeof(TTag));
sl@0
   560
sl@0
   561
		aDFBlock.Append(tmpPtr);
sl@0
   562
		}
sl@0
   563
	}
sl@0
   564
sl@0
   565
/**
sl@0
   566
 * Computes the size in bytes of aDFBlock
sl@0
   567
 * @param aDFSubBlock
sl@0
   568
 * @return TUint32 size of sub block
sl@0
   569
 */
sl@0
   570
TUint32 TDebugFunctionality::ComputeBlockSize(const TSubBlock& aDFSubBlock)
sl@0
   571
	{
sl@0
   572
	TUint32 size = 0;
sl@0
   573
sl@0
   574
	// Header size
sl@0
   575
	size += sizeof(TTagHeader);
sl@0
   576
sl@0
   577
	// size of all the tags within the header:
sl@0
   578
	size += aDFSubBlock.iHeader.iNumTags * sizeof(TTag); 
sl@0
   579
sl@0
   580
	return size;
sl@0
   581
	}
sl@0
   582