perfsrv/piprofiler/plugins/GeneralsPlugin/src/GeneralsDriver.cpp
author hgs
Tue, 26 Oct 2010 16:20:32 +0300
changeset 62 1c2bb2fc7c87
parent 51 98307c651589
permissions -rw-r--r--
201043
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
20
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description:  
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
hgs
parents:
diff changeset
    19
//
hgs
parents:
diff changeset
    20
// LDD for thread time profiling
hgs
parents:
diff changeset
    21
//
hgs
parents:
diff changeset
    22
hgs
parents:
diff changeset
    23
#include <kern_priv.h>
hgs
parents:
diff changeset
    24
#include <platform.h>
hgs
parents:
diff changeset
    25
#include <arm.h>
62
hgs
parents: 51
diff changeset
    26
#include <kernel/kpower.h>
20
hgs
parents:
diff changeset
    27
hgs
parents:
diff changeset
    28
#ifdef __SMP__
hgs
parents:
diff changeset
    29
#include <assp/naviengine/naviengine.h> 
hgs
parents:
diff changeset
    30
#include <nkernsmp/arm/arm_gic.h>
hgs
parents:
diff changeset
    31
#include <nkernsmp/arm/arm_tmr.h>
hgs
parents:
diff changeset
    32
#endif
hgs
parents:
diff changeset
    33
hgs
parents:
diff changeset
    34
#include "GeneralsDriver.h"
hgs
parents:
diff changeset
    35
#include <piprofiler/PluginDriver.h>
hgs
parents:
diff changeset
    36
#include <piprofiler/PluginSampler.h>
hgs
parents:
diff changeset
    37
#include <piprofiler/ProfilerTraces.h>
hgs
parents:
diff changeset
    38
hgs
parents:
diff changeset
    39
#include "GppSamplerImpl.h"
hgs
parents:
diff changeset
    40
#include "GfcSamplerImpl.h"
hgs
parents:
diff changeset
    41
#include "IttSamplerImpl.h"
hgs
parents:
diff changeset
    42
#include "MemSamplerImpl.h"
hgs
parents:
diff changeset
    43
#include "PriSamplerImpl.h"
hgs
parents:
diff changeset
    44
hgs
parents:
diff changeset
    45
hgs
parents:
diff changeset
    46
#ifndef __SMP__
hgs
parents:
diff changeset
    47
extern TUint* IntStackPtr();
hgs
parents:
diff changeset
    48
extern void UsrModLr(TUint32*);
hgs
parents:
diff changeset
    49
#endif
hgs
parents:
diff changeset
    50
// for security check
hgs
parents:
diff changeset
    51
#define KProfilerExeSecurUid 0x2001E5AD
hgs
parents:
diff changeset
    52
static _LIT_SECURITY_POLICY_PASS(KAllowAllPolicy);
hgs
parents:
diff changeset
    53
static _LIT_SECURITY_POLICY_FAIL( KDenyAllPolicy );
hgs
parents:
diff changeset
    54
hgs
parents:
diff changeset
    55
// CONSTANTS
hgs
parents:
diff changeset
    56
//_LIT(DProfilerThread,"DProfilerThread");
62
hgs
parents: 51
diff changeset
    57
const TInt KDSamplerThreadPriority = 27;
20
hgs
parents:
diff changeset
    58
hgs
parents:
diff changeset
    59
const TInt KGeneralsDriverThreadPriority = 24;
hgs
parents:
diff changeset
    60
_LIT(KGeneralsDriverThread, "PIGeneralsDriver");
hgs
parents:
diff changeset
    61
hgs
parents:
diff changeset
    62
// global Dfc Que
62
hgs
parents: 51
diff changeset
    63
TDynamicDfcQue* gDfcQ;
20
hgs
parents:
diff changeset
    64
62
hgs
parents: 51
diff changeset
    65
#ifdef __SMP__
hgs
parents: 51
diff changeset
    66
static TSpinLock PiSpinLock = TSpinLock(TSpinLock::EOrderGenericIrqLow2);
hgs
parents: 51
diff changeset
    67
#endif
20
hgs
parents:
diff changeset
    68
hgs
parents:
diff changeset
    69
/*
hgs
parents:
diff changeset
    70
 *
hgs
parents:
diff changeset
    71
 *
62
hgs
parents: 51
diff changeset
    72
 *	Class DGeneralsProfilerFactory definition
20
hgs
parents:
diff changeset
    73
 *
hgs
parents:
diff changeset
    74
 *
hgs
parents:
diff changeset
    75
 */
hgs
parents:
diff changeset
    76
hgs
parents:
diff changeset
    77
class DGeneralsProfilerFactory : public DLogicalDevice
hgs
parents:
diff changeset
    78
{
hgs
parents:
diff changeset
    79
	public:
hgs
parents:
diff changeset
    80
		DGeneralsProfilerFactory();
hgs
parents:
diff changeset
    81
		~DGeneralsProfilerFactory();
hgs
parents:
diff changeset
    82
hgs
parents:
diff changeset
    83
	public:
hgs
parents:
diff changeset
    84
		virtual TInt Install();
hgs
parents:
diff changeset
    85
		virtual void GetCaps(TDes8& aDes) const;
hgs
parents:
diff changeset
    86
		virtual TInt Create(DLogicalChannelBase*& aChannel);
hgs
parents:
diff changeset
    87
};
hgs
parents:
diff changeset
    88
hgs
parents:
diff changeset
    89
/*
hgs
parents:
diff changeset
    90
 *
hgs
parents:
diff changeset
    91
 *
62
hgs
parents: 51
diff changeset
    92
 *	Class DGeneralsDriver definition
20
hgs
parents:
diff changeset
    93
 *
hgs
parents:
diff changeset
    94
 *
hgs
parents:
diff changeset
    95
 */
hgs
parents:
diff changeset
    96
class DPluginDriver;
62
hgs
parents: 51
diff changeset
    97
class DSamplerPowerHandler;
20
hgs
parents:
diff changeset
    98
hgs
parents:
diff changeset
    99
class DGeneralsDriver : public DPluginDriver
hgs
parents:
diff changeset
   100
{
hgs
parents:
diff changeset
   101
hgs
parents:
diff changeset
   102
public:
hgs
parents:
diff changeset
   103
	DGeneralsDriver();
hgs
parents:
diff changeset
   104
	~DGeneralsDriver();
62
hgs
parents: 51
diff changeset
   105
    TInt                    StartSampling(TInt aRate, TInt aInterruptNumber);
hgs
parents: 51
diff changeset
   106
    TInt                    StopSampling();
20
hgs
parents:
diff changeset
   107
private:
62
hgs
parents: 51
diff changeset
   108
    TInt                    isExecuted;
hgs
parents: 51
diff changeset
   109
    TInt                    NewStart(TInt aRate);
hgs
parents: 51
diff changeset
   110
    void                    IncrementSampleNeededState(TInt aId);
hgs
parents: 51
diff changeset
   111
    void                    DecrementSampleNeededState();
20
hgs
parents:
diff changeset
   112
	static void				NewDoProfilerProfile(TAny*);
hgs
parents:
diff changeset
   113
	static void				NewDoDfc(TAny*);
hgs
parents:
diff changeset
   114
	
hgs
parents:
diff changeset
   115
	// called by each core
62
hgs
parents: 51
diff changeset
   116
	static void				Sample(TAny* aPtr);
20
hgs
parents:
diff changeset
   117
hgs
parents:
diff changeset
   118
	TInt					GetSampleTime(TUint32* time);
hgs
parents:
diff changeset
   119
	//TInt					Test(TUint32 testCase); 
hgs
parents:
diff changeset
   120
hgs
parents:
diff changeset
   121
hgs
parents:
diff changeset
   122
	void					InitialiseSamplerList(); 
hgs
parents:
diff changeset
   123
hgs
parents:
diff changeset
   124
	DProfilerSamplerBase*	GetSamplerForId(TInt samplerId);
hgs
parents:
diff changeset
   125
	TInt					GetSamplerVersion(TDes* aDes);
hgs
parents:
diff changeset
   126
	
hgs
parents:
diff changeset
   127
#ifdef __SMP__
hgs
parents:
diff changeset
   128
	void                    UnbindInterrupts();
hgs
parents:
diff changeset
   129
#endif
hgs
parents:
diff changeset
   130
	TInt					ProcessStreamReadRequest(TBapBuf* aBuf,TRequestStatus* aStatus);
hgs
parents:
diff changeset
   131
hgs
parents:
diff changeset
   132
	TInt					MarkTraceActive(TInt samplerIdToActivate);
hgs
parents:
diff changeset
   133
	TInt					MarkTraceInactive(TInt samplerIdToDisable);
hgs
parents:
diff changeset
   134
	TInt					OutputSettingsForTrace(TInt samplerId,TInt settings);
hgs
parents:
diff changeset
   135
	TInt					AdditionalTraceSettings(TInt samplerId,TInt settings);
hgs
parents:
diff changeset
   136
	TInt					AdditionalTraceSettings2(TInt samplerId,TInt settings);
hgs
parents:
diff changeset
   137
	TInt					SetSamplingPeriod(TInt /*samplerId*/,TInt settings);
hgs
parents:
diff changeset
   138
private:
hgs
parents:
diff changeset
   139
	// create the driver in EKA-2 version
hgs
parents:
diff changeset
   140
	TInt			        DoCreate(TInt aUnit, const TDesC8* anInfo, const TVersion& aVer);
hgs
parents:
diff changeset
   141
hgs
parents:
diff changeset
   142
	// receive commands and control in EKA-2 version
hgs
parents:
diff changeset
   143
	void					HandleMsg(TMessageBase* aMsg);
hgs
parents:
diff changeset
   144
private:
hgs
parents:
diff changeset
   145
	// timer mechanism in EKA-2 version
hgs
parents:
diff changeset
   146
	NTimer						iTimer;
hgs
parents:
diff changeset
   147
	TDfc						iNewDfc;
hgs
parents:
diff changeset
   148
	TInt						iCount;
hgs
parents:
diff changeset
   149
	TInt						iLastPcVal;					
hgs
parents:
diff changeset
   150
	TInt						iPeriod;
hgs
parents:
diff changeset
   151
	
hgs
parents:
diff changeset
   152
	// sync sample number property for synchronizing other samplers
hgs
parents:
diff changeset
   153
	RPropertyRef 				iSampleStartTimeProp;
hgs
parents:
diff changeset
   154
	TInt						iSampleStartTime;
hgs
parents:
diff changeset
   155
	
hgs
parents:
diff changeset
   156
	DProfilerGppSampler<10000> 	gppSampler;
hgs
parents:
diff changeset
   157
#ifdef __SMP__
hgs
parents:
diff changeset
   158
	DProfilerGppSampler<10000>  gppSampler2;
hgs
parents:
diff changeset
   159
    DProfilerGppSampler<10000>  gppSampler3;
hgs
parents:
diff changeset
   160
    DProfilerGppSampler<10000>  gppSampler4;
hgs
parents:
diff changeset
   161
#endif
hgs
parents:
diff changeset
   162
	DProfilerGfcSampler<10000> 	gfcSampler;
hgs
parents:
diff changeset
   163
	DProfilerIttSampler<10000> 	ittSampler;
62
hgs
parents: 51
diff changeset
   164
	DProfilerMemSampler<10000> 	memSampler;
20
hgs
parents:
diff changeset
   165
	DProfilerPriSampler<10000> 	priSampler;
hgs
parents:
diff changeset
   166
#ifdef __SMP__
hgs
parents:
diff changeset
   167
//    DProfilerPriSampler<10000>  priSampler2;
hgs
parents:
diff changeset
   168
//    DProfilerPriSampler<10000>  priSampler3;
hgs
parents:
diff changeset
   169
//    DProfilerPriSampler<10000>  priSampler4;
hgs
parents:
diff changeset
   170
#endif
hgs
parents:
diff changeset
   171
	
hgs
parents:
diff changeset
   172
#ifndef __SMP__
hgs
parents:
diff changeset
   173
	static const TInt			KSamplerAmount = 5;
hgs
parents:
diff changeset
   174
#else
hgs
parents:
diff changeset
   175
    static const TInt           KSamplerAmount = 8;
hgs
parents:
diff changeset
   176
#endif
hgs
parents:
diff changeset
   177
	DProfilerSamplerBase*		iSamplers[KSamplerAmount];
62
hgs
parents: 51
diff changeset
   178
    TUint                       iInterruptCounter[KMaxCpus];
20
hgs
parents:
diff changeset
   179
    TInt                        iMaxCpus;
hgs
parents:
diff changeset
   180
    TUint32                     iStartTime; 
62
hgs
parents: 51
diff changeset
   181
    TInt8                       postSampleNeeded;
hgs
parents: 51
diff changeset
   182
    DSamplerPowerHandler*       iPowerHandler;
hgs
parents: 51
diff changeset
   183
    
hgs
parents: 51
diff changeset
   184
    /* using the HAL machine UID we determine the platform Bridge/Naviengine */
hgs
parents: 51
diff changeset
   185
      enum TPlatform
hgs
parents: 51
diff changeset
   186
          {
hgs
parents: 51
diff changeset
   187
          /* Bridge Platform STE500*/
hgs
parents: 51
diff changeset
   188
          EBridge,
hgs
parents: 51
diff changeset
   189
          /* Naviengine Platform NE1_TB */
hgs
parents: 51
diff changeset
   190
          ENaviengine,
hgs
parents: 51
diff changeset
   191
          /* Not recognised platform */
hgs
parents: 51
diff changeset
   192
          ENotRecognised,
hgs
parents: 51
diff changeset
   193
          /* Spare */
hgs
parents: 51
diff changeset
   194
          ESpare
hgs
parents: 51
diff changeset
   195
          };
hgs
parents: 51
diff changeset
   196
      TPlatform iPlatform;
hgs
parents: 51
diff changeset
   197
hgs
parents: 51
diff changeset
   198
public:
hgs
parents: 51
diff changeset
   199
    TUint8 iStarted;
hgs
parents: 51
diff changeset
   200
    TUint8 iOff;
hgs
parents: 51
diff changeset
   201
    TInt iRate;
hgs
parents: 51
diff changeset
   202
    TInt iIntNo; // Interrupt Number
20
hgs
parents:
diff changeset
   203
};
62
hgs
parents: 51
diff changeset
   204
