debugsrv/runmodedebug/rmdriver/inc/d_rmd_stepping.inl
author hgs
Fri, 08 Oct 2010 14:56:39 +0300
changeset 56 aa2539c91954
parent 42 0ff24a8f6ca2
permissions -rw-r--r--
201041
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
42
hgs
parents:
diff changeset
     1
// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     2
// All rights reserved.
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
56
hgs
parents: 42
diff changeset
     4
// under the terms of "Eclipse Public License v1.0"
42
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
hgs
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     7
//
hgs
parents:
diff changeset
     8
// Initial Contributors:
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    10
//
hgs
parents:
diff changeset
    11
// Contributors:
hgs
parents:
diff changeset
    12
//
hgs
parents:
diff changeset
    13
// Description:
hgs
parents:
diff changeset
    14
//
hgs
parents:
diff changeset
    15
hgs
parents:
diff changeset
    16
#ifndef D_RMD_STEPPING_INL
hgs
parents:
diff changeset
    17
#define D_RMD_STEPPING_INL
hgs
parents:
diff changeset
    18
hgs
parents:
diff changeset
    19
//
hgs
parents:
diff changeset
    20
// IsBitSet
hgs
parents:
diff changeset
    21
//
hgs
parents:
diff changeset
    22
// Returns 1 if the bit 'aNum' is set within aBitset, 0 otherwise
hgs
parents:
diff changeset
    23
inline TUint32 DRMDStepping::IsBitSet(const TUint32 aBitset, const TUint8 aNum)
hgs
parents:
diff changeset
    24
	{
hgs
parents:
diff changeset
    25
	return (aBitset & (1 << aNum) );
hgs
parents:
diff changeset
    26
	}
hgs
parents:
diff changeset
    27
hgs
parents:
diff changeset
    28
// 
hgs
parents:
diff changeset
    29
// BitCount
hgs
parents:
diff changeset
    30
//
hgs
parents:
diff changeset
    31
// Count number of bits in aVal
hgs
parents:
diff changeset
    32
inline TUint32 DRMDStepping::BitCount(const TUint32 aVal)
hgs
parents:
diff changeset
    33
	{
hgs
parents:
diff changeset
    34
	TUint32 num = 0;
hgs
parents:
diff changeset
    35
hgs
parents:
diff changeset
    36
	for(TInt i = 0; i < 32; i++)
hgs
parents:
diff changeset
    37
		{
hgs
parents:
diff changeset
    38
		if ((1 << i) & aVal)
hgs
parents:
diff changeset
    39
			{
hgs
parents:
diff changeset
    40
			num++;
hgs
parents:
diff changeset
    41
			}
hgs
parents:
diff changeset
    42
		}
hgs
parents:
diff changeset
    43
	return num;
hgs
parents:
diff changeset
    44
	}
hgs
parents:
diff changeset
    45
hgs
parents:
diff changeset
    46
//
hgs
parents:
diff changeset
    47
// Thumb2 opcode decoding
hgs
parents:
diff changeset
    48
//
hgs
parents:
diff changeset
    49
// Special data instructions and branch and exchange.
hgs
parents:
diff changeset
    50
//
hgs
parents:
diff changeset
    51
// Returns Opcode as defined in ARM ARM DDI0406A, section A6.2.3
hgs
parents:
diff changeset
    52
inline TUint16 DRMDStepping::t2opcode16special(const TUint16 aInst)
hgs
parents:
diff changeset
    53
	{
hgs
parents:
diff changeset
    54
	TUint8 aVal = (aInst & 0x03C0) >> 5;
hgs
parents:
diff changeset
    55
hgs
parents:
diff changeset
    56
	return aVal;
hgs
parents:
diff changeset
    57
	}
hgs
parents:
diff changeset
    58
hgs
parents:
diff changeset
    59
hgs
parents:
diff changeset
    60
// Thumb2 opcode decoding instructions
hgs
parents:
diff changeset
    61
