kerneltest/e32test/power/t_frqchg.cpp
branchRCL_3
changeset 257 3e88ff8f41d5
parent 256 c1f20ce4abcf
child 258 880ff05ad710
child 263 9e2d4f7f5028
--- a/kerneltest/e32test/power/t_frqchg.cpp	Tue Aug 31 16:34:26 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,775 +0,0 @@
-// Copyright (c) 2010-2010 Nokia Corporation and/or its subsidiary(-ies).
-// All rights reserved.
-// This component and the accompanying materials are made available
-// under the terms of the License "Eclipse Public License v1.0"
-// which accompanies this distribution, and is available
-// at the URL "http://www.eclipse.org/legal/epl-v10.html".
-//
-// Initial Contributors:
-// Nokia Corporation - initial contribution.
-//
-// Contributors:
-//
-// Description:
-// e32test\power\t_frqchg.cpp
-//
-//
-
-#define __E32TEST_EXTENSION__
-#include <e32test.h>
-#include <e32math.h>
-#include <e32atomics.h>
-#include <hal.h>
-#include "d_frqchg.h"
-#include <e32svr.h>
-#include "u32std.h"
-
-RFrqChg Driver;
-RTest test(_L("T_FRQCHG"));
-
-// test will fail if slice is > (expected+KSliceDeltaPercent%of expexted) 
-// or < (expected-KSliceDeltaPercent%expected)
-const TInt KSliceDeltaPercent = 5;   
-// test will fail for global timer based timestamps if interval measured 
-// is > (expected+KTimeStampDeltaPercent%of expexted) 
-// or < (expected-KTimeStampDeltaPercent%expected)
-const TInt KTimeStampDeltaPercent = 5;
-
-TInt RealToRatio(SRatio& aRatio, const TRealX& aReal)
-	{
-	aRatio.iSpare1 = 0;
-	aRatio.iSpare2 = 0;
-	if (aReal.iSign || aReal.IsZero() || aReal.IsNaN())
-		{
-		aRatio.iM = 0;
-		aRatio.iX = 0;
-		return (aReal.IsZero()) ? KErrNone : KErrNotSupported;
-		}
-	TRealX rx(aReal);
-	TRealX rr(rx);
-	rr.iExp -= 32;
-	rr.iMantLo = 0;
-	rr.iMantHi = 0x80000000u;
-	rx += rr;	// rounding
-	TInt exp = rx.iExp - 32767 - 31;
-	if (exp < -32768)
-		{
-		aRatio.iM = 0;
-		aRatio.iX = 0;
-		return KErrUnderflow;
-		}
-	if (exp > 32767)
-		{
-		aRatio.iM = 0xffffffffu;
-		aRatio.iX = 32767;
-		return KErrOverflow;
-		}
-	aRatio.iM = rx.iMantHi;
-	aRatio.iX = (TInt16)exp;
-	return KErrNone;
-	}
-
-TInt RatioToReal(TRealX& a, const SRatio& aRatio)
-	{
-	a.iSign = 0;
-	a.iFlag = 0;
-	a.iMantLo = 0;
-	a.iMantHi = aRatio.iM;
-	if (!aRatio.iM)
-		{
-		a.SetZero();
-		return KErrNone;
-		}
-	TInt exp = aRatio.iX + 31 + 32767;
-	if (exp > 65534)
-		{
-		a.SetInfinite(EFalse);
-		}
-	else
-		{
-		a.iExp = (TUint16)exp;
-		}
-	return KErrNone;
-	}
-
-TInt RatioSetValue(TRealX& a, TUint32 aInt, TInt aDivisorExp)
-	{
-	a.Set(TUint(aInt));
-	TInt exp = a.iExp;
-	exp -= aDivisorExp;
-	if (exp<1)
-		{
-		a.SetZero();
-		return KErrUnderflow;
-		}
-	if (exp>65534)
-		{
-		a.SetInfinite(EFalse);
-		return KErrOverflow;
-		}
-	a.iExp = (TInt16)exp;
-	return KErrNone;
-	}
-
-TInt RatioReciprocal(SRatio& aRatio)
-	{
-	TRealX rx;
-	TInt r = RatioToReal(rx, aRatio);
-	if (r != KErrNone)
-		return r;
-	rx = TRealX(1) / rx;
-	return RealToRatio(aRatio, rx);
-	}
-
-TInt RatioMult(const SRatio& aRatio, TUint32& aInt32)
-	{
-	TRealX rx;
-	TInt r = RatioToReal(rx, aRatio);
-	if (r != KErrNone)
-		return r;
-	r = rx.MultEq(TRealX((TUint)aInt32));
-	if (r != KErrNone)
-		return r;
-	if (rx.IsZero())
-		{
-		aInt32 = 0;
-		return KErrNone;
-		}
-	rx.AddEq(TRealX(0.5));
-	if (rx<TRealX(1))
-		{
-		aInt32 = 0;
-		return KErrUnderflow;
-		}
-	if (rx.iExp > 32767+31)
-		{
-		aInt32 = ~0u;
-		return KErrOverflow;
-		}
-	aInt32 = rx.operator TUint();
-	return KErrNone;
-	}
-
-void RatioPrint(const char* aTitle, const SRatio& aRatio)
-	{
-	TPtrC8 t8((const TUint8*)aTitle);
-	TBuf<256> t16;
-	t16.Copy(t8);
-	test.Printf(_L("%S: %08x %04x\n"), &t16, aRatio.iM, TUint16(aRatio.iX));
-	}
-
-void RatioPrint2(const char* aTitle, const SRatio& aR1, const SRatio& aR2)
-	{
-	TPtrC8 t8((const TUint8*)aTitle);
-	TBuf<256> t16;
-	t16.Copy(t8);
-	test.Printf(_L("%S: %08x %04x   %08x %04x\n"), &t16, aR1.iM, TUint16(aR1.iX), aR2.iM, TUint16(aR2.iX));
-	}
-
-void TestEqual(const SRatio& aActual, const SRatio& aExpected)
-	{
-	if (aActual.iM==aExpected.iM && aActual.iX==aExpected.iX)
-		return;
-	RatioPrint("Actual", aActual);
-	RatioPrint("Expected", aExpected);
-	test(0);
-	}
-
-const TUint32 MultTestIntegers[] =
-	{
-	0u, 1u, 2u, 3u, 5u, 7u, 11u, 13u, 17u, 19u, 23u, 29u, 31u, 37u, 41u, 43u, 47u,
-	50u, 51u, 53u, 59u, 61u, 63u, 67u, 71u, 72u, 81u, 100u, 127u, 133u, 187u, 200u,
-	4u, 8u, 16u, 32u, 64u, 128u, 256u, 512u, 1024u, 2048u, 4096u, 8192u, 16384u,
-	32768u, 65536u, 131072u, 262144u, 524288u, 1048576u, 2097152u, 4194304u, 8388608u,
-	16777216u, 33554432u, 67108864u, 134217728u, 268435456u, 536870912u, 1073741824u,
-	2147483648u, 4294967295u,
-	9u, 27u, 243u, 729u, 2187u, 6561u, 19683u, 59049u, 177147u, 531441u, 1594323u,
-	4782969u, 14348907u, 43046721u, 129140163u, 387420489u, 1162261467u, 3486784401u,
-	25u, 125u, 625u, 3125u, 15625u, 78125u, 390625u, 1953125u, 9765625u,
-	48828125u, 244140625u, 1220703125u,
-	49u, 343u, 2401u, 16807u, 117649u, 823543u, 5764801u, 40353607u, 282475249u, 1977326743u
-	};
-
-void Test1M(const SRatio& aRatio)
-	{
-	SRatio ratio = aRatio;
-	const TInt N = sizeof(MultTestIntegers)/sizeof(MultTestIntegers[0]);
-	test.Printf(_L("Testing %d integers\n"), N);
-	TInt i;
-	for (i=0; i<N; ++i)
-		{
-		TUint32 I = MultTestIntegers[i];
-		TUint32 I0 = I;
-		TUint32 I1 = I;
-		TInt r0 = RatioMult(aRatio, I0);
-		TInt r1 = Driver.RatioMult(ratio, I1);
-		if (r0!=KErrNone || r1!=KErrNone)
-			{
-			if (r0!=r1)
-				{
-				test.Printf(_L("Return code mismatch r0=%d r1=%d (I=%08x I0=%08x I1=%08x)\n"), r0, r1, I, I0, I1);
-				test(0);
-				}
-			}
-		else if (I0!=I1)
-			{
-			test.Printf(_L("Result mismatch I=%08x I0=%08x I1=%08x\n"), I, I0, I1);
-			}
-		}
-	}
-
-void Test1(TUint32 aInt, TInt aDivisorExp)
-	{
-	TRealX realx;
-	SRatio r0x;
-	SRatio r0;
-	SRatio r1x;
-	SRatio r1;
-	TInt r;
-	test.Printf(_L("Test1 %08x %d\n"), aInt, aDivisorExp);
-	r = RatioSetValue(realx, aInt, aDivisorExp);
-	test_KErrNone(r);
-	r = RealToRatio(r0x, realx);
-	test_KErrNone(r);
-	r = Driver.RatioSet(r0, aInt, aDivisorExp);
-	RatioPrint2("R0X,R0", r0x, r0);
-	TestEqual(r0, r0x);
-	Test1M(r0);
-	r1x = r0x;
-	r = RatioReciprocal(r1x);
-	test_KErrNone(r);
-	r1 = r0;
-	r = Driver.RatioReciprocal(r1);
-	test_KErrNone(r);
-	RatioPrint2("R1X,R1", r1x, r1);
-	TestEqual(r1, r1x);
-	Test1M(r1);
-	}
-
-void TestRatios()
-	{
-	Test1(1,0);
-	Test1(3,0);
-	Test1(0xb504f334u,32);
-	Test1(0xc90fdaa2u,30);
-	Test1(10,0);
-	Test1(0xcccccccd,35);
-	Test1(100,0);
-	Test1(0xa3d70a3d,38);
-	}
-
-class CircBuf
-	{
-public:
-	static CircBuf* New(TInt aSlots);
-	CircBuf();
-	~CircBuf();
-	TInt TryPut(TUint32 aIn);
-	void Reset();
-public:
-	volatile TUint32* iBufBase;
-	TUint32 iSlotCount;
-	volatile TUint32 iPutIndex;
-	};
-
-CircBuf* CircBuf::New(TInt aSlots)
-	{
-	test(TUint32(aSlots-1)<65536);
-	CircBuf* p = new CircBuf();
-	p->iSlotCount = aSlots;
-	p->iPutIndex = 0;
-	p->iBufBase = (TUint32*)User::Alloc(aSlots*sizeof(TUint32));
-	if (!p->iBufBase)
-		{
-		delete p;
-		p = 0;
-		}
-	__e32_memory_barrier();
-	return p;
-	}
-
-CircBuf::CircBuf()
-	{
-	iBufBase = 0;
-	}
-
-CircBuf::~CircBuf()
-	{
-	User::Free((TAny*)iBufBase);
-	}
-
-TInt CircBuf::TryPut(TUint32 aIn)
-	{
-	TUint32 orig = __e32_atomic_tau_rlx32(&iPutIndex, iSlotCount, 0, 1);
-	if (orig == iSlotCount)
-		return KErrOverflow;
-	iBufBase[orig] = aIn;
-	return KErrNone;
-	}
-
-void CircBuf::Reset()
-	{
-	__e32_atomic_store_ord32(&iPutIndex, 0);
-	}
-
-
-
-class CTimesliceTestThread : public CBase
-	{
-public:
-	CTimesliceTestThread();
-	~CTimesliceTestThread();
-	static CTimesliceTestThread* New(TUint32 aId, TInt aCpu, TInt aSlice, CircBuf* aBuf);
-	void Start();
-	void Wait();
-	TBool Finished();
-	TInt Construct(TUint32 aId, TInt aCpu, TInt aSlice, CircBuf* aBuf);
-	static TInt ThreadFunc(TAny*);
-public:
-	RThread	iThread;
-	TRequestStatus iExitStatus;
-	TUint32 iId;
-	CircBuf* iBuf;
-	TUint32 iFreq;
-	TUint32 iThresh;
-	TUint32 iThresh2;
-	TInt iCpu;
-	TInt iSlice;
-	};
-
-CTimesliceTestThread::CTimesliceTestThread()
-	{
-	iThread.SetHandle(0);
-	}
-
-CTimesliceTestThread::~CTimesliceTestThread()
-	{
-	if (iThread.Handle())
-		{
-		if (iThread.ExitType() == EExitPending)
-			{
-			iThread.Kill(0);
-			Wait();
-			}
-		CLOSE_AND_WAIT(iThread);
-		}
-	}
-
-TInt CTimesliceTestThread::Construct(TUint32 aId, TInt aCpu, TInt aSlice, CircBuf* aBuf)
-	{
-	iId = aId;
-	iCpu = aCpu;
-	iSlice = aSlice;
-	iBuf = aBuf;
-
-	TInt r = HAL::Get(HAL::EFastCounterFrequency, (TInt&)iFreq);
-	if (r!=KErrNone)
-		return r;
-	iThresh = iFreq / 3000;
-	if (iThresh < 10)
-		iThresh = 10;
-	iThresh2 = iFreq;
-	TBuf<16> name = _L("TSThrd");
-	name.AppendNum(iId);
-	r = iThread.Create(name, &ThreadFunc, 0x1000, NULL, this);
-	if (r!=KErrNone)
-		return r;
-	iThread.Logon(iExitStatus);
-	if (iExitStatus != KRequestPending)
-		{
-		iThread.Kill(0);
-		iThread.Close();
-		iThread.SetHandle(0);
-		return iExitStatus.Int();
-		}
-	return KErrNone;
-	}
-
-CTimesliceTestThread* CTimesliceTestThread::New(TUint32 aId, TInt aCpu, TInt aSlice, CircBuf* aBuf)
-	{
-	CTimesliceTestThread* p = new CTimesliceTestThread;
-	if (p)
-		{
-		TInt r = p->Construct(aId, aCpu, aSlice, aBuf);
-		if (r != KErrNone)
-			{
-			delete p;
-			p = 0;
-			}
-		}
-	return p;
-	}
-
-void CTimesliceTestThread::Start()
-	{
-	iThread.Resume();
-	}
-
-TBool CTimesliceTestThread::Finished()
-	{
-	return (KRequestPending!=iExitStatus.Int());
-	}
-
-void CTimesliceTestThread::Wait()
-	{
-	User::WaitForRequest(iExitStatus);
-	}
-
-TInt CTimesliceTestThread::ThreadFunc(TAny* aPtr)
-	{
-	CTimesliceTestThread& a = *(CTimesliceTestThread*)aPtr;
-	Driver.SetCurrentThreadCpu(a.iCpu);
-	Driver.SetCurrentThreadPriority(63);
-	Driver.SetCurrentThreadTimeslice(a.iSlice);
-	User::AfterHighRes(100000);
-	TUint id = a.iId;
-	TUint32 last_interval_begin = User::FastCounter();
-	TUint32 last_seen_time = User::FastCounter();
-	FOREVER
-		{
-		TUint32 nfc = User::FastCounter();
-		TUint32 delta = nfc - last_seen_time;
-		TUint32 interval_length = last_seen_time - last_interval_begin;
-		if (delta > a.iThresh || interval_length > a.iThresh2)
-			{
-			last_interval_begin = nfc;
-			TUint32 x = (id<<30) | (interval_length&0x3fffffffu);
-			TInt r = a.iBuf->TryPut(x);
-			if (r != KErrNone)
-				break;
-			}
-		last_seen_time = nfc;
-		}
-	return KErrNone;
-	}
-
-CircBuf* RunTimesliceTest(TInt aCpu, TInt aSlice, TInt aCount, TInt aInterfere = 0)
- 	{
-	TUint32 oldaff = 0;
-	TUint32 interfereAffinity = 0; 
-	TUint tellKernel = 0x80000000u;
-	
-	CircBuf* buf = CircBuf::New(aCount);
-	test(buf != 0);
-	CTimesliceTestThread* t0 = CTimesliceTestThread::New(0, aCpu, aSlice, buf);
-	test(t0 != 0);
-	CTimesliceTestThread* t1 = CTimesliceTestThread::New(1, aCpu, aSlice, buf);
-	test(t1 != 0);
-
-	if (aInterfere) 
-		{
-		if (aInterfere < 0) 
-			{
-			tellKernel = 0;
-			}
-		TInt r = UserSvr::HalFunction(EHalGroupKernel, EKernelHalNumLogicalCpus, 0, 0);
-		test(r>0);
-		interfereAffinity = (0x80000000 | ((0x1<<r)-1)) & ~0x2; // all except core 1
-		if (0x80000001 == interfereAffinity) 
-			{
-			interfereAffinity = 0;   // dual core system (not doing this fails affinity check later)
-			}
-		
-		Driver.SetCurrentThreadCpu(interfereAffinity , &oldaff);   // move away from core 1 (doesn't hurt though not much difference gained)
-		Driver.SetCurrentThreadPriority(63);                       // changing prescaler requires running on core 1 so priority needs to 
-		}                                                          // match test threads
-
-
-	t0->Start();
-	t1->Start();
-	if (aInterfere) 
-		{
-		TInt prescale = 1;
-		while (!t0->Finished() || !t1->Finished()) 
-			{
-			User::AfterHighRes(23000);
-			Driver.SetLocalTimerPrescaler((1u<<1)|tellKernel, prescale);
-			prescale++;
-			if (prescale >  4) 
-				{
-				prescale = 0;
-				}
-			}
-		}
-
-	t0->Wait();
-	t1->Wait();
-	
-	delete t0;
-	delete t1;
-	if (aInterfere) 
-		{
-		TUint32 aff;
-		Driver.SetLocalTimerPrescaler((1u<<1)|0x80000000u, -1);
-		RThread().SetPriority(EPriorityNormal);
-		Driver.SetCurrentThreadCpu(oldaff,&aff);
-		test_Equal(aff,interfereAffinity);
-		}
-	return buf;
-	}
-
-TUint32 ticks_to_us(TUint32 aTicks, TUint32 aF)
-	{
-	TUint64 x = TUint64(aTicks) * TUint64(1000000);
-	TUint64 f64 = aF;
-	x += (f64>>1);
-	x /= f64;
-	return I64LOW(x);
-	}
-
-void DisplayBuffer(CircBuf* aBuf, TUint32 aSlice )
-	{
-	TUint32 f;
-	TInt r = HAL::Get(HAL::EFastCounterFrequency, (TInt&)f);
-	test_KErrNone(r);
-	TUint32* p = (TUint32*)aBuf->iBufBase;
-	TInt c = aBuf->iSlotCount;
-	TInt i;
-	TInt lid = -1;
-	TUint32 min = ~0u;
-	TUint32 max = 0;
-	TUint32 totivus = 0;
-	TBool firstchg = ETrue;
-	for (i=0; i<c; ++i)
-		{
-		TUint32 x = p[i];
-		TUint32 id = x>>30;
-		TUint32 iv = (x<<2)>>2;
-		TUint32 ivus = ticks_to_us(iv,f);
-		if (lid >= 0)
-			{
-			if (lid == (TInt)id)
-				totivus += ivus;
-			else
-				{
-				if (!firstchg)
-					{
-					if (totivus < min)
-						min = totivus;
-					if (totivus > max)
-						max = totivus;
-					}
-				else
-					firstchg = EFalse;
-				totivus = ivus;
-				}
-			}
-		lid = (TInt)id;
-		test.Printf(_L("ID: %1d IV: %10d (=%10dus) TIV %10dus\n"), id, iv, ivus, totivus);
-		}
-
-	if (aSlice > 0)
-		{
-		// check timeslices where within acceptable ranges
-		TUint32 sliceError = KSliceDeltaPercent*aSlice/100;
-		test_Compare(max,<,aSlice+sliceError);  
-		test_Compare(min,>,aSlice-sliceError);  
-		}
-	test.Printf(_L("RANGE %d-%dus (%dus)\n"), min, max, max-min);
-	}
-
-void TT()
-	{
-	test.Printf(_L("Timeslicing test ...\n"));
-	CircBuf* b = RunTimesliceTest(1, 50000, 100);
-	test.Next(_L("Baseline - expecting normal"));
-	DisplayBuffer(b,50000u);
-	delete b;
-
-	Driver.SetLocalTimerPrescaler(1u<<1, 1);
-	b = RunTimesliceTest(1, 50000, 100);
-	test.Next(_L("expecting double"));
-	DisplayBuffer(b,100000u);
-	delete b;
-
-	Driver.SetLocalTimerPrescaler(1u<<1|0x80000000u, 1);
-	test.Next(_L("expecting normal again"));
-	b = RunTimesliceTest(1, 50000, 100);
-	DisplayBuffer(b,50000u);
-	delete b;
-
-	test.Next(_L("expecting half"));
-	Driver.SetLocalTimerPrescaler(1u<<1, -1);
-	b = RunTimesliceTest(1, 50000, 100);
-	DisplayBuffer(b,25000u);
-	delete b;
-
-	Driver.SetLocalTimerPrescaler(1u<<1|0x80000000u, -1);
-	test.Next(_L("expecting normal again"));
-	b = RunTimesliceTest(1, 50000, 100);
-	DisplayBuffer(b,50000u);
-	delete b;
-
-	b = RunTimesliceTest(1, 50000, 200 ,-1);
-	test.Next(_L("expecting random"));
-	DisplayBuffer(b,0u);  // timeslices should be fairly random on this run
-
-	b = RunTimesliceTest(1, 50000, 200 ,1);
-	test.Next(_L("expecting normal again"));
-	DisplayBuffer(b,50000u);
-	delete b;
-	}
-
-struct SGTRecord
-	{
-	TUint64 iTSInterval;
-	TUint64 iGTInterval;
-	};
-
-
-SGTRecord* RunGTTest(TInt aCount, TInt aWait)
-	{
-	TUint64 lastgt,lastts,gt,ts;
-
-	SGTRecord* res = new SGTRecord[aCount];
-	test(res!=0);
-
-
-	TInt r = Driver.ReadGlobalTimerAndTimestamp(lastgt,lastts);
-	test_Equal(r,KErrNone);
-
-	for (TInt i = 0; i < aCount; i++) 
-		{
-		User::AfterHighRes(aWait);
-		
-		TInt r = Driver.ReadGlobalTimerAndTimestamp(gt,ts);
-		test_Equal(r,KErrNone);
-		res[i].iGTInterval = gt-lastgt;
-		lastgt = gt;
-		res[i].iTSInterval = ts-lastts;
-		lastts = ts;
-		}
-
-	return res;
-	}
-
-void DisplayGTResults(SGTRecord* aRec, TInt aCount, TUint32 aFreq, TUint64 aExpectedTSInterval, TUint64 aExpectedGTInterval)
-	{
-	SGTRecord max = { 0ul , 0ul };
-	SGTRecord min = { KMaxTUint64 , KMaxTUint64 };
-	
-	TUint64 errgt = (aExpectedGTInterval*KTimeStampDeltaPercent)/100;
-	TUint64 errts = (aExpectedTSInterval*KTimeStampDeltaPercent)/100;
-
-	
-	for (TInt i = 0 ; i < aCount; i++) 
-		{
-		test.Printf(_L("gt interval : %Lu (gtticks) %Lu (us)\n"),
-					aRec[i].iGTInterval,
-					aRec[i].iTSInterval*1000000u/TUint64(aFreq));
-		
-		if (max.iTSInterval < aRec[i].iTSInterval) 
-			{
-			max.iTSInterval = aRec[i].iTSInterval;
-			}
-		if (max.iGTInterval < aRec[i].iGTInterval) 
-			{
-			max.iGTInterval = aRec[i].iGTInterval;
-			}
-		
-		if (min.iTSInterval > aRec[i].iTSInterval) 
-			{
-			min.iTSInterval = aRec[i].iTSInterval;
-			}
-		if (min.iGTInterval > aRec[i].iGTInterval) 
-			{
-			min.iGTInterval = aRec[i].iGTInterval;
-			}
-		}
-	
-	test.Printf(_L("RANGE Global Timer %Lu-%Lu ticks (%Lu ticks)\n"),
-				min.iGTInterval, max.iGTInterval, max.iGTInterval-min.iGTInterval);
-	
-	test.Printf(_L("RANGE Timestamp %Lu-%Lu us (%Lu us)\n"),
-				(1000000u*min.iGTInterval)/TUint64(aFreq), (1000000u*max.iGTInterval)/TUint64(aFreq),
-				(1000000u*max.iGTInterval)/TUint64(aFreq) - (1000000u*min.iGTInterval)/TUint64(aFreq));
-	
-	if (errts) 
-		{
-		test_Compare(max.iTSInterval,<,aExpectedTSInterval+errts);  
-		test_Compare(min.iTSInterval,>,aExpectedTSInterval);  
-		}
-	
-	if (errgt) 
-		{
-		test_Compare(max.iGTInterval,<,aExpectedGTInterval+errgt);  
-		test_Compare(min.iGTInterval,>,aExpectedGTInterval);  
-		}
-	
-	}
-
-void GTT()
-	{
-	test.Printf(_L("Global timer tests ...\n"));
-	TUint64 gt,ts;
-
-	TInt r = Driver.ReadGlobalTimerAndTimestamp(gt,ts);
-	if (KErrNotSupported == r ) 
-		{
-		test.Printf(_L("Global timer not supported in this plaform, skipping GT tests\n"));
-		return;
-		}
-
-	TUint32 f;
-	r = HAL::Get(HAL::EFastCounterFrequency, (TInt&)f);
-	test_KErrNone(r);
-	TInt wait = 100000; // 100ms
-	TInt count = 10;
-	
-	TUint64 expectedTs = (TUint64(f)*TUint64(wait))/1000000u;
-	TUint64 expectedGtOrig = expectedTs;
-	
-	SGTRecord* rec;
-	for (TInt i = 0; i < 10; i++)
-		{
-		TUint64 expectedGt = expectedGtOrig/(i+1);
-		r = Driver.SetGlobalTimerPrescaler(i);
-		test_KErrNone(r);
-		rec = RunGTTest(count, wait);
-		test.Printf(_L("expectedTS %Lu expectedGT %Lu\n"),expectedTs,expectedGt);
-		DisplayGTResults(rec,count, f, expectedTs , expectedGt);
-		delete rec;
-		}
-
-	r = Driver.SetGlobalTimerPrescaler(-1); // back to default
-	test_KErrNone(r);
-	}
-
-void RunTests()
-	{
-	TestRatios();
-	if (Driver.FrqChgTestPresent()!=KErrNone)
-		{
-		test.Printf(_L("Frequency Change not supported on this platform\n"));
-		return;
-		}
-	TT();
-	GTT();
-	}
-
-GLDEF_C TInt E32Main()
-	{
-	test.Title();
-	test.Start(_L("Testing"));
-	TInt r = User::LoadLogicalDevice(KLddName);
-	if (r==KErrNotFound)
-		{
-		test.Printf(_L("Test not supported on this platform\n"));
-		}
-	else 
-		{
-		if (r!=KErrNone)
-			{
-			test_Equal(KErrAlreadyExists, r);
-			}
-		r = Driver.Open();
-		test_KErrNone(r);
-		RunTests();
-		Driver.Close();
-		}
-
-	test.End();
-	r = User::FreeLogicalDevice(KLddName);
-	test_KErrNone(r);
-	return KErrNone;
-	}