/*
hgs
parents: 51
diff changeset
   205
 * PowerHandler
hgs
parents: 51
diff changeset
   206
 */
hgs
parents: 51
diff changeset
   207
class DSamplerPowerHandler : public DPowerHandler
hgs
parents: 51
diff changeset
   208
    {
hgs
parents: 51
diff changeset
   209
public: // from DPowerHandler
hgs
parents: 51
diff changeset
   210
    void PowerUp();
hgs
parents: 51
diff changeset
   211
    void PowerDown(TPowerState);
hgs
parents: 51
diff changeset
   212
public:
hgs
parents: 51
diff changeset
   213
    DSamplerPowerHandler(DGeneralsDriver* aChannel);
hgs
parents: 51
diff changeset
   214
public:
hgs
parents: 51
diff changeset
   215
    DGeneralsDriver* iChannel;
hgs
parents: 51
diff changeset
   216
    };
hgs
parents: 51
diff changeset
   217
20
hgs
parents:
diff changeset
   218
hgs
parents:
diff changeset
   219
/*
hgs
parents:
diff changeset
   220
 *
hgs
parents:
diff changeset
   221
 *
hgs
parents:
diff changeset
   222
 *	Class DGeneralsProfilerFactory implementation
hgs
parents:
diff changeset
   223
 *
hgs
parents:
diff changeset
   224
 *
hgs
parents:
diff changeset
   225
 */
hgs
parents:
diff changeset
   226
hgs
parents:
diff changeset
   227
DECLARE_STANDARD_LDD()
hgs
parents:
diff changeset
   228
    {
hgs
parents:
diff changeset
   229
	return new DGeneralsProfilerFactory();
hgs
parents:
diff changeset
   230
    }
hgs
parents:
diff changeset
   231
hgs
parents:
diff changeset
   232
TInt DGeneralsProfilerFactory::Create(DLogicalChannelBase*& aChannel)
hgs
parents:
diff changeset
   233
    {
hgs
parents:
diff changeset
   234
	aChannel = new DGeneralsDriver;
hgs
parents:
diff changeset
   235
	return aChannel?KErrNone:KErrNoMemory;
hgs
parents:
diff changeset
   236
    }
hgs
parents:
diff changeset
   237
hgs
parents:
diff changeset
   238
hgs
parents:
diff changeset
   239
DGeneralsProfilerFactory::DGeneralsProfilerFactory()
hgs
parents:
diff changeset
   240
    {
hgs
parents:
diff changeset
   241
	// major, minor, and build version number
hgs
parents:
diff changeset
   242
    iVersion=TVersion(1,0,1);
hgs
parents:
diff changeset
   243
    }
hgs
parents:
diff changeset
   244
hgs
parents:
diff changeset
   245
DGeneralsProfilerFactory::~DGeneralsProfilerFactory()
hgs
parents:
diff changeset
   246
    {
62
hgs
parents: 51
diff changeset
   247
    if (gDfcQ)
hgs
parents: 51
diff changeset
   248
        {
hgs
parents: 51
diff changeset
   249
        gDfcQ->Destroy();
hgs
parents: 51
diff changeset
   250
        }
20
hgs
parents:
diff changeset
   251
    }
hgs
parents:
diff changeset
   252
hgs
parents:
diff changeset
   253
TInt DGeneralsProfilerFactory::Install()
hgs
parents:
diff changeset
   254
    {
62
hgs
parents: 51
diff changeset
   255
    // Allocate a kernel thread to run the DFC 
hgs
parents: 51
diff changeset
   256
    TInt r = Kern::DynamicDfcQCreate(gDfcQ, KDSamplerThreadPriority, KGeneralsDriverThread);
hgs
parents: 51
diff changeset
   257
    if (r != KErrNone)
hgs
parents: 51
diff changeset
   258
        {
hgs
parents: 51
diff changeset
   259
        return r;
hgs
parents: 51
diff changeset
   260
        }
hgs
parents: 51
diff changeset
   261
20
hgs
parents:
diff changeset
   262
    return(SetName(&KPluginSamplerName));
hgs
parents:
diff changeset
   263
    }
hgs
parents:
diff changeset
   264
hgs
parents:
diff changeset
   265
void DGeneralsProfilerFactory::GetCaps(TDes8& aDes) const
hgs
parents:
diff changeset
   266
    {
hgs
parents:
diff changeset
   267
    TCapsSamplerV01 b;
hgs
parents:
diff changeset
   268
    
hgs
parents:
diff changeset
   269
    b.iVersion=TVersion(1,0,1);
hgs
parents:
diff changeset
   270
    
hgs
parents:
diff changeset
   271
    aDes.FillZ(aDes.MaxLength());
hgs
parents:
diff changeset
   272
    aDes.Copy((TUint8*)&b,Min(aDes.MaxLength(),sizeof(b)));
hgs
parents:
diff changeset
   273
    }
hgs
parents:
diff changeset
   274
hgs
parents:
diff changeset
   275
/*
hgs
parents:
diff changeset
   276
 *
hgs
parents:
diff changeset
   277
 *
hgs
parents:
diff changeset
   278
 *	Class DGeneralsDriver implementation
hgs
parents:
diff changeset
   279
 *
hgs
parents:
diff changeset
   280
 *
hgs
parents:
diff changeset
   281
 */
hgs
parents:
diff changeset
   282
 
hgs
parents:
diff changeset
   283
DGeneralsDriver::DGeneralsDriver() :
hgs
parents:
diff changeset
   284
	iTimer(NewDoProfilerProfile,this),
hgs
parents:
diff changeset
   285
	iNewDfc(NewDoDfc,this,NULL,7),
hgs
parents:
diff changeset
   286
#ifdef __SMP__
hgs
parents:
diff changeset
   287
	gppSampler(0),
hgs
parents:
diff changeset
   288
	gppSampler2(1),
hgs
parents:
diff changeset
   289
    gppSampler3(2),
hgs
parents:
diff changeset
   290
    gppSampler4(3),
hgs
parents:
diff changeset
   291
#endif
hgs
parents:
diff changeset
   292
	gfcSampler(gppSampler.GetExportData()),
hgs
parents:
diff changeset
   293
	ittSampler(gppSampler.GetExportData()),
hgs
parents:
diff changeset
   294
	memSampler(gppSampler.GetExportData(), PROFILER_MEM_SAMPLER_ID),
hgs
parents:
diff changeset
   295
	priSampler(gppSampler.GetExportData(), PROFILER_PRI_SAMPLER_ID)
hgs
parents:
diff changeset
   296
#ifdef __SMP__
hgs
parents:
diff changeset
   297
//    ,priSampler2(gppSampler.GetExportData(), PROFILER_PRI_SAMPLER_ID),
hgs
parents:
diff changeset
   298
//    priSampler3(gppSampler.GetExportData(), PROFILER_PRI_SAMPLER_ID),
hgs
parents:
diff changeset
   299
//    priSampler4(gppSampler.GetExportData(), PROFILER_PRI_SAMPLER_ID)
hgs
parents:
diff changeset
   300
#endif
hgs
parents:
diff changeset
   301
    {
hgs
parents:
diff changeset
   302
	LOGSTRING("DGeneralsDriver::DGeneralsDriver()");
hgs
parents:
diff changeset
   303
hgs
parents:
diff changeset
   304
	iState = EStopped;
hgs
parents:
diff changeset
   305
	iEndRequestStatus = 0;
hgs
parents:
diff changeset
   306
	doingDfc = 0;
hgs
parents:
diff changeset
   307
	sampleRunning = 0;
hgs
parents:
diff changeset
   308
	iSyncOffset = 0;
hgs
parents:
diff changeset
   309
	iStartTime = 0;
62
hgs
parents: 51
diff changeset
   310
	postSampleNeeded = 0;
20
hgs
parents:
diff changeset
   311
	InitialiseSamplerList();
hgs
parents:
diff changeset
   312
    }
hgs
parents:
diff changeset
   313
hgs
parents:
diff changeset
   314
/*
hgs
parents:
diff changeset
   315
 *
hgs
parents:
diff changeset
   316
 *	This method has to be changed for each new sampler
hgs
parents:
diff changeset
   317
 *
hgs
parents:
diff changeset
   318
 */ 
hgs
parents:
diff changeset
   319
void DGeneralsDriver::InitialiseSamplerList()
hgs
parents:
diff changeset
   320
	{
hgs
parents:
diff changeset
   321
	// initialize all samplers to zero
hgs
parents:
diff changeset
   322
	for(TInt i(0);i<KSamplerAmount;i++)
hgs
parents:
diff changeset
   323
		{
hgs
parents:
diff changeset
   324
		iSamplers[i] = 0;
hgs
parents:
diff changeset
   325
		}
hgs
parents:
diff changeset
   326
hgs
parents:
diff changeset
   327
	TInt i(0);
hgs
parents:
diff changeset
   328
	iSamplers[i] = &gppSampler;i++;
hgs
parents:
diff changeset
   329
#ifdef __SMP__
hgs
parents:
diff changeset
   330
	iSamplers[i] = &gppSampler2;i++;
hgs
parents:
diff changeset
   331
    iSamplers[i] = &gppSampler3;i++;
hgs
parents:
diff changeset
   332
    iSamplers[i] = &gppSampler4;i++;
hgs
parents:
diff changeset
   333
#endif
hgs
parents:
diff changeset
   334
	iSamplers[i] = &gfcSampler;i++;
hgs
parents:
diff changeset
   335
	iSamplers[i] = &ittSampler;i++;
hgs
parents:
diff changeset
   336
	iSamplers[i] = &memSampler;i++;
hgs
parents:
diff changeset
   337
	iSamplers[i] = &priSampler;i++;
hgs
parents:
diff changeset
   338
	
hgs
parents:
diff changeset
   339
#ifdef __SMP__
hgs
parents:
diff changeset
   340
    // get the number of cpus
hgs
parents:
diff changeset
   341
    iMaxCpus = NKern::NumberOfCpus();
62
hgs
parents: 51
diff changeset
   342
    for(TInt nCpu(0); nCpu < iMaxCpus; nCpu++)
hgs
parents: 51
diff changeset
   343
        {
hgs
parents: 51
diff changeset
   344
        iInterruptCounter[nCpu] = 0;
hgs
parents: 51
diff changeset
   345
        }
hgs
parents: 51
diff changeset
   346
20
hgs
parents:
diff changeset
   347
#else
hgs
parents:
diff changeset
   348
    iMaxCpus = 0;
hgs
parents:
diff changeset
   349
#endif
hgs
parents:
diff changeset
   350
    
hgs
parents:
diff changeset
   351
	// initialize synchronizing property
hgs
parents:
diff changeset
   352
	LOGSTRING("DGeneralsDriver::InitialiseSamplerList() - initializing property");
hgs
parents:
diff changeset
   353
	TInt r(iSampleStartTimeProp.Attach(KGppPropertyCat, EGppPropertySyncSampleNumber));
hgs
parents:
diff changeset
   354
    if (r!=KErrNone)
hgs
parents:
diff changeset
   355
        {
62
hgs
parents: 51
diff changeset
   356
        Kern::Printf("DGeneralsDriver::InitialiseSamplerList() - error in attaching counter property, error %d", r);
20
hgs
parents:
diff changeset
   357
        }
hgs
parents:
diff changeset
   358
    LOGSTRING("DGeneralsDriver::InitialiseSamplerList() - defining properties");
hgs
parents:
diff changeset
   359
    r = iSampleStartTimeProp.Define(RProperty::EInt, KAllowAllPolicy, KDenyAllPolicy, 0, NULL);
hgs
parents:
diff changeset
   360
    if (r!=KErrNone)
hgs
parents:
diff changeset
   361
        {
62
hgs
parents: 51
diff changeset
   362
        Kern::Printf("DGeneralsDriver::InitialiseSamplerList() - error in defining counter property, error %d", r);
hgs
parents: 51
diff changeset
   363
        }
20
hgs
parents:
diff changeset
   364
	}
hgs
parents:
diff changeset
   365
hgs
parents:
diff changeset
   366
hgs
parents:
diff changeset
   367
