tracesrv/tracecore/btrace_handler/src/BTraceOstCategoryHandler.cpp
author hgs
Fri, 08 Oct 2010 14:56:39 +0300
changeset 56 aa2539c91954
permissions -rw-r--r--
201041
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
56
hgs
parents:
diff changeset
     1
// Copyright (c) 2007-2010 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
hgs
parents:
diff changeset
     4
// under the terms of "Eclipse Public License v1.0"
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
// Trace Core 
hgs
parents:
diff changeset
    15
//
hgs
parents:
diff changeset
    16
hgs
parents:
diff changeset
    17
#include "TraceCore.h"
hgs
parents:
diff changeset
    18
#include "BTraceOstCategoryHandler.h"
hgs
parents:
diff changeset
    19
#include "BTraceOstCategoryBitmap.h"
hgs
parents:
diff changeset
    20
#include "TraceCoreWriter.h"
hgs
parents:
diff changeset
    21
#include "TraceCoreDebug.h"
hgs
parents:
diff changeset
    22
#include "TraceCoreConstants.h"
hgs
parents:
diff changeset
    23
#include "OstTraceDefinitions.h"
hgs
parents:
diff changeset
    24
#ifdef OST_TRACE_COMPILER_IN_USE
hgs
parents:
diff changeset
    25
#include "BTraceOstCategoryHandlerTraces.h"
hgs
parents:
diff changeset
    26
#endif
hgs
parents:
diff changeset
    27
hgs
parents:
diff changeset
    28
#ifndef __SMP__
hgs
parents:
diff changeset
    29
/**
hgs
parents:
diff changeset
    30
 * Length of Trace group ID + Trace ID in the MultiPart traces data part
hgs
parents:
diff changeset
    31
 */
hgs
parents:
diff changeset
    32
const TUint KTraceGroupIdLen = 4;
hgs
parents:
diff changeset
    33
hgs
parents:
diff changeset
    34
/**
hgs
parents:
diff changeset
    35
 * Length of BTrace header
hgs
parents:
diff changeset
    36
 */
hgs
parents:
diff changeset
    37
const TUint KBTraceHeaderLen = 4;
hgs
parents:
diff changeset
    38
hgs
parents:
diff changeset
    39
/**
hgs
parents:
diff changeset
    40
 * Length of single BTrace variable
hgs
parents:
diff changeset
    41
 */
hgs
parents:
diff changeset
    42
const TUint KBTraceVariableLen = 4;
hgs
parents:
diff changeset
    43
hgs
parents:
diff changeset
    44
/**
hgs
parents:
diff changeset
    45
 * Four bytes
hgs
parents:
diff changeset
    46
 */
hgs
parents:
diff changeset
    47
const TUint KFourBytes = 4;
hgs
parents:
diff changeset
    48
hgs
parents:
diff changeset
    49
#endif // !__SMP__
hgs
parents:
diff changeset
    50
/**
hgs
parents:
diff changeset
    51
 * Group value in GroupId
hgs
parents:
diff changeset
    52
 */
hgs
parents:
diff changeset
    53
const TUint32 KGroupMask = 0xffff0000;
hgs
parents:
diff changeset
    54
hgs
parents:
diff changeset
    55
hgs
parents:
diff changeset
    56
/**
hgs
parents:
diff changeset
    57
 * Constructor
hgs
parents:
diff changeset
    58
 */
hgs
parents:
diff changeset
    59
DBTraceOstCategoryHandler::DBTraceOstCategoryHandler()
hgs
parents:
diff changeset
    60
: iAllTracesDeactivated( ETrue )
hgs
parents:
diff changeset
    61
, iCacheItem1( iComponentGroupCache )   // One "cache" item contains ComponentId, groupId, and activation info (3*32bit)
hgs
parents:
diff changeset
    62
, iCacheItem2( iComponentGroupCache+3 ) //CodForChk_Dis_Magic
hgs
parents:
diff changeset
    63
, iCacheItem3( iComponentGroupCache+6 ) //CodForChk_Dis_Magic
hgs
parents:
diff changeset
    64
, iCacheItem4( iComponentGroupCache+9 ) //CodForChk_Dis_Magic
hgs
parents:
diff changeset
    65
, iOstTraceBitmap( NULL )
hgs
parents:
diff changeset
    66
    {
hgs
parents:
diff changeset
    67
    }
hgs
parents:
diff changeset
    68
hgs
parents:
diff changeset
    69
hgs
parents:
diff changeset
    70
/**
hgs
parents:
diff changeset
    71
 * Destructor
hgs
parents:
diff changeset
    72
 */
hgs
parents:
diff changeset
    73
DBTraceOstCategoryHandler::~DBTraceOstCategoryHandler()
hgs
parents:
diff changeset
    74
    {
hgs
parents:
diff changeset
    75
	// Delete trace bitmap
hgs
parents:
diff changeset
    76
	delete iOstTraceBitmap;
hgs
parents:
diff changeset
    77
    }
hgs
parents:
diff changeset
    78
hgs
parents:
diff changeset
    79
hgs
parents:
diff changeset
    80
/**
hgs
parents:
diff changeset
    81
 * Initializes this handler
hgs
parents:
diff changeset
    82
 *
hgs
parents:
diff changeset
    83
 * @param aHandler The BTrace handler
hgs
parents:
diff changeset
    84
 */
hgs
parents:
diff changeset
    85
