kerneltest/e32test/debug/d_context.h
changeset 0 a41df078684a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/e32test/debug/d_context.h	Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,194 @@
+// Copyright (c) 2003-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/debug/d_context.h
+// 
+//
+
+#ifndef __D_CONTEXT_H__
+#define __D_CONTEXT_H__
+
+#include <e32cmn.h>
+#ifndef __KLIB_H__
+#include <e32std.h>
+#endif
+#include <kernel/arm/arm_types.h>
+
+_LIT(KTestLddName, "TestContext");
+
+enum TUserCallbackState
+	{
+	ENoCallback,		// thread does nothing special
+	ESpinningCallback,	// thread will be given a callback that spins forever
+	ESleepingCallback,	// thread will be given a callback that sleeps for a long time
+	};
+
+struct TArmFullContext
+	{
+	TArmRegSet iUserContext;
+	TUint32 iUserAvail;
+	TArmRegSet iSystemContext;
+	TUint32 iSystemAvail;
+	};
+
+class RContextLdd : public RBusLogicalChannel
+	{
+public:
+	enum 
+		{
+		EHook,
+		EGetLastExc,
+		ETrapNextHwExc,
+		ETrapNextSwExc,
+		ETrapNextDeath,
+		ESetGetContext,
+		EGetContext,
+		EGetKernelContext,
+		ESpinInKernel,
+		ESetGetFullContext,
+		EAddUserCallback,
+		EResumeTrappedThread,
+		};
+
+	struct TTrapInfo
+		{
+		TUint iThreadId;
+		TAny* iContextPtr;
+		TRequestStatus* iStatusPtr;
+		TBool iKillThread;
+		};
+
+public:
+	static inline TVersion Version() { return TVersion(1, 0, 1); }
+#ifndef __KERNEL_MODE__
+public:
+	inline RContextLdd();
+	inline TInt Open();
+	inline TInt Hook(TInt* aCounterPtr);
+	inline TExcType LastException();
+	inline TBool IsHooked() const;
+	inline void TrapNextHwExc(TThreadId aId, TAny* aContext, TRequestStatus& aStatus, TBool aKillThread);
+	inline void TrapNextSwExc(TThreadId aId, TAny* aContext, TRequestStatus& aStatus, TBool aKillThread);
+	inline void TrapNextDeath(TThreadId aId, TAny* aContext, TRequestStatus& aStatus);
+	inline TInt SetAndGetBackContext(TThreadId aId, TAny* aContext);
+	inline TInt SetAndGetFullContext(TThreadId aId, TArmFullContext* aContextData);
+	inline void GetContext(TThreadId aId, TAny* aContext);
+	inline void GetKernelContext(TThreadId aId, TAny* aContext);
+	inline TUint32 SpinInKernel(TBool aReallySpin);
+	inline void AddUserCallback(TThreadId aId, TUserCallbackState aCallback);
+	inline void ResumeTrappedThread(TThreadId aId);
+private:
+	TBool iHooked;
+#endif
+	};
+
+
+#ifndef __KERNEL_MODE__
+
+inline RContextLdd::RContextLdd() 
+	: iHooked(EFalse) 
+	{
+	}
+
+inline TBool RContextLdd::IsHooked() const 
+	{ 
+	return iHooked; 
+	}
+
+inline TInt RContextLdd::Open()
+	{
+	return DoCreate(KTestLddName, Version(), KNullUnit, NULL, NULL, EOwnerProcess);
+	}
+
+inline TInt RContextLdd::Hook(TInt* aCounterPtr)
+	{
+	TInt r = DoControl(EHook, aCounterPtr);
+	iHooked = (r == KErrNone);
+	return r;
+	}
+
+inline TExcType RContextLdd::LastException()
+	{
+	return static_cast<TExcType>(DoControl(EGetLastExc));
+	}
+
+inline void RContextLdd::TrapNextHwExc(TThreadId aId, TAny* aExcContext, TRequestStatus& aStatus, TBool aKillThread)
+	{
+	aStatus = KRequestPending;
+	TTrapInfo info;
+	info.iThreadId = aId;
+	info.iContextPtr = aExcContext;
+	info.iStatusPtr = &aStatus;
+	info.iKillThread = aKillThread;
+	DoControl(ETrapNextHwExc, &info);
+	}
+
+inline void RContextLdd::TrapNextSwExc(TThreadId aId, TAny* aContext, TRequestStatus& aStatus, TBool aKillThread)
+	{
+	aStatus = KRequestPending;
+	TTrapInfo info;
+	info.iThreadId = aId;
+	info.iContextPtr = aContext;
+	info.iStatusPtr = &aStatus;
+	info.iKillThread = aKillThread;
+	DoControl(ETrapNextSwExc, &info);
+	}
+
+inline void RContextLdd::TrapNextDeath(TThreadId aId, TAny* aContext, TRequestStatus& aStatus)
+	{
+	aStatus = KRequestPending;
+	TTrapInfo info;
+	info.iThreadId = aId;
+	info.iContextPtr = aContext;
+	info.iStatusPtr = &aStatus;
+	DoControl(ETrapNextDeath, &info);
+	}
+
+inline TInt RContextLdd::SetAndGetBackContext(TThreadId aId, TAny* aContext)
+	{
+	return DoControl(ESetGetContext, (TAny*)(TUint)aId, aContext);
+	}
+
+inline TInt RContextLdd::SetAndGetFullContext(TThreadId aId, TArmFullContext* aContextData)
+	{
+	return DoControl(ESetGetFullContext, (TAny*)(TUint)aId, (TAny*)aContextData);
+	}
+
+inline void RContextLdd::GetContext(TThreadId aId, TAny* aContext)
+	{
+	DoControl(EGetContext, (TAny*)(TUint)aId, aContext);
+	}
+
+inline void RContextLdd::GetKernelContext(TThreadId aId, TAny* aContext)
+	{
+	DoControl(EGetKernelContext, (TAny*)(TUint)aId, aContext);
+	}
+
+inline TUint32 RContextLdd::SpinInKernel(TBool aReallySpin)
+	{
+	return DoControl(ESpinInKernel, (TAny*)aReallySpin);
+	}
+
+inline void RContextLdd::AddUserCallback(TThreadId aId, TUserCallbackState aCallback)
+	{
+	DoControl(EAddUserCallback, (TAny*)(TUint)aId, (TAny*)aCallback);
+	}
+
+inline void RContextLdd::ResumeTrappedThread(TThreadId aId)
+	{
+	DoControl(EResumeTrappedThread, (TAny*)(TUint)aId);
+	}
+
+#endif // __KERNEL_MODE__
+
+#endif