DProfilerSamplerBase* DGeneralsDriver::GetSamplerForId(TInt samplerIdToGet)
hgs
parents:
diff changeset
   368
    {
hgs
parents:
diff changeset
   369
	for(TInt i(0);i<KSamplerAmount;i++)
hgs
parents:
diff changeset
   370
	    {
hgs
parents:
diff changeset
   371
		if(iSamplers[i]->iSamplerId == samplerIdToGet)
hgs
parents:
diff changeset
   372
		    {
hgs
parents:
diff changeset
   373
			return iSamplers[i];
hgs
parents:
diff changeset
   374
		    }
hgs
parents:
diff changeset
   375
	    }
hgs
parents:
diff changeset
   376
	return (DProfilerSamplerBase*)0;
hgs
parents:
diff changeset
   377
    }
hgs
parents:
diff changeset
   378
hgs
parents:
diff changeset
   379
TInt DGeneralsDriver::DoCreate(TInt aUnit, const TDesC8* anInfo, const TVersion& aVer)
hgs
parents:
diff changeset
   380
    {
hgs
parents:
diff changeset
   381
    TUint8 err(KErrNone);
62
hgs
parents: 51
diff changeset
   382
    LOGSTRING("DGeneralsDriver::DoCreate()");
20
hgs
parents:
diff changeset
   383
    if (!Kern::QueryVersionSupported(TVersion(1,0,1),aVer))
hgs
parents:
diff changeset
   384
	   	return KErrNotSupported;
hgs
parents:
diff changeset
   385
    
hgs
parents:
diff changeset
   386
    // just for testing 
hgs
parents:
diff changeset
   387
#ifndef __SMP__
hgs
parents:
diff changeset
   388
    LOGTEXT("Initializing the stack pointer");
hgs
parents:
diff changeset
   389
    stackTop=(TUint32*)IntStackPtr();
hgs
parents:
diff changeset
   390
    LOGSTRING2("Got stack pointer 0x%x",(TUint32)stackTop);
hgs
parents:
diff changeset
   391
#endif
hgs
parents:
diff changeset
   392
hgs
parents:
diff changeset
   393
    iClient = &Kern::CurrentThread();
hgs
parents:
diff changeset
   394
    err = iClient->Open();
hgs
parents:
diff changeset
   395
	
hgs
parents:
diff changeset
   396
    DProcess* clientProcess(iClient->iOwningProcess);
hgs
parents:
diff changeset
   397
    if (clientProcess)
hgs
parents:
diff changeset
   398
        {
hgs
parents:
diff changeset
   399
        //Require Power Management and All Files to use this driver
hgs
parents:
diff changeset
   400
        // Not ideal, but better than nothing
hgs
parents:
diff changeset
   401
        if(!Kern::CurrentThreadHasCapability(ECapabilityPowerMgmt,__PLATSEC_DIAGNOSTIC_STRING("Checked by GeneralsDriver.ldd")))
62
hgs
parents: 51
diff changeset
   402
            {
hgs
parents: 51
diff changeset
   403
            Kern::Printf("DGeneralsDriver::CurrentThreadHasCapability - denied");
20
hgs
parents:
diff changeset
   404
            return KErrPermissionDenied;
62
hgs
parents: 51
diff changeset
   405
            }
20
hgs
parents:
diff changeset
   406
        if(!Kern::CurrentThreadHasCapability(ECapabilityAllFiles,__PLATSEC_DIAGNOSTIC_STRING("Checked by GeneralsDriver.ldd")))
62
hgs
parents: 51
diff changeset
   407
            {
hgs
parents: 51
diff changeset
   408
                Kern::Printf("DGeneralsDriver::CurrentThreadHasCapability - denied");
hgs
parents: 51
diff changeset
   409
                return KErrPermissionDenied;
hgs
parents: 51
diff changeset
   410
            }
20
hgs
parents:
diff changeset
   411
        
hgs
parents:
diff changeset
   412
        SSecurityInfo secureInfo = clientProcess->iS;
hgs
parents:
diff changeset
   413
        if (secureInfo.iSecureId != KProfilerExeSecurUid)
hgs
parents:
diff changeset
   414
            {
62
hgs
parents: 51
diff changeset
   415
            Kern::Printf("DGeneralsDriver::security - denied");
20
hgs
parents:
diff changeset
   416
            return KErrPermissionDenied;
hgs
parents:
diff changeset
   417
            }
hgs
parents:
diff changeset
   418
        }
hgs
parents:
diff changeset
   419
    
hgs
parents:
diff changeset
   420
    // initiate sample stream ready for collecting the trace data
hgs
parents:
diff changeset
   421
	iSampleStream.InsertCurrentClient(iClient);
hgs
parents:
diff changeset
   422
	
hgs
parents:
diff changeset
   423
	iTimer.Cancel();
hgs
parents:
diff changeset
   424
	iNewDfc.Cancel();
hgs
parents:
diff changeset
   425
62
hgs
parents: 51
diff changeset
   426
	Kern::SetThreadPriority(KGeneralsDriverThreadPriority);
20
hgs
parents:
diff changeset
   427
62
hgs
parents: 51
diff changeset
   428
    SetDfcQ(gDfcQ);
hgs
parents: 51
diff changeset
   429
    iNewDfc.SetDfcQ(iDfcQ);
hgs
parents: 51
diff changeset
   430
    iMsgQ.Receive();
hgs
parents: 51
diff changeset
   431
	
hgs
parents: 51
diff changeset
   432
	// create the power handler
hgs
parents: 51
diff changeset
   433
    iPowerHandler = new DSamplerPowerHandler(this);
hgs
parents: 51
diff changeset
   434
    if (!iPowerHandler)
20
hgs
parents:
diff changeset
   435
        {
62
hgs
parents: 51
diff changeset
   436
        Kern::Printf("DGeneralsDriver::DoCreate() : new DSamplerPowerHandler(this) failed");
hgs
parents: 51
diff changeset
   437
        return KErrNoMemory;
20
hgs
parents:
diff changeset
   438
        }
62
hgs
parents: 51
diff changeset
   439
    iPowerHandler->Add();
20
hgs
parents:
diff changeset
   440
	return err;
hgs
parents:
diff changeset
   441
    }
hgs
parents:
diff changeset
   442
hgs
parents:
diff changeset
   443
DGeneralsDriver::~DGeneralsDriver()
hgs
parents:
diff changeset
   444
    {
hgs
parents:
diff changeset
   445
	if (iState!=EStopped)
hgs
parents:
diff changeset
   446
	    iTimer.Cancel();
hgs
parents:
diff changeset
   447
	iNewDfc.Cancel();
hgs
parents:
diff changeset
   448
	
hgs
parents:
diff changeset
   449
	iSampleStartTimeProp.Close();
hgs
parents:
diff changeset
   450
	Kern::SafeClose((DObject*&)iClient,NULL);
hgs
parents:
diff changeset
   451
    }
hgs
parents:
diff changeset
   452
hgs
parents:
diff changeset
   453
hgs
parents:
diff changeset
   454
TInt DGeneralsDriver::GetSampleTime(TUint32* time)
hgs
parents:
diff changeset
   455
    {
hgs
parents:
diff changeset
   456
	LOGSTRING("DGeneralsDriver::GetSampleTime - entry");
hgs
parents:
diff changeset
   457
hgs
parents:
diff changeset
   458
	Kern::ThreadRawWrite(	iClient,(TAny*)time, 
hgs
parents:
diff changeset
   459
							(TAny*)&gppSampler.GetExportData()->sampleNumber, 
hgs
parents:
diff changeset
   460
							4, iClient);
hgs
parents:
diff changeset
   461
hgs
parents:
diff changeset
   462
	LOGSTRING("DGeneralsDriver::GetSampleTime - exit");
hgs
parents:
diff changeset
   463
hgs
parents:
diff changeset
   464
	return KErrNone;
hgs
parents:
diff changeset
   465
    }
hgs
parents:
diff changeset
   466
hgs
parents:
diff changeset
   467
hgs
parents:
diff changeset
   468
TInt DGeneralsDriver::GetSamplerVersion(TDes* aDes)
hgs
parents:
diff changeset
   469
    {
hgs
parents:
diff changeset
   470
	LOGSTRING2("DGeneralsDriver::GetSamplerVersion - 0x%x",aDes);
hgs
parents:
diff changeset
   471
	
hgs
parents:
diff changeset
   472
	TBuf8<16> aBuf;
hgs
parents:
diff changeset
   473
	aBuf.Append(PROFILER_SAMPLER_VERSION);
hgs
parents:
diff changeset
   474
	Kern::ThreadDesWrite(iClient,aDes,aBuf,0,KChunkShiftBy0,iClient);
hgs
parents:
diff changeset
   475
	LOGSTRING("DGeneralsDriver::GetSamplerVersion - written client descriptor");
hgs
parents:
diff changeset
   476
	return KErrNone;
hgs
parents:
diff changeset
   477
    }
hgs
parents:
diff changeset
   478
hgs
parents:
diff changeset
   479
TInt DGeneralsDriver::NewStart(TInt aDelay)
hgs
parents:
diff changeset
   480
    {	
hgs
parents:
diff changeset
   481
	LOGSTRING("DGeneralsDriver::NewStart");
hgs
parents:
diff changeset
   482
	iEndRequestStatus = 0;
hgs
parents:
diff changeset
   483
	
hgs
parents:
diff changeset
   484
	aDelay = Min(KMaxDelay, Max(KMinDelay, aDelay));
hgs
parents:
diff changeset
   485
hgs
parents:
diff changeset
   486
	// always use this rate
hgs
parents:
diff changeset
   487
	iPeriod = aDelay;
hgs
parents:
diff changeset
   488
	
hgs
parents:
diff changeset
   489
#ifdef __SMP__
hgs
parents:
diff changeset
   490
    /*
62
hgs
parents: 51
diff changeset
   491
     * Bind and enable the sampling interrupts 
20
hgs
parents:
diff changeset
   492
     */
hgs
parents:
diff changeset
   493
    TInt err(0);
62
hgs
parents: 51
diff changeset
   494
    TUint32 flags(NKern::EIrqBind_Count);
hgs
parents: 51
diff changeset
   495
    TInt noofCpu(NKern::NumberOfCpus());
20
hgs
parents:
diff changeset
   496
62
hgs
parents: 51
diff changeset
   497
    //Binding to the interrupt(s)
hgs
parents: 51
diff changeset
   498
    for( TInt nCpu(0); nCpu < noofCpu; nCpu++ )
hgs
parents: 51
diff changeset
   499
        {
hgs
parents: 51
diff changeset
   500
        LOGSTRING3(" > Interrupt::InterruptBind %d + %d - 32", iIntNo, nCpu );
hgs
parents: 51
diff changeset
   501
        err = NKern::InterruptBind( (iIntNo + nCpu - 32) , DGeneralsDriver::Sample, this, flags, 0);
hgs
parents: 51
diff changeset
   502
        if(err < 0)
hgs
parents: 51
diff changeset
   503
            {
hgs
parents: 51
diff changeset
   504
            Kern::Printf(" InterruptBind %d + %d - 32 Error = 0x%x", iIntNo, nCpu, err );
hgs
parents: 51
diff changeset
   505
            return err;
hgs
parents: 51
diff changeset
   506
            }
hgs
parents: 51
diff changeset
   507
        }
hgs
parents: 51
diff changeset
   508
     
hgs
parents: 51
diff changeset
   509
    //Enabling Interrupt(s)
hgs
parents: 51
diff changeset
   510
    for( TInt nCpu(0); nCpu < noofCpu; nCpu++ )
hgs
parents: 51
diff changeset
   511
        {
hgs
parents: 51
diff changeset
   512
        LOGSTRING3(" > NKern::InterruptEnable %d + %d - 32", iIntNo, nCpu );
hgs
parents: 51
diff changeset
   513
        err = NKern::InterruptEnable(iIntNo + nCpu - 32);
hgs
parents: 51
diff changeset
   514
        if(err < 0)
hgs
parents: 51
diff changeset
   515
            {
hgs
parents: 51
diff changeset
   516
            Kern::Printf(" InterruptEnable %d + %d - 32 ret = 0x%x", iIntNo, nCpu, err );
hgs
parents: 51
diff changeset
   517
            return err;
hgs
parents: 51
diff changeset
   518
            }
hgs
parents: 51
diff changeset
   519
        
hgs
parents: 51
diff changeset
   520
        /* For Bridge we enable one single interrupt for CPU 1 */
hgs
parents: 51
diff changeset
   521
       if(iPlatform == EBridge)
hgs
parents: 51
diff changeset
   522
           break;
hgs
parents: 51
diff changeset
   523
        }
20
hgs
parents:
diff changeset
   524
        
hgs
parents:
diff changeset
   525
#endif
hgs
parents:
diff changeset
   526
	
hgs
parents:
diff changeset
   527
	iTimer.OneShot(aDelay);
hgs
parents:
diff changeset
   528
	
hgs
parents:
diff changeset
   529
	iState = ERunning;
hgs
parents:
diff changeset
   530
hgs
parents:
diff changeset
   531
	return KErrNone;
hgs
parents:
diff changeset
   532
    }
hgs
parents:
diff changeset
   533
62
hgs
parents: 51
diff changeset
   534