TInt DBTraceOstCategoryHandler::Init()
hgs
parents:
diff changeset
    86
    {    
hgs
parents:
diff changeset
    87
    TInt ret = KErrNone;
hgs
parents:
diff changeset
    88
hgs
parents:
diff changeset
    89
#ifdef __SMP__	    
hgs
parents:
diff changeset
    90
    for( TInt i = 0; i<MAX_MULTIPART_TRACES; i++ )
hgs
parents:
diff changeset
    91
        {
hgs
parents:
diff changeset
    92
        iMultipartArray[i].iMultiPartId = 0xffffffff;
hgs
parents:
diff changeset
    93
        iFreeList[i] = 1; // Set Free
hgs
parents:
diff changeset
    94
        }
hgs
parents:
diff changeset
    95
#endif // __SMP__
hgs
parents:
diff changeset
    96
    
hgs
parents:
diff changeset
    97
    for (TUint category = KMaxKernelCategory + 1; category <= KMaxCategory; category++)
hgs
parents:
diff changeset
    98
    	{
hgs
parents:
diff changeset
    99
    	if (category != KCategoryNokiaBranchCoverage) // Is this exception needed? 
hgs
parents:
diff changeset
   100
    		{
hgs
parents:
diff changeset
   101
    		ret = AddCategory( category );
hgs
parents:
diff changeset
   102
        	if (ret != KErrNone)
hgs
parents:
diff changeset
   103
        		{
hgs
parents:
diff changeset
   104
        		break;
hgs
parents:
diff changeset
   105
        		}
hgs
parents:
diff changeset
   106
    		}
hgs
parents:
diff changeset
   107
    	}
hgs
parents:
diff changeset
   108
    
hgs
parents:
diff changeset
   109
    if (ret == KErrNone)
hgs
parents:
diff changeset
   110
    	{    
hgs
parents:
diff changeset
   111
		iOstTraceBitmap = new DBTraceOstCategoryBitmap( this );	
hgs
parents:
diff changeset
   112
		if ( iOstTraceBitmap != NULL )
hgs
parents:
diff changeset
   113
			{
hgs
parents:
diff changeset
   114
			// Initialize TraceBitmap
hgs
parents:
diff changeset
   115
			ret = iOstTraceBitmap->Init();
hgs
parents:
diff changeset
   116
			if ( ret == KErrNone )
hgs
parents:
diff changeset
   117
				{
hgs
parents:
diff changeset
   118
				ret = iOstTraceBitmap->RegisterActivationNotification( *this );
hgs
parents:
diff changeset
   119
				if ( ret == KErrNone )
hgs
parents:
diff changeset
   120
					{
hgs
parents:
diff changeset
   121
	                ret = Register();
hgs
parents:
diff changeset
   122
	                if ( ret == KErrNone )
hgs
parents:
diff changeset
   123
	                    {
hgs
parents:
diff changeset
   124
	                    TC_TRACE( ETraceLevelNormal, Kern::Printf( 
hgs
parents:
diff changeset
   125
	                            "DBTraceAutogenCategoryHandler::Init - Register OK" ) );
hgs
parents:
diff changeset
   126
	                    }
hgs
parents:
diff changeset
   127
	                // Register failed
hgs
parents:
diff changeset
   128
	                else
hgs
parents:
diff changeset
   129
						{
hgs
parents:
diff changeset
   130
						ret = KErrGeneral;
hgs
parents:
diff changeset
   131
						}
hgs
parents:
diff changeset
   132
					}
hgs
parents:
diff changeset
   133
				// RegisterActivationNotification failed
hgs
parents:
diff changeset
   134
				else
hgs
parents:
diff changeset
   135
					{
hgs
parents:
diff changeset
   136
					ret = KErrGeneral;
hgs
parents:
diff changeset
   137
					}
hgs
parents:
diff changeset
   138
				}
hgs
parents:
diff changeset
   139
			}
hgs
parents:
diff changeset
   140
		// Memory allocation failed
hgs
parents:
diff changeset
   141
		else
hgs
parents:
diff changeset
   142
			{
hgs
parents:
diff changeset
   143
			TC_TRACE( ETraceLevelError, Kern::Printf( "DBTraceOstCategoryHandler::Init - Memory allocation failed" ) );
hgs
parents:
diff changeset
   144
			ret = KErrNoMemory;
hgs
parents:
diff changeset
   145
			}
hgs
parents:
diff changeset
   146
    	}
hgs
parents:
diff changeset
   147
    TC_TRACE( ETraceLevelError, Kern::Printf( "<DBTraceOstCategoryHandler::Init() - %d", ret ) );  
hgs
parents:
diff changeset
   148
    return ret;
hgs
parents:
diff changeset
   149
    }
hgs
parents:
diff changeset
   150
    
hgs
parents:
diff changeset
   151
/**
hgs
parents:
diff changeset
   152
 * Set settings
hgs
parents:
diff changeset
   153
 * 
hgs
parents:
diff changeset
   154
 * @param aSettings Settings
hgs
parents:
diff changeset
   155
 */
hgs
parents:
diff changeset
   156
void DBTraceOstCategoryHandler::SetSettings( DTraceCoreSettings* aSettings )
hgs
parents:
diff changeset
   157
	{
hgs
parents:
diff changeset
   158
    OstTrace1( TRACE_FLOW, DBTRACEOSTCATEGORYHANDLER_SETSETTINGS_ENTRY, "> DBTraceOstCategoryHandler::SetSettings 0x%x", ( TUint )( aSettings ) );
hgs
parents:
diff changeset
   159
    DBTraceCategoryHandler::SetSettings( aSettings );
hgs
parents:
diff changeset
   160
    if ( iOstTraceBitmap != NULL && aSettings != NULL )
hgs
parents:
diff changeset
   161
        {
hgs
parents:
diff changeset
   162
        // Reads the bitmap configuration from settings
hgs
parents:
diff changeset
   163
        iOstTraceBitmap->ReadFromSettings( *aSettings );
hgs
parents:
diff changeset
   164
        }
hgs
parents:
diff changeset
   165
	}
hgs
parents:
diff changeset
   166
hgs
parents:
diff changeset
   167
/**
hgs
parents:
diff changeset
   168
 * Notification that the activation state has changed.
hgs
parents:
diff changeset
   169
 * 
hgs
parents:
diff changeset
   170
 * @param aActivation the activation interface that was updated
hgs
parents:
diff changeset
   171
 * @param aFromSettings ETrue if activation was due to settings read, EFalse if from some other source
hgs
parents:
diff changeset
   172
 * @param aComponentId Component ID of the activation
hgs
parents:
diff changeset
   173
 */
hgs
parents:
diff changeset
   174
void DBTraceOstCategoryHandler::ActivationChanged( MTraceCoreActivation& aActivation, TBool aFromSettings,
hgs
parents:
diff changeset
   175
        TUint32 /*aComponentId*/)
hgs
parents:
diff changeset
   176
    {
hgs
parents:
diff changeset
   177
    OstTrace1( TRACE_FLOW, DBTRACEOSTCATEGORYHANDLER_ACTIVATIONCHANGED_ENTRY, "> DBTraceOstCategoryHandler::ActivationChanged 0x%x", ( TUint )&( aActivation ) );
hgs
parents:
diff changeset
   178
    
hgs
parents:
diff changeset
   179
    // Call the bitmap to write changes to settings saver
hgs
parents:
diff changeset
   180
    if ( !aFromSettings )
hgs
parents:
diff changeset
   181
        {
hgs
parents:
diff changeset
   182
        if ( iSettings != NULL )
hgs
parents:
diff changeset
   183
            {
hgs
parents:
diff changeset
   184
            aActivation.WriteToSettings( *iSettings );
hgs
parents:
diff changeset
   185
            }
hgs
parents:
diff changeset
   186
        }
hgs
parents:
diff changeset
   187
    }
