perfsrv/piprofiler/plugins/GeneralsPlugin/src/GeneralsDriver.cpp
author hgs
Mon, 06 Sep 2010 15:00:47 +0300
changeset 51 98307c651589
parent 20 piprofiler/plugins/GeneralsPlugin/src/GeneralsDriver.cpp@a71a3e32a2ae
child 62 1c2bb2fc7c87
permissions -rw-r--r--
201035
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>
hgs
parents:
diff changeset
    26
hgs
parents:
diff changeset
    27
#ifdef __SMP__
hgs
parents:
diff changeset
    28
#include <assp/naviengine/naviengine.h> 
hgs
parents:
diff changeset
    29
#include <nkernsmp/arm/arm_gic.h>
hgs
parents:
diff changeset
    30
#include <nkernsmp/arm/arm_tmr.h>
hgs
parents:
diff changeset
    31
#endif
hgs
parents:
diff changeset
    32
hgs
parents:
diff changeset
    33
#include "GeneralsDriver.h"
hgs
parents:
diff changeset
    34
#include <piprofiler/PluginDriver.h>
hgs
parents:
diff changeset
    35
#include <piprofiler/PluginSampler.h>
hgs
parents:
diff changeset
    36
#include <piprofiler/ProfilerTraces.h>
hgs
parents:
diff changeset
    37
hgs
parents:
diff changeset
    38
#include "GppSamplerImpl.h"
hgs
parents:
diff changeset
    39
#include "GfcSamplerImpl.h"
hgs
parents:
diff changeset
    40
#include "IttSamplerImpl.h"
hgs
parents:
diff changeset
    41
#include "MemSamplerImpl.h"
hgs
parents:
diff changeset
    42
#include "PriSamplerImpl.h"
hgs
parents:
diff changeset
    43
hgs
parents:
diff changeset
    44
hgs
parents:
diff changeset
    45
#ifndef __SMP__
hgs
parents:
diff changeset
    46
extern TUint* IntStackPtr();
hgs
parents:
diff changeset
    47
extern void UsrModLr(TUint32*);
hgs
parents:
diff changeset
    48
#endif
hgs
parents:
diff changeset
    49
// for security check
hgs
parents:
diff changeset
    50
#define KProfilerExeSecurUid 0x2001E5AD
hgs
parents:
diff changeset
    51
static _LIT_SECURITY_POLICY_PASS(KAllowAllPolicy);
hgs
parents:
diff changeset
    52
static _LIT_SECURITY_POLICY_FAIL( KDenyAllPolicy );
hgs
parents:
diff changeset
    53
hgs
parents:
diff changeset
    54
#define SEPARATE_DFC_QUEUE
hgs
parents:
diff changeset
    55
// CONSTANTS
hgs
parents:
diff changeset
    56
hgs
parents:
diff changeset
    57
//_LIT(DProfilerThread,"DProfilerThread");
hgs
parents:
diff changeset
    58
//const TInt KDProfilerThreadPriority = 27;
hgs
parents:
diff changeset
    59
hgs
parents:
diff changeset
    60
#ifdef SEPARATE_DFC_QUEUE
hgs
parents:
diff changeset
    61
const TInt KGeneralsDriverThreadPriority = 24;
hgs
parents:
diff changeset
    62
_LIT(KGeneralsDriverThread, "PIGeneralsDriver");
hgs
parents:
diff changeset
    63
hgs
parents:
diff changeset
    64
#endif
hgs
parents:
diff changeset
    65
hgs
parents:
diff changeset
    66
// global Dfc Que
hgs
parents:
diff changeset
    67
//TDynamicDfcQue* gDfcQ;
hgs
parents:
diff changeset
    68
hgs
parents:
diff changeset
    69
//#ifdef __SMP__
hgs
parents:
diff changeset
    70
//
hgs
parents:
diff changeset
    71
//enum  TNaviEngineAsspInterruptIdExtension
hgs
parents:
diff changeset
    72
//{
hgs
parents:
diff changeset
    73
//    KIntProfilerBase = 99      //  Sampling profiler interrupt base. 
hgs
parents:
diff changeset
    74
//    //  Each CPU is assigned a sampling interrupt from this base
hgs
parents:
diff changeset
    75
//    //  CPU-0's sampling interrupt is KIntIdSamplingBase + 0
hgs
parents:
diff changeset
    76
//    //  CPU-n's sampling interrupt is KIntIdSamplingBase + n
hgs
parents:
diff changeset
    77
//};
hgs
parents:
diff changeset
    78
//#endif
hgs
parents:
diff changeset
    79
hgs
parents:
diff changeset
    80
/*
hgs
parents:
diff changeset
    81
 *
hgs
parents:
diff changeset
    82
 *
hgs
parents:
diff changeset
    83
 *	Class DGfcProfilerFactory definition
hgs
parents:
diff changeset
    84
 *
hgs
parents:
diff changeset
    85
 *
hgs
parents:
diff changeset
    86
 */
hgs
parents:
diff changeset
    87
hgs
parents:
diff changeset
    88
class DGeneralsProfilerFactory : public DLogicalDevice
hgs
parents:
diff changeset
    89
{
hgs
parents:
diff changeset
    90
	public:
hgs
parents:
diff changeset
    91
		DGeneralsProfilerFactory();
hgs
parents:
diff changeset
    92
		~DGeneralsProfilerFactory();
hgs
parents:
diff changeset
    93
hgs
parents:
diff changeset
    94
	public:
hgs
parents:
diff changeset
    95
		virtual TInt Install();
hgs
parents:
diff changeset
    96
		virtual void GetCaps(TDes8& aDes) const;
hgs
parents:
diff changeset
    97
		virtual TInt Create(DLogicalChannelBase*& aChannel);
hgs
parents:
diff changeset
    98
};
hgs
parents:
diff changeset
    99
hgs
parents:
diff changeset
   100
/*
hgs
parents:
diff changeset
   101
 *
hgs
parents:
diff changeset
   102
 *
hgs
parents:
diff changeset
   103
 *	Class DGfcDriver definition
hgs
parents:
diff changeset
   104
 *
hgs
parents:
diff changeset
   105
 *
hgs
parents:
diff changeset
   106
 */
hgs
parents:
diff changeset
   107
class DPluginDriver;
hgs
parents:
diff changeset
   108
hgs
parents:
diff changeset
   109
class DGeneralsDriver : public DPluginDriver
hgs
parents:
diff changeset
   110
{
hgs
parents:
diff changeset
   111
hgs
parents:
diff changeset
   112
public:
hgs
parents:
diff changeset
   113
	DGeneralsDriver();
hgs
parents:
diff changeset
   114
	~DGeneralsDriver();
hgs
parents:
diff changeset
   115
hgs
parents:
diff changeset
   116
private:
hgs
parents:
diff changeset
   117
	TInt					NewStart(TInt aRate);
hgs
parents:
diff changeset
   118
	static void				NewDoProfilerProfile(TAny*);
hgs
parents:
diff changeset
   119
	static void				NewDoDfc(TAny*);
hgs
parents:
diff changeset
   120
	
hgs
parents:
diff changeset
   121
	// called by each core
hgs
parents:
diff changeset
   122
	static void				Sample(TAny*);
hgs
parents:
diff changeset
   123
hgs
parents:
diff changeset
   124
	TInt					GetSampleTime(TUint32* time);
hgs
parents:
diff changeset
   125
	//TInt					Test(TUint32 testCase); 
hgs
parents:
diff changeset
   126
hgs
parents:
diff changeset
   127
	TInt					StartSampling();
hgs
parents:
diff changeset
   128
	TInt                    StopSampling();
hgs
parents:
diff changeset
   129
hgs
parents:
diff changeset
   130
	void					InitialiseSamplerList(); 
hgs
parents:
diff changeset
   131
hgs
parents:
diff changeset
   132
	DProfilerSamplerBase*	GetSamplerForId(TInt samplerId);
hgs
parents:
diff changeset
   133
	TInt					GetSamplerVersion(TDes* aDes);
hgs
parents:
diff changeset
   134
	
hgs
parents:
diff changeset
   135
#ifdef __SMP__
hgs
parents:
diff changeset
   136
	void                    UnbindInterrupts();
hgs
parents:
diff changeset
   137
#endif
hgs
parents:
diff changeset
   138
	TInt					ProcessStreamReadRequest(TBapBuf* aBuf,TRequestStatus* aStatus);
hgs
parents:
diff changeset
   139
hgs
parents:
diff changeset
   140
	TInt					MarkTraceActive(TInt samplerIdToActivate);
hgs
parents:
diff changeset
   141
	TInt					MarkTraceInactive(TInt samplerIdToDisable);
hgs
parents:
diff changeset
   142
	TInt					OutputSettingsForTrace(TInt samplerId,TInt settings);
hgs
parents:
diff changeset
   143
	TInt					AdditionalTraceSettings(TInt samplerId,TInt settings);
hgs
parents:
diff changeset
   144
	TInt					AdditionalTraceSettings2(TInt samplerId,TInt settings);
hgs
parents:
diff changeset
   145
	TInt					SetSamplingPeriod(TInt /*samplerId*/,TInt settings);
hgs
parents:
diff changeset
   146
private:
hgs
parents:
diff changeset
   147
	// create the driver in EKA-2 version
hgs
parents:
diff changeset
   148
	TInt			        DoCreate(TInt aUnit, const TDesC8* anInfo, const TVersion& aVer);
hgs
parents:
diff changeset
   149
hgs
parents:
diff changeset
   150
	// receive commands and control in EKA-2 version
hgs
parents:
diff changeset
   151
	void					HandleMsg(TMessageBase* aMsg);
hgs
parents:
diff changeset
   152
private:
hgs
parents:
diff changeset
   153
	// timer mechanism in EKA-2 version
hgs
parents:
diff changeset
   154
	NTimer						iTimer;
hgs
parents:
diff changeset
   155
	TDfc						iNewDfc;
hgs
parents:
diff changeset
   156
	TInt						iCount;
hgs
parents:
diff changeset
   157
	TInt						iLastPcVal;					
hgs
parents:
diff changeset
   158
	TInt						iPeriod;
hgs
parents:
diff changeset
   159
	
hgs
parents:
diff changeset
   160
	// sync sample number property for synchronizing other samplers
hgs
parents:
diff changeset
   161
	RPropertyRef 				iSampleStartTimeProp;
hgs
parents:
diff changeset
   162
	TInt						iSampleStartTime;
hgs
parents:
diff changeset
   163
	
hgs
parents:
diff changeset
   164
	DProfilerGppSampler<10000> 	gppSampler;
hgs
parents:
diff changeset
   165
#ifdef __SMP__
hgs
parents:
diff changeset
   166
	DProfilerGppSampler<10000>  gppSampler2;
hgs
parents:
diff changeset
   167
    DProfilerGppSampler<10000>  gppSampler3;
hgs
parents:
diff changeset
   168
    DProfilerGppSampler<10000>  gppSampler4;
hgs
parents:
diff changeset
   169
#endif
hgs
parents:
diff changeset
   170
	DProfilerGfcSampler<10000> 	gfcSampler;
hgs
parents:
diff changeset
   171
	DProfilerIttSampler<10000> 	ittSampler;
hgs
parents:
diff changeset
   172
	DProfilerMemSampler<40000> 	memSampler;
hgs
parents:
diff changeset
   173
	DProfilerPriSampler<10000> 	priSampler;
hgs
parents:
diff changeset
   174
#ifdef __SMP__
hgs
parents:
diff changeset
   175
//    DProfilerPriSampler<10000>  priSampler2;
hgs
parents:
diff changeset
   176
//    DProfilerPriSampler<10000>  priSampler3;
hgs
parents:
diff changeset
   177
//    DProfilerPriSampler<10000>  priSampler4;
hgs
parents:
diff changeset
   178
#endif
hgs
parents:
diff changeset
   179
	
hgs
parents:
diff changeset
   180
#ifndef __SMP__
hgs
parents:
diff changeset
   181
	static const TInt			KSamplerAmount = 5;
hgs
parents:
diff changeset
   182
#else
hgs
parents:
diff changeset
   183
    static const TInt           KSamplerAmount = 8;
hgs
parents:
diff changeset
   184
#endif
hgs
parents:
diff changeset
   185
	DProfilerSamplerBase*		iSamplers[KSamplerAmount];
hgs
parents:
diff changeset
   186
    TInt                        iMaxCpus;
hgs
parents:
diff changeset
   187
    TUint32                     iStartTime; 
hgs
parents:
diff changeset
   188
	
hgs
parents:
diff changeset
   189
#ifdef SEPARATE_DFC_QUEUE
hgs
parents:
diff changeset
   190
	TDynamicDfcQue*             iDfcQ;
hgs
parents:
diff changeset
   191
#endif
hgs
parents:
diff changeset
   192
};
hgs
parents:
diff changeset
   193