void DGeneralsDriver::IncrementSampleNeededState(TInt aId)
hgs
parents: 51
diff changeset
   535
    {
hgs
parents: 51
diff changeset
   536
    LOGSTRING2("DGeneralsDriver::IncrementSampleNeededState() - incrementing sample needed state, caller id: %d", (aId+1));
hgs
parents: 51
diff changeset
   537
#ifdef __SMP__
hgs
parents: 51
diff changeset
   538
    TInt intState(0);
hgs
parents: 51
diff changeset
   539
    intState = __SPIN_LOCK_IRQSAVE(PiSpinLock);
hgs
parents: 51
diff changeset
   540
#endif
hgs
parents: 51
diff changeset
   541
    postSampleNeeded++;
hgs
parents: 51
diff changeset
   542
#ifdef __SMP__
hgs
parents: 51
diff changeset
   543
    __SPIN_UNLOCK_IRQRESTORE(PiSpinLock, intState);
hgs
parents: 51
diff changeset
   544
#endif
hgs
parents: 51
diff changeset
   545
    }
hgs
parents: 51
diff changeset
   546
hgs
parents: 51
diff changeset
   547
void DGeneralsDriver::DecrementSampleNeededState()
hgs
parents: 51
diff changeset
   548
    {
hgs
parents: 51
diff changeset
   549
    LOGSTRING("DGeneralsDriver::DecrementSampleNeededState() - decrementing sample needed state");
hgs
parents: 51
diff changeset
   550
#ifdef __SMP__
hgs
parents: 51
diff changeset
   551
    TInt intState(0);
hgs
parents: 51
diff changeset
   552
    intState = __SPIN_LOCK_IRQSAVE(PiSpinLock);
hgs
parents: 51
diff changeset
   553
#endif
hgs
parents: 51
diff changeset
   554
    postSampleNeeded--;
hgs
parents: 51
diff changeset
   555
#ifdef __SMP__
hgs
parents: 51
diff changeset
   556
    __SPIN_UNLOCK_IRQRESTORE(PiSpinLock, intState);
hgs
parents: 51
diff changeset
   557
#endif
hgs
parents: 51
diff changeset
   558
    }
hgs
parents: 51
diff changeset
   559
hgs
parents: 51
diff changeset
   560
20
hgs
parents:
diff changeset
   561
/*
hgs
parents:
diff changeset
   562
 *	This function is run in each interrupt
hgs
parents:
diff changeset
   563
 */
hgs
parents:
diff changeset
   564
// EKA-2 implementation of the sampler method
hgs
parents:
diff changeset
   565
hgs
parents:
diff changeset
   566
void DGeneralsDriver::NewDoProfilerProfile(TAny* aPtr)
hgs
parents:
diff changeset
   567
    {
hgs
parents:
diff changeset
   568
    LOGSTRING("DGeneralsDriver::NewDoProfilerProfile - entry");
62
hgs
parents: 51
diff changeset
   569
    DGeneralsDriver& d=*(DGeneralsDriver*)aPtr;
20
hgs
parents:
diff changeset
   570
#ifdef __SMP__      
hgs
parents:
diff changeset
   571
    TInt currCpu(NKern::CurrentCpu());
hgs
parents:
diff changeset
   572
#endif
62
hgs
parents: 51
diff changeset
   573
hgs
parents: 51
diff changeset
   574
    if(!d.iOff)
hgs
parents: 51
diff changeset
   575
        {
hgs
parents: 51
diff changeset
   576
        if (d.iState == ERunning && d.sampleRunning == 0)
hgs
parents: 51
diff changeset
   577
            {
hgs
parents: 51
diff changeset
   578
            // start timer again
hgs
parents: 51
diff changeset
   579
            d.iTimer.Again(d.iPeriod);
hgs
parents: 51
diff changeset
   580
            d.sampleRunning++;
hgs
parents: 51
diff changeset
   581
hgs
parents: 51
diff changeset
   582
#ifdef __SMP__      
hgs
parents: 51
diff changeset
   583
            // print out the sample tick
hgs
parents: 51
diff changeset
   584
            if(d.gppSampler.GetExportData()->sampleNumber% 1000 == 0) 
hgs
parents: 51
diff changeset
   585
                {
hgs
parents: 51
diff changeset
   586
                Kern::Printf(("PIPROF SAMPLE TICK, #%d"), d.gppSampler.GetExportData()->sampleNumber);
hgs
parents: 51
diff changeset
   587
                }
hgs
parents: 51
diff changeset
   588
            
hgs
parents: 51
diff changeset
   589
            // call the actual CPU sampling function for CPU 0 (in NaviEngine), later may be on any of the CPUs
hgs
parents: 51
diff changeset
   590
            Sample(aPtr);
hgs
parents: 51
diff changeset
   591
            
hgs
parents: 51
diff changeset
   592
            /* 
hgs
parents: 51
diff changeset
   593
            This is the master sampler from the watchdog timer, so 
hgs
parents: 51
diff changeset
   594
            send interrupts to the other CPU(s)
hgs
parents: 51
diff changeset
   595
            */
hgs
parents: 51
diff changeset
   596
            TScheduler *theSched = TScheduler::Ptr();
hgs
parents: 51
diff changeset
   597
//            GicDistributor* gicDist = (GicDistributor* )theSched->i_GicDistAddr;
hgs
parents: 51
diff changeset
   598
            GicDistributor* gicDist = (GicDistributor* )(theSched->iSX.iGicDistAddr);
hgs
parents: 51
diff changeset
   599
            
hgs
parents: 51
diff changeset
   600
            // post-sampling for NTimer interrupted CPU
hgs
parents: 51
diff changeset
   601
            //d.postSampleNeeded += d.iSamplers[currCpu]->PostSampleNeeded();
hgs
parents: 51
diff changeset
   602
            
hgs
parents: 51
diff changeset
   603
            if (d.iPlatform == EBridge)
hgs
parents: 51
diff changeset
   604
                {
hgs
parents: 51
diff changeset
   605
                /* The Interrupt ID is hardcoded for Bridge to be 108/117, using SPI on ARM GIC
hgs
parents: 51
diff changeset
   606
                 * Programming the GIC Distributor Set-Pending Register to raise an interrupt
hgs
parents: 51
diff changeset
   607
                 * Programming the GIC Distributor Target Register to set an interrupt in CPU 1
hgs
parents: 51
diff changeset
   608
                 */
hgs
parents: 51
diff changeset
   609
            
hgs
parents: 51
diff changeset
   610
                /* Interrupt Processor Targets Registers (ICDIPTRn)
hgs
parents: 51
diff changeset
   611
                 * target register  ICDIPTR number, M, is given by M = N DIV 4
hgs
parents: 51
diff changeset
   612
                 * so M is 27 for N = 108/117
hgs
parents: 51
diff changeset
   613
                 * NTimer interrupt is always defaulted to CPU 0 so we have to interrupt CPU 1
hgs
parents: 51
diff changeset
   614
                 * setting 0bxxxxxx1x CPU interface 1
hgs
parents: 51
diff changeset
   615
                 */
hgs
parents: 51
diff changeset
   616
//                gicDist->iTarget[27] |= 0x00000002; 
hgs
parents: 51
diff changeset
   617
//                gicDist->iTarget[27] &= 0xFE;
hgs
parents: 51
diff changeset
   618
                gicDist->iTarget[29] |= 0x00000200; 
hgs
parents: 51
diff changeset
   619
                gicDist->iTarget[29] &= 0xFFFFFEFF;
20
hgs
parents:
diff changeset
   620
62
hgs
parents: 51
diff changeset
   621
                /* Interrupt Set-Pending Registers (ICDISPRn) 
hgs
parents: 51
diff changeset
   622
                 * the corresponding ICDISPR number, M, is given by M = N DIV 32
hgs
parents: 51
diff changeset
   623
                 * M = 3 for N being 108/117
hgs
parents: 51
diff changeset
   624
                 * the bit number of the required Set-pending bit in this register is N MOD 32
hgs
parents: 51
diff changeset
   625
                 * which in this case is 12
hgs
parents: 51
diff changeset
   626
                 */ 
hgs
parents: 51
diff changeset
   627
//                gicDist->iPendingSet[3] = 1<<((12));  // N = 108
hgs
parents: 51
diff changeset
   628
                gicDist->iPendingSet[3] = 1<<((21));    // N = 117
hgs
parents: 51
diff changeset
   629
hgs
parents: 51
diff changeset
   630
                arm_dsb();
hgs
parents: 51
diff changeset
   631
                
hgs
parents: 51
diff changeset
   632
                }
hgs
parents: 51
diff changeset
   633
            else if (d.iPlatform == ENaviengine) //naviengine platform
hgs
parents: 51
diff changeset
   634
                {
hgs
parents: 51
diff changeset
   635
                for( TInt nCpu(0); nCpu < NKern::NumberOfCpus(); nCpu++ )
hgs
parents: 51
diff changeset
   636
                    {
hgs
parents: 51
diff changeset
   637
                    if( nCpu != currCpu )
hgs
parents: 51
diff changeset
   638
                        {
hgs
parents: 51
diff changeset
   639
                        //Kern::Printf(("DProfile::TimerSampleIsr() > iSoftIrq: to cpu%d, 0x%08X"), nCpu, ( 0x10000 << nCpu ) | (d.iIntNo + nCpu));
hgs
parents: 51
diff changeset
   640
                        gicDist->iSoftIrq = ( 0x10000 << nCpu ) | (d.iIntNo + nCpu);
hgs
parents: 51
diff changeset
   641
                        }
hgs
parents: 51
diff changeset
   642
                    // post-sampling for CPUs with specifically generated interrupts
hgs
parents: 51
diff changeset
   643
                    //d.postSampleNeeded += d.iSamplers[nCpu]->PostSampleNeeded();
hgs
parents: 51
diff changeset
   644
                    }
hgs
parents: 51
diff changeset
   645
                arm_dsb();
hgs
parents: 51
diff changeset
   646
               
hgs
parents: 51
diff changeset
   647
                }
hgs
parents: 51
diff changeset
   648
            else
hgs
parents: 51
diff changeset
   649
                {
hgs
parents: 51
diff changeset
   650
                Kern::Printf("DGeneralsDriver::NewDoProfilerProfile - SMP Platform not recognised " ); 
hgs
parents: 51
diff changeset
   651
                }
hgs
parents: 51
diff changeset
   652
hgs
parents: 51
diff changeset
   653
#endif  
hgs
parents: 51
diff changeset
   654
            // then sample the rest of non-cpu samplers
hgs
parents: 51
diff changeset
   655
            for(TInt i(0);i<KSamplerAmount;i++)
hgs
parents: 51
diff changeset
   656
                {
hgs
parents: 51
diff changeset
   657
                if(d.iSamplers[i]->iEnabled)
hgs
parents: 51
diff changeset
   658
                    {
hgs
parents: 51
diff changeset
   659
                    d.iSamplers[i]->Sample(aPtr);
hgs
parents: 51
diff changeset
   660
                    if(d.iSamplers[i]->PostSampleNeeded())
hgs
parents: 51
diff changeset
   661
                        {
hgs
parents: 51
diff changeset
   662
                        d.IncrementSampleNeededState(i);
hgs
parents: 51
diff changeset
   663
                        }
hgs
parents: 51
diff changeset
   664
                    }
hgs
parents: 51
diff changeset
   665
                }
hgs
parents: 51
diff changeset
   666
hgs
parents: 51
diff changeset
   667
//            // check if post sampling is needed for samplers
hgs
parents: 51
diff changeset
   668
//            for(TInt i(0);i<KSamplerAmount;i++)
hgs
parents: 51
diff changeset
   669
//                {
hgs
parents: 51
diff changeset
   670
//                if(d.iSamplers[i]->iEnabled)
hgs
parents: 51
diff changeset
   671
//                    {
hgs
parents: 51
diff changeset
   672
//                    if(d.iSamplers[i]->PostSampleNeeded())
hgs
parents: 51
diff changeset
   673
//                        {
hgs
parents: 51
diff changeset
   674
//                        d.IncrementSampleNeededState(i);
hgs
parents: 51
diff changeset
   675
//                        }
hgs
parents: 51
diff changeset
   676
//                    }
hgs
parents: 51
diff changeset
   677
//                }
hgs
parents: 51
diff changeset
   678
hgs
parents: 51
diff changeset
   679
            if(d.postSampleNeeded > 0 && d.doingDfc == 0)
hgs
parents: 51
diff changeset
   680
            //if(d.postSampleNeeded > 0)
hgs
parents: 51
diff changeset
   681
                {
hgs
parents: 51
diff changeset
   682
                LOGSTRING2("DGeneralsDriver::NewDoProfilerProfile - postSampleNeeded count %d ", d.postSampleNeeded );
hgs
parents: 51
diff changeset
   683
                d.doingDfc++;
hgs
parents: 51
diff changeset
   684
                d.iNewDfc.Add();
20
hgs
parents:
diff changeset
   685
        
62
hgs
parents: 51
diff changeset
   686
                d.sampleRunning--;
20
hgs
parents:
diff changeset
   687
        
62
hgs
parents: 51
diff changeset
   688
                return;
hgs
parents: 51
diff changeset
   689
                }
hgs
parents: 51
diff changeset
   690
            d.sampleRunning--;
hgs
parents: 51
diff changeset
   691
            }   // if (d.iState == ERunning && d.sampleRunning == 0)
hgs
parents: 51
diff changeset
   692
        else if (d.iState == EStopping && d.sampleRunning == 0)
20
hgs
parents:
diff changeset
   693
            {
62
hgs
parents: 51
diff changeset
   694
            // add a dfc for this final time
hgs
parents: 51
diff changeset
   695
            d.iNewDfc.Add();
hgs
parents: 51
diff changeset
   696
            LOGSTRING("DGeneralsDriver::NewDoProfilerProfile - sampling added to dfc queue");
20
hgs
parents:
diff changeset
   697
            }
62
hgs
parents: 51
diff changeset
   698
        else
20
hgs
parents:
diff changeset
   699
            {
62
hgs
parents: 51
diff changeset
   700
            // the previous sample has not finished,
hgs
parents: 51
diff changeset
   701
            Kern::Printf("DGeneralsDriver::NewDoProfilerProfile - Profiler Sampler Error - interrupted before finished sampling!!");
20
hgs
parents:
diff changeset
   702
            }
62
hgs
parents: 51
diff changeset
   703
        LOGSTRING("DGeneralsDriver::NewDoProfilerProfile - exit");
hgs
parents: 51
diff changeset
   704
        } // iOff
hgs
parents: 51
diff changeset
   705
    else
hgs
parents: 51
diff changeset
   706
        {
hgs
parents: 51
diff changeset
   707
        Kern::Printf("DGeneralsDriver::iOff");
20
hgs
parents:
diff changeset
   708
        }
62
hgs
parents: 51
diff changeset
   709
}
20
hgs
parents:
diff changeset
   710