// 
hgs
parents:
diff changeset
    62
// Returns Opcode as defined in ARM ARM DDI0406A, section A6.2
hgs
parents:
diff changeset
    63
// 16-bit Thumb instruction encoding
hgs
parents:
diff changeset
    64
inline TUint16 DRMDStepping::t2opcode16(const TUint16 aInst)
hgs
parents:
diff changeset
    65
{
hgs
parents:
diff changeset
    66
	TUint16 aVal = (aInst & 0xFC00) >> 9;
hgs
parents:
diff changeset
    67
hgs
parents:
diff changeset
    68
	return aVal;
hgs
parents:
diff changeset
    69
}
hgs
parents:
diff changeset
    70
hgs
parents:
diff changeset
    71
// ARM opcode decoding functions
hgs
parents:
diff changeset
    72
inline TUint32 DRMDStepping::arm_opcode(const TUint32 aInst)
hgs
parents:
diff changeset
    73
{
hgs
parents:
diff changeset
    74
// #define ARM_OPCODE(x)		(((TUint32)(x) & 0x0E000000) >> 25)
hgs
parents:
diff changeset
    75
hgs
parents:
diff changeset
    76
	TUint32 aVal = ((aInst) & 0x0E000000) >> 25;
hgs
parents:
diff changeset
    77
hgs
parents:
diff changeset
    78
	return aVal;
hgs
parents:
diff changeset
    79
}
hgs
parents:
diff changeset
    80
hgs
parents:
diff changeset
    81
inline TUint32 DRMDStepping:: arm_rm(const TUint32 aInst)
hgs
parents:
diff changeset
    82
{
hgs
parents:
diff changeset
    83
//#define ARM_RM(x)				((TUint32)(x) & 0x0000000F)			// bit 0- 4
hgs
parents:
diff changeset
    84
hgs
parents:
diff changeset
    85
	TUint32 aVal = (aInst) & 0x0000000F;
hgs
parents:
diff changeset
    86
hgs
parents:
diff changeset
    87
	return aVal;
hgs
parents:
diff changeset
    88
}
hgs
parents:
diff changeset
    89
hgs
parents:
diff changeset
    90
inline TUint32 DRMDStepping:: arm_rs(const TUint32 aInst)
hgs
parents:
diff changeset
    91
{
hgs
parents:
diff changeset
    92
//#define ARM_RS(x)				(((TUint32)(x) & 0x00000F00) >> 8)	// bit 8-11
hgs
parents:
diff changeset
    93
hgs
parents:
diff changeset
    94
	TUint32 aVal = ((aInst) & 0x00000F00) >> 8;
hgs
parents:
diff changeset
    95
hgs
parents:
diff changeset
    96
	return aVal;
hgs
parents:
diff changeset
    97
}
hgs
parents:
diff changeset
    98
hgs
parents:
diff changeset
    99
inline TUint32 DRMDStepping:: arm_rd(const TUint32 aInst)
hgs
parents:
diff changeset
   100
{
hgs
parents:
diff changeset
   101
//#define ARM_RD(x)				(((TUint32)(x) & 0x0000F000) >> 12)	// bit 12-15
hgs
parents:
diff changeset
   102
hgs
parents:
diff changeset
   103
	TUint32 aVal = ((aInst) & 0x0000F000) >> 12;
hgs
parents:
diff changeset
   104
hgs
parents:
diff changeset
   105
	return aVal;
hgs
parents:
diff changeset
   106
}
hgs
parents:
diff changeset
   107
hgs
parents:
diff changeset
   108