hgs
parents:
diff changeset
   188
hgs
parents:
diff changeset
   189
/**
hgs
parents:
diff changeset
   190
 * Handler for KCategoryNokiaOst
hgs
parents:
diff changeset
   191
 *
hgs
parents:
diff changeset
   192
 * @param aHeader BTrace header
hgs
parents:
diff changeset
   193
 * @param aHeader2 Extra header data
hgs
parents:
diff changeset
   194
 * @param aContext The thread context in which this function was called
hgs
parents:
diff changeset
   195
 * @param a1 The first trace parameter
hgs
parents:
diff changeset
   196
 * @param a2 The second trace parameter
hgs
parents:
diff changeset
   197
 * @param a3 The third trace parameter
hgs
parents:
diff changeset
   198
 * @param aExtra Extra trace data
hgs
parents:
diff changeset
   199
 * @param aPc The program counter value
hgs
parents:
diff changeset
   200
 * @return ETrue if trace was processed, EFalse if not
hgs
parents:
diff changeset
   201
 */
hgs
parents:
diff changeset
   202
TBool DBTraceOstCategoryHandler::HandleFrame( TUint32 aHeader, TUint32 aHeader2, const TUint32 aContext, 
hgs
parents:
diff changeset
   203
                                              const TUint32 a1, const TUint32 a2, const TUint32 a3, 
hgs
parents:
diff changeset
   204
                                              const TUint32 aExtra, const TUint32 aPc )
hgs
parents:
diff changeset
   205
    {
hgs
parents:
diff changeset
   206
    TBool retval(EFalse);
hgs
parents:
diff changeset
   207
    if ( iWriter != NULL && !iAllTracesDeactivated )
hgs
parents:
diff changeset
   208
        {
hgs
parents:
diff changeset
   209
        __ASSERT_DEBUG( iOstTraceBitmap != NULL, 
hgs
parents:
diff changeset
   210
                Kern::Fault( "DBTraceOstCategoryHandler::HandleFrame - NULL", KErrGeneral ) );
hgs
parents:
diff changeset
   211
        
hgs
parents:
diff changeset
   212
        // Check if tracing is certified
hgs
parents:
diff changeset
   213
        DTraceCore* tracecore = DTraceCore::GetInstance();
hgs
parents:
diff changeset
   214
        if (!tracecore || !tracecore->IsTraceCertified())
hgs
parents:
diff changeset
   215
            {
hgs
parents:
diff changeset
   216
            return EFalse;
hgs
parents:
diff changeset
   217
            }
hgs
parents:
diff changeset
   218
        
hgs
parents:
diff changeset
   219
        // Check if the trace is a multipart trace
hgs
parents:
diff changeset
   220
        TBool isMultiPart = CheckMultiPart(aHeader, aHeader2);
hgs
parents:
diff changeset
   221
        
hgs
parents:
diff changeset
   222
        if (isMultiPart)
hgs
parents:
diff changeset
   223
            {
hgs
parents:
diff changeset
   224
		
hgs
parents:
diff changeset
   225
#ifdef __SMP__
hgs
parents:
diff changeset
   226
            // Handle the multipart trace
hgs
parents:
diff changeset
   227
            retval = HandleMultiPart(aHeader, aHeader2, aContext, a1, a2, a3, aExtra, aPc);
hgs
parents:
diff changeset
   228
#else
hgs
parents:
diff changeset
   229
            // Handle the multipart trace. Returns EFalse if trace is not activated.
hgs
parents:
diff changeset
   230
            TBool isActivatedMultiPart = HandleMultiPart(aHeader, aHeader2, aContext, a1, a2, a3, aExtra, aPc);
hgs
parents:
diff changeset
   231
            if (isActivatedMultiPart)
hgs
parents:
diff changeset
   232
                {
hgs
parents:
diff changeset
   233
                retval = ETrue;    
hgs
parents:
diff changeset
   234
                }
hgs
parents:
diff changeset
   235
            else
hgs
parents:
diff changeset
   236
                {
hgs
parents:
diff changeset
   237
                retval = EFalse;
hgs
parents:
diff changeset
   238
                }
hgs
parents:
diff changeset
   239
#endif // __SMP__
hgs
parents:
diff changeset
   240
hgs
parents:
diff changeset
   241
            }
hgs
parents:
diff changeset
   242
        // Not a multipart trace
hgs
parents:
diff changeset
   243
        else
hgs
parents:
diff changeset
   244
            {
hgs
parents:
diff changeset
   245
        
hgs
parents:
diff changeset
   246
            // Take group and leave trace id away
hgs
parents:
diff changeset
   247
            TUint32 group = a2 & KGroupMask;
hgs
parents:
diff changeset
   248
hgs
parents:
diff changeset
   249
            if ((*iCacheItem1) == a1 && (*(iCacheItem1 + 1)) == group)
hgs
parents:
diff changeset
   250
                {
hgs
parents:
diff changeset
   251
                retval = *(iCacheItem1 + 2); //CodForChk_Dis_Magic
hgs
parents:
diff changeset
   252
                }
hgs
parents:
diff changeset
   253
            else if ((*iCacheItem2) == a1 && (*(iCacheItem2 + 1)) == group)
hgs
parents:
diff changeset
   254
                {
hgs
parents:
diff changeset
   255
                retval = *(iCacheItem2 + 2); //CodForChk_Dis_Magic
hgs
parents:
diff changeset
   256
                }
hgs
parents:
diff changeset
   257
            else if ((*iCacheItem3) == a1 && (*(iCacheItem3 + 1)) == group)
hgs
parents:
diff changeset
   258
                {
hgs
parents:
diff changeset
   259
                retval = *(iCacheItem3 + 2); //CodForChk_Dis_Magic
hgs
parents:
diff changeset
   260
                }
hgs
parents:
diff changeset
   261
            else if ((*iCacheItem4) == a1 && (*(iCacheItem4 + 1)) == group)
hgs
parents:
diff changeset
   262
                {
hgs
parents:
diff changeset
   263
                retval = *(iCacheItem4 + 2); //CodForChk_Dis_Magic
hgs
parents:
diff changeset
   264
                }
hgs
parents:
diff changeset
   265
            else
hgs
parents:
diff changeset
   266
                {
hgs
parents:
diff changeset
   267
                retval = iOstTraceBitmap->IsTraceActivated(a1, a2);
hgs
parents:
diff changeset
   268
hgs
parents:
diff changeset
   269
                iTemp = iCacheItem1;
hgs
parents:
diff changeset
   270
                iCacheItem1 = iCacheItem4;
hgs
parents:
diff changeset
   271
                iCacheItem4 = iCacheItem3;
hgs
parents:
diff changeset
   272
                iCacheItem3 = iCacheItem2;
hgs
parents:
diff changeset
   273
                iCacheItem2 = iTemp;
hgs
parents:
diff changeset
   274
                *iCacheItem1 = a1;
hgs
parents:
diff changeset
   275
                *(iCacheItem1 + 1) = group;
hgs
parents:
diff changeset
   276
                *(iCacheItem1 + 2) = retval;
hgs
parents:
diff changeset
   277
hgs
parents:
diff changeset
   278
                }
hgs
parents:
diff changeset
   279
                
hgs
parents:
diff changeset
   280
            if ( ( ( aHeader >> ( BTrace::ESubCategoryIndex * KByteSize ) ) & KByteMask ) == EOstTraceActivationQuery )
hgs
parents:
diff changeset
   281
                {
hgs
parents:
diff changeset
   282
                //Trace from here is not allowed
hgs
parents:
diff changeset
   283
                }
hgs
parents:
diff changeset
   284
            else if ( retval )
hgs
parents:
diff changeset
   285
                {                
hgs
parents:
diff changeset
   286
                CheckDroppedTrace( aHeader ); // Update header if there is a dropped trace
hgs
parents:
diff changeset
   287
                TUint8 recordSize = static_cast< TUint8 >( ( aHeader >> ( BTrace::ESizeIndex * KByteSize ) ) & KByteMask );
hgs
parents:
diff changeset
   288
                iWriter->WriteTraceCoreFrame( a1, a2, aHeader, aHeader2, aContext, a1, a2, a3, aExtra, aPc, recordSize );
hgs
parents:
diff changeset
   289
                }
hgs
parents:
diff changeset
   290
            }
hgs
parents:
diff changeset
   291
        }
hgs
parents:
diff changeset
   292
    else
hgs
parents:
diff changeset
   293
        {        
hgs
parents:
diff changeset
   294
        if( iWriter == NULL )
hgs
parents:
diff changeset
   295
            {
hgs
parents:
diff changeset
   296
            //Trace from here is not allowed
hgs
parents:
diff changeset
   297
            retval = EFalse;
hgs
parents:
diff changeset
   298
            }
hgs
parents:
diff changeset
   299
            
hgs
parents:
diff changeset
   300
        }
hgs
parents:
diff changeset
   301
hgs
parents:
diff changeset
   302
    //Trace from here is not allowed
hgs
parents:
diff changeset
   303
    return retval;
hgs
parents:
diff changeset
   304
    }