hgs
parents:
diff changeset
   711
hgs
parents:
diff changeset
   712
void DGeneralsDriver::Sample(TAny* aPtr)
hgs
parents:
diff changeset
   713
    {
hgs
parents:
diff changeset
   714
    LOGSTRING("DGeneralsDriver::Sample - entry");
hgs
parents:
diff changeset
   715
hgs
parents:
diff changeset
   716
#ifdef __SMP__
hgs
parents:
diff changeset
   717
    DGeneralsDriver& d=*(DGeneralsDriver*)aPtr;
hgs
parents:
diff changeset
   718
62
hgs
parents: 51
diff changeset
   719
    TInt currCpu(NKern::CurrentCpu());
hgs
parents: 51
diff changeset
   720
    ++d.iInterruptCounter[currCpu];
20
hgs
parents:
diff changeset
   721
62
hgs
parents: 51
diff changeset
   722
    d.iSamplers[currCpu]->Sample(aPtr);
20
hgs
parents:
diff changeset
   723
#endif
hgs
parents:
diff changeset
   724
    LOGSTRING("DGeneralsDriver::Sample - exit");
hgs
parents:
diff changeset
   725
    }
62
hgs
parents: 51
diff changeset
   726
20
hgs
parents:
diff changeset
   727
/*
hgs
parents:
diff changeset
   728
 *	This function is run when any of the samplers
hgs
parents:
diff changeset
   729
 *	requires post sampling
hgs
parents:
diff changeset
   730
 */
hgs
parents:
diff changeset
   731
void DGeneralsDriver::NewDoDfc(TAny* pointer)
hgs
parents:
diff changeset
   732
    {
hgs
parents:
diff changeset
   733
	DGeneralsDriver& d(*((DGeneralsDriver*)pointer));
hgs
parents:
diff changeset
   734
	
hgs
parents:
diff changeset
   735
	if(d.iState == ERunning)
hgs
parents:
diff changeset
   736
	    {
hgs
parents:
diff changeset
   737
		// for all enabled samplers, perform
hgs
parents:
diff changeset
   738
		// post sample if needed
hgs
parents:
diff changeset
   739
		for(TInt i(0);i<KSamplerAmount;i++)
hgs
parents:
diff changeset
   740
		    {
hgs
parents:
diff changeset
   741
			if(d.iSamplers[i]->iEnabled)
hgs
parents:
diff changeset
   742
			    {
hgs
parents:
diff changeset
   743
				if(d.iSamplers[i]->PostSampleNeeded())
hgs
parents:
diff changeset
   744
				    {
62
hgs
parents: 51
diff changeset
   745
                    LOGSTRING3("DGeneralsDriver::NewDoDfc iSamplers[%d] PostSampleNeeded count %d", i, d.postSampleNeeded);
hgs
parents: 51
diff changeset
   746
                    d.iSamplers[i]->PostSample();
hgs
parents: 51
diff changeset
   747
                    d.DecrementSampleNeededState();
hgs
parents: 51
diff changeset
   748
                    LOGSTRING3("DGeneralsDriver::NewDoDfc iSamplers[%d] PostSampleNeeded count %d", i, d.postSampleNeeded);
20
hgs
parents:
diff changeset
   749
                    }
hgs
parents:
diff changeset
   750
                }
hgs
parents:
diff changeset
   751
            }
hgs
parents:
diff changeset
   752
		d.doingDfc--;
hgs
parents:
diff changeset
   753
        }
hgs
parents:
diff changeset
   754
hgs
parents:
diff changeset
   755
	else if(d.iState == EStopping)
hgs
parents:
diff changeset
   756
	    {
62
hgs
parents: 51
diff changeset
   757
        LOGSTRING("DGeneralsDriver::NewDoDfc state Stopping()");
20
hgs
parents:
diff changeset
   758
		// for all enabled samplers,
hgs
parents:
diff changeset
   759
		// perform end sampling
hgs
parents:
diff changeset
   760
		TBool releaseBuffer(false);
hgs
parents:
diff changeset
   761
		for(TInt i(0);i<KSamplerAmount;i++)
hgs
parents:
diff changeset
   762
		    {
hgs
parents:
diff changeset
   763
			if(d.iSamplers[i]->iEnabled)
hgs
parents:
diff changeset
   764
			    {
62
hgs
parents: 51
diff changeset
   765
                LOGSTRING("DGeneralsDriver::NewDoDfc() - ending");
hgs
parents: 51
diff changeset
   766
                if(d.iSamplers[i]->PostSampleNeeded())
hgs
parents: 51
diff changeset
   767
                    {
hgs
parents: 51
diff changeset
   768
                    LOGSTRING2("DGeneralsDriver::NewDoDfc iSamplers[%d] PostSampleNeeded still", i);
hgs
parents: 51
diff changeset
   769
                    d.iSamplers[i]->PostSample();
hgs
parents: 51
diff changeset
   770
                    }
20
hgs
parents:
diff changeset
   771
				// perform end sampling for all samplers
hgs
parents:
diff changeset
   772
				// stream mode samplers may be pending, if they
hgs
parents:
diff changeset
   773
				// are still waiting for another client buffer
hgs
parents:
diff changeset
   774
				if(d.iSamplers[i]->EndSampling() == KErrNotReady) 
hgs
parents:
diff changeset
   775
				    {
62
hgs
parents: 51
diff changeset
   776
                    LOGSTRING("DGeneralsDriver::NewDoDfc() - stream data pending");
20
hgs
parents:
diff changeset
   777
					releaseBuffer = true;
hgs
parents:
diff changeset
   778
                    }
hgs
parents:
diff changeset
   779
				else 
hgs
parents:
diff changeset
   780
				    {
62
hgs
parents: 51
diff changeset
   781
                    LOGSTRING("DGeneralsDriver::NewDoDfc() - no data pending");
20
hgs
parents:
diff changeset
   782
					releaseBuffer = true;
hgs
parents:
diff changeset
   783
                    }		
hgs
parents:
diff changeset
   784
                }
hgs
parents:
diff changeset
   785
            }
hgs
parents:
diff changeset
   786
hgs
parents:
diff changeset
   787
		// At the end, once all the samplers are gone through, the buffer should be released
hgs
parents:
diff changeset
   788
		if (true == releaseBuffer) 
hgs
parents:
diff changeset
   789
		    {
62
hgs
parents: 51
diff changeset
   790
            LOGSTRING("DGeneralsDriver::NewDoDfc() - release the buffer");
20
hgs
parents:
diff changeset
   791
			d.iSampleStream.ReleaseIfPending();	
hgs
parents:
diff changeset
   792
            }
hgs
parents:
diff changeset
   793
		
hgs
parents:
diff changeset
   794
		d.iState = EStopped;
hgs
parents:
diff changeset
   795
		if(d.iEndRequestStatus != 0 && d.iClient != 0)
hgs
parents:
diff changeset
   796
		    {
hgs
parents:
diff changeset
   797
			// sampling has ended
hgs
parents:
diff changeset
   798
			Kern::RequestComplete(d.iClient,d.iEndRequestStatus,KErrNone);
62
hgs
parents: 51
diff changeset
   799
			LOGSTRING("DGeneralsDriver::NewDoDfc() - request complete, stopped");
20
hgs
parents:
diff changeset
   800
            }
hgs
parents:
diff changeset
   801
        }
hgs
parents:
diff changeset
   802
    }
hgs
parents:
diff changeset
   803
hgs
parents:
diff changeset
   804
hgs
parents:
diff changeset
   805
/*
hgs
parents:
diff changeset
   806
 *	All controls are handled here
hgs
parents:
diff changeset
   807
 */
hgs
parents:
diff changeset
   808
 
hgs
parents:
diff changeset
   809
