kerneltest/e32test/bench/d_kernasmbm.cpp
changeset 0 a41df078684a
equal deleted inserted replaced
-1:000000000000 0:a41df078684a
       
     1 // Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of the License "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 // e32test\bench\d_kernasmbm.cpp
       
    15 // Device driver providing benchmarking for assmblerised kernel routines
       
    16 // 
       
    17 //
       
    18 
       
    19 #include <kernel/kern_priv.h>
       
    20 #include <kernel/cache.h>
       
    21 #include "d_kernasmbm.h"
       
    22 #include "d_kernbm.h"
       
    23 
       
    24 RPointerArray<TKernelBenchmark> KernelBenchmarks;
       
    25 
       
    26 // TKernelBenchmark ////////////////////////////////////////////////////////////
       
    27 
       
    28 TKernelBenchmark::TKernelBenchmark(const TDesC8& aName)
       
    29 	{
       
    30 	iInfo.iName = aName;
       
    31 	iInfo.iCategories = KCategoryGeneral;
       
    32 	iInfo.iAlignStep = 0;
       
    33 	KernelBenchmarks.Append(this);  // Ignores rc
       
    34 	}
       
    35 
       
    36 TKernelBenchmark::TKernelBenchmark(const TDesC8& aName, TInt aAlignStep)
       
    37 	{
       
    38 	iInfo.iName = aName;
       
    39 	iInfo.iCategories = KCategoryGeneral | KCategoryMemory;
       
    40 	iInfo.iAlignStep = aAlignStep;
       
    41 	KernelBenchmarks.Append(this);  // Ignores rc
       
    42 	}
       
    43 
       
    44 const TBmInfo& TKernelBenchmark::Info() const
       
    45 	{
       
    46 	return iInfo;
       
    47 	}
       
    48 
       
    49 TInt TKernelBenchmark::Run(const TBmParams& aParams, TInt& aResult)
       
    50 	{
       
    51 	TUint init, final;
       
    52 	init = NKern::FastCounter();
       
    53 	DoRun(aParams);
       
    54 	final = NKern::FastCounter();
       
    55 	aResult = final - init;
       
    56 	return KErrNone;
       
    57 	}
       
    58 
       
    59 // TThreadedBenchmark //////////////////////////////////////////////////////////
       
    60 
       
    61 TThreadedBenchmark::TThreadedBenchmark(const TDesC8& aName, TInt aRelPri) :
       
    62 	TKernelBenchmark(aName), iRelPri(aRelPri)
       
    63 	{
       
    64 	}
       
    65 
       
    66 TInt TThreadedBenchmark::Run(const TBmParams& aParams, TInt& aResult)
       
    67 	{
       
    68 	iIts = aParams.iIts;
       
    69 	iThread1 = &Kern::CurrentThread();
       
    70 
       
    71 	SThreadCreateInfo info;
       
    72 	info.iType=EThreadSupervisor;
       
    73 	info.iFunction=Thread2Func;
       
    74 	info.iPtr=this;
       
    75 	info.iSupervisorStack=NULL;
       
    76 	info.iSupervisorStackSize=0;	// zero means use default value
       
    77 	info.iInitialThreadPriority=iThread1->iNThread.iPriority + iRelPri;
       
    78 	info.iName.Set(_L("bmthread"));
       
    79 	info.iTotalSize = sizeof(info);
       
    80 	
       
    81 	NKern::ThreadEnterCS();
       
    82 	TInt r = Kern::ThreadCreate(info);
       
    83 	NKern::ThreadLeaveCS();
       
    84 	if (r != KErrNone)
       
    85 		return r;
       
    86 
       
    87 	iThread2 = (DThread*)info.iHandle;
       
    88 
       
    89 	return TKernelBenchmark::Run(aParams, aResult);
       
    90 	}
       
    91 
       
    92 TInt TThreadedBenchmark::Thread2Func(TAny* aPtr)
       
    93 	{
       
    94 	TThreadedBenchmark* self = (TThreadedBenchmark*)aPtr;
       
    95 	self->DoRun2(self->iIts);
       
    96 	return KErrNone;
       
    97 	}
       
    98 
       
    99 // Device driver implementation ////////////////////////////////////////////////
       
   100 
       
   101 class DKernAsmBmFactory : public DLogicalDevice
       
   102 	{
       
   103 public:
       
   104 	virtual TInt Install();						//overriding pure virtual
       
   105 	virtual void GetCaps(TDes8& aDes) const;	//overriding pure virtual
       
   106 	virtual TInt Create(DLogicalChannelBase*& aChannel);
       
   107 	};
       
   108 
       
   109 class DKernAsmBm : public DLogicalChannel
       
   110 	{
       
   111 public:
       
   112 	virtual ~DKernAsmBm();
       
   113 	virtual TInt DoCreate(TInt aUnit, const TDesC8* anInfo, const TVersion& aVer);
       
   114 	virtual TInt Request(TInt aFunction, TAny* a1, TAny* a2);
       
   115 	virtual void HandleMsg(TMessageBase *aMsg);
       
   116 	};
       
   117 
       
   118 TInt DKernAsmBmFactory::Install()
       
   119     {
       
   120     return(SetName(&KKernAsmBmLddName));
       
   121     }
       
   122 
       
   123 void DKernAsmBmFactory::GetCaps(TDes8& /*aDes*/) const
       
   124     {
       
   125     }
       
   126 
       
   127 TInt DKernAsmBmFactory::Create(DLogicalChannelBase*& aChannel)
       
   128 	{
       
   129 	aChannel = new DKernAsmBm;
       
   130 	if(!aChannel)
       
   131 		return KErrNoMemory;
       
   132 	return KErrNone;
       
   133 	}
       
   134 
       
   135 DECLARE_STANDARD_LDD()
       
   136 	{
       
   137     return new DKernAsmBmFactory;
       
   138     }
       
   139 
       
   140 DKernAsmBm::~DKernAsmBm()
       
   141 	{
       
   142 	CloseData();
       
   143 	}
       
   144 
       
   145 TInt DKernAsmBm::DoCreate(TInt /*aUnit*/, const TDesC8* /*anInfo*/, const TVersion& /*aVer*/)
       
   146     {
       
   147 	return InitData();
       
   148 	}
       
   149 
       
   150 TInt DKernAsmBm::Request(TInt aFunction, TAny* a1, TAny* a2)
       
   151     {
       
   152 	TInt index = aFunction >> 8;
       
   153 	aFunction &= 0xff;
       
   154 	
       
   155 	if (aFunction != RKernAsmBmLdd::ECount && (index < 0 || index >= KernelBenchmarks.Count()))
       
   156 		return KErrArgument;
       
   157 
       
   158 	switch (aFunction)
       
   159 		{
       
   160 		case RKernAsmBmLdd::ECount:
       
   161 			return KernelBenchmarks.Count();
       
   162 			
       
   163 		case RKernAsmBmLdd::EInfo:
       
   164 			{
       
   165 			TPckgC<TBmInfo> info(KernelBenchmarks[index]->Info());
       
   166 			return Kern::ThreadDesWrite(&Kern::CurrentThread(), a1, info, 0, 0, NULL);
       
   167 			}
       
   168 			
       
   169 		case RKernAsmBmLdd::ERun:
       
   170 			{
       
   171 			TPckgBuf<TBmParams> params;
       
   172 			Kern::ThreadDesRead(&Kern::CurrentThread(), a1, params, 0, 0);			
       
   173 			UserPtr = (TUint8*)ALIGN_ADDR(a2);
       
   174 			
       
   175 			TInt delta;
       
   176 			TInt r = KernelBenchmarks[index]->Run(params(), delta);
       
   177 			if (r == KErrNone)
       
   178 				r = Kern::ThreadRawWrite(&Kern::CurrentThread(), a2, &delta, sizeof(TInt));
       
   179 			return r;
       
   180 			}
       
   181 
       
   182 		default:
       
   183 			return KErrArgument;
       
   184 		}
       
   185 	}
       
   186 
       
   187 void DKernAsmBm::HandleMsg(TMessageBase* /*aMsg*/)
       
   188 	{
       
   189 	}