hgs
parents:
diff changeset
   305
   
hgs
parents:
diff changeset
   306
/**
hgs
parents:
diff changeset
   307
 * Checks if the given trace is a Multipart trace
hgs
parents:
diff changeset
   308
 *
hgs
parents:
diff changeset
   309
 * @param aHeader Header data
hgs
parents:
diff changeset
   310
 * @param aHeader2 Extra header data
hgs
parents:
diff changeset
   311
 * @return ETrue if trace is a Multipart trace, EFalse if not
hgs
parents:
diff changeset
   312
 */
hgs
parents:
diff changeset
   313
inline TBool DBTraceOstCategoryHandler::CheckMultiPart( TUint32 aHeader, TUint32 aHeader2 )
hgs
parents:
diff changeset
   314
    {
hgs
parents:
diff changeset
   315
    TBool retval = EFalse;
hgs
parents:
diff changeset
   316
    TUint8 flags = static_cast< TUint8 >( ( aHeader >> ( BTrace::EFlagsIndex * KByteSize ) ) & KByteMask );
hgs
parents:
diff changeset
   317
    if (flags & BTrace::EHeader2Present)
hgs
parents:
diff changeset
   318
        {
hgs
parents:
diff changeset
   319
        // First, middle or last part of Multipart trace
hgs
parents:
diff changeset
   320
        if (aHeader2 & BTrace::EMultipartFlagMask)
hgs
parents:
diff changeset
   321
            {
hgs
parents:
diff changeset
   322
            retval = ETrue;
hgs
parents:
diff changeset
   323
            }
hgs
parents:
diff changeset
   324
        }
hgs
parents:
diff changeset
   325
    
hgs
parents:
diff changeset
   326
    //Trace from here is not allowed
hgs
parents:
diff changeset
   327
    return retval;
hgs
parents:
diff changeset
   328
    }
hgs
parents:
diff changeset
   329
hgs
parents:
diff changeset
   330
/**
hgs
parents:
diff changeset
   331
 * Checks if there is a dropped trace and updates header if so
hgs
parents:
diff changeset
   332
 *
hgs
parents:
diff changeset
   333
 * @param aHeader Header data
hgs
parents:
diff changeset
   334
 */
hgs
parents:
diff changeset
   335
inline TBool DBTraceOstCategoryHandler::CheckDroppedTrace( TUint32& aHeader )
hgs
parents:
diff changeset
   336
    {
hgs
parents:
diff changeset
   337
    TBool ret(EFalse);
hgs
parents:
diff changeset
   338
    
hgs
parents:
diff changeset
   339
    DTraceCore* tracecore = DTraceCore::GetInstance();
hgs
parents:
diff changeset
   340
    if (tracecore && (tracecore->PreviousTraceDropped())) //if previous trace was dropped 
hgs
parents:
diff changeset
   341
        {
hgs
parents:
diff changeset
   342
        //set flags back to EFalse first
hgs
parents:
diff changeset
   343
        tracecore->SetPreviousTraceDropped(EFalse);
hgs
parents:
diff changeset
   344
        
hgs
parents:
diff changeset
   345
        //set missing flag in BTrace
hgs
parents:
diff changeset
   346
        aHeader |= BTrace::EMissingRecord<<(BTrace::EFlagsIndex * KByteSize);
hgs
parents:
diff changeset
   347
        
hgs
parents:
diff changeset
   348
        ret = ETrue;
hgs
parents:
diff changeset
   349
        }
hgs
parents:
diff changeset
   350
    
hgs
parents:
diff changeset
   351
    return ret;
hgs
parents:
diff changeset
   352
    }
hgs
parents:
diff changeset
   353