void DGeneralsDriver::HandleMsg(TMessageBase* aMsg)
hgs
parents:
diff changeset
   810
    {
hgs
parents:
diff changeset
   811
	TInt r(KErrNone);
hgs
parents:
diff changeset
   812
	TThreadMessage& m(*(TThreadMessage*)aMsg);
hgs
parents:
diff changeset
   813
hgs
parents:
diff changeset
   814
	LOGSTRING5("DGeneralsDriver::HandleMsg 0x%x 0x%x 0x%x 0x%x",m.Int0(),m.Int1(),m.Int2(),m.Int3());
hgs
parents:
diff changeset
   815
	
hgs
parents:
diff changeset
   816
	if(m.iValue == (TInt)ECloseMsg)
hgs
parents:
diff changeset
   817
	    {
hgs
parents:
diff changeset
   818
		LOGSTRING("DGeneralsDriver::HandleMsg - received close message");
hgs
parents:
diff changeset
   819
		iTimer.Cancel();
hgs
parents:
diff changeset
   820
		iNewDfc.Cancel();
hgs
parents:
diff changeset
   821
hgs
parents:
diff changeset
   822
		m.Complete(KErrNone,EFalse);
hgs
parents:
diff changeset
   823
		iMsgQ.CompleteAll(KErrServerTerminated);
hgs
parents:
diff changeset
   824
		LOGSTRING("DGeneralsDriver::HandleMsg - cleaned up the driver!");
hgs
parents:
diff changeset
   825
		return;
hgs
parents:
diff changeset
   826
        }
hgs
parents:
diff changeset
   827
hgs
parents:
diff changeset
   828
	if (m.Client()!=iClient)
hgs
parents:
diff changeset
   829
	    {
hgs
parents:
diff changeset
   830
		LOGSTRING("DGeneralsDriver::HandleMsg - ERROR, wrong client");
hgs
parents:
diff changeset
   831
		m.PanicClient(_L("GENERALSSAMPLER"),EAccessDenied);
hgs
parents:
diff changeset
   832
		return;
hgs
parents:
diff changeset
   833
        }
hgs
parents:
diff changeset
   834
hgs
parents:
diff changeset
   835
	TInt id(m.iValue);
hgs
parents:
diff changeset
   836
	switch(id)
hgs
parents:
diff changeset
   837
	    {
hgs
parents:
diff changeset
   838
		 //Controls are handled here
hgs
parents:
diff changeset
   839
		case RPluginSampler::EMarkTraceActive:
hgs
parents:
diff changeset
   840
			LOGSTRING("DGeneralsDriver::HandleMsg - EMarkTraceActive");
hgs
parents:
diff changeset
   841
			r = MarkTraceActive((TInt)m.Int0());
hgs
parents:
diff changeset
   842
			break;
hgs
parents:
diff changeset
   843
hgs
parents:
diff changeset
   844
		case RPluginSampler::EOutputSettingsForTrace:
hgs
parents:
diff changeset
   845
			LOGSTRING("DGeneralsDriver::HandleMsg - EOutputSettingsForTrace");
hgs
parents:
diff changeset
   846
			r = OutputSettingsForTrace((TInt)m.Int0(),(TInt)m.Int1());
hgs
parents:
diff changeset
   847
			break;
hgs
parents:
diff changeset
   848
hgs
parents:
diff changeset
   849
		case RPluginSampler::EAdditionalTraceSettings:
hgs
parents:
diff changeset
   850
			LOGSTRING("DGeneralsDriver::HandleMsg - EAdditionalTraceSettings");
hgs
parents:
diff changeset
   851
			r = AdditionalTraceSettings((TInt)m.Int0(),(TInt)m.Int1());
hgs
parents:
diff changeset
   852
			break;
hgs
parents:
diff changeset
   853
hgs
parents:
diff changeset
   854
		case RPluginSampler::EAdditionalTraceSettings2:
hgs
parents:
diff changeset
   855
			LOGSTRING("DGeneralsDriver::HandleMsg - EAdditionalTraceSettings2");
hgs
parents:
diff changeset
   856
			r = AdditionalTraceSettings2((TInt)m.Int0(),(TInt)m.Int1());
hgs
parents:
diff changeset
   857
			break;
hgs
parents:
diff changeset
   858
			
hgs
parents:
diff changeset
   859
		case RPluginSampler::ESetSamplingPeriod:
hgs
parents:
diff changeset
   860
		    LOGSTRING2("DGeneralsDriver::HandleMsg - ESetSamplingPeriod %d", (TInt)m.Int1());
hgs
parents:
diff changeset
   861
			r = SetSamplingPeriod((TInt)m.Int0(),(TInt)m.Int1());
hgs
parents:
diff changeset
   862
			break;
hgs
parents:
diff changeset
   863
			
hgs
parents:
diff changeset
   864
		case RPluginSampler::EMarkTraceInactive:
hgs
parents:
diff changeset
   865
			LOGSTRING("DGeneralsDriver::HandleMsg - EMarkTraceInactive");
hgs
parents:
diff changeset
   866
			r = MarkTraceInactive((TInt)m.Int0());
hgs
parents:
diff changeset
   867
			break;
hgs
parents:
diff changeset
   868
hgs
parents:
diff changeset
   869
		case RPluginSampler::ESample:
hgs
parents:
diff changeset
   870
			LOGSTRING("DGeneralsDriver::HandleMsg - ESample");
hgs
parents:
diff changeset
   871
			//r = Sample();  // hack. Original implementation of sample just returned 0
hgs
parents:
diff changeset
   872
			r = 0;
hgs
parents:
diff changeset
   873
			break;
hgs
parents:
diff changeset
   874
hgs
parents:
diff changeset
   875
		case RPluginSampler::EStartSampling:
62
hgs
parents: 51
diff changeset
   876
		    LOGSTRING("DGeneralsDriver::HandleMsg - EStartSampling");
hgs
parents: 51
diff changeset
   877
			iStarted = (TUint8)ETrue;
hgs
parents: 51
diff changeset
   878
			r=StartSampling(m.Int0(),m.Int1());
hgs
parents: 51
diff changeset
   879
			//r = StartSampling();
20
hgs
parents:
diff changeset
   880
			break;
hgs
parents:
diff changeset
   881
hgs
parents:
diff changeset
   882
		case RPluginSampler::EGetSampleTime:
hgs
parents:
diff changeset
   883
			LOGSTRING("DGeneralsDriver::HandleMsg - EGetSampleTime");
hgs
parents:
diff changeset
   884
			r = GetSampleTime(reinterpret_cast<TUint32*>(m.Ptr0()));
hgs
parents:
diff changeset
   885
			break;
hgs
parents:
diff changeset
   886
hgs
parents:
diff changeset
   887
		case RPluginSampler::EGetSamplerVersion:
hgs
parents:
diff changeset
   888
			LOGSTRING("DGeneralsDriver::HandleMsg - EGetSamplerVersion");
hgs
parents:
diff changeset
   889
			r = GetSamplerVersion(reinterpret_cast<TDes*>(m.Ptr0()));
hgs
parents:
diff changeset
   890
			break;
hgs
parents:
diff changeset
   891
		
hgs
parents:
diff changeset
   892
		case RPluginSampler::ECancelStreamRead:
hgs
parents:
diff changeset
   893
			LOGSTRING("DGeneralsDriver::HandleMsg - ECancelStreamRead");
hgs
parents:
diff changeset
   894
			iStreamReadCancelStatus = reinterpret_cast<TRequestStatus*>(m.Ptr0());
hgs
parents:
diff changeset
   895
			r = ProcessStreamReadCancel();
hgs
parents:
diff changeset
   896
			break;
hgs
parents:
diff changeset
   897
hgs
parents:
diff changeset
   898
hgs
parents:
diff changeset
   899
		 //	Requests are handled here
hgs
parents:
diff changeset
   900
hgs
parents:
diff changeset
   901
		case ~RPluginSampler::EStopAndWaitForEnd:
62
hgs
parents: 51
diff changeset
   902
            LOGSTRING("DGeneralsDriver::HandleMsg - EStopAndWaitForEnd");
20
hgs
parents:
diff changeset
   903
			iEndRequestStatus = reinterpret_cast<TRequestStatus*>(m.Ptr0());
hgs
parents:
diff changeset
   904
			r = StopSampling();
hgs
parents:
diff changeset
   905
#ifdef __SMP__
hgs
parents:
diff changeset
   906
			UnbindInterrupts();
hgs
parents:
diff changeset
   907
#endif
hgs
parents:
diff changeset
   908
			break;
hgs
parents:
diff changeset
   909
hgs
parents:
diff changeset
   910
		case ~RPluginSampler::ERequestFillThisStreamBuffer:
hgs
parents:
diff changeset
   911
			LOGSTRING("DGeneralsDriver::HandleMsg - ERequestFillThisStreamBuffer");			
hgs
parents:
diff changeset
   912
			r = ProcessStreamReadRequest(	reinterpret_cast<TBapBuf*>(m.Ptr1()),
hgs
parents:
diff changeset
   913
											reinterpret_cast<TRequestStatus*>(m.Ptr0()));
hgs
parents:
diff changeset
   914
			break;
hgs
parents:
diff changeset
   915
hgs
parents:
diff changeset
   916
		default:
62
hgs
parents: 51
diff changeset
   917
			Kern::Printf("DGeneralsDriver::HandleMsg - ERROR, unknown command %d",id);
20
hgs
parents:
diff changeset
   918
			r = KErrNotSupported;
hgs
parents:
diff changeset
   919
			break;
hgs
parents:
diff changeset
   920
        }
hgs
parents:
diff changeset
   921
hgs
parents:
diff changeset
   922
	LOGSTRING("DGeneralsDriver::HandleMsg - Completed");
hgs
parents:
diff changeset
   923
	m.Complete(r,ETrue);
hgs
parents:
diff changeset
   924
    }
hgs
parents:
diff changeset
   925
hgs
parents:
diff changeset
   926
#ifdef __SMP__
hgs
parents:
diff changeset
   927
inline void DGeneralsDriver::UnbindInterrupts()
hgs
parents:
diff changeset
   928
    {
hgs
parents:
diff changeset
   929
    TInt err(0);
62
hgs
parents: 51
diff changeset
   930
        /*
hgs
parents: 51
diff changeset
   931
         * Disable and unbind the sampling interrupts associated with each core. 
hgs
parents: 51
diff changeset
   932
         */
hgs
parents: 51
diff changeset
   933
        TInt noofCpu(NKern::NumberOfCpus());
hgs
parents: 51
diff changeset
   934
        //Disabling Interrupt(s)
hgs
parents: 51
diff changeset
   935
        for( TInt nCpu(0); nCpu < noofCpu; nCpu++ )
hgs
parents: 51
diff changeset
   936
            {
hgs
parents: 51
diff changeset
   937
            err = NKern::InterruptDisable(iIntNo + nCpu - 32);
hgs
parents: 51
diff changeset
   938
            if(err < 0)
hgs
parents: 51
diff changeset
   939
                {
hgs
parents: 51
diff changeset
   940
                Kern::Printf(" Interrupt Disable iIntNo + %d - 32 ret = %d", nCpu, err );
hgs
parents: 51
diff changeset
   941
                }
hgs
parents: 51
diff changeset
   942
            }
hgs
parents: 51
diff changeset
   943
        
hgs
parents: 51
diff changeset
   944
        //UnBinding to the interrupt(s)
hgs
parents: 51
diff changeset
   945
        for( TInt nCpu(0); nCpu < noofCpu; nCpu++ )
hgs
parents: 51
diff changeset
   946
            {
hgs
parents: 51
diff changeset
   947
            LOGSTRING3(" > Interrupt::InterruptUnBind + %d -32 =%d", nCpu, iIntNo + nCpu -32 );
hgs
parents: 51
diff changeset
   948
            err = NKern::InterruptUnbind( (iIntNo + nCpu - 32) );
hgs
parents: 51
diff changeset
   949
            if(err < 0)
hgs
parents: 51
diff changeset
   950
                {
hgs
parents: 51
diff changeset
   951
                Kern::Printf(" InterruptUnBind iIntNo + %d - 32 Error = %d", nCpu, err );
hgs
parents: 51
diff changeset
   952
                }
hgs
parents: 51
diff changeset
   953
            }
20
hgs
parents:
diff changeset
   954
    }
hgs
parents:
diff changeset
   955
#endif
hgs
parents:
diff changeset
   956
hgs
parents:
diff changeset
   957
inline TInt DGeneralsDriver::ProcessStreamReadRequest(TBapBuf* aBuf,TRequestStatus* aStatus)
hgs
parents:
diff changeset
   958
	{
hgs
parents:
diff changeset
   959
	LOGSTRING("DGeneralsDriver::ProcessStreamReadRequest - entry");
hgs
parents:
diff changeset
   960
	
hgs
parents:
diff changeset
   961
	// a new sample buffer has been received from the client
hgs
parents:
diff changeset
   962
	iSampleStream.AddSampleBuffer(aBuf,aStatus);
hgs
parents:
diff changeset
   963
	
hgs
parents:
diff changeset
   964
	// check if we are waiting for the last data to be written to the client
hgs
parents:
diff changeset
   965
	if(iState == EStopped)
hgs
parents:
diff changeset
   966
	    {
hgs
parents:
diff changeset
   967
		LOGSTRING("DGeneralsDriver::ProcessStreamReadRequest state = EStopped");
hgs
parents:
diff changeset
   968
	
hgs
parents:
diff changeset
   969
		// sampling has stopped and stream read cancel is pending
hgs
parents:
diff changeset
   970
		// try to perform the end sampling procedure again
hgs
parents:
diff changeset
   971
		TBool releaseBuffer(false);
hgs
parents:
diff changeset
   972
		for(TInt i(0);i<KSamplerAmount;i++)
hgs
parents:
diff changeset
   973
		    {
hgs
parents:
diff changeset
   974
			// only for all enabled samplers that have stream output mode
hgs
parents:
diff changeset
   975
			if(iSamplers[i]->iEnabled /*&& samplers[i]->outputMode == 2*/)
hgs
parents:
diff changeset
   976
			    {
hgs
parents:
diff changeset
   977
				//TInt pending = 0;
hgs
parents:
diff changeset
   978
				// stream mode samplers may be pending, if they
hgs
parents:
diff changeset
   979
				// are still waiting for another client buffer,
hgs
parents:
diff changeset
   980
				// in that case, the request should be completed already
hgs
parents:
diff changeset
   981
				if(iSamplers[i]->EndSampling() == KErrNotReady) 
hgs
parents:
diff changeset
   982
				    {
62
hgs
parents: 51
diff changeset
   983
                    LOGSTRING("DGeneralsDriver::ProcessStreamReadRequest - still data pending");
hgs
parents: 51
diff changeset
   984
					releaseBuffer = false;
20
hgs
parents:
diff changeset
   985
                    }
hgs
parents:
diff changeset
   986
				else 
hgs
parents:
diff changeset
   987
				    {
62
hgs
parents: 51
diff changeset
   988
                    LOGSTRING("DGeneralsDriver::ProcessStreamReadRequest - no data pending");
20
hgs
parents:
diff changeset
   989
					releaseBuffer = true;
hgs
parents:
diff changeset
   990
                    }
hgs
parents:
diff changeset
   991
                }
hgs
parents:
diff changeset
   992
            }
hgs
parents:
diff changeset
   993
		// At the end, once all the samplers are gone through, the buffer should be released
hgs
parents:
diff changeset
   994
		if (true == releaseBuffer) 
hgs
parents:
diff changeset
   995
		    {
62
hgs
parents: 51
diff changeset
   996
            LOGSTRING("DGeneralsDriver::ProcessStreamReadRequest - all data copied, release the buffer");
20
hgs
parents:
diff changeset
   997
			iSampleStream.ReleaseIfPending();
hgs
parents:
diff changeset
   998
		    }
hgs
parents:
diff changeset
   999
        }
hgs
parents:
diff changeset
  1000
	LOGSTRING("DGeneralsDriver::ProcessStreamReadRequest - exit");
hgs
parents:
diff changeset
  1001
	
hgs
parents:
diff changeset
  1002
	return KErrNone;
hgs
parents:
diff changeset
  1003
	}
hgs
parents:
diff changeset
  1004
hgs
parents:
diff changeset
  1005
hgs
parents:
diff changeset
  1006
/*
hgs
parents:
diff changeset
  1007
 *	Mark traces active or inactive, this can be done
hgs
parents:
diff changeset
  1008
 *	only if sampling is not running
hgs
parents:
diff changeset
  1009
 */
hgs
parents:
diff changeset
  1010
hgs
parents:
diff changeset
  1011