inline TUint32 DRMDStepping:: arm_rn(const TUint32 aInst)
hgs
parents:
diff changeset
   109
{
hgs
parents:
diff changeset
   110
//#define ARM_RN(x)				(((TUint32)(x) & 0x000F0000) >> 16)	// bit 16-19
hgs
parents:
diff changeset
   111
hgs
parents:
diff changeset
   112
	TUint32 aVal = ((aInst) & 0x000F0000) >> 16;
hgs
parents:
diff changeset
   113
hgs
parents:
diff changeset
   114
	return aVal;
hgs
parents:
diff changeset
   115
}
hgs
parents:
diff changeset
   116
hgs
parents:
diff changeset
   117
inline TUint32 DRMDStepping::arm_load(const TUint32 aInst)
hgs
parents:
diff changeset
   118
{
hgs
parents:
diff changeset
   119
//#define ARM_LOAD(x)				(((TUint32)(x) & 0x00100000) >> 20)	// bit 20
hgs
parents:
diff changeset
   120
hgs
parents:
diff changeset
   121
	TUint32 aVal = ((aInst) & 0x00100000) >> 20;
hgs
parents:
diff changeset
   122
hgs
parents:
diff changeset
   123
	return aVal;
hgs
parents:
diff changeset
   124
}
hgs
parents:
diff changeset
   125
hgs
parents:
diff changeset
   126
// Data processing instruction defines
hgs
parents:
diff changeset
   127
inline TUint32 DRMDStepping::arm_data_shift(const TUint32 aInst)
hgs
parents:
diff changeset
   128
{
hgs
parents:
diff changeset
   129
//#define ARM_DATA_SHIFT(x)		(((TUint32)(x) & 0x00000060) >> 5) 	// bit 5- 6
hgs
parents:
diff changeset
   130
	
hgs
parents:
diff changeset
   131
	TUint32 aVal = ((aInst) & 0x00000060) >> 5;
hgs
parents:
diff changeset
   132
hgs
parents:
diff changeset
   133
	return aVal;
hgs
parents:
diff changeset
   134
}
hgs
parents:
diff changeset
   135
hgs
parents:
diff changeset
   136
inline TUint32 DRMDStepping::arm_data_c(const TUint32 aInst)
hgs
parents:
diff changeset
   137
{
hgs
parents:
diff changeset
   138
//#define ARM_DATA_C(x)			(((TUint32)(x) & 0x00000F80) >> 7) 	// bit 7-11
hgs
parents:
diff changeset
   139
hgs
parents:
diff changeset
   140
	TUint32 aVal = ((aInst) & 0x00000F80) >> 7;
hgs
parents:
diff changeset
   141
hgs
parents:
diff changeset
   142
	return aVal;
hgs
parents:
diff changeset
   143
}
hgs
parents:
diff changeset
   144
hgs
parents:
diff changeset
   145
inline TUint32 DRMDStepping::arm_data_imm(const TUint32 aInst)
hgs
parents:
diff changeset
   146
{
hgs
parents:
diff changeset
   147
//#define ARM_DATA_IMM(x)			((TUint32)(x) & 0x000000FF)			// bit 0-7
hgs
parents:
diff changeset
   148
hgs
parents:
diff changeset
   149
	TUint32 aVal = (aInst) & 0x000000FF;
hgs
parents:
diff changeset
   150
hgs
parents:
diff changeset
   151
	return aVal;
hgs
parents:
diff changeset
   152
}
hgs
parents:
diff changeset
   153
hgs
parents:
diff changeset
   154
inline TUint32 DRMDStepping::arm_data_rot(const TUint32 aInst)
hgs
parents:
diff changeset
   155
{
hgs
parents:
diff changeset
   156
//#define ARM_DATA_ROT(x)			(((TUint32)(x) & 0x00000F00) >> 8) 	// bit 8-11
hgs
parents:
diff changeset
   157
hgs
parents:
diff changeset
   158
	TUint32 aVal = ((aInst) & 0x00000F00) >> 8;
hgs
parents:
diff changeset
   159
hgs
parents:
diff changeset
   160
	return aVal;
hgs
parents:
diff changeset
   161
}
hgs
parents:
diff changeset
   162