hgs
parents:
diff changeset
   354
#ifdef __SMP__
hgs
parents:
diff changeset
   355
hgs
parents:
diff changeset
   356
hgs
parents:
diff changeset
   357
TInt DBTraceOstCategoryHandler::Find( TUint32 aMultiPartId )
hgs
parents:
diff changeset
   358
    {
hgs
parents:
diff changeset
   359
    TInt ret(KErrNotFound);
hgs
parents:
diff changeset
   360
    for( TInt i = 0; i<MAX_MULTIPART_TRACES; i++ )
hgs
parents:
diff changeset
   361
        {
hgs
parents:
diff changeset
   362
        if( iMultipartArray[i].iMultiPartId == aMultiPartId )
hgs
parents:
diff changeset
   363
            {
hgs
parents:
diff changeset
   364
            ret = i;
hgs
parents:
diff changeset
   365
            break;
hgs
parents:
diff changeset
   366
            }
hgs
parents:
diff changeset
   367
        }
hgs
parents:
diff changeset
   368
    return ret;
hgs
parents:
diff changeset
   369
    }
hgs
parents:
diff changeset
   370
    
hgs
parents:
diff changeset
   371
void DBTraceOstCategoryHandler::Remove( TUint32 aIndex )
hgs
parents:
diff changeset
   372
    {
hgs
parents:
diff changeset
   373
    iMultipartArray[aIndex].iMultiPartId = 0xffffffff;    
hgs
parents:
diff changeset
   374
    iFreeList[aIndex] = 1; // Set free
hgs
parents:
diff changeset
   375
    }
hgs
parents:
diff changeset
   376
    
hgs
parents:
diff changeset
   377
    /**
hgs
parents:
diff changeset
   378
     * 
hgs
parents:
diff changeset
   379
     * @return KErrNone if added, otherwise KErrNotFound.
hgs
parents:
diff changeset
   380
     */
hgs
parents:
diff changeset
   381
TInt DBTraceOstCategoryHandler::InsertIfNotExist( TMultiPartActivationInfo &aMultiPartTrace )
hgs
parents:
diff changeset
   382
    {
hgs
parents:
diff changeset
   383
    TInt ret = Find( aMultiPartTrace.iMultiPartId );
hgs
parents:
diff changeset
   384
    if( ret == KErrNotFound )
hgs
parents:
diff changeset
   385
        {
hgs
parents:
diff changeset
   386
        // Find free slot
hgs
parents:
diff changeset
   387
        for( TInt freeIndex = 0; freeIndex<MAX_MULTIPART_TRACES; freeIndex++ )
hgs
parents:
diff changeset
   388
            {
hgs
parents:
diff changeset
   389
            if( iFreeList[freeIndex] )
hgs
parents:
diff changeset
   390
                {
hgs
parents:
diff changeset
   391
                iFreeList[freeIndex] = 0; // Set reserved
hgs
parents:
diff changeset
   392
                iMultipartArray[freeIndex].iComponentId = aMultiPartTrace.iComponentId;
hgs
parents:
diff changeset
   393
                iMultipartArray[freeIndex].iTraceWord = aMultiPartTrace.iTraceWord;
hgs
parents:
diff changeset
   394
                iMultipartArray[freeIndex].iMultiPartId = aMultiPartTrace.iMultiPartId;
hgs
parents:
diff changeset
   395
                ret = KErrNone;
hgs
parents:
diff changeset
   396
                break;
hgs
parents:
diff changeset
   397
                }
hgs
parents:
diff changeset
   398
            }
hgs
parents:
diff changeset
   399
hgs
parents:
diff changeset
   400
        }
hgs
parents:
diff changeset
   401
    return ret;
hgs
parents:
diff changeset
   402
    }
hgs
parents:
diff changeset
   403
 
hgs
parents:
diff changeset
   404
hgs
parents:
diff changeset
   405
/**
hgs
parents:
diff changeset
   406
 * Handles this Multipart trace
hgs
parents:
diff changeset
   407
 *
hgs
parents:
diff changeset
   408
 * @param aHeader BTrace header
hgs
parents:
diff changeset
   409
 * @param aHeader2 Extra header data
hgs
parents:
diff changeset
   410
 * @param aContext The thread context in which this function was called
hgs
parents:
diff changeset
   411
 * @param a1 First parameter
hgs
parents:
diff changeset
   412
 * @param a2 Second parameter
hgs
parents:
diff changeset
   413
 * @param aData The data
hgs
parents:
diff changeset
   414
 * @param aExtra Extra trace data
hgs
parents:
diff changeset
   415
 * @param aPc The program counter value
hgs
parents:
diff changeset
   416
 * @return ETrue if trace is activated
hgs
parents:
diff changeset
   417
 */
hgs
parents:
diff changeset
   418
TBool DBTraceOstCategoryHandler::HandleMultiPart( TUint32 aHeader, TUint32 aHeader2, const TUint32 aContext,
hgs
parents:
diff changeset
   419
                   const TUint32 a1, const TUint32 a2, const TUint32 aData, const TUint32 aExtra,
hgs
parents:
diff changeset
   420
                   const TUint32 aPc)