inline TInt DGeneralsDriver::MarkTraceActive(TInt samplerIdToActivate)
hgs
parents:
diff changeset
  1012
	{
hgs
parents:
diff changeset
  1013
	LOGSTRING2("DGeneralsDriver::MarkTraceActive %d",samplerIdToActivate);
hgs
parents:
diff changeset
  1014
hgs
parents:
diff changeset
  1015
	TInt cpus(0);
hgs
parents:
diff changeset
  1016
#ifdef __SMP__
hgs
parents:
diff changeset
  1017
	cpus = NKern::NumberOfCpus();
hgs
parents:
diff changeset
  1018
	if( samplerIdToActivate == PROFILER_GPP_SAMPLER_ID )
hgs
parents:
diff changeset
  1019
	    {
hgs
parents:
diff changeset
  1020
	    for(TInt cpu(0);cpu<cpus;cpu++)
62
hgs
parents: 51
diff changeset
  1021
            {
hgs
parents: 51
diff changeset
  1022
            LOGSTRING2("DGeneralsDriver::MarkTraceActive - activating CPU %d",cpu);
hgs
parents: 51
diff changeset
  1023
            iSamplers[cpu]->SetEnabledFlag(true);
hgs
parents: 51
diff changeset
  1024
            }
20
hgs
parents:
diff changeset
  1025
	    return KErrNone;
hgs
parents:
diff changeset
  1026
	    }
hgs
parents:
diff changeset
  1027
#endif
hgs
parents:
diff changeset
  1028
	for(TInt i(cpus);i<KSamplerAmount;i++)
hgs
parents:
diff changeset
  1029
	    {
hgs
parents:
diff changeset
  1030
		if(iSamplers[i]->iSamplerId == samplerIdToActivate)
hgs
parents:
diff changeset
  1031
		    {
hgs
parents:
diff changeset
  1032
			iSamplers[i]->SetEnabledFlag(true);
hgs
parents:
diff changeset
  1033
			return KErrNone;
hgs
parents:
diff changeset
  1034
            }
hgs
parents:
diff changeset
  1035
        }
hgs
parents:
diff changeset
  1036
62
hgs
parents: 51
diff changeset
  1037
	Kern::Printf("DGeneralsDriver::MarkTraceActive - %d not supported",samplerIdToActivate);
20
hgs
parents:
diff changeset
  1038
	return KErrNotSupported;
hgs
parents:
diff changeset
  1039
	}
hgs
parents:
diff changeset
  1040
hgs
parents:
diff changeset
  1041
inline TInt DGeneralsDriver::MarkTraceInactive(TInt samplerIdToDisable)
hgs
parents:
diff changeset
  1042
	{
hgs
parents:
diff changeset
  1043
	LOGSTRING2("DGeneralsDriver::MarkTraceInactive %d",samplerIdToDisable);
hgs
parents:
diff changeset
  1044
hgs
parents:
diff changeset
  1045
    TInt cpus(0);
hgs
parents:
diff changeset
  1046
#ifdef __SMP__
hgs
parents:
diff changeset
  1047
    cpus = NKern::NumberOfCpus();
hgs
parents:
diff changeset
  1048
    if( samplerIdToDisable == PROFILER_GPP_SAMPLER_ID )
hgs
parents:
diff changeset
  1049
        {
hgs
parents:
diff changeset
  1050
        for(TInt cpu(0);cpu<cpus;cpu++)
hgs
parents:
diff changeset
  1051
             {
hgs
parents:
diff changeset
  1052
             iSamplers[cpu]->SetEnabledFlag(false);
hgs
parents:
diff changeset
  1053
             }
hgs
parents:
diff changeset
  1054
        return KErrNone;
hgs
parents:
diff changeset
  1055
        }
hgs
parents:
diff changeset
  1056
#endif
hgs
parents:
diff changeset
  1057
    for(TInt i(cpus);i<KSamplerAmount;i++)
hgs
parents:
diff changeset
  1058
	    {
hgs
parents:
diff changeset
  1059
		if(iSamplers[i]->iSamplerId == samplerIdToDisable)
hgs
parents:
diff changeset
  1060
		    {
hgs
parents:
diff changeset
  1061
			iSamplers[i]->SetEnabledFlag(false);
hgs
parents:
diff changeset
  1062
			return KErrNone;
hgs
parents:
diff changeset
  1063
            }
hgs
parents:
diff changeset
  1064
        }
hgs
parents:
diff changeset
  1065
62
hgs
parents: 51
diff changeset
  1066
	Kern::Printf("DGeneralsDriver::MarkTraceInactive - %d not supported",samplerIdToDisable);
20
hgs
parents:
diff changeset
  1067
	return KErrNotSupported;
hgs
parents:
diff changeset
  1068
	}
hgs
parents:
diff changeset
  1069
hgs
parents:
diff changeset
  1070
/*
hgs
parents:
diff changeset
  1071
 *	Set output settings for a trace
hgs
parents:
diff changeset
  1072
 */
hgs
parents:
diff changeset
  1073
 
hgs
parents:
diff changeset
  1074
inline TInt DGeneralsDriver::OutputSettingsForTrace(TInt samplerId,TInt settings)
hgs
parents:
diff changeset
  1075
	{
hgs
parents:
diff changeset
  1076
	LOGSTRING3("DGeneralsDriver::OutputSettingsForTrace id:%d set:%d",samplerId,settings);
hgs
parents:
diff changeset
  1077
hgs
parents:
diff changeset
  1078
    TInt cpus(0);
hgs
parents:
diff changeset
  1079
#ifdef __SMP__
hgs
parents:
diff changeset
  1080
    cpus = NKern::NumberOfCpus();
hgs
parents:
diff changeset
  1081
    if( samplerId == PROFILER_GPP_SAMPLER_ID )
hgs
parents:
diff changeset
  1082
        {
hgs
parents:
diff changeset
  1083
        for(TInt cpu(0);cpu<cpus;cpu++)
hgs
parents:
diff changeset
  1084
             {
hgs
parents:
diff changeset
  1085
             iSamplers[cpu]->SetOutputCombination(settings);
hgs
parents:
diff changeset
  1086
             }
hgs
parents:
diff changeset
  1087
        return KErrNone;
hgs
parents:
diff changeset
  1088
        }
hgs
parents:
diff changeset
  1089
#endif
hgs
parents:
diff changeset
  1090
    for(TInt i(cpus);i<KSamplerAmount;i++)
hgs
parents:
diff changeset
  1091
	    {
hgs
parents:
diff changeset
  1092
		if(iSamplers[i]->iSamplerId == samplerId)
hgs
parents:
diff changeset
  1093
		    {
hgs
parents:
diff changeset
  1094
			iSamplers[i]->SetOutputCombination(settings);
hgs
parents:
diff changeset
  1095
			return KErrNone;
hgs
parents:
diff changeset
  1096
		    }
hgs
parents:
diff changeset
  1097
	    }
hgs
parents:
diff changeset
  1098
hgs
parents:
diff changeset
  1099
	return KErrNotSupported;	
hgs
parents:
diff changeset
  1100
	}
hgs
parents:
diff changeset
  1101
hgs
parents:
diff changeset
  1102
/*
hgs
parents:
diff changeset
  1103
 *	Set additional settings for a trace
hgs
parents:
diff changeset
  1104
 */
hgs
parents:
diff changeset
  1105
hgs
parents:
diff changeset
  1106
inline TInt DGeneralsDriver::AdditionalTraceSettings(TInt samplerId,TInt settings)
hgs
parents:
diff changeset
  1107
	{
hgs
parents:
diff changeset
  1108
	LOGSTRING3("DGeneralsDriver::SetAdditionalTraceSettings id:%d set:%d",samplerId,settings);
hgs
parents:
diff changeset
  1109
hgs
parents:
diff changeset
  1110
    TInt cpus(0);
hgs
parents:
diff changeset
  1111
#ifdef __SMP__
hgs
parents:
diff changeset
  1112
    cpus = NKern::NumberOfCpus();
hgs
parents:
diff changeset
  1113
    if( samplerId == PROFILER_GPP_SAMPLER_ID )
hgs
parents:
diff changeset
  1114
        {
hgs
parents:
diff changeset
  1115
        for(TInt cpu(0);cpu<cpus;cpu++)
hgs
parents:
diff changeset
  1116
             {
hgs
parents:
diff changeset
  1117
             iSamplers[cpu]->SetAdditionalSettings(settings);
hgs
parents:
diff changeset
  1118
             }
hgs
parents:
diff changeset
  1119
        return KErrNone;
hgs
parents:
diff changeset
  1120
        }
hgs
parents:
diff changeset
  1121
#endif
hgs
parents:
diff changeset
  1122
    for(TInt i(cpus);i<KSamplerAmount;i++)
hgs
parents:
diff changeset
  1123
	    {
hgs
parents:
diff changeset
  1124
		if(iSamplers[i]->iSamplerId == samplerId)
hgs
parents:
diff changeset
  1125
		    {
hgs
parents:
diff changeset
  1126
			iSamplers[i]->SetAdditionalSettings(settings);
hgs
parents:
diff changeset
  1127
			return KErrNone;
hgs
parents:
diff changeset
  1128
            }
hgs
parents:
diff changeset
  1129
        }
hgs
parents:
diff changeset
  1130
hgs
parents:
diff changeset
  1131
	return KErrNotSupported;	
hgs
parents:
diff changeset
  1132
	}
hgs
parents:
diff changeset
  1133
hgs
parents:
diff changeset
  1134
inline TInt DGeneralsDriver::AdditionalTraceSettings2(TInt samplerId,TInt settings)
hgs
parents:
diff changeset
  1135
	{
hgs
parents:
diff changeset
  1136
	LOGSTRING3("DGeneralsDriver::SetAdditionalTraceSettings id:%d set:%d",samplerId,settings);
hgs
parents:
diff changeset
  1137
hgs
parents:
diff changeset
  1138
    TInt cpus(0);
hgs
parents:
diff changeset
  1139
#ifdef __SMP__
hgs
parents:
diff changeset
  1140
    cpus = NKern::NumberOfCpus();
hgs
parents:
diff changeset
  1141
    if( samplerId == PROFILER_GPP_SAMPLER_ID )
hgs
parents:
diff changeset
  1142
        {
hgs
parents:
diff changeset
  1143
        for(TInt cpu(0);cpu<cpus;cpu++)
hgs
parents:
diff changeset
  1144
             {
hgs
parents:
diff changeset
  1145
             iSamplers[cpu]->SetAdditionalSettings2(settings);
hgs
parents:
diff changeset
  1146
             }
hgs
parents:
diff changeset
  1147
        return KErrNone;
hgs
parents:
diff changeset
  1148
        }
hgs
parents:
diff changeset
  1149
#endif
hgs
parents:
diff changeset
  1150
    for(TInt i(cpus);i<KSamplerAmount;i++)
hgs
parents:
diff changeset
  1151
	    {
hgs
parents:
diff changeset
  1152
		if(iSamplers[i]->iSamplerId == samplerId)
hgs
parents:
diff changeset
  1153
		    {
hgs
parents:
diff changeset
  1154
			iSamplers[i]->SetAdditionalSettings2(settings);
hgs
parents:
diff changeset
  1155
			return KErrNone;
hgs
parents:
diff changeset
  1156
		    }
hgs
parents:
diff changeset
  1157
        }
hgs
parents:
diff changeset
  1158
hgs
parents:
diff changeset
  1159
	return KErrNotSupported;	
hgs
parents:
diff changeset
  1160
	}
hgs
parents:
diff changeset
  1161
hgs
parents:
diff changeset
  1162
inline TInt DGeneralsDriver::SetSamplingPeriod(TInt samplerId,TInt settings)
hgs
parents:
diff changeset
  1163
	{
hgs
parents:
diff changeset
  1164
	LOGSTRING2("DGeneralsDriver::SetSamplingPeriod - set:%d",settings);
hgs
parents:
diff changeset
  1165
hgs
parents:
diff changeset
  1166
	TInt cpus(0);
hgs
parents:
diff changeset
  1167
#ifdef __SMP__
hgs
parents:
diff changeset
  1168
    cpus = NKern::NumberOfCpus();
hgs
parents:
diff changeset
  1169
    if( samplerId == PROFILER_GPP_SAMPLER_ID )
hgs
parents:
diff changeset
  1170
        {
hgs
parents:
diff changeset
  1171
        for(TInt cpu(0);cpu<cpus;cpu++)
hgs
parents:
diff changeset
  1172
             {
hgs
parents:
diff changeset
  1173
             iSamplers[cpu]->SetSamplingPeriod(settings);
hgs
parents:
diff changeset
  1174
             }
hgs
parents:
diff changeset
  1175
        return KErrNone;
hgs
parents:
diff changeset
  1176
        }
hgs
parents:
diff changeset
  1177
#endif
hgs
parents:
diff changeset
  1178
    for(TInt i(cpus);i<KSamplerAmount;i++)
hgs
parents:
diff changeset
  1179
	    {
hgs
parents:
diff changeset
  1180
		if(iSamplers[i]->iSamplerId == samplerId)
hgs
parents:
diff changeset
  1181
		    {
hgs
parents:
diff changeset
  1182
			iSamplers[i]->SetSamplingPeriod(settings);
hgs
parents:
diff changeset
  1183
			return KErrNone;
hgs
parents:
diff changeset
  1184
		    }
hgs
parents:
diff changeset
  1185
	    }
hgs
parents:
diff changeset
  1186
hgs
parents:
diff changeset
  1187
	return KErrNotSupported;	
hgs
parents:
diff changeset
  1188
	}
hgs
parents:
diff changeset
  1189
hgs
parents:
diff changeset
  1190
/*
hgs
parents:
diff changeset
  1191
 *	Mark traces active or inactive, this can be done
hgs
parents:
diff changeset
  1192
 *	only if sampling is not running
hgs
parents:
diff changeset
  1193
 */
hgs
parents:
diff changeset
  1194
 
62
hgs
parents: 51
diff changeset
  1195
