sl@0: // Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of the License "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // LDD for testing nanokernel debug trace bits sl@0: // sl@0: // sl@0: sl@0: //#undef __REMOVE_PLATSEC_DIAGNOSTICS__ sl@0: #include "platform.h" sl@0: #include sl@0: #include "u32std.h" sl@0: #include "d_kern_msg.h" sl@0: sl@0: sl@0: const TInt KMajorVersionNumber=0; sl@0: const TInt KMinorVersionNumber=1; sl@0: const TInt KBuildVersionNumber=1; sl@0: sl@0: class DKernMsgTestFactory : public DLogicalDevice sl@0: // sl@0: // Kernel msg test LDD factory sl@0: // sl@0: { sl@0: public: sl@0: DKernMsgTestFactory(); sl@0: virtual TInt Install(); //overriding pure virtual sl@0: virtual void GetCaps(TDes8& aDes) const; //overriding pure virtual sl@0: virtual TInt Create(DLogicalChannelBase*& aChannel); //overriding pure virtual sl@0: }; sl@0: sl@0: class DKernMsgTest : public DLogicalChannelBase sl@0: // sl@0: // Trace test LDD channel sl@0: // sl@0: { sl@0: public: sl@0: DKernMsgTest(); sl@0: ~DKernMsgTest(); sl@0: protected: sl@0: virtual TInt Request(TInt aReqNo, TAny* a1, TAny* a2); sl@0: virtual TInt DoCreate(TInt aUnit, const TDesC8* anInfo, const TVersion& aVer); sl@0: sl@0: private: sl@0: DThread* iClient; sl@0: TInt iShotNumber; sl@0: TInt iCurShot; sl@0: NTimer iNTimer; sl@0: static void NTimerCallBack(TAny*); sl@0: }; sl@0: sl@0: sl@0: DECLARE_STANDARD_LDD() sl@0: { sl@0: //=== load sl@0: return new DKernMsgTestFactory; sl@0: } sl@0: sl@0: DKernMsgTestFactory::DKernMsgTestFactory() sl@0: // sl@0: // Constructor sl@0: // sl@0: { sl@0: //=== load sl@0: iVersion=TVersion(KMajorVersionNumber,KMinorVersionNumber,KBuildVersionNumber); sl@0: } sl@0: sl@0: TInt DKernMsgTestFactory::Create(DLogicalChannelBase*& aChannel) sl@0: // sl@0: // Create a new DNKTraceTest on this logical device sl@0: // sl@0: { sl@0: //=== open sl@0: aChannel=new DKernMsgTest; sl@0: return aChannel?KErrNone:KErrNoMemory; sl@0: } sl@0: sl@0: TInt DKernMsgTestFactory::Install() sl@0: // sl@0: // Install the LDD - overriding pure virtual sl@0: // sl@0: { sl@0: //=== load sl@0: return SetName(&KLddName); sl@0: } sl@0: sl@0: sl@0: void DKernMsgTestFactory::GetCaps(TDes8& aDes) const sl@0: // sl@0: // Get capabilities - overriding pure virtual sl@0: // sl@0: { sl@0: TCapsTraceTestV01 b; sl@0: b.iVersion=TVersion(KMajorVersionNumber,KMinorVersionNumber,KBuildVersionNumber); sl@0: Kern::InfoCopy(aDes,(TUint8*)&b,sizeof(b)); sl@0: } sl@0: sl@0: DKernMsgTest::DKernMsgTest() sl@0: : iNTimer(NTimerCallBack, this) sl@0: // sl@0: // Constructor sl@0: // sl@0: //=== open sl@0: { sl@0: // Get pointer to client threads DThread object sl@0: iClient=&Kern::CurrentThread(); sl@0: sl@0: // Open a reference on client thread so it's control block can't dissapear until sl@0: // this driver has finished with it. sl@0: // Note, this call to Open can't fail since its the thread we are currently running in sl@0: iClient->Open(); sl@0: } sl@0: sl@0: /** sl@0: Destructor sl@0: */ sl@0: DKernMsgTest::~DKernMsgTest() sl@0: { sl@0: iNTimer.Cancel(); sl@0: // Close our reference on the client thread sl@0: Kern::SafeClose((DObject*&)iClient,NULL); sl@0: } sl@0: sl@0: TInt DKernMsgTest::DoCreate(TInt /*aUnit*/, const TDesC8* /*anInfo*/, const TVersion& aVer) sl@0: // sl@0: // Create channel sl@0: // sl@0: { sl@0: sl@0: //=== open sl@0: if (!Kern::QueryVersionSupported(TVersion(KMajorVersionNumber,KMinorVersionNumber,KBuildVersionNumber),aVer)) sl@0: return KErrNotSupported; sl@0: return KErrNone; sl@0: } sl@0: sl@0: TInt DKernMsgTest::Request(TInt aReqNo, TAny* a1, TAny*) sl@0: { sl@0: TInt r=KErrNotSupported; sl@0: switch (aReqNo) sl@0: { sl@0: case RKernMsgTest::EControlKDebug: sl@0: { sl@0: sl@0: TBuf8<1024> msg; sl@0: sl@0: TInt ret=Kern::ThreadDesRead(iClient,a1,msg,0,0); sl@0: if (ret != KErrNone) sl@0: return ret; sl@0: sl@0: *((char*)msg.Ptr() + msg.Length()) = '\0'; sl@0: sl@0: Kern::Printf("%s", msg.Ptr()); sl@0: r = Kern::CurrentThread().iId; sl@0: sl@0: } sl@0: break; sl@0: case RKernMsgTest::EControlIsrContextTest: sl@0: { sl@0: iShotNumber = (TInt) a1; sl@0: sl@0: iCurShot = 0; sl@0: sl@0: iNTimer.OneShot(5); sl@0: sl@0: r = KErrNone; sl@0: } sl@0: break; sl@0: sl@0: default: sl@0: break; sl@0: } sl@0: return r; sl@0: } sl@0: sl@0: void DKernMsgTest::NTimerCallBack(TAny* ptr) sl@0: { sl@0: DKernMsgTest* p = (DKernMsgTest*) ptr; sl@0: sl@0: if (p->iCurShot++ == p->iShotNumber) sl@0: return; sl@0: sl@0: Kern::Printf("%d", p->iCurShot); sl@0: sl@0: p->iNTimer.Again(10); sl@0: }