hgs
parents:
diff changeset
   421
    {
hgs
parents:
diff changeset
   422
    TBool retval = ETrue;
hgs
parents:
diff changeset
   423
    TInt multiPartOffset = aHeader2 & BTrace::EMultipartFlagMask;
hgs
parents:
diff changeset
   424
    TUint8 recordSize = static_cast< TUint8 >( ( aHeader >> ( BTrace::ESizeIndex * KByteSize ) ) & KByteMask );
hgs
parents:
diff changeset
   425
    
hgs
parents:
diff changeset
   426
    // First part of multipart trace
hgs
parents:
diff changeset
   427
    if (multiPartOffset == BTrace::EMultipartFirst)
hgs
parents:
diff changeset
   428
        {
hgs
parents:
diff changeset
   429
        // Create new MultiPart activation info and save it to the array
hgs
parents:
diff changeset
   430
        TMultiPartActivationInfo activationInfo;
hgs
parents:
diff changeset
   431
        activationInfo.iComponentId = a2;
hgs
parents:
diff changeset
   432
        
hgs
parents:
diff changeset
   433
        // This should be safe operation as if there is not enough data, the trace should not
hgs
parents:
diff changeset
   434
        // be first part of multipart trace
hgs
parents:
diff changeset
   435
        TUint32* ptr = reinterpret_cast< TUint32* >(aData);
hgs
parents:
diff changeset
   436
        activationInfo.iTraceWord = *ptr++;
hgs
parents:
diff changeset
   437
        activationInfo.iMultiPartId = aExtra;
hgs
parents:
diff changeset
   438
        retval = iOstTraceBitmap->IsTraceActivated( activationInfo.iComponentId, activationInfo.iTraceWord );
hgs
parents:
diff changeset
   439
        
hgs
parents:
diff changeset
   440
        if (retval)
hgs
parents:
diff changeset
   441
            {
hgs
parents:
diff changeset
   442
            // Insert the item to the array        
hgs
parents:
diff changeset
   443
            TInt ret = InsertIfNotExist( activationInfo );
hgs
parents:
diff changeset
   444
			
hgs
parents:
diff changeset
   445
            if (KErrNone == ret)
hgs
parents:
diff changeset
   446
                {
hgs
parents:
diff changeset
   447
                CheckDroppedTrace( aHeader ); // Update header if there is a dropped trace
hgs
parents:
diff changeset
   448
                
hgs
parents:
diff changeset
   449
                // Write the trace. Skip first 4 bytes as it's the traceWord which is given in different parameter
hgs
parents:
diff changeset
   450
                iWriter->WriteTraceCoreFrame( activationInfo.iComponentId, activationInfo.iTraceWord, 
hgs
parents:
diff changeset
   451
                        aHeader, aHeader2, aContext, activationInfo.iComponentId, 
hgs
parents:
diff changeset
   452
                        activationInfo.iTraceWord, aData + 4, aExtra, aPc, recordSize - 4 );
hgs
parents:
diff changeset
   453
                }
hgs
parents:
diff changeset
   454
            else
hgs
parents:
diff changeset
   455
                {
hgs
parents:
diff changeset
   456
                retval = EFalse;
hgs
parents:
diff changeset
   457
                }
hgs
parents:
diff changeset
   458
            }
hgs
parents:
diff changeset
   459
        }
hgs
parents:
diff changeset
   460
    // Middle or last part of multipart trace
hgs
parents:
diff changeset
   461
    else if (multiPartOffset == BTrace::EMultipartMiddle || multiPartOffset == BTrace::EMultipartLast)
hgs
parents:
diff changeset
   462
        {
hgs
parents:
diff changeset
   463
        // Check index of component id in array
hgs
parents:
diff changeset
   464
        TMultiPartActivationInfo tempInfo;
hgs
parents:
diff changeset
   465
        tempInfo.iMultiPartId = aExtra;
hgs
parents:
diff changeset
   466
        
hgs
parents:
diff changeset
   467
		TInt index = Find( aExtra );
hgs
parents:
diff changeset
   468
        
hgs
parents:
diff changeset
   469
        if (index != KErrNotFound)
hgs
parents:
diff changeset
   470
            {
hgs
parents:
diff changeset
   471
            CheckDroppedTrace( aHeader ); // Update header if there is a dropped trace
hgs
parents:
diff changeset
   472
        
hgs
parents:
diff changeset
   473
            TMultiPartActivationInfo activationInfo;
hgs
parents:
diff changeset
   474
            activationInfo.iComponentId = iMultipartArray[index].iComponentId;
hgs
parents:
diff changeset
   475
            activationInfo.iTraceWord = iMultipartArray[index].iTraceWord;
hgs
parents:
diff changeset
   476
            activationInfo.iMultiPartId = iMultipartArray[index].iMultiPartId;
hgs
parents:
diff changeset
   477
            
hgs
parents:
diff changeset
   478
            // Write the trace
hgs
parents:
diff changeset
   479
            iWriter->WriteTraceCoreFrame( activationInfo.iComponentId, activationInfo.iTraceWord, aHeader, aHeader2, 
hgs
parents:
diff changeset
   480
                    aContext, activationInfo.iComponentId, activationInfo.iTraceWord, aData, aExtra, aPc, recordSize );
hgs
parents:
diff changeset
   481
            
hgs
parents:
diff changeset
   482
            // Last part, remove the item from the array
hgs
parents:
diff changeset
   483
            if (multiPartOffset == BTrace::EMultipartLast)
hgs
parents:
diff changeset
   484
                {
hgs
parents:
diff changeset
   485
                Remove(index);
hgs
parents:
diff changeset
   486
                }
hgs
parents:
diff changeset
   487
            }
hgs
parents:
diff changeset
   488
        }
hgs
parents:
diff changeset
   489
    
hgs
parents:
diff changeset
   490
    //Trace from here is not allowed
hgs
parents:
diff changeset
   491
        
hgs
parents:
diff changeset
   492
    return retval;
hgs
parents:
diff changeset
   493
    }
hgs
parents:
diff changeset
   494
hgs
parents:
diff changeset
   495
#else // __SMP__
hgs
parents:
diff changeset
   496
hgs
parents:
diff changeset
   497
/**
hgs
parents:
diff changeset
   498
 * Handles this Multipart trace
hgs
parents:
diff changeset
   499
 *
hgs
parents:
diff changeset
   500
 * @param aHeader BTrace header
hgs
parents:
diff changeset
   501
 * @param aHeader2 Extra header data
hgs
parents:
diff changeset
   502
 * @param aContext The thread context in which this function was called
hgs
parents:
diff changeset
   503
 * @param a1 First parameter
hgs
parents:
diff changeset
   504
 * @param a2 Second parameter
hgs
parents:
diff changeset
   505
 * @param aData The data
hgs
parents:
diff changeset
   506
 * @param aExtra Extra trace data
hgs
parents:
diff changeset
   507
 * @param aPc The program counter value
hgs
parents:
diff changeset
   508
 * @return ETrue if trace was processed, EFalse if not
hgs
parents:
diff changeset
   509
 */
hgs
parents:
diff changeset
   510
TBool DBTraceOstCategoryHandler::HandleMultiPart( TUint32 aHeader, TUint32 aHeader2, const TUint32 aContext,
hgs
parents:
diff changeset
   511
                   const TUint32 a1, const TUint32 a2, const TUint32 aData, const TUint32 aExtra,
hgs
parents:
diff changeset
   512
                   const TUint32 aPc)