TInt DGeneralsDriver::StartSampling(TInt aRate, TInt aInterruptNumber)
20
hgs
parents:
diff changeset
  1196
	{
hgs
parents:
diff changeset
  1197
	LOGSTRING("DGeneralsDriver::StartSampling");
hgs
parents:
diff changeset
  1198
hgs
parents:
diff changeset
  1199
	if(iState == EStopped)
hgs
parents:
diff changeset
  1200
		{
hgs
parents:
diff changeset
  1201
		// reset iSampleStartTimeProp property value
hgs
parents:
diff changeset
  1202
		iSampleStartTime = NKern::TickCount();	// get the system tick value for sync purposes 
hgs
parents:
diff changeset
  1203
#ifdef __SMP__
62
hgs
parents: 51
diff changeset
  1204
		TInt err;
20
hgs
parents:
diff changeset
  1205
		iStartTime = (iSampleStartTime & 0xfffffff0);
hgs
parents:
diff changeset
  1206
#endif
hgs
parents:
diff changeset
  1207
		TInt r(iSampleStartTimeProp.Set(iSampleStartTime));
hgs
parents:
diff changeset
  1208
		
hgs
parents:
diff changeset
  1209
		Kern::Printf(("PIPROF SAMPLE TICK, #0")); // for remote profiling with Profiler Activator
hgs
parents:
diff changeset
  1210
		
hgs
parents:
diff changeset
  1211
		// reset all enabled samplers
hgs
parents:
diff changeset
  1212
		for(TInt i(0);i<KSamplerAmount;i++)
hgs
parents:
diff changeset
  1213
			{
hgs
parents:
diff changeset
  1214
			if(iSamplers[i]->iEnabled)
hgs
parents:
diff changeset
  1215
				{
hgs
parents:
diff changeset
  1216
				// reset with stream option
hgs
parents:
diff changeset
  1217
#ifndef __SMP__
62
hgs
parents: 51
diff changeset
  1218
				LOGSTRING2(("DGeneralsDriver::StartSampling - stream reset for generals driver, sync offset %d"), 0);
20
hgs
parents:
diff changeset
  1219
				iSamplers[i]->Reset(&iSampleStream, 0);
hgs
parents:
diff changeset
  1220
#else
62
hgs
parents: 51
diff changeset
  1221
				LOGSTRING2(("DGeneralsDriver::StartSampling - stream reset for generals driver, start time %d"), iStartTime);
20
hgs
parents:
diff changeset
  1222
                iSamplers[i]->Reset(&iSampleStream, iStartTime);
hgs
parents:
diff changeset
  1223
#endif
hgs
parents:
diff changeset
  1224
				}
hgs
parents:
diff changeset
  1225
			}
62
hgs
parents: 51
diff changeset
  1226
#ifdef __SMP__
hgs
parents: 51
diff changeset
  1227
		iRate = aRate;
hgs
parents: 51
diff changeset
  1228
		iIntNo = aInterruptNumber;
hgs
parents: 51
diff changeset
  1229
		// use HAL to understand the underlying hardware
hgs
parents: 51
diff changeset
  1230
        // not so elegant but used for two SMP pltaforms Bridge and Naviengine
hgs
parents: 51
diff changeset
  1231
        TVariantInfoV01 info;
hgs
parents: 51
diff changeset
  1232
        TPckg<TVariantInfoV01> infoPckg(info);
hgs
parents: 51
diff changeset
  1233
        err = Kern::HalFunction(EHalGroupVariant, EVariantHalVariantInfo, (TAny*)&infoPckg, NULL);
hgs
parents: 51
diff changeset
  1234
        
hgs
parents: 51
diff changeset
  1235
        if(err != KErrNone)
hgs
parents: 51
diff changeset
  1236
            {
hgs
parents: 51
diff changeset
  1237
            Kern::Printf("Error in reading HAL Entry EVariantHalVariantInfo %r ", err);
hgs
parents: 51
diff changeset
  1238
            }
hgs
parents: 51
diff changeset
  1239
        if (info.iMachineUniqueId.iData[0] == KBridgeMachineUID)
hgs
parents: 51
diff changeset
  1240
            {
hgs
parents: 51
diff changeset
  1241
            iPlatform = EBridge;
hgs
parents: 51
diff changeset
  1242
            LOGSTRING("DGeneralsDriver::StartSampling() - Bridge HW");
hgs
parents: 51
diff changeset
  1243
            }
hgs
parents: 51
diff changeset
  1244
        else if (info.iMachineUniqueId.iData[0] == KNaviengineMachineUID)
hgs
parents: 51
diff changeset
  1245
            {
hgs
parents: 51
diff changeset
  1246
            iPlatform = ENaviengine;
hgs
parents: 51
diff changeset
  1247
            LOGSTRING("DGeneralsDriver::StartSampling() - NaviEngine HW");
hgs
parents: 51
diff changeset
  1248
            }
hgs
parents: 51
diff changeset
  1249
        else
hgs
parents: 51
diff changeset
  1250
            {
hgs
parents: 51
diff changeset
  1251
            Kern::Printf("DGeneralsDriver::StartSampling() - Unknown HW, 0x%x", info.iMachineUniqueId.iData[0]);
hgs
parents: 51
diff changeset
  1252
            }
hgs
parents: 51
diff changeset
  1253
        
hgs
parents: 51
diff changeset
  1254
        //users are restricted to use the default Interrupt Number for Bridge
hgs
parents: 51
diff changeset
  1255
        if ((iPlatform == EBridge) && (aInterruptNumber != KValueZero) && (aInterruptNumber != KBridgeProfilerInterruptId) )
hgs
parents: 51
diff changeset
  1256
            {
hgs
parents: 51
diff changeset
  1257
            Kern::Printf("Invalid Interrupt Number for Bridge used %d interrupt...Please use %d Interrupt Number", iIntNo, KBridgeProfilerInterruptId);
hgs
parents: 51
diff changeset
  1258
            return KErrNotSupported;
hgs
parents: 51
diff changeset
  1259
            }
hgs
parents: 51
diff changeset
  1260
        if (aInterruptNumber == KValueZero)
hgs
parents: 51
diff changeset
  1261
                iIntNo = KDefaultInterruptNumber;
hgs
parents: 51
diff changeset
  1262
            
hgs
parents: 51
diff changeset
  1263
            if (iPlatform == EBridge)   
hgs
parents: 51
diff changeset
  1264
                /* By default for Bridge we are using KBridgeProfilerInterruptId */
hgs
parents: 51
diff changeset
  1265
                iIntNo = KBridgeProfilerInterruptId;
hgs
parents: 51
diff changeset
  1266
#endif		
20
hgs
parents:
diff changeset
  1267
		NewStart(gppSampler.GetPeriod());
hgs
parents:
diff changeset
  1268
		return KErrNone;
hgs
parents:
diff changeset
  1269
		}
hgs
parents:
diff changeset
  1270
	else
hgs
parents:
diff changeset
  1271
		{
hgs
parents:
diff changeset
  1272
		return KErrGeneral;
hgs
parents:
diff changeset
  1273
		}
hgs
parents:
diff changeset
  1274
	}
hgs
parents:
diff changeset
  1275
hgs
parents:
diff changeset
  1276
/*
hgs
parents:
diff changeset
  1277
 *  Mark traces active or inactive, this can be done
hgs
parents:
diff changeset
  1278
 *  only if sampling is not running
hgs
parents:
diff changeset
  1279
 */
hgs
parents:
diff changeset
  1280
 
hgs
parents:
diff changeset
  1281
TInt DGeneralsDriver::StopSampling()
hgs
parents:
diff changeset
  1282
    {
62
hgs
parents: 51
diff changeset
  1283
    LOGSTRING2("DGeneralsDriver::StopSampling - iState %", iState);
hgs
parents: 51
diff changeset
  1284
    TInt noofCpu(NKern::NumberOfCpus());
20
hgs
parents:
diff changeset
  1285
hgs
parents:
diff changeset
  1286
    if(iState == ERunning)
hgs
parents:
diff changeset
  1287
        {
hgs
parents:
diff changeset
  1288
        this->iState = EStopping;
hgs
parents:
diff changeset
  1289
        // reset all enabled samplers
hgs
parents:
diff changeset
  1290
        for(TInt i(0);i<KSamplerAmount;i++)
hgs
parents:
diff changeset
  1291
            {
62
hgs
parents: 51
diff changeset
  1292
            // do the reset only for memory and itt samplers
hgs
parents: 51
diff changeset
  1293
            if(iSamplers[i]->iEnabled && 
hgs
parents: 51
diff changeset
  1294
                    (iSamplers[i]->iSamplerId == PROFILER_ITT_SAMPLER_ID || 
hgs
parents: 51
diff changeset
  1295
                            iSamplers[i]->iSamplerId == PROFILER_MEM_SAMPLER_ID ))
20
hgs
parents:
diff changeset
  1296
                {
hgs
parents:
diff changeset
  1297
                // reset with stream option
62
hgs
parents: 51
diff changeset
  1298
                LOGSTRING(("DGeneralsDriver::StopSampling - stream reset for samplers"));
hgs
parents: 51
diff changeset
  1299
                iSamplers[i]->Reset(&iSampleStream, KStateSamplingEnding);
20
hgs
parents:
diff changeset
  1300
                }
hgs
parents:
diff changeset
  1301
            }
62
hgs
parents: 51
diff changeset
  1302
        LOGSTRING2("\nDGeneralsDriver::StopSampling - Number of times the Timer counter expired on CPU 0 = %d ", iInterruptCounter[0]);
hgs
parents: 51
diff changeset
  1303
        
hgs
parents: 51
diff changeset
  1304
        for(TInt nCpu(1); nCpu < noofCpu; nCpu++)
hgs
parents: 51
diff changeset
  1305
            {
hgs
parents: 51
diff changeset
  1306
            Kern::Printf( "\n Number of times we interrupted CPU[%d] = %d and Number of Missed CPU interrupts = %d", nCpu, iInterruptCounter[nCpu],(iInterruptCounter[0] - iInterruptCounter[nCpu]));  
hgs
parents: 51
diff changeset
  1307
            Kern::Printf( "\n Number of times CPU sampler[0] accessed: %d", gppSampler.GetExportData()->sampleNumber);
hgs
parents: 51
diff changeset
  1308
#ifdef __SMP__
hgs
parents: 51
diff changeset
  1309
            Kern::Printf( "\n Number of times CPU sampler[1] accessed: %d", gppSampler2.GetExportData()->sampleNumber);
hgs
parents: 51
diff changeset
  1310
#endif
hgs
parents: 51
diff changeset
  1311
            }
20
hgs
parents:
diff changeset
  1312
hgs
parents:
diff changeset
  1313
        return KErrNone;
hgs
parents:
diff changeset
  1314
        }
hgs
parents:
diff changeset
  1315
    else
hgs
parents:
diff changeset
  1316
        {
hgs
parents:
diff changeset
  1317
        return KErrGeneral;
hgs
parents:
diff changeset
  1318
        }
hgs
parents:
diff changeset
  1319
    }
hgs
parents:
diff changeset
  1320
62
hgs
parents: 51
diff changeset
  1321
DSamplerPowerHandler::DSamplerPowerHandler(DGeneralsDriver* aChannel)
hgs
parents: 51
diff changeset
  1322
    :   DPowerHandler(KPluginSamplerName), 
hgs
parents: 51
diff changeset
  1323
        iChannel(aChannel)
hgs
parents: 51
diff changeset
  1324
        {
hgs
parents: 51
diff changeset
  1325
        LOGSTRING("DSamplerPowerHandler::DSamplerPowerHandler\n");
hgs
parents: 51
diff changeset
  1326
        }
hgs
parents: 51
diff changeset
  1327
        
hgs
parents: 51
diff changeset
  1328
void DSamplerPowerHandler::PowerUp()
hgs
parents: 51
diff changeset
  1329
    {
hgs
parents: 51
diff changeset
  1330
    LOGSTRING("DSamplerPowerHandler::PowerUp()1\n");
hgs
parents: 51
diff changeset
  1331
    iChannel->iOff = (TUint8)EFalse;
hgs
parents: 51
diff changeset
  1332
    if (iChannel->iStarted)
hgs
parents: 51
diff changeset
  1333
        {
hgs
parents: 51
diff changeset
  1334
        LOGSTRING("DSamplerPowerHandler::PowerUp()2\n");
hgs
parents: 51
diff changeset
  1335
        iChannel->StartSampling(iChannel->iRate, iChannel->iIntNo);
hgs
parents: 51
diff changeset
  1336
        }
hgs
parents: 51
diff changeset
  1337
    PowerUpDone();
hgs
parents: 51
diff changeset
  1338
    }
hgs
parents: 51
diff changeset
  1339
    
hgs
parents: 51
diff changeset
  1340
void DSamplerPowerHandler::PowerDown(TPowerState)
hgs
parents: 51
diff changeset
  1341
    {
hgs
parents: 51
diff changeset
  1342
    LOGSTRING("DSamplerPowerHandler::PowerDown()\n");
hgs
parents: 51
diff changeset
  1343
    iChannel->iOff = (TUint8)ETrue;
hgs
parents: 51
diff changeset
  1344
    //iChannel->iState = EStopped;
hgs
parents: 51
diff changeset
  1345
    iChannel->StopSampling();
hgs
parents: 51
diff changeset
  1346
    PowerDownDone();
hgs
parents: 51
diff changeset
  1347
    }
20
hgs
parents:
diff changeset
  1348