diff -r 000000000000 -r a41df078684a kerneltest/e32test/nkernsa/arm/armutils.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kerneltest/e32test/nkernsa/arm/armutils.cpp Mon Oct 19 15:55:17 2009 +0100 @@ -0,0 +1,232 @@ +// Copyright (c) 2008-2009 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\nkernsa\arm\armutils.cpp +// +// + +#include +#include + +const TUint32 KPageSize = 0x1000u; + +extern "C" { + +void thread_request_signal(NThread* aThread); + +TUint64 fcf; +TUint32 nfcf; +TUint32 nfcfs; + + +TUint32 round_to_page(TUint32 x) + { + return (x + KPageSize - 1) &~ (KPageSize - 1); + } + + +TLinAddr __initial_stack_base() + { + return __stack_pointer() & ~0xfff; + } + +TInt __initial_stack_size() + { + return 0x1000; + } + +TUint64 fast_counter_freq() + { + return fcf; + } + +TUint32 norm_fast_counter_freq() + { + return nfcf; + } + +void init_fast_counter() + { + NKern::Sleep(30); + TUint64 initial = fast_counter(); + NKern::Sleep(1000); + TUint64 final = fast_counter(); + fcf = final - initial; + TUint64 f = fcf; + nfcfs = 0; + while (f > 2000000) + f>>=1, ++nfcfs; + nfcf = (TUint32)(fcf >> nfcfs); + + DEBUGPRINT("fcf=%lx",fcf); + DEBUGPRINT("nfcf=%d",nfcf); + } + +TInt __microseconds_to_fast_counter(TInt us) + { + TUint64 x = TUint64(TUint32(us)); + x *= fcf; + x += TUint64(500000); + x /= TUint64(1000000); + + return (TInt)x; + } + +TInt __microseconds_to_norm_fast_counter(TInt us) + { + TUint64 x = TUint64(TUint32(us)); + x *= nfcf; + x += TUint64(500000); + x /= TUint64(1000000); + + return (TInt)x; + } + +void nfcfspin(TUint32 aTicks) + { + TUint64 ticks = aTicks; + ticks <<= nfcfs; + fcfspin(ticks); + } + +void fcfspin(TUint64 aTicks) + { + TUint64 t0 = fast_counter(); + TUint64 t1; + do { + t1 = fast_counter(); + t1 -= t0; + } while (t1 + +void TickTimerFn(TAny*); +NFastSemaphore TTSem; + +void TTIDfcFn(TAny*) + { + TTSem.Signal(); + } + +TDfc TTIDfc(&TTIDfcFn,0); +NTimer TickTimer(&TickTimerFn,0); +volatile TInt State=0; +volatile TInt Cycle=0; +volatile TInt WC[1024]; +volatile TInt WCI=0; + +void TickTimerFn(TAny* aPtr) + { + ArmLocalTimer& T = LOCAL_TIMER; + TInt c = (TInt)T.iWatchdogCount; + WC[WCI++]=c; + if (c<0) + { + if (++State==3) + { + if (++Cycle==3) + { + TTIDfc.Add(); + return; + } + T.iWatchdogCount = 1900000u; + State = 0; + } + } + TickTimer.Again(1); + } + +void DoWatchdogTimerTest() + { + NKern::FSSetOwner(&TTSem, NKern::CurrentThread()); + ArmLocalTimer& T = LOCAL_TIMER; + T.iWatchdogLoad = KMaxTUint32; + T.iWatchdogCount = 2097152; + T.iWatchdogIntStatus = 1; + __e32_io_completion_barrier(); + T.iWatchdogCtrl = 3; + __e32_io_completion_barrier(); + TickTimer.OneShot(1); + NKern::FSWait(&TTSem); + TInt i; + for (i=0; i