hgs
parents:
diff changeset
   513
    {
hgs
parents:
diff changeset
   514
    TBool retval = EFalse;
hgs
parents:
diff changeset
   515
    
hgs
parents:
diff changeset
   516
    if (iMultiPartTrace.iMultiPartId == 0 || iMultiPartTrace.iMultiPartId == aExtra)
hgs
parents:
diff changeset
   517
        {    
hgs
parents:
diff changeset
   518
        // First part of multipart trace
hgs
parents:
diff changeset
   519
        if ((aHeader2 & BTrace::EMultipartFlagMask) == BTrace::EMultipartFirst)
hgs
parents:
diff changeset
   520
            {
hgs
parents:
diff changeset
   521
            TUint32 componentId = a2;
hgs
parents:
diff changeset
   522
            TUint32* ptr = ( TUint32* )aData;
hgs
parents:
diff changeset
   523
            TUint32 traceWord = *ptr++;
hgs
parents:
diff changeset
   524
            retval = iOstTraceBitmap->IsTraceActivated( componentId, traceWord );
hgs
parents:
diff changeset
   525
            if (retval)
hgs
parents:
diff changeset
   526
                {
hgs
parents:
diff changeset
   527
                CheckDroppedTrace( aHeader ); // Update header if there is a dropped trace
hgs
parents:
diff changeset
   528
            
hgs
parents:
diff changeset
   529
                // Set values
hgs
parents:
diff changeset
   530
                iMultiPartTrace.iMultiPartId = aExtra;
hgs
parents:
diff changeset
   531
                iMultiPartTrace.iComponentId = componentId;
hgs
parents:
diff changeset
   532
                iMultiPartTrace.iTraceWord = traceWord;
hgs
parents:
diff changeset
   533
                iMultiPartTrace.iContext = aContext;
hgs
parents:
diff changeset
   534
                iMultiPartTrace.iPc = aPc;
hgs
parents:
diff changeset
   535
                iMultiPartTrace.iHeader = aHeader;
hgs
parents:
diff changeset
   536
                
hgs
parents:
diff changeset
   537
                // Remove the multipart information from the header2
hgs
parents:
diff changeset
   538
                aHeader2 &= ~BTrace::EMultipartFlagMask;
hgs
parents:
diff changeset
   539
                iMultiPartTrace.iHeader2 = aHeader2;
hgs
parents:
diff changeset
   540
    
hgs
parents:
diff changeset
   541
                // Copy the data
hgs
parents:
diff changeset
   542
                TUint8 recordSize = static_cast< TUint8 >( ( aHeader >> ( BTrace::ESizeIndex * KByteSize ) ) & KByteMask );
hgs
parents:
diff changeset
   543
                TUint32 dataSize = recordSize - CalculateDataStartOffset(aHeader);
hgs
parents:
diff changeset
   544
                memcpy(iMultiPartTrace.iData, (TUint8*)aData + KTraceGroupIdLen, dataSize - KTraceGroupIdLen);
hgs
parents:
diff changeset
   545
                iMultiPartTrace.iDataInserted = dataSize - KTraceGroupIdLen;
hgs
parents:
diff changeset
   546
                }
hgs
parents:
diff changeset
   547
            }      
hgs
parents:
diff changeset
   548
        // Middle part of multipart trace
hgs
parents:
diff changeset
   549
        else if ((aHeader2 & BTrace::EMultipartFlagMask) == BTrace::EMultipartMiddle)
hgs
parents:
diff changeset
   550
            {
hgs
parents:
diff changeset
   551
            retval = ETrue;
hgs
parents:
diff changeset
   552
            // Add to the data buffer
hgs
parents:
diff changeset
   553
            TUint8 recordSize = static_cast< TUint8 >( ( aHeader >> ( BTrace::ESizeIndex * KByteSize ) ) & KByteMask );
hgs
parents:
diff changeset
   554
            TUint32 dataSize = recordSize - CalculateDataStartOffset(aHeader);
hgs
parents:
diff changeset
   555
            
hgs
parents:
diff changeset
   556
            // Check that trace is not too big
hgs
parents:
diff changeset
   557
            if (iMultiPartTrace.iDataInserted + dataSize < MAX_TRACE_DATA_SIZE)
hgs
parents:
diff changeset
   558
                {
hgs
parents:
diff changeset
   559
                CheckDroppedTrace( aHeader ); // Update header if there is a dropped trace
hgs
parents:
diff changeset
   560
                memcpy(iMultiPartTrace.iData + iMultiPartTrace.iDataInserted, (TUint8*)aData, dataSize);
hgs
parents:
diff changeset
   561
                iMultiPartTrace.iDataInserted += dataSize;
hgs
parents:
diff changeset
   562
                }
hgs
parents:
diff changeset
   563
            }
hgs
parents:
diff changeset
   564
        // Last part of multipart trace
hgs
parents:
diff changeset
   565
        else if ((aHeader2 & BTrace::EMultipartFlagMask) == BTrace::EMultipartLast)
hgs
parents:
diff changeset
   566
            {
hgs
parents:
diff changeset
   567
            retval = ETrue;
hgs
parents:
diff changeset
   568
            TUint32 totalDataLen = a1;
hgs
parents:
diff changeset
   569
            TUint32 offset = a2;
hgs
parents:
diff changeset
   570
            
hgs
parents:
diff changeset
   571
            // Add to the data buffer
hgs
parents:
diff changeset
   572
            TUint32 partLen = totalDataLen - offset;
hgs
parents:
diff changeset
   573
            TUint32 dataStartOffset = CalculateDataStartOffset(iMultiPartTrace.iHeader);
hgs
parents:
diff changeset
   574
                           
hgs
parents:
diff changeset
   575
            // Check that trace is not too big
hgs
parents:
diff changeset
   576
            if (iMultiPartTrace.iDataInserted + partLen <= MAX_TRACE_DATA_SIZE)
hgs
parents:
diff changeset
   577
                {
hgs
parents:
diff changeset
   578
                CheckDroppedTrace( aHeader ); // Update header if there is a dropped trace
hgs
parents:
diff changeset
   579
                
hgs
parents:
diff changeset
   580
                // If the last part contains only last four bytes, it's a value instead of pointer
hgs
parents:
diff changeset
   581
                if (partLen == KFourBytes)
hgs
parents:
diff changeset
   582
                    {
hgs
parents:
diff changeset
   583
                    iMultiPartTrace.iData[iMultiPartTrace.iDataInserted] = aData & KByteMask;
hgs
parents:
diff changeset
   584
                    iMultiPartTrace.iData[iMultiPartTrace.iDataInserted + 1] = (aData >> 8) & KByteMask; //CodForChk_Dis_Magic
hgs
parents:
diff changeset
   585
                    iMultiPartTrace.iData[iMultiPartTrace.iDataInserted + 2] = (aData >> 16) & KByteMask; //CodForChk_Dis_Magic
hgs
parents:
diff changeset
   586
                    iMultiPartTrace.iData[iMultiPartTrace.iDataInserted + 3] = (aData >> 24) & KByteMask; //CodForChk_Dis_Magic
hgs
parents:
diff changeset
   587
                    }
hgs
parents:
diff changeset
   588
                else 
hgs
parents:
diff changeset
   589
                    {
hgs
parents:
diff changeset
   590
                    memcpy(iMultiPartTrace.iData + iMultiPartTrace.iDataInserted, (TUint8*)aData, partLen);   
hgs
parents:
diff changeset
   591
                    }
hgs
parents:
diff changeset
   592
                    
hgs
parents:
diff changeset
   593
                // Total data length. Four bytes is taken out because it was parsed out from the data
hgs
parents:
diff changeset
   594
                // array when parsing first part of the trace
hgs
parents:
diff changeset
   595
                totalDataLen = totalDataLen + dataStartOffset - KFourBytes;    
hgs
parents:
diff changeset
   596
                    
hgs
parents:
diff changeset
   597
                }
hgs
parents:
diff changeset
   598
            else
hgs
parents:
diff changeset
   599
                {
hgs
parents:
diff changeset
   600
                	// Total data length. Four bytes is taken out because it was parsed out from the data
hgs
parents:
diff changeset
   601
                  // array when parsing first part of the trace
hgs
parents:
diff changeset
   602
                	totalDataLen = iMultiPartTrace.iDataInserted + dataStartOffset - KFourBytes;
hgs
parents:
diff changeset
   603
                }
hgs
parents:
diff changeset
   604
                	
hgs
parents:
diff changeset
   605
            // Write the trace
hgs
parents:
diff changeset
   606
            iWriter->WriteTraceCoreFrame( iMultiPartTrace.iComponentId, iMultiPartTrace.iTraceWord,
hgs
parents:
diff changeset
   607
            iMultiPartTrace.iHeader, iMultiPartTrace.iHeader2, iMultiPartTrace.iContext,
hgs
parents:
diff changeset
   608
            iMultiPartTrace.iComponentId, iMultiPartTrace.iTraceWord, (TUint32)iMultiPartTrace.iData,
hgs
parents:
diff changeset
   609
            iMultiPartTrace.iMultiPartId, iMultiPartTrace.iPc, totalDataLen);
hgs
parents:
diff changeset
   610
                
hgs
parents:
diff changeset
   611
            iMultiPartTrace.iMultiPartId = 0;
hgs
parents:
diff changeset
   612
            }
hgs
parents:
diff changeset
   613
        }
hgs
parents:
diff changeset
   614
hgs
parents:
diff changeset
   615
    return retval;
hgs
parents:
diff changeset
   616
    }
