os/kernelhwsrv/kerneltest/e32test/bench/d_kernasmbm.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     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 	}