hgs
parents:
diff changeset
   194
/*
hgs
parents:
diff changeset
   195
 *
hgs
parents:
diff changeset
   196
 *
hgs
parents:
diff changeset
   197
 *	Class DGeneralsProfilerFactory implementation
hgs
parents:
diff changeset
   198
 *
hgs
parents:
diff changeset
   199
 *
hgs
parents:
diff changeset
   200
 */
hgs
parents:
diff changeset
   201
hgs
parents:
diff changeset
   202
DECLARE_STANDARD_LDD()
hgs
parents:
diff changeset
   203
    {
hgs
parents:
diff changeset
   204
	return new DGeneralsProfilerFactory();
hgs
parents:
diff changeset
   205
    }
hgs
parents:
diff changeset
   206
hgs
parents:
diff changeset
   207
TInt DGeneralsProfilerFactory::Create(DLogicalChannelBase*& aChannel)
hgs
parents:
diff changeset
   208
    {
hgs
parents:
diff changeset
   209
	aChannel = new DGeneralsDriver;
hgs
parents:
diff changeset
   210
	return aChannel?KErrNone:KErrNoMemory;
hgs
parents:
diff changeset
   211
    }
hgs
parents:
diff changeset
   212
hgs
parents:
diff changeset
   213
hgs
parents:
diff changeset
   214
DGeneralsProfilerFactory::DGeneralsProfilerFactory()
hgs
parents:
diff changeset
   215
    {
hgs
parents:
diff changeset
   216
	// major, minor, and build version number
hgs
parents:
diff changeset
   217
    iVersion=TVersion(1,0,1);
hgs
parents:
diff changeset
   218
    }
hgs
parents:
diff changeset
   219
hgs
parents:
diff changeset
   220
DGeneralsProfilerFactory::~DGeneralsProfilerFactory()
hgs
parents:
diff changeset
   221
    {
hgs
parents:
diff changeset
   222
//    if (gDfcQ)
hgs
parents:
diff changeset
   223
//        {
hgs
parents:
diff changeset
   224
//        gDfcQ->Destroy();
hgs
parents:
diff changeset
   225
//        }
hgs
parents:
diff changeset
   226
    }
hgs
parents:
diff changeset
   227
hgs
parents:
diff changeset
   228
TInt DGeneralsProfilerFactory::Install()
hgs
parents:
diff changeset
   229
    {
hgs
parents:
diff changeset
   230
    return(SetName(&KPluginSamplerName));
hgs
parents:
diff changeset
   231
    }
hgs
parents:
diff changeset
   232
hgs
parents:
diff changeset
   233
void DGeneralsProfilerFactory::GetCaps(TDes8& aDes) const
hgs
parents:
diff changeset
   234
    {
hgs
parents:
diff changeset
   235
    TCapsSamplerV01 b;
hgs
parents:
diff changeset
   236
    
hgs
parents:
diff changeset
   237
    b.iVersion=TVersion(1,0,1);
hgs
parents:
diff changeset
   238
    
hgs
parents:
diff changeset
   239
    aDes.FillZ(aDes.MaxLength());
hgs
parents:
diff changeset
   240
    aDes.Copy((TUint8*)&b,Min(aDes.MaxLength(),sizeof(b)));
hgs
parents:
diff changeset
   241
    }
hgs
parents:
diff changeset
   242
hgs
parents:
diff changeset
   243
/*
hgs
parents:
diff changeset
   244
 *
hgs
parents:
diff changeset
   245
 *
hgs
parents:
diff changeset
   246
 *	Class DGeneralsDriver implementation
hgs
parents:
diff changeset
   247
 *
hgs
parents:
diff changeset
   248
 *
hgs
parents:
diff changeset
   249
 */
hgs
parents:
diff changeset
   250
 
hgs
parents:
diff changeset
   251
DGeneralsDriver::DGeneralsDriver() :
hgs
parents:
diff changeset
   252
	iTimer(NewDoProfilerProfile,this),
hgs
parents:
diff changeset
   253
	iNewDfc(NewDoDfc,this,NULL,7),
hgs
parents:
diff changeset
   254
#ifdef __SMP__
hgs
parents:
diff changeset
   255
	gppSampler(0),
hgs
parents:
diff changeset
   256
	gppSampler2(1),
hgs
parents:
diff changeset
   257
    gppSampler3(2),
hgs
parents:
diff changeset
   258
    gppSampler4(3),
hgs
parents:
diff changeset
   259
#endif
hgs
parents:
diff changeset
   260
	gfcSampler(gppSampler.GetExportData()),
hgs
parents:
diff changeset
   261
	ittSampler(gppSampler.GetExportData()),
hgs
parents:
diff changeset
   262
	memSampler(gppSampler.GetExportData(), PROFILER_MEM_SAMPLER_ID),
hgs
parents:
diff changeset
   263
	priSampler(gppSampler.GetExportData(), PROFILER_PRI_SAMPLER_ID)
hgs
parents:
diff changeset
   264
#ifdef __SMP__
hgs
parents:
diff changeset
   265
//    ,priSampler2(gppSampler.GetExportData(), PROFILER_PRI_SAMPLER_ID),
hgs
parents:
diff changeset
   266
//    priSampler3(gppSampler.GetExportData(), PROFILER_PRI_SAMPLER_ID),
hgs
parents:
diff changeset
   267
//    priSampler4(gppSampler.GetExportData(), PROFILER_PRI_SAMPLER_ID)
hgs
parents:
diff changeset
   268