hgs
parents:
diff changeset
   163
// Single date transfer instruction defines
hgs
parents:
diff changeset
   164
inline TUint32 DRMDStepping::arm_single_imm(const TUint32 aInst)
hgs
parents:
diff changeset
   165
{
hgs
parents:
diff changeset
   166
//#define ARM_SINGLE_IMM(x)		((TUint32)(x) & 0x00000FFF)			// bit 0-11
hgs
parents:
diff changeset
   167
hgs
parents:
diff changeset
   168
	TUint32 aVal = (aInst) & 0x00000FFF;
hgs
parents:
diff changeset
   169
hgs
parents:
diff changeset
   170
	return aVal;
hgs
parents:
diff changeset
   171
}
hgs
parents:
diff changeset
   172
hgs
parents:
diff changeset
   173
inline TUint32 DRMDStepping::arm_single_byte(const TUint32 aInst)
hgs
parents:
diff changeset
   174
{
hgs
parents:
diff changeset
   175
//#define ARM_SINGLE_BYTE(x)		(((TUint32)(x) & 0x00400000) >> 22)	// bit 22
hgs
parents:
diff changeset
   176
hgs
parents:
diff changeset
   177
	TUint32 aVal = ((aInst) & 0x00400000) >> 22;
hgs
parents:
diff changeset
   178
hgs
parents:
diff changeset
   179
	return aVal;
hgs
parents:
diff changeset
   180
}
hgs
parents:
diff changeset
   181
hgs
parents:
diff changeset
   182
inline TUint32 DRMDStepping::arm_single_u(const TUint32 aInst)
hgs
parents:
diff changeset
   183
{
hgs
parents:
diff changeset
   184
//#define ARM_SINGLE_U(x)			(((TUint32)(x) & 0x00800000) >> 23)	// bit 23
hgs
parents:
diff changeset
   185
hgs
parents:
diff changeset
   186
	TUint32 aVal = ((aInst) & 0x00800000) >> 23;
hgs
parents:
diff changeset
   187
hgs
parents:
diff changeset
   188
	return aVal;
hgs
parents:
diff changeset
   189
}
hgs
parents:
diff changeset
   190
hgs
parents:
diff changeset
   191
inline TUint32 DRMDStepping::arm_single_pre(const TUint32 aInst)
hgs
parents:
diff changeset
   192
{
hgs
parents:
diff changeset
   193
//#define ARM_SINGLE_PRE(x)		(((TUint32)(x) & 0x01000000) >> 24)	// bit 24
hgs
parents:
diff changeset
   194
hgs
parents:
diff changeset
   195
	TUint32 aVal = ((aInst) & 0x01000000) >> 24;
hgs
parents:
diff changeset
   196
hgs
parents:
diff changeset
   197
	return aVal;
hgs
parents:
diff changeset
   198
}
hgs
parents:
diff changeset
   199
hgs
parents:
diff changeset
   200
// Block data transfer instruction defines
hgs
parents:
diff changeset
   201
inline TUint32 DRMDStepping::arm_block_reglist(const TUint32 aInst)
hgs
parents:
diff changeset
   202
{
hgs
parents:
diff changeset
   203
//#define ARM_BLOCK_REGLIST(x)	((TUint32)(x) & 0x0000FFFF)		// bit 0-15
hgs
parents:
diff changeset
   204
hgs
parents:
diff changeset
   205
	TUint32 aVal = (aInst) & 0x0000FFFF;
hgs
parents:
diff changeset
   206
hgs
parents:
diff changeset
   207
	return aVal;
hgs
parents:
diff changeset
   208
}
hgs
parents:
diff changeset
   209
hgs
parents:
diff changeset
   210