hgs
parents:
diff changeset
   617
hgs
parents:
diff changeset
   618
/**
hgs
parents:
diff changeset
   619
 * Calculates data start offset
hgs
parents:
diff changeset
   620
 *
hgs
parents:
diff changeset
   621
 * @param aHeader BTrace header
hgs
parents:
diff changeset
   622
 */
hgs
parents:
diff changeset
   623
TUint32 DBTraceOstCategoryHandler::CalculateDataStartOffset( TUint32 aHeader )
hgs
parents:
diff changeset
   624
    {
hgs
parents:
diff changeset
   625
    TUint32 offset = 0;
hgs
parents:
diff changeset
   626
    TUint8 flags = static_cast< TUint8 >( ( aHeader >> ( BTrace::EFlagsIndex * KByteSize ) ) & KByteMask );
hgs
parents:
diff changeset
   627
    
hgs
parents:
diff changeset
   628
    // First add header length
hgs
parents:
diff changeset
   629
    offset += KBTraceHeaderLen;
hgs
parents:
diff changeset
   630
    
hgs
parents:
diff changeset
   631
    // Header2 is present
hgs
parents:
diff changeset
   632
    if ( flags & BTrace::EHeader2Present )
hgs
parents:
diff changeset
   633
        {
hgs
parents:
diff changeset
   634
        offset += KBTraceVariableLen;
hgs
parents:
diff changeset
   635
        }
hgs
parents:
diff changeset
   636
    // Timestamp is present
hgs
parents:
diff changeset
   637
    if ( flags & BTrace::ETimestampPresent )
hgs
parents:
diff changeset
   638
        {
hgs
parents:
diff changeset
   639
        offset += KBTraceVariableLen;
hgs
parents:
diff changeset
   640
        }
hgs
parents:
diff changeset
   641
    // Timestamp2 is present
hgs
parents:
diff changeset
   642
    if ( flags & BTrace::ETimestamp2Present )
hgs
parents:
diff changeset
   643
        {
hgs
parents:
diff changeset
   644
        offset += KBTraceVariableLen;
hgs
parents:
diff changeset
   645
        }
hgs
parents:
diff changeset
   646
    // Context ID is present
hgs
parents:
diff changeset
   647
    if ( flags & BTrace::EContextIdPresent )
hgs
parents:
diff changeset
   648
        {
hgs
parents:
diff changeset
   649
        offset += KBTraceVariableLen;
hgs
parents:
diff changeset
   650
        }
hgs
parents:
diff changeset
   651
    // Program counter is present
hgs
parents:
diff changeset
   652
    if ( flags & BTrace::EPcPresent )
hgs
parents:
diff changeset
   653
        {
hgs
parents:
diff changeset
   654
        offset += KBTraceVariableLen;
hgs
parents:
diff changeset
   655
        }
hgs
parents:
diff changeset
   656
    // Extra value is present
hgs
parents:
diff changeset
   657
    if ( flags & BTrace::EExtraPresent )
hgs
parents:
diff changeset
   658
        {
hgs
parents:
diff changeset
   659
        offset += KBTraceVariableLen;
hgs
parents:
diff changeset
   660
        }
hgs
parents:
diff changeset
   661
    
hgs
parents:
diff changeset
   662
    // Next 8 bytes came with first and second parameter of the multipart trace
hgs
parents:
diff changeset
   663
    offset += KFourBytes;
hgs
parents:
diff changeset
   664
    offset += KFourBytes;
hgs
parents:
diff changeset
   665
    
hgs
parents:
diff changeset
   666
    return offset;
hgs
parents:
diff changeset
   667
    }
hgs
parents:
diff changeset
   668
	
hgs
parents:
diff changeset
   669
#endif // !__SMP__
hgs
parents:
diff changeset
   670
hgs
parents:
diff changeset
   671
// End of File