#endif
hgs
parents:
diff changeset
   269
    {
hgs
parents:
diff changeset
   270
	LOGSTRING("DGeneralsDriver::DGeneralsDriver()");
hgs
parents:
diff changeset
   271
hgs
parents:
diff changeset
   272
	iState = EStopped;
hgs
parents:
diff changeset
   273
	iEndRequestStatus = 0;
hgs
parents:
diff changeset
   274
	doingDfc = 0;
hgs
parents:
diff changeset
   275
	sampleRunning = 0;
hgs
parents:
diff changeset
   276
	iSyncOffset = 0;
hgs
parents:
diff changeset
   277
	iStartTime = 0;
hgs
parents:
diff changeset
   278
	InitialiseSamplerList();
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
 *	This method has to be changed for each new sampler
hgs
parents:
diff changeset
   284
 *
hgs
parents:
diff changeset
   285
 */ 
hgs
parents:
diff changeset
   286
void DGeneralsDriver::InitialiseSamplerList()
hgs
parents:
diff changeset
   287
	{
hgs
parents:
diff changeset
   288
	// initialize all samplers to zero
hgs
parents:
diff changeset
   289
	for(TInt i(0);i<KSamplerAmount;i++)
hgs
parents:
diff changeset
   290
		{
hgs
parents:
diff changeset
   291
		iSamplers[i] = 0;
hgs
parents:
diff changeset
   292
		}
hgs
parents:
diff changeset
   293
hgs
parents:
diff changeset
   294
	TInt i(0);
hgs
parents:
diff changeset
   295
	iSamplers[i] = &gppSampler;i++;
hgs
parents:
diff changeset
   296
#ifdef __SMP__
hgs
parents:
diff changeset
   297
	iSamplers[i] = &gppSampler2;i++;
hgs
parents:
diff changeset
   298
    iSamplers[i] = &gppSampler3;i++;
hgs
parents:
diff changeset
   299
    iSamplers[i] = &gppSampler4;i++;
hgs
parents:
diff changeset
   300
#endif
hgs
parents:
diff changeset
   301
	iSamplers[i] = &gfcSampler;i++;
hgs
parents:
diff changeset
   302
	iSamplers[i] = &ittSampler;i++;
hgs
parents:
diff changeset
   303
	iSamplers[i] = &memSampler;i++;
hgs
parents:
diff changeset
   304
	iSamplers[i] = &priSampler;i++;
hgs
parents:
diff changeset
   305
	
hgs
parents:
diff changeset
   306
#ifdef __SMP__
hgs
parents:
diff changeset
   307
    // get the number of cpus
hgs
parents:
diff changeset
   308
    iMaxCpus = NKern::NumberOfCpus();
hgs
parents:
diff changeset
   309
#else
hgs
parents:
diff changeset
   310
    iMaxCpus = 0;
hgs
parents:
diff changeset
   311
#endif
hgs
parents:
diff changeset
   312
    
hgs
parents:
diff changeset
   313
	// initialize synchronizing property
hgs
parents:
diff changeset
   314
	LOGSTRING("DGeneralsDriver::InitialiseSamplerList() - initializing property");
hgs
parents:
diff changeset
   315
	TInt r(iSampleStartTimeProp.Attach(KGppPropertyCat, EGppPropertySyncSampleNumber));
hgs
parents:
diff changeset
   316
    if (r!=KErrNone)
hgs
parents:
diff changeset
   317
        {
hgs
parents:
diff changeset
   318
        LOGSTRING2("DGeneralsDriver::InitialiseSamplerList() - error in attaching counter property, error %d", r);
hgs
parents:
diff changeset
   319
        }
hgs
parents:
diff changeset
   320
    LOGSTRING("DGeneralsDriver::InitialiseSamplerList() - defining properties");
hgs
parents:
diff changeset
   321
    r = iSampleStartTimeProp.Define(RProperty::EInt, KAllowAllPolicy, KDenyAllPolicy, 0, NULL);
hgs
parents:
diff changeset
   322
    if (r!=KErrNone)
hgs
parents:
diff changeset
   323
        {
hgs
parents:
diff changeset
   324
        LOGSTRING2("DGeneralsDriver::InitialiseSamplerList() - error in defining counter property, error %d", r);
hgs
parents:
diff changeset
   325
        }	
hgs
parents:
diff changeset
   326
	}
hgs
parents:
diff changeset
   327
hgs
parents:
diff changeset
   328
hgs
parents:
diff changeset
   329
DProfilerSamplerBase* DGeneralsDriver::GetSamplerForId(TInt samplerIdToGet)
hgs
parents:
diff changeset
   330
    {
hgs
parents:
diff changeset
   331
	for(TInt i(0);i<KSamplerAmount;i++)
hgs
parents:
diff changeset
   332
	    {
hgs
parents:
diff changeset
   333
		if(iSamplers[i]->iSamplerId == samplerIdToGet)
hgs
parents:
diff changeset
   334
		    {
hgs
parents:
diff changeset
   335
			return iSamplers[i];
hgs
parents:
diff changeset
   336
		    }
hgs
parents:
diff changeset
   337
	    }
hgs
parents:
diff changeset
   338
	return (DProfilerSamplerBase*)0;
hgs
parents:
diff changeset
   339
    }
hgs
parents:
diff changeset
   340
hgs
parents:
diff changeset
   341
TInt DGeneralsDriver::DoCreate(TInt aUnit, const TDesC8* anInfo, const TVersion& aVer)
hgs
parents:
diff changeset
   342
    {
hgs
parents:
diff changeset
   343
    TUint8 err(KErrNone);
hgs
parents:
diff changeset
   344
    
hgs
parents:
diff changeset
   345
    if (!Kern::QueryVersionSupported(TVersion(1,0,1),aVer))
hgs
parents:
diff changeset
   346
	   	return KErrNotSupported;
hgs
parents:
diff changeset
   347
    
hgs
parents:
diff changeset
   348
    // just for testing 
hgs
parents:
diff changeset
   349
#ifndef __SMP__
hgs
parents:
diff changeset
   350
    LOGTEXT("Initializing the stack pointer");
hgs
parents:
diff changeset
   351
    stackTop=(TUint32*)IntStackPtr();
hgs
parents:
diff changeset
   352
    LOGSTRING2("Got stack pointer 0x%x",(TUint32)stackTop);
hgs
parents:
diff changeset
   353
#endif
hgs
parents:
diff changeset
   354
hgs
parents:
diff changeset
   355
    iClient = &Kern::CurrentThread();
hgs
parents:
diff changeset
   356
    err = iClient->Open();
hgs
parents:
diff changeset
   357
	
hgs
parents:
diff changeset
   358
    DProcess* clientProcess(iClient->iOwningProcess);
hgs
parents:
diff changeset
   359
    if (clientProcess)
hgs
parents:
diff changeset
   360
        {
hgs
parents:
diff changeset
   361
        //Require Power Management and All Files to use this driver
hgs
parents:
diff changeset
   362
        // Not ideal, but better than nothing
hgs
parents:
diff changeset
   363
        if(!Kern::CurrentThreadHasCapability(ECapabilityPowerMgmt,__PLATSEC_DIAGNOSTIC_STRING("Checked by GeneralsDriver.ldd")))
hgs
parents:
diff changeset
   364
            return KErrPermissionDenied;
hgs
parents:
diff changeset
   365
        if(!Kern::CurrentThreadHasCapability(ECapabilityAllFiles,__PLATSEC_DIAGNOSTIC_STRING("Checked by GeneralsDriver.ldd")))
hgs
parents:
diff changeset
   366
            return KErrPermissionDenied;  
hgs
parents:
diff changeset
   367
        
hgs
parents:
diff changeset
   368
        SSecurityInfo secureInfo = clientProcess->iS;
hgs
parents:
diff changeset
   369
        if (secureInfo.iSecureId != KProfilerExeSecurUid)
hgs
parents:
diff changeset
   370
            {
hgs
parents:
diff changeset
   371
            return KErrPermissionDenied;
hgs
parents:
diff changeset
   372
            }
hgs
parents:
diff changeset
   373
        }
hgs
parents:
diff changeset
   374
    
hgs
parents:
diff changeset
   375
    // initiate sample stream ready for collecting the trace data
hgs
parents:
diff changeset
   376
	iSampleStream.InsertCurrentClient(iClient);
hgs
parents:
diff changeset
   377
	
hgs
parents:
diff changeset
   378
	iTimer.Cancel();
hgs
parents:
diff changeset
   379
	iNewDfc.Cancel();
hgs
parents:
diff changeset
   380
hgs
parents:
diff changeset
   381
	Kern::SetThreadPriority(24);
hgs
parents:
diff changeset
   382
hgs
parents:
diff changeset
   383
#ifdef SEPARATE_DFC_QUEUE
hgs
parents:
diff changeset
   384
	err = Kern::DynamicDfcQCreate(iDfcQ, KGeneralsDriverThreadPriority, TBuf8<32>( KGeneralsDriverThread ));
hgs
parents:
diff changeset
   385
	if (KErrNone == err)
hgs
parents:
diff changeset
   386
        {
hgs
parents:
diff changeset
   387
        SetDfcQ(iDfcQ);
hgs
parents:
diff changeset
   388
        iNewDfc.SetDfcQ(iDfcQ);
hgs
parents:
diff changeset
   389
        iMsgQ.Receive();
hgs
parents:
diff changeset
   390
        return err;
hgs
parents:
diff changeset
   391
        }
hgs
parents:
diff changeset
   392
#else
hgs
parents:
diff changeset
   393
	SetDfcQ(Kern::DfcQue0());
hgs
parents:
diff changeset
   394
	iNewDfc.SetDfcQ(iDfcQ);
hgs
parents:
diff changeset
   395
	iMsgQ.Receive();
hgs
parents:
diff changeset
   396
#endif
hgs
parents:
diff changeset
   397
	return err;
hgs
parents:
diff changeset
   398
    }
hgs
parents:
diff changeset
   399
hgs
parents:
diff changeset
   400
DGeneralsDriver::~DGeneralsDriver()
hgs
parents:
diff changeset
   401
    {
hgs
parents:
diff changeset
   402
	if (iState!=EStopped)
hgs
parents:
diff changeset
   403
	    iTimer.Cancel();
hgs
parents:
diff changeset
   404
	iNewDfc.Cancel();
hgs
parents:
diff changeset
   405
	
hgs
parents:
diff changeset
   406
#ifdef SEPARATE_DFC_QUEUE
hgs
parents:
diff changeset
   407
	if(iDfcQ)
hgs
parents:
diff changeset
   408
	    iDfcQ->Destroy();
hgs
parents:
diff changeset
   409
#endif
hgs
parents:
diff changeset
   410
	
hgs
parents:
diff changeset
   411
	iSampleStartTimeProp.Close();
hgs
parents:
diff changeset
   412
	Kern::SafeClose((DObject*&)iClient,NULL);
hgs
parents:
diff changeset
   413
    }
hgs
parents:
diff changeset
   414
hgs
parents:
diff changeset
   415
hgs
parents:
diff changeset
   416
TInt DGeneralsDriver::GetSampleTime(TUint32* time)
hgs
parents:
diff changeset
   417
    {
hgs
parents:
diff changeset
   418
	LOGSTRING("DGeneralsDriver::GetSampleTime - entry");
hgs
parents:
diff changeset
   419
hgs
parents:
diff changeset
   420
	Kern::ThreadRawWrite(	iClient,(TAny*)time, 
hgs
parents:
diff changeset
   421
							(TAny*)&gppSampler.GetExportData()->sampleNumber, 
hgs
parents:
diff changeset
   422
							4, iClient);
hgs
parents:
diff changeset
   423
hgs
parents:
diff changeset
   424
	LOGSTRING("DGeneralsDriver::GetSampleTime - exit");
hgs
parents:
diff changeset
   425
hgs
parents:
diff changeset
   426
	return KErrNone;
hgs
parents:
diff changeset
   427
    }
hgs
parents:
diff changeset
   428
hgs
parents:
diff changeset
   429
hgs
parents:
diff changeset
   430
TInt DGeneralsDriver::GetSamplerVersion(TDes* aDes)
hgs
parents:
diff changeset
   431
    {
hgs
parents:
diff changeset
   432
	LOGSTRING2("DGeneralsDriver::GetSamplerVersion - 0x%x",aDes);
hgs
parents:
diff changeset
   433
	
hgs
parents:
diff changeset
   434
	TBuf8<16> aBuf;
hgs
parents:
diff changeset
   435
	aBuf.Append(PROFILER_SAMPLER_VERSION);
hgs
parents:
diff changeset
   436
	Kern::ThreadDesWrite(iClient,aDes,aBuf,0,KChunkShiftBy0,iClient);
hgs
parents:
diff changeset
   437
	LOGSTRING("DGeneralsDriver::GetSamplerVersion - written client descriptor");
hgs
parents:
diff changeset
   438
	return KErrNone;
hgs
parents:
diff changeset
   439
    }
hgs
parents:
diff changeset
   440
hgs
parents:
diff changeset
   441
TInt DGeneralsDriver::NewStart(TInt aDelay)
hgs
parents:
diff changeset
   442
    {	
hgs
parents:
diff changeset
   443
	LOGSTRING("DGeneralsDriver::NewStart");
hgs
parents:
diff changeset
   444
	iEndRequestStatus = 0;
hgs
parents:
diff changeset
   445
	
hgs
parents:
diff changeset
   446
	aDelay = Min(KMaxDelay, Max(KMinDelay, aDelay));
hgs
parents:
diff changeset
   447
hgs
parents:
diff changeset
   448
	// always use this rate
hgs
parents:
diff changeset
   449
	iPeriod = aDelay;
hgs
parents:
diff changeset
   450
	
hgs
parents:
diff changeset
   451
#ifdef __SMP__
hgs
parents:
diff changeset
   452
    /*
hgs
parents:
diff changeset
   453
     * Bind and enable the sampling interupts associated with each core. 
hgs
parents:
diff changeset
   454
     */
hgs
parents:
diff changeset
   455
    TInt err(0);
hgs
parents:
diff changeset
   456
    
hgs
parents:
diff changeset
   457
    TUint32 flags = NKern::EIrqBind_Count;
hgs
parents:
diff changeset
   458
hgs
parents:
diff changeset
   459
//    Kern::Printf(" > Interrupt::InterruptBind KIntProfilerBase - 32=%d", KIntProfilerBase -32 );
hgs
parents:
diff changeset
   460
    err = NKern::InterruptBind( KIntProfilerBase - 32 , DGeneralsDriver::Sample, this, flags, 0);
hgs
parents:
diff changeset
   461
    if(err < 0)
hgs
parents:
diff changeset
   462
        Kern::Printf(" InterruptBind KIntProfilerBase - 32 ret = %d", err );
hgs
parents:
diff changeset
   463
    
hgs
parents:
diff changeset
   464
//    Kern::Printf(" > Interrupt::InterruptBind KIntProfilerBase + 1 - 32=%d", KIntProfilerBase + 1-32 );
hgs
parents:
diff changeset
   465
    err = NKern::InterruptBind( KIntProfilerBase + 1 - 32 , DGeneralsDriver::Sample, this, flags, 0);
hgs
parents:
diff changeset
   466
    if(err < 0)
hgs
parents:
diff changeset
   467
        Kern::Printf(" InterruptBind KIntProfilerBase + 1 - 32 ret = %d", err );
hgs
parents:
diff changeset
   468
hgs
parents:
diff changeset
   469
//    Kern::Printf(" > Interrupt::InterruptBind KIntProfilerBase + 2 - 32=%d", KIntProfilerBase + 2 - 32 );
hgs
parents:
diff changeset
   470
    err = NKern::InterruptBind(KIntProfilerBase + 2 - 32 , DGeneralsDriver::Sample, this, flags, 0);
hgs
parents:
diff changeset
   471
    if(err < 0)
hgs
parents:
diff changeset
   472
        Kern::Printf(" InterruptBind KIntProfilerBase + 2 - 32 ret = %d", err );
hgs
parents:
diff changeset
   473
hgs
parents:
diff changeset
   474
//    Kern::Printf(" > Interrupt::InterruptBind KIntProfilerBase + 3 - 32=%d", KIntProfilerBase + 3 - 32 );
hgs
parents:
diff changeset
   475
    err = NKern::InterruptBind(KIntProfilerBase + 3 - 32 , DGeneralsDriver::Sample, this, flags, 0);
hgs
parents:
diff changeset
   476
    if(err < 0)
hgs
parents:
diff changeset
   477
        Kern::Printf(" InterruptBind KIntProfilerBase + 3 - 32 ret = %d", err );
hgs
parents:
diff changeset
   478
hgs
parents:
diff changeset
   479
hgs
parents:
diff changeset
   480
    err = NKern::InterruptEnable(KIntProfilerBase - 32);
hgs
parents:
diff changeset
   481
    if(err < 0)
hgs
parents:
diff changeset
   482
        Kern::Printf(" InterruptEnable KIntProfilerBase - 32 ret = %d", err );
hgs
parents:
diff changeset
   483
    
hgs
parents:
diff changeset
   484
    err = NKern::InterruptEnable(KIntProfilerBase + 1 - 32);
hgs
parents:
diff changeset
   485
    if(err < 0)
hgs
parents:
diff changeset
   486
        Kern::Printf(" InterruptEnable KIntProfilerBase + 1 - 32 ret = %d", err );
hgs
parents:
diff changeset
   487
hgs
parents:
diff changeset
   488
    err = NKern::InterruptEnable(KIntProfilerBase + 2 - 32);
hgs
parents:
diff changeset
   489
    if(err < 0)
hgs
parents:
diff changeset
   490
        Kern::Printf(" InterruptEnable KIntProfilerBase + 2 - 32 ret = %d", err );
hgs
parents:
diff changeset
   491
hgs
parents:
diff changeset
   492
    err = NKern::InterruptEnable(KIntProfilerBase + 3 - 32);
hgs
parents:
diff changeset
   493
    if(err < 0)
hgs
parents:
diff changeset
   494
        Kern::Printf(" InterruptEnable KIntProfilerBase + 3 - 32 ret = %d", err );
hgs
parents:
diff changeset
   495
        
hgs
parents:
diff changeset
   496
#endif
hgs
parents:
diff changeset
   497
	
hgs
parents:
diff changeset
   498
	iTimer.OneShot(aDelay);
hgs
parents:
diff changeset
   499
	
hgs
parents:
diff changeset
   500
	iState = ERunning;
hgs
parents:
diff changeset
   501
hgs
parents:
diff changeset
   502
	return KErrNone;
hgs
parents:
diff changeset
   503
    }
hgs
parents:
diff changeset
   504
hgs
parents:
diff changeset
   505
/*
hgs
parents:
diff changeset
   506
 *	This function is run in each interrupt
hgs
parents:
diff changeset
   507
 */
hgs
parents:
diff changeset
   508
// EKA-2 implementation of the sampler method
hgs
parents:
diff changeset
   509
hgs
parents:
diff changeset
   510
void DGeneralsDriver::NewDoProfilerProfile(TAny* aPtr)
hgs
parents:
diff changeset
   511
    {
hgs
parents:
diff changeset
   512
    LOGSTRING("DGeneralsDriver::NewDoProfilerProfile - entry");
hgs
parents:
diff changeset
   513
    
hgs
parents:
diff changeset
   514
#ifdef __SMP__      
hgs
parents:
diff changeset
   515
    TInt currCpu(NKern::CurrentCpu());
hgs
parents:
diff changeset
   516
#endif
hgs
parents:
diff changeset
   517
    TInt8 postSampleNeeded(0);
hgs
parents:
diff changeset
   518
    DGeneralsDriver& d=*(DGeneralsDriver*)aPtr;
hgs
parents:
diff changeset
   519
hgs
parents:
diff changeset
   520
	if (d.iState == ERunning && d.sampleRunning == 0)
hgs
parents:
diff changeset
   521
	    {
hgs
parents:
diff changeset
   522
        // start timer again
hgs
parents:
diff changeset
   523
		d.iTimer.Again(d.iPeriod);
hgs
parents:
diff changeset
   524
		d.sampleRunning++;
hgs
parents:
diff changeset
   525
        
hgs
parents:
diff changeset
   526
#ifdef __SMP__      
hgs
parents:
diff changeset
   527
        // print out the sample tick
hgs
parents:
diff changeset
   528
        if(d.gppSampler.GetExportData()->sampleNumber% 1000 == 0) 
hgs
parents:
diff changeset
   529
            {
hgs
parents:
diff changeset
   530
            Kern::Printf(("PIPROF SAMPLE TICK, #%d"), d.gppSampler.GetExportData()->sampleNumber);
hgs
parents:
diff changeset
   531
            }
hgs
parents:
diff changeset
   532
        // call the actual CPU sampling function for CPU 0 (in NaviEngine), later may be on any of the CPUs
hgs
parents:
diff changeset
   533
        Sample(aPtr);
hgs
parents:
diff changeset
   534
        
hgs
parents:
diff changeset
   535
        // post-sampling for NTimer interrupted CPU
hgs
parents:
diff changeset
   536
        postSampleNeeded += d.iSamplers[currCpu]->PostSampleNeeded();
hgs
parents:
diff changeset
   537
        
hgs
parents:
diff changeset
   538
        /* 
hgs
parents:
diff changeset
   539
        This is the master sampler from the watchdog timer, so 
hgs
parents:
diff changeset
   540
        send interrupts to the other CPUs
hgs
parents:
diff changeset
   541
        */
hgs
parents:
diff changeset
   542
        TScheduler *theSched = TScheduler::Ptr();
hgs
parents:
diff changeset
   543
        GicDistributor* gicDist = (GicDistributor* )theSched->i_GicDistAddr;
hgs
parents:
diff changeset
   544
            
hgs
parents:
diff changeset
   545
        for( TInt nCpu(0); nCpu < d.iMaxCpus; nCpu++ )
hgs
parents:
diff changeset
   546
            {
hgs
parents:
diff changeset
   547
            if( nCpu != currCpu )
hgs
parents:
diff changeset
   548
                {
hgs
parents:
diff changeset
   549
                gicDist->iSoftIrq = ( 0x10000 << nCpu ) | (KIntProfilerBase + nCpu);
hgs
parents:
diff changeset
   550
                }
hgs
parents:
diff changeset
   551
            // post-sampling for CPUs with specifically generated interrupts
hgs
parents:
diff changeset
   552
            postSampleNeeded += d.iSamplers[nCpu]->PostSampleNeeded();
hgs
parents:
diff changeset
   553
            }
hgs
parents:
diff changeset
   554
        arm_dsb();
hgs
parents:
diff changeset
   555
#endif  
hgs
parents:
diff changeset
   556
        // then sample the rest of non-cpu samplers
hgs
parents:
diff changeset
   557
        for(TInt i(d.iMaxCpus);i<KSamplerAmount;i++)
hgs
parents:
diff changeset
   558
            {
hgs
parents:
diff changeset
   559
            if(d.iSamplers[i]->iEnabled)
hgs
parents:
diff changeset
   560
                {
hgs
parents:
diff changeset
   561
                d.iSamplers[i]->Sample();
hgs
parents:
diff changeset
   562
                postSampleNeeded += d.iSamplers[i]->PostSampleNeeded();
hgs
parents:
diff changeset
   563
                }
hgs
parents:
diff changeset
   564
            }
hgs
parents:
diff changeset
   565
			
hgs
parents:
diff changeset
   566
		if(postSampleNeeded > 0 && d.doingDfc == 0)
hgs
parents:
diff changeset
   567
		    {
hgs
parents:
diff changeset
   568
			d.doingDfc++;
hgs
parents:
diff changeset
   569
			d.iNewDfc.Add();
hgs
parents:
diff changeset
   570
hgs
parents:
diff changeset
   571
			d.sampleRunning--;
hgs
parents:
diff changeset
   572
			return;
hgs
parents:
diff changeset
   573
            }
hgs
parents:
diff changeset
   574
		d.sampleRunning--;
hgs
parents:
diff changeset
   575
        }
hgs
parents:
diff changeset
   576
	else if (d.iState == EStopping && d.sampleRunning == 0)
hgs
parents:
diff changeset
   577
	    {
hgs
parents:
diff changeset
   578
		// add a dfc for this final time
hgs
parents:
diff changeset
   579
		d.iNewDfc.Add();
hgs
parents:
diff changeset
   580
        Kern::Printf("DGeneralsDriver::Sample - sampling added to dfc queue");
hgs
parents:
diff changeset
   581
        }
hgs
parents:
diff changeset
   582
	else
hgs
parents:
diff changeset
   583
	    {
hgs
parents:
diff changeset
   584
		// the previous sample has not finished,
hgs
parents:
diff changeset
   585
		Kern::Printf("DGeneralsDriver::NewDoProfilerProfile - Profiler Sampler Error - interrupted before finished sampling!!");
hgs
parents:
diff changeset
   586
        }
hgs
parents:
diff changeset
   587
        LOGSTRING("DGeneralsDriver::NewDoProfilerProfile - exit");
hgs
parents:
diff changeset
   588
    }
hgs
parents:
diff changeset
   589
hgs
parents:
diff changeset
   590
hgs
parents:
diff changeset
   591
hgs
parents:
diff changeset
   592
void DGeneralsDriver::Sample(TAny* aPtr)
hgs
parents:
diff changeset
   593
    {
hgs
parents:
diff changeset
   594
    LOGSTRING("DGeneralsDriver::Sample - entry");
hgs
parents:
diff changeset
   595
hgs
parents:
diff changeset
   596
#ifdef __SMP__
hgs
parents:
diff changeset
   597
    DGeneralsDriver& d=*(DGeneralsDriver*)aPtr;
hgs
parents:
diff changeset
   598
hgs
parents:
diff changeset
   599
//    TInt currCpu(NKern::CurrentCpu());
hgs
parents:
diff changeset
   600
hgs
parents:
diff changeset
   601
    // sample the current cpu load
hgs
parents:
diff changeset
   602
//    if(d.iSamplers[currCpu]->iEnabled)
hgs
parents:
diff changeset
   603
//        {
hgs
parents:
diff changeset
   604
        d.iSamplers[NKern::CurrentCpu()]->Sample();
hgs
parents:
diff changeset
   605
//        postSampleNeeded += d.iSamplers[currCpu]->PostSampleNeeded();
hgs
parents:
diff changeset
   606
//        }
hgs
parents:
diff changeset
   607
#endif
hgs
parents:
diff changeset
   608
    LOGSTRING("DGeneralsDriver::Sample - exit");
hgs
parents:
diff changeset
   609
    }
hgs
parents:
diff changeset
   610
/*
hgs
parents:
diff changeset
   611
 *	This function is run when any of the samplers
hgs
parents:
diff changeset
   612
 *	requires post sampling
hgs
parents:
diff changeset
   613
 */
hgs
parents:
diff changeset
   614
void DGeneralsDriver::NewDoDfc(TAny* pointer)
hgs
parents:
diff changeset
   615
    {
hgs
parents:
diff changeset
   616
	DGeneralsDriver& d(*((DGeneralsDriver*)pointer));
hgs
parents:
diff changeset
   617
	
hgs
parents:
diff changeset
   618
	if(d.iState == ERunning)
hgs
parents:
diff changeset
   619
	    {
hgs
parents:
diff changeset
   620
		// for all enabled samplers, perform
hgs
parents:
diff changeset
   621
		// post sample if needed
hgs
parents:
diff changeset
   622
		for(TInt i(0);i<KSamplerAmount;i++)
hgs
parents:
diff changeset
   623
		    {
hgs
parents:
diff changeset
   624
			if(d.iSamplers[i]->iEnabled)
hgs
parents:
diff changeset
   625
			    {
hgs
parents:
diff changeset
   626
				if(d.iSamplers[i]->PostSampleNeeded())
hgs
parents:
diff changeset
   627
				    {
hgs
parents:
diff changeset
   628
					d.iSamplers[i]->PostSample();
hgs
parents:
diff changeset
   629
                    }
hgs
parents:
diff changeset
   630
                }
hgs
parents:
diff changeset
   631
            }
hgs
parents:
diff changeset
   632
		d.doingDfc--;
hgs
parents:
diff changeset
   633
        }
hgs
parents:
diff changeset
   634
hgs
parents:
diff changeset
   635
	else if(d.iState == EStopping)
hgs
parents:
diff changeset
   636
	    {
hgs
parents:
diff changeset
   637
		// for all enabled samplers,
hgs
parents:
diff changeset
   638
		// perform end sampling
hgs
parents:
diff changeset
   639
		TBool releaseBuffer(false);
hgs
parents:
diff changeset
   640
		for(TInt i(0);i<KSamplerAmount;i++)
hgs
parents:
diff changeset
   641
		    {
hgs
parents:
diff changeset
   642
			if(d.iSamplers[i]->iEnabled)
hgs
parents:
diff changeset
   643
			    {
hgs
parents:
diff changeset
   644
				LOGSTRING("DGeneralsDriver::NewDoDfc() - ending");
hgs
parents:
diff changeset
   645
				// perform end sampling for all samplers
hgs
parents:
diff changeset
   646
				// stream mode samplers may be pending, if they
hgs
parents:
diff changeset
   647
				// are still waiting for another client buffer
hgs
parents:
diff changeset
   648
				if(d.iSamplers[i]->EndSampling() == KErrNotReady) 
hgs
parents:
diff changeset
   649
				    {
hgs
parents:
diff changeset
   650
					LOGSTRING("DGeneralsDriver::NewDoDfc() - stream data pending");
hgs
parents:
diff changeset
   651
					releaseBuffer = true;
hgs
parents:
diff changeset
   652
                    }
hgs
parents:
diff changeset
   653
				else 
hgs
parents:
diff changeset
   654
				    {
hgs
parents:
diff changeset
   655
					LOGSTRING("DGeneralsDriver::NewDoDfc() - no data pending");
hgs
parents:
diff changeset
   656
					releaseBuffer = true;
hgs
parents:
diff changeset
   657
                    }		
hgs
parents:
diff changeset
   658
                }
hgs
parents:
diff changeset
   659
            }
hgs
parents:
diff changeset
   660
hgs
parents:
diff changeset
   661
		// At the end, once all the samplers are gone through, the buffer should be released
hgs
parents:
diff changeset
   662
		if (true == releaseBuffer) 
hgs
parents:
diff changeset
   663
		    {
hgs
parents:
diff changeset
   664
			LOGSTRING("DGeneralsDriver::NewDoDfc() - release the buffer");
hgs
parents:
diff changeset
   665
			d.iSampleStream.ReleaseIfPending();	
hgs
parents:
diff changeset
   666
            }
hgs
parents:
diff changeset
   667
		
hgs
parents:
diff changeset
   668
		d.iState = EStopped;
hgs
parents:
diff changeset
   669
		if(d.iEndRequestStatus != 0 && d.iClient != 0)
hgs
parents:
diff changeset
   670
		    {
hgs
parents:
diff changeset
   671
			// sampling has ended
hgs
parents:
diff changeset
   672
			Kern::RequestComplete(d.iClient,d.iEndRequestStatus,KErrNone);
hgs
parents:
diff changeset
   673
            }
hgs
parents:
diff changeset
   674
        }
hgs
parents:
diff changeset
   675
    }
hgs
parents:
diff changeset
   676
hgs
parents:
diff changeset
   677
hgs
parents:
diff changeset
   678
/*
hgs
parents:
diff changeset
   679
 *	All controls are handled here
hgs
parents:
diff changeset
   680
 */
hgs
parents:
diff changeset
   681
 
hgs
parents:
diff changeset
   682
void DGeneralsDriver::HandleMsg(TMessageBase* aMsg)
hgs
parents:
diff changeset
   683
    {
hgs
parents:
diff changeset
   684
	TInt r(KErrNone);
hgs
parents:
diff changeset
   685
	TThreadMessage& m(*(TThreadMessage*)aMsg);
hgs
parents:
diff changeset
   686
hgs
parents:
diff changeset
   687
	LOGSTRING5("DGeneralsDriver::HandleMsg 0x%x 0x%x 0x%x 0x%x",m.Int0(),m.Int1(),m.Int2(),m.Int3());
hgs
parents:
diff changeset
   688
	
hgs
parents:
diff changeset
   689
	if(m.iValue == (TInt)ECloseMsg)
hgs
parents:
diff changeset
   690
	    {
hgs
parents:
diff changeset
   691
		LOGSTRING("DGeneralsDriver::HandleMsg - received close message");
hgs
parents:
diff changeset
   692
		iTimer.Cancel();
hgs
parents:
diff changeset
   693
		iNewDfc.Cancel();
hgs
parents:
diff changeset
   694
hgs
parents:
diff changeset
   695
		m.Complete(KErrNone,EFalse);
hgs
parents:
diff changeset
   696
		iMsgQ.CompleteAll(KErrServerTerminated);
hgs
parents:
diff changeset
   697
		LOGSTRING("DGeneralsDriver::HandleMsg - cleaned up the driver!");
hgs
parents:
diff changeset
   698
		return;
hgs
parents:
diff changeset
   699
        }
hgs
parents:
diff changeset
   700
hgs
parents:
diff changeset
   701
	if (m.Client()!=iClient)
hgs
parents:
diff changeset
   702
	    {
hgs
parents:
diff changeset
   703
		LOGSTRING("DGeneralsDriver::HandleMsg - ERROR, wrong client");
hgs
parents:
diff changeset
   704
		m.PanicClient(_L("GENERALSSAMPLER"),EAccessDenied);
hgs
parents:
diff changeset
   705
		return;
hgs
parents:
diff changeset
   706
        }
hgs
parents:
diff changeset
   707
hgs
parents:
diff changeset
   708
	TInt id(m.iValue);
hgs
parents:
diff changeset
   709
	switch(id)
hgs
parents:
diff changeset
   710
	    {
hgs
parents:
diff changeset
   711
		 //Controls are handled here
hgs
parents:
diff changeset
   712
		case RPluginSampler::EMarkTraceActive:
hgs
parents:
diff changeset
   713
			LOGSTRING("DGeneralsDriver::HandleMsg - EMarkTraceActive");
hgs
parents:
diff changeset
   714
			r = MarkTraceActive((TInt)m.Int0());
hgs
parents:
diff changeset
   715
			break;
hgs
parents:
diff changeset
   716
hgs
parents:
diff changeset
   717
		case RPluginSampler::EOutputSettingsForTrace:
hgs
parents:
diff changeset
   718
			LOGSTRING("DGeneralsDriver::HandleMsg - EOutputSettingsForTrace");
hgs
parents:
diff changeset
   719
			r = OutputSettingsForTrace((TInt)m.Int0(),(TInt)m.Int1());
hgs
parents:
diff changeset
   720
			break;
hgs
parents:
diff changeset
   721
hgs
parents:
diff changeset
   722
		case RPluginSampler::EAdditionalTraceSettings:
hgs
parents:
diff changeset
   723
			LOGSTRING("DGeneralsDriver::HandleMsg - EAdditionalTraceSettings");
hgs
parents:
diff changeset
   724
			r = AdditionalTraceSettings((TInt)m.Int0(),(TInt)m.Int1());
hgs
parents:
diff changeset
   725
			break;
hgs
parents:
diff changeset
   726
hgs
parents:
diff changeset
   727
		case RPluginSampler::EAdditionalTraceSettings2:
hgs
parents:
diff changeset
   728
			LOGSTRING("DGeneralsDriver::HandleMsg - EAdditionalTraceSettings2");
hgs
parents:
diff changeset
   729
			r = AdditionalTraceSettings2((TInt)m.Int0(),(TInt)m.Int1());
hgs
parents:
diff changeset
   730
			break;
hgs
parents:
diff changeset
   731
			
hgs
parents:
diff changeset
   732
		case RPluginSampler::ESetSamplingPeriod:
hgs
parents:
diff changeset
   733
		    LOGSTRING2("DGeneralsDriver::HandleMsg - ESetSamplingPeriod %d", (TInt)m.Int1());
hgs
parents:
diff changeset
   734
			r = SetSamplingPeriod((TInt)m.Int0(),(TInt)m.Int1());
hgs
parents:
diff changeset
   735
			break;
hgs
parents:
diff changeset
   736
			
hgs
parents:
diff changeset
   737
		case RPluginSampler::EMarkTraceInactive:
hgs
parents:
diff changeset
   738
			LOGSTRING("DGeneralsDriver::HandleMsg - EMarkTraceInactive");
hgs
parents:
diff changeset
   739
			r = MarkTraceInactive((TInt)m.Int0());
hgs
parents:
diff changeset
   740
			break;
hgs
parents:
diff changeset
   741
hgs
parents:
diff changeset
   742
		case RPluginSampler::ESample:
hgs
parents:
diff changeset
   743
			LOGSTRING("DGeneralsDriver::HandleMsg - ESample");
hgs
parents:
diff changeset
   744
			//r = Sample();  // hack. Original implementation of sample just returned 0
hgs
parents:
diff changeset
   745
			r = 0;
hgs
parents:
diff changeset
   746
			break;
hgs
parents:
diff changeset
   747
hgs
parents:
diff changeset
   748
		case RPluginSampler::EStartSampling:
hgs
parents:
diff changeset
   749
			LOGSTRING("DGeneralsDriver::HandleMsg - EStartSampling");
hgs
parents:
diff changeset
   750
			r = StartSampling();
hgs
parents:
diff changeset
   751
			break;
hgs
parents:
diff changeset
   752
hgs
parents:
diff changeset
   753
		case RPluginSampler::EGetSampleTime:
hgs
parents:
diff changeset
   754
			LOGSTRING("DGeneralsDriver::HandleMsg - EGetSampleTime");
hgs
parents:
diff changeset
   755
			r = GetSampleTime(reinterpret_cast<TUint32*>(m.Ptr0()));
hgs
parents:
diff changeset
   756
			break;
hgs
parents:
diff changeset
   757
hgs
parents:
diff changeset
   758
		case RPluginSampler::EGetSamplerVersion:
hgs
parents:
diff changeset
   759
			LOGSTRING("DGeneralsDriver::HandleMsg - EGetSamplerVersion");
hgs
parents:
diff changeset
   760
			r = GetSamplerVersion(reinterpret_cast<TDes*>(m.Ptr0()));
hgs
parents:
diff changeset
   761
			break;
hgs
parents:
diff changeset
   762
		
hgs
parents:
diff changeset
   763
		case RPluginSampler::ECancelStreamRead:
hgs
parents:
diff changeset
   764
			LOGSTRING("DGeneralsDriver::HandleMsg - ECancelStreamRead");
hgs
parents:
diff changeset
   765
			iStreamReadCancelStatus = reinterpret_cast<TRequestStatus*>(m.Ptr0());
hgs
parents:
diff changeset
   766
			r = ProcessStreamReadCancel();
hgs
parents:
diff changeset
   767
			break;
hgs
parents:
diff changeset
   768
hgs
parents:
diff changeset
   769
hgs
parents:
diff changeset
   770
		 //	Requests are handled here
hgs
parents:
diff changeset
   771
hgs
parents:
diff changeset
   772
		case ~RPluginSampler::EStopAndWaitForEnd:
hgs
parents:
diff changeset
   773
			LOGSTRING("DGeneralsDriver::HandleMsg - EStopAndWaitForEnd");
hgs
parents:
diff changeset
   774
			iEndRequestStatus = reinterpret_cast<TRequestStatus*>(m.Ptr0());
hgs
parents:
diff changeset
   775
			r = StopSampling();
hgs
parents:
diff changeset
   776
#ifdef __SMP__
hgs
parents:
diff changeset
   777
			UnbindInterrupts();
hgs
parents:
diff changeset
   778
#endif
hgs
parents:
diff changeset
   779
			break;
hgs
parents:
diff changeset
   780
hgs
parents:
diff changeset
   781
		case ~RPluginSampler::ERequestFillThisStreamBuffer:
hgs
parents:
diff changeset
   782
			LOGSTRING("DGeneralsDriver::HandleMsg - ERequestFillThisStreamBuffer");			
hgs
parents:
diff changeset
   783
			r = ProcessStreamReadRequest(	reinterpret_cast<TBapBuf*>(m.Ptr1()),
hgs
parents:
diff changeset
   784
											reinterpret_cast<TRequestStatus*>(m.Ptr0()));
hgs
parents:
diff changeset
   785
			break;
hgs
parents:
diff changeset
   786
hgs
parents:
diff changeset
   787
		default:
hgs
parents:
diff changeset
   788
			LOGSTRING2("DGeneralsDriver::HandleMsg - ERROR, unknown command %d",id);
hgs
parents:
diff changeset
   789
			r = KErrNotSupported;
hgs
parents:
diff changeset
   790
			break;
hgs
parents:
diff changeset
   791
        }
hgs
parents:
diff changeset
   792
hgs
parents:
diff changeset
   793
	LOGSTRING("DGeneralsDriver::HandleMsg - Completed");
hgs
parents:
diff changeset
   794
	m.Complete(r,ETrue);
hgs
parents:
diff changeset
   795
    }
hgs
parents:
diff changeset
   796
hgs
parents:
diff changeset
   797
#ifdef __SMP__
hgs
parents:
diff changeset
   798
inline void DGeneralsDriver::UnbindInterrupts()
hgs
parents:
diff changeset
   799
    {
hgs
parents:
diff changeset
   800
    TInt err(0);
hgs
parents:
diff changeset
   801
hgs
parents:
diff changeset
   802
    // disable interrupts when sampling stops, enabled again on start
hgs
parents:
diff changeset
   803
    err = NKern::InterruptDisable(KIntProfilerBase - 32);
hgs
parents:
diff changeset
   804
    if(err < 0)
hgs
parents:
diff changeset
   805
        Kern::Printf(" InterruptDisable KIntProfilerBase - 32 ret = %d", err );
hgs
parents:
diff changeset
   806
    
hgs
parents:
diff changeset
   807
    err = NKern::InterruptDisable(KIntProfilerBase + 1 - 32);
hgs
parents:
diff changeset
   808
    if(err < 0)
hgs
parents:
diff changeset
   809
        Kern::Printf(" InterruptDisable KIntProfilerBase + 1 - 32 ret = %d", err );
hgs
parents:
diff changeset
   810
hgs
parents:
diff changeset
   811
    err = NKern::InterruptDisable(KIntProfilerBase + 2 - 32);
hgs
parents:
diff changeset
   812
    if(err < 0)
hgs
parents:
diff changeset
   813
        Kern::Printf(" InterruptDisable KIntProfilerBase + 2 - 32 ret = %d", err );
hgs
parents:
diff changeset
   814
hgs
parents:
diff changeset
   815
    err = NKern::InterruptDisable(KIntProfilerBase + 3 - 32);
hgs
parents:
diff changeset
   816
    if(err < 0)
hgs
parents:
diff changeset
   817
        Kern::Printf(" InterruptDisable KIntProfilerBase + 3 - 32 ret = %d", err );
hgs
parents:
diff changeset
   818
    
hgs
parents:
diff changeset
   819
//    Kern::Printf(" > Interrupt::InterruptBind KIntProfilerBase - 32=%d", KIntProfilerBase -32 );
hgs
parents:
diff changeset
   820
    err = NKern::InterruptUnbind( KIntProfilerBase - 32);
hgs
parents:
diff changeset
   821
    if(err < 0)
hgs
parents:
diff changeset
   822
        Kern::Printf(" InterruptUnbind KIntProfilerBase - 32 ret = %d", err );
hgs
parents:
diff changeset
   823
    
hgs
parents:
diff changeset
   824
//    Kern::Printf(" > Interrupt::InterruptBind KIntProfilerBase + 1 - 32=%d", KIntProfilerBase + 1-32 );
hgs
parents:
diff changeset
   825
    err = NKern::InterruptUnbind( KIntProfilerBase + 1 - 32);
hgs
parents:
diff changeset
   826
    if(err < 0)
hgs
parents:
diff changeset
   827
        Kern::Printf(" InterruptUnbind KIntProfilerBase + 1 - 32 ret = %d", err );
hgs
parents:
diff changeset
   828
hgs
parents:
diff changeset
   829
//    Kern::Printf(" > Interrupt::InterruptBind KIntProfilerBase + 2 - 32=%d", KIntProfilerBase + 2 - 32 );
hgs
parents:
diff changeset
   830
    err = NKern::InterruptUnbind(KIntProfilerBase + 2 - 32);
hgs
parents:
diff changeset
   831
    if(err < 0)
hgs
parents:
diff changeset
   832
        Kern::Printf(" InterruptUnbind KIntProfilerBase + 2 - 32 ret = %d", err );
hgs
parents:
diff changeset
   833
hgs
parents:
diff changeset
   834
//    Kern::Printf(" > Interrupt::InterruptBind KIntProfilerBase + 3 - 32=%d", KIntProfilerBase + 3 - 32 );
hgs
parents:
diff changeset
   835
    err = NKern::InterruptUnbind(KIntProfilerBase + 3 - 32);
hgs
parents:
diff changeset
   836
    if(err < 0)
hgs
parents:
diff changeset
   837
        Kern::Printf(" InterruptUnbind KIntProfilerBase + 3 - 32 ret = %d", err );
hgs
parents:
diff changeset
   838
hgs
parents:
diff changeset
   839
    }
hgs
parents:
diff changeset
   840
#endif
hgs
parents:
diff changeset
   841
hgs
parents:
diff changeset
   842
inline TInt DGeneralsDriver::ProcessStreamReadRequest(TBapBuf* aBuf,TRequestStatus* aStatus)
hgs
parents:
diff changeset
   843
	{
hgs
parents:
diff changeset
   844
	LOGSTRING("DGeneralsDriver::ProcessStreamReadRequest - entry");
hgs
parents:
diff changeset
   845
	
hgs
parents:
diff changeset
   846
	// a new sample buffer has been received from the client
hgs
parents:
diff changeset
   847
	iSampleStream.AddSampleBuffer(aBuf,aStatus);
hgs
parents:
diff changeset
   848
	
hgs
parents:
diff changeset
   849
	// check if we are waiting for the last data to be written to the client
hgs
parents:
diff changeset
   850
	if(iState == EStopped)
hgs
parents:
diff changeset
   851
	    {
hgs
parents:
diff changeset
   852
		LOGSTRING("DGeneralsDriver::ProcessStreamReadRequest state = EStopped");
hgs
parents:
diff changeset
   853
	
hgs
parents:
diff changeset
   854
		// sampling has stopped and stream read cancel is pending
hgs
parents:
diff changeset
   855
		// try to perform the end sampling procedure again
hgs
parents:
diff changeset
   856
		TBool releaseBuffer(false);
hgs
parents:
diff changeset
   857
		for(TInt i(0);i<KSamplerAmount;i++)
hgs
parents:
diff changeset
   858
		    {
hgs
parents:
diff changeset
   859
			// only for all enabled samplers that have stream output mode
hgs
parents:
diff changeset
   860
			if(iSamplers[i]->iEnabled /*&& samplers[i]->outputMode == 2*/)
hgs
parents:
diff changeset
   861
			    {
hgs
parents:
diff changeset
   862
				//TInt pending = 0;
hgs
parents:
diff changeset
   863
				// stream mode samplers may be pending, if they
hgs
parents:
diff changeset
   864
				// are still waiting for another client buffer,
hgs
parents:
diff changeset
   865
				// in that case, the request should be completed already
hgs
parents:
diff changeset
   866
				if(iSamplers[i]->EndSampling() == KErrNotReady) 
hgs
parents:
diff changeset
   867
				    {
hgs
parents:
diff changeset
   868
					LOGSTRING("DGeneralsDriver::ProcessStreamReadRequest - still data pending");
hgs
parents:
diff changeset
   869
					releaseBuffer = true;
hgs
parents:
diff changeset
   870
                    }
hgs
parents:
diff changeset
   871
				else 
hgs
parents:
diff changeset
   872
				    {
hgs
parents:
diff changeset
   873
					LOGSTRING("DGeneralsDriver::ProcessStreamReadRequest - no data pending");
hgs
parents:
diff changeset
   874
					releaseBuffer = true;
hgs
parents:
diff changeset
   875
                    }
hgs
parents:
diff changeset
   876
                }
hgs
parents:
diff changeset
   877
            }
hgs
parents:
diff changeset
   878
		// At the end, once all the samplers are gone through, the buffer should be released
hgs
parents:
diff changeset
   879
		if (true == releaseBuffer) 
hgs
parents:
diff changeset
   880
		    {
hgs
parents:
diff changeset
   881
			LOGSTRING("DGeneralsDriver::ProcessStreamReadRequest - all data copied, release the buffer");
hgs
parents:
diff changeset
   882
			iSampleStream.ReleaseIfPending();
hgs
parents:
diff changeset
   883
		    }
hgs
parents:
diff changeset
   884
        }
hgs
parents:
diff changeset
   885
	LOGSTRING("DGeneralsDriver::ProcessStreamReadRequest - exit");
hgs
parents:
diff changeset
   886
	
hgs
parents:
diff changeset
   887
	return KErrNone;
hgs
parents:
diff changeset
   888
	}
hgs
parents:
diff changeset
   889
hgs
parents:
diff changeset
   890
hgs
parents:
diff changeset
   891
/*
hgs
parents:
diff changeset
   892
 *	Mark traces active or inactive, this can be done
hgs
parents:
diff changeset
   893
 *	only if sampling is not running
hgs
parents:
diff changeset
   894
 */
hgs
parents:
diff changeset
   895
hgs
parents:
diff changeset
   896
inline TInt DGeneralsDriver::MarkTraceActive(TInt samplerIdToActivate)
hgs
parents:
diff changeset
   897
	{
hgs
parents:
diff changeset
   898
	LOGSTRING2("DGeneralsDriver::MarkTraceActive %d",samplerIdToActivate);
hgs
parents:
diff changeset
   899
hgs
parents:
diff changeset
   900
	TInt cpus(0);
hgs
parents:
diff changeset
   901
#ifdef __SMP__
hgs
parents:
diff changeset
   902
	cpus = NKern::NumberOfCpus();
hgs
parents:
diff changeset
   903
	if( samplerIdToActivate == PROFILER_GPP_SAMPLER_ID )
hgs
parents:
diff changeset
   904
	    {
hgs
parents:
diff changeset
   905
	    for(TInt cpu(0);cpu<cpus;cpu++)
hgs
parents:
diff changeset
   906
	         {
hgs
parents:
diff changeset
   907
	         Kern::Printf("DGeneralsDriver::MarkTraceActive - activating CPU %d",cpu);
hgs
parents:
diff changeset
   908
	         iSamplers[cpu]->SetEnabledFlag(true);
hgs
parents:
diff changeset
   909
	         }
hgs
parents:
diff changeset
   910
	    return KErrNone;
hgs
parents:
diff changeset
   911
	    }
hgs
parents:
diff changeset
   912
#endif
hgs
parents:
diff changeset
   913
	for(TInt i(cpus);i<KSamplerAmount;i++)
hgs
parents:
diff changeset
   914
	    {
hgs
parents:
diff changeset
   915
		if(iSamplers[i]->iSamplerId == samplerIdToActivate)
hgs
parents:
diff changeset
   916
		    {
hgs
parents:
diff changeset
   917
			iSamplers[i]->SetEnabledFlag(true);
hgs
parents:
diff changeset
   918
			return KErrNone;
hgs
parents:
diff changeset
   919
            }
hgs
parents:
diff changeset
   920
        }
hgs
parents:
diff changeset
   921
hgs
parents:
diff changeset
   922
	LOGSTRING2("DGeneralsDriver::MarkTraceActive - %d not supported",samplerIdToActivate);
hgs
parents:
diff changeset
   923
	return KErrNotSupported;
hgs
parents:
diff changeset
   924
	}
hgs
parents:
diff changeset
   925
hgs
parents:
diff changeset
   926
inline TInt DGeneralsDriver::MarkTraceInactive(TInt samplerIdToDisable)
hgs
parents:
diff changeset
   927
	{
hgs
parents:
diff changeset
   928
	LOGSTRING2("DGeneralsDriver::MarkTraceInactive %d",samplerIdToDisable);
hgs
parents:
diff changeset
   929
hgs
parents:
diff changeset
   930
    TInt cpus(0);
hgs
parents:
diff changeset
   931
#ifdef __SMP__
hgs
parents:
diff changeset
   932
    cpus = NKern::NumberOfCpus();
hgs
parents:
diff changeset
   933
    if( samplerIdToDisable == PROFILER_GPP_SAMPLER_ID )
hgs
parents:
diff changeset
   934
        {
hgs
parents:
diff changeset
   935
        for(TInt cpu(0);cpu<cpus;cpu++)
hgs
parents:
diff changeset
   936
             {
hgs
parents:
diff changeset
   937
             iSamplers[cpu]->SetEnabledFlag(false);
hgs
parents:
diff changeset
   938
             }
hgs
parents:
diff changeset
   939
        return KErrNone;
hgs
parents:
diff changeset
   940
        }
hgs
parents:
diff changeset
   941
#endif
hgs
parents:
diff changeset
   942
    for(TInt i(cpus);i<KSamplerAmount;i++)
hgs
parents:
diff changeset
   943
	    {
hgs
parents:
diff changeset
   944
		if(iSamplers[i]->iSamplerId == samplerIdToDisable)
hgs
parents:
diff changeset
   945
		    {
hgs
parents:
diff changeset
   946
			iSamplers[i]->SetEnabledFlag(false);
hgs
parents:
diff changeset
   947
			return KErrNone;
hgs
parents:
diff changeset
   948
            }
hgs
parents:
diff changeset
   949
        }
hgs
parents:
diff changeset
   950
hgs
parents:
diff changeset
   951
	LOGSTRING2("DGeneralsDriver::MarkTraceInactive - %d not supported",samplerIdToDisable);
hgs
parents:
diff changeset
   952
	return KErrNotSupported;
hgs
parents:
diff changeset
   953
	}
hgs
parents:
diff changeset
   954
hgs
parents:
diff changeset
   955
/*
hgs
parents:
diff changeset
   956
 *	Set output settings for a trace
hgs
parents:
diff changeset
   957
 */
hgs
parents:
diff changeset
   958
 
hgs
parents:
diff changeset
   959
inline TInt DGeneralsDriver::OutputSettingsForTrace(TInt samplerId,TInt settings)
hgs
parents:
diff changeset
   960
	{
hgs
parents:
diff changeset
   961
	LOGSTRING3("DGeneralsDriver::OutputSettingsForTrace id:%d set:%d",samplerId,settings);
hgs
parents:
diff changeset
   962
hgs
parents:
diff changeset
   963
    TInt cpus(0);
hgs
parents:
diff changeset
   964
#ifdef __SMP__
hgs
parents:
diff changeset
   965
    cpus = NKern::NumberOfCpus();
hgs
parents:
diff changeset
   966
    if( samplerId == PROFILER_GPP_SAMPLER_ID )
hgs
parents:
diff changeset
   967
        {
hgs
parents:
diff changeset
   968
        for(TInt cpu(0);cpu<cpus;cpu++)
hgs
parents:
diff changeset
   969
             {
hgs
parents:
diff changeset
   970
             iSamplers[cpu]->SetOutputCombination(settings);
hgs
parents:
diff changeset
   971
             }
hgs
parents:
diff changeset
   972
        return KErrNone;
hgs
parents:
diff changeset
   973
        }
hgs
parents:
diff changeset
   974
#endif
hgs
parents:
diff changeset
   975
    for(TInt i(cpus);i<KSamplerAmount;i++)
hgs
parents:
diff changeset
   976
	    {
hgs
parents:
diff changeset
   977
		if(iSamplers[i]->iSamplerId == samplerId)
hgs
parents:
diff changeset
   978
		    {
hgs
parents:
diff changeset
   979
			iSamplers[i]->SetOutputCombination(settings);
hgs
parents:
diff changeset
   980
			return KErrNone;
hgs
parents:
diff changeset
   981
		    }
hgs
parents:
diff changeset
   982
	    }
hgs
parents:
diff changeset
   983
hgs
parents:
diff changeset
   984
	return KErrNotSupported;	
hgs
parents:
diff changeset
   985
	}
hgs
parents:
diff changeset
   986
hgs
parents:
diff changeset
   987
/*
hgs
parents:
diff changeset
   988
 *	Set additional settings for a trace
hgs
parents:
diff changeset
   989
 */
hgs
parents:
diff changeset
   990
hgs
parents:
diff changeset
   991
inline TInt DGeneralsDriver::AdditionalTraceSettings(TInt samplerId,TInt settings)
hgs
parents:
diff changeset
   992
	{
hgs
parents:
diff changeset
   993
	LOGSTRING3("DGeneralsDriver::SetAdditionalTraceSettings id:%d set:%d",samplerId,settings);
hgs
parents:
diff changeset
   994
hgs
parents:
diff changeset
   995
    TInt cpus(0);
hgs
parents:
diff changeset
   996
#ifdef __SMP__
hgs
parents:
diff changeset
   997
    cpus = NKern::NumberOfCpus();
hgs
parents:
diff changeset
   998
    if( samplerId == PROFILER_GPP_SAMPLER_ID )
hgs
parents:
diff changeset
   999
        {
hgs
parents:
diff changeset
  1000
        for(TInt cpu(0);cpu<cpus;cpu++)
hgs
parents:
diff changeset
  1001
             {
hgs
parents:
diff changeset
  1002
             iSamplers[cpu]->SetAdditionalSettings(settings);
hgs
parents:
diff changeset
  1003
             }
hgs
parents:
diff changeset
  1004
        return KErrNone;
hgs
parents:
diff changeset
  1005
        }
hgs
parents:
diff changeset
  1006
#endif
hgs
parents:
diff changeset
  1007
    for(TInt i(cpus);i<KSamplerAmount;i++)
hgs
parents:
diff changeset
  1008
	    {
hgs
parents:
diff changeset
  1009
		if(iSamplers[i]->iSamplerId == samplerId)
hgs
parents:
diff changeset
  1010
		    {
hgs
parents:
diff changeset
  1011
			iSamplers[i]->SetAdditionalSettings(settings);
hgs
parents:
diff changeset
  1012
			return KErrNone;
hgs
parents:
diff changeset
  1013
            }
hgs
parents:
diff changeset
  1014
        }
hgs
parents:
diff changeset
  1015
hgs
parents:
diff changeset
  1016
	return KErrNotSupported;	
hgs
parents:
diff changeset
  1017
	}
hgs
parents:
diff changeset
  1018
hgs
parents:
diff changeset
  1019
inline TInt DGeneralsDriver::AdditionalTraceSettings2(TInt samplerId,TInt settings)
hgs
parents:
diff changeset
  1020
	{
hgs
parents:
diff changeset
  1021
	LOGSTRING3("DGeneralsDriver::SetAdditionalTraceSettings id:%d set:%d",samplerId,settings);
hgs
parents:
diff changeset
  1022
hgs
parents:
diff changeset
  1023
    TInt cpus(0);
hgs
parents:
diff changeset
  1024
#ifdef __SMP__
hgs
parents:
diff changeset
  1025
    cpus = NKern::NumberOfCpus();
hgs
parents:
diff changeset
  1026
    if( samplerId == PROFILER_GPP_SAMPLER_ID )
hgs
parents:
diff changeset
  1027
        {
hgs
parents:
diff changeset
  1028
        for(TInt cpu(0);cpu<cpus;cpu++)
hgs
parents:
diff changeset
  1029
             {
hgs
parents:
diff changeset
  1030
             iSamplers[cpu]->SetAdditionalSettings2(settings);
hgs
parents:
diff changeset
  1031
             }
hgs
parents:
diff changeset
  1032
        return KErrNone;
hgs
parents:
diff changeset
  1033
        }
hgs
parents:
diff changeset
  1034
#endif
hgs
parents:
diff changeset
  1035
    for(TInt i(cpus);i<KSamplerAmount;i++)
hgs
parents:
diff changeset
  1036
	    {
hgs
parents:
diff changeset
  1037
		if(iSamplers[i]->iSamplerId == samplerId)
hgs
parents:
diff changeset
  1038
		    {
hgs
parents:
diff changeset
  1039
			iSamplers[i]->SetAdditionalSettings2(settings);
hgs
parents:
diff changeset
  1040
			return KErrNone;
hgs
parents:
diff changeset
  1041
		    }
hgs
parents:
diff changeset
  1042
        }
hgs
parents:
diff changeset
  1043
hgs
parents:
diff changeset
  1044
	return KErrNotSupported;	
hgs
parents:
diff changeset
  1045
	}
hgs
parents:
diff changeset
  1046
hgs
parents:
diff changeset
  1047
inline TInt DGeneralsDriver::SetSamplingPeriod(TInt samplerId,TInt settings)
hgs
parents:
diff changeset
  1048
	{
hgs
parents:
diff changeset
  1049
	LOGSTRING2("DGeneralsDriver::SetSamplingPeriod - set:%d",settings);
hgs
parents:
diff changeset
  1050
hgs
parents:
diff changeset
  1051
	TInt cpus(0);
hgs
parents:
diff changeset
  1052
#ifdef __SMP__
hgs
parents:
diff changeset
  1053
    cpus = NKern::NumberOfCpus();
hgs
parents:
diff changeset
  1054
    if( samplerId == PROFILER_GPP_SAMPLER_ID )
hgs
parents:
diff changeset
  1055
        {
hgs
parents:
diff changeset
  1056
        for(TInt cpu(0);cpu<cpus;cpu++)
hgs
parents:
diff changeset
  1057
             {
hgs
parents:
diff changeset
  1058
             iSamplers[cpu]->SetSamplingPeriod(settings);
hgs
parents:
diff changeset
  1059
             }
hgs
parents:
diff changeset
  1060
        return KErrNone;
hgs
parents:
diff changeset
  1061
        }
hgs
parents:
diff changeset
  1062
#endif
hgs
parents:
diff changeset
  1063
    for(TInt i(cpus);i<KSamplerAmount;i++)
hgs
parents:
diff changeset
  1064
	    {
hgs
parents:
diff changeset
  1065
		if(iSamplers[i]->iSamplerId == samplerId)
hgs
parents:
diff changeset
  1066
		    {
hgs
parents:
diff changeset
  1067
			iSamplers[i]->SetSamplingPeriod(settings);
hgs
parents:
diff changeset
  1068
			return KErrNone;
hgs
parents:
diff changeset
  1069
		    }
hgs
parents:
diff changeset
  1070
	    }
hgs
parents:
diff changeset
  1071
hgs
parents:
diff changeset
  1072
	return KErrNotSupported;	
hgs
parents:
diff changeset
  1073
	}
hgs
parents:
diff changeset
  1074
hgs
parents:
diff changeset
  1075
/*
hgs
parents:
diff changeset
  1076
 *	Mark traces active or inactive, this can be done
hgs
parents:
diff changeset
  1077
 *	only if sampling is not running
hgs
parents:
diff changeset
  1078
 */
hgs
parents:
diff changeset
  1079
 
hgs
parents:
diff changeset
  1080
TInt DGeneralsDriver::StartSampling()
hgs
parents:
diff changeset
  1081
	{
hgs
parents:
diff changeset
  1082
	LOGSTRING("DGeneralsDriver::StartSampling");
hgs
parents:
diff changeset
  1083
hgs
parents:
diff changeset
  1084
	if(iState == EStopped)
hgs
parents:
diff changeset
  1085
		{
hgs
parents:
diff changeset
  1086
		// reset iSampleStartTimeProp property value
hgs
parents:
diff changeset
  1087
		iSampleStartTime = NKern::TickCount();	// get the system tick value for sync purposes 
hgs
parents:
diff changeset
  1088
#ifdef __SMP__
hgs
parents:
diff changeset
  1089
		iStartTime = (iSampleStartTime & 0xfffffff0);
hgs
parents:
diff changeset
  1090
#endif
hgs
parents:
diff changeset
  1091
		TInt r(iSampleStartTimeProp.Set(iSampleStartTime));
hgs
parents:
diff changeset
  1092
		
hgs
parents:
diff changeset
  1093
		Kern::Printf(("PIPROF SAMPLE TICK, #0")); // for remote profiling with Profiler Activator
hgs
parents:
diff changeset
  1094
		
hgs
parents:
diff changeset
  1095
		// reset all enabled samplers
hgs
parents:
diff changeset
  1096
		for(TInt i(0);i<KSamplerAmount;i++)
hgs
parents:
diff changeset
  1097
			{
hgs
parents:
diff changeset
  1098
			if(iSamplers[i]->iEnabled)
hgs
parents:
diff changeset
  1099
				{
hgs
parents:
diff changeset
  1100
				// reset with stream option
hgs
parents:
diff changeset
  1101
#ifndef __SMP__
hgs
parents:
diff changeset
  1102
                Kern::Printf(("DGeneralsDriver::StartSampling - stream reset for generals driver, sync offset %d"), 0);
hgs
parents:
diff changeset
  1103
				iSamplers[i]->Reset(&iSampleStream, 0);
hgs
parents:
diff changeset
  1104
#else
hgs
parents:
diff changeset
  1105
                Kern::Printf(("DGeneralsDriver::StartSampling - stream reset for generals driver, start time %d"), iStartTime);
hgs
parents:
diff changeset
  1106
                iSamplers[i]->Reset(&iSampleStream, iStartTime);
hgs
parents:
diff changeset
  1107
#endif
hgs
parents:
diff changeset
  1108
				}
hgs
parents:
diff changeset
  1109
			}
hgs
parents:
diff changeset
  1110
hgs
parents:
diff changeset
  1111
		NewStart(gppSampler.GetPeriod());
hgs
parents:
diff changeset
  1112
		return KErrNone;
hgs
parents:
diff changeset
  1113
		}
hgs
parents:
diff changeset
  1114
	else
hgs
parents:
diff changeset
  1115
		{
hgs
parents:
diff changeset
  1116
		return KErrGeneral;
hgs
parents:
diff changeset
  1117
		}
hgs
parents:
diff changeset
  1118
	}
hgs
parents:
diff changeset
  1119
hgs
parents:
diff changeset
  1120
/*
hgs
parents:
diff changeset
  1121
 *  Mark traces active or inactive, this can be done
hgs
parents:
diff changeset
  1122
 *  only if sampling is not running
hgs
parents:
diff changeset
  1123
 */
hgs
parents:
diff changeset
  1124
 
hgs
parents:
diff changeset
  1125
TInt DGeneralsDriver::StopSampling()
hgs
parents:
diff changeset
  1126
    {
hgs
parents:
diff changeset
  1127
    LOGSTRING("DGeneralsDriver::StopSampling");
hgs
parents:
diff changeset
  1128
hgs
parents:
diff changeset
  1129
    if(iState == ERunning)
hgs
parents:
diff changeset
  1130
        {
hgs
parents:
diff changeset
  1131
        this->iState = EStopping;
hgs
parents:
diff changeset
  1132
        // reset all enabled samplers
hgs
parents:
diff changeset
  1133
        for(TInt i(0);i<KSamplerAmount;i++)
hgs
parents:
diff changeset
  1134
            {
hgs
parents:
diff changeset
  1135
            // do the reset only for memory sampler
hgs
parents:
diff changeset
  1136
            if(iSamplers[i]->iEnabled && iSamplers[i]->iSamplerId == 4)
hgs
parents:
diff changeset
  1137
                {
hgs
parents:
diff changeset
  1138
                // reset with stream option
hgs
parents:
diff changeset
  1139
                LOGTEXT(("DGeneralsDriver::StopSampling - stream reset for samplers"));
hgs
parents:
diff changeset
  1140
                iSamplers[i]->Reset(&iSampleStream, 999999);
hgs
parents:
diff changeset
  1141
                }
hgs
parents:
diff changeset
  1142
            }
hgs
parents:
diff changeset
  1143
hgs
parents:
diff changeset
  1144
        return KErrNone;
hgs
parents:
diff changeset
  1145
        }
hgs
parents:
diff changeset
  1146
    else
hgs
parents:
diff changeset
  1147
        {
hgs
parents:
diff changeset
  1148
        return KErrGeneral;
hgs
parents:
diff changeset
  1149
        }
hgs
parents:
diff changeset
  1150
    }
hgs
parents:
diff changeset
  1151
hgs
parents:
diff changeset
  1152