inline TUint32 DRMDStepping::arm_block_u(const TUint32 aInst)
hgs
parents:
diff changeset
   211
{
hgs
parents:
diff changeset
   212
//#define ARM_BLOCK_U(x)			(((TUint32)(x) & 0x00800000) >> 23)	// bit 23
hgs
parents:
diff changeset
   213
hgs
parents:
diff changeset
   214
	TUint32 aVal = ((aInst) & 0x00800000) >> 23;
hgs
parents:
diff changeset
   215
hgs
parents:
diff changeset
   216
	return aVal;
hgs
parents:
diff changeset
   217
}
hgs
parents:
diff changeset
   218
hgs
parents:
diff changeset
   219
inline TUint32 DRMDStepping::arm_block_pre(const TUint32 aInst)
hgs
parents:
diff changeset
   220
{
hgs
parents:
diff changeset
   221
//#define ARM_BLOCK_PRE(x)		(((TUint32)(x) & 0x01000000) >> 24)	// bit 24
hgs
parents:
diff changeset
   222
hgs
parents:
diff changeset
   223
	TUint32 aVal = ((aInst) & 0x01000000) >> 24;
hgs
parents:
diff changeset
   224
hgs
parents:
diff changeset
   225
	return aVal;
hgs
parents:
diff changeset
   226
}
hgs
parents:
diff changeset
   227
hgs
parents:
diff changeset
   228
// Branch instruction defines
hgs
parents:
diff changeset
   229
inline TUint32 DRMDStepping::arm_b_addr(const TUint32 aInst)
hgs
parents:
diff changeset
   230
{
hgs
parents:
diff changeset
   231
//#define ARM_B_ADDR(x)			((x & 0x00800000) ? ((TUint32)(x) & 0x00FFFFFF | 0xFF000000) : (TUint32)(x) & 0x00FFFFFF)
hgs
parents:
diff changeset
   232
hgs
parents:
diff changeset
   233
	TUint32 aVal = ((aInst & 0x00800000) ? ((TUint32)(aInst) & 0x00FFFFFF | 0xFF000000) : (TUint32)(aInst) & 0x00FFFFFF);
hgs
parents:
diff changeset
   234
hgs
parents:
diff changeset
   235
	return aVal;
hgs
parents:
diff changeset
   236
}
hgs
parents:
diff changeset
   237
hgs
parents:
diff changeset
   238
inline TUint32 DRMDStepping::arm_instr_b_dest(const TUint32 aInst, TUint32& aAddress)
hgs
parents:
diff changeset
   239
{
hgs
parents:
diff changeset
   240
//#define ARM_INSTR_B_DEST(x,a)	(ARM_B_ADDR(x) << 2) + ((TUint32)(a) + 8)
hgs
parents:
diff changeset
   241
hgs
parents:
diff changeset
   242
	TUint32 aVal = (arm_b_addr(aInst) << 2) + ((TUint32)(aAddress) + 8);
hgs
parents:
diff changeset
   243
hgs
parents:
diff changeset
   244
	return aVal;
hgs
parents:
diff changeset
   245
}
hgs
parents:
diff changeset
   246
hgs
parents:
diff changeset
   247
inline TUint32 DRMDStepping::thumb_b_addr(const TUint32 aInst)
hgs
parents:
diff changeset
   248
{
hgs
parents:
diff changeset
   249
//#define THUMB_B_ADDR(x) ((x & 0x0400) ? ((((TUint32)(x) & 0x07FF)<<11) | (((TUint32)(x) & 0x07FF0000)>>16) | 0xFFC00000) :\
hgs
parents:
diff changeset
   250
                                            ((TUint32)(x) & 0x07FF)<<11) | (((TUint32)(x) & 0x07FF0000)>>16)
hgs
parents:
diff changeset
   251
hgs
parents:
diff changeset
   252
	TUint32 aVal = ((((TUint32)(aInst) & 0x07FF)<<11) | ((TUint32)(aInst) & 0x07FF0000)>>16);
hgs
parents:
diff changeset
   253
hgs
parents:
diff changeset
   254
	return ((aInst & 0x0400) ? (aVal | 0xFFC00000) : aVal);
hgs
parents:
diff changeset
   255
}
hgs
parents:
diff changeset
   256
hgs
parents:
diff changeset
   257
inline TUint32 DRMDStepping::thumb_instr_b_dest(const TUint32 aInst, TUint32& aAddress)
hgs
parents:
diff changeset
   258
{
hgs
parents:
diff changeset
   259
//#define THUMB_INSTR_B_DEST(x,a)	(THUMB_B_ADDR(x) << 1) + ((TUint32)(a) + 4)
hgs
parents:
diff changeset
   260
hgs
parents:
diff changeset
   261
	TUint32 aVal = (thumb_b_addr(aInst) << 1) + ((TUint32)(aAddress) + 4);
hgs
parents:
diff changeset
   262
hgs
parents:
diff changeset
   263
	return aVal;
hgs
parents:
diff changeset
   264
}
hgs
parents:
diff changeset
   265
hgs
parents:
diff changeset
   266
inline TUint32 DRMDStepping::arm_carry_bit(void)
hgs
parents:
diff changeset
   267
{
hgs
parents:
diff changeset
   268
//#define ARM_CARRY_BIT			0x20000000	// bit 30
hgs
parents:
diff changeset
   269
hgs
parents:
diff changeset
   270
	TUint32 aVal = 0x20000000;
hgs
parents:
diff changeset
   271
hgs
parents:
diff changeset
   272
	return aVal;
hgs
parents:
diff changeset
   273
}
hgs
parents:
diff changeset
   274
hgs
parents:
diff changeset
   275
// Thumb instruction bitmasks
hgs
parents:
diff changeset
   276
inline TUint16 DRMDStepping::thumb_opcode(const TUint16 aInst)
hgs
parents:
diff changeset
   277
{
hgs
parents:
diff changeset
   278
//	#define THUMB_OPCODE(x)		(((TUint16)(x) & 0xF800) >> 11)
hgs
parents:
diff changeset
   279
hgs
parents:
diff changeset
   280
	TUint16 aVal = ((aInst) & 0xF800) >> 11;
hgs
parents:
diff changeset
   281
hgs
parents:
diff changeset
   282
	return aVal;
hgs
parents:
diff changeset
   283
}
hgs
parents:
diff changeset
   284
hgs
parents:
diff changeset
   285
inline TUint16 DRMDStepping::thumb_inst_7_15(const TUint16 aInst)
hgs
parents:
diff changeset
   286
{
hgs
parents:
diff changeset
   287
//	#define THUMB_INST_7_15(x)	(((TUint16)(x) & 0xFF80) >> 7)
hgs
parents:
diff changeset
   288
hgs
parents:
diff changeset
   289
	TUint16 aVal = ((aInst) & 0xFF80) >> 7;
hgs
parents:
diff changeset
   290
hgs
parents:
diff changeset
   291
	return aVal;
hgs
parents:
diff changeset
   292
}
hgs
parents:
diff changeset
   293
hgs
parents:
diff changeset
   294
inline TUint16 DRMDStepping::thumb_inst_8_15(const TUint16 aInst)
hgs
parents:
diff changeset
   295
{
hgs
parents:
diff changeset
   296
//	#define THUMB_INST_8_15(x)	(((TUint16)(x) & 0xFF00) >> 8)
hgs
parents:
diff changeset
   297
hgs
parents:
diff changeset
   298
	TUint16 aVal = ((aInst) & 0xFF00) >> 8;
hgs
parents:
diff changeset
   299
hgs
parents:
diff changeset
   300
	return aVal;
hgs
parents:
diff changeset
   301
}
hgs
parents:
diff changeset
   302
hgs
parents:
diff changeset
   303
#endif	// D_RMD_STEPPPING_INL
hgs
parents:
diff changeset
   304
hgs
parents:
diff changeset
   305
// End of file - d-rmd-stepping.inl