kernel/eka/drivers/debug/smdebug/d_stopmode.cpp
changeset 0 a41df078684a
child 245 647ab20fee2e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kernel/eka/drivers/debug/smdebug/d_stopmode.cpp	Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,175 @@
+// Copyright (c) 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:
+// Responsible for dealing with requests for the SM interface
+//
+
+/**
+@file
+@internalComponent
+@prototype
+*/
+
+#include <rm_debug_api.h>
+#include <sm_debug_api.h>
+
+#include "d_rmd_breakpoints.h"
+
+
+#ifdef __LAUNCH_AS_EXTENSION__
+
+using namespace Debug;
+
+_LIT(KLitLocal,"Local-");
+_LIT(KColonColon,"::");
+
+/**
+ * This is the generic exit point for all stop mode routines
+ * @param aReturnValue Symbian Error Code to return
+ * @return One of the Symbian wide error codes
+ */
+EXPORT_C TInt StopModeDebug::ExitPoint(const TInt aReturnValue)
+	{
+	return aReturnValue;
+	}
+
+/**
+ * This is the routine that shall return lists of information such as
+ * process list or code segment list etc
+ * @pre aItem->iBufferAddress must be word aligned
+ * @param aItem Describes the list to retrieve
+ * @param aCheckConsistent Should we check the mutex on the list
+ * @return One of the Symbian wide error codes
+ */
+EXPORT_C TInt StopModeDebug::GetList(const TListItem* aItem, TBool aCheckConsistent)
+	{
+	//Check arguments
+	if(!aItem ||
+		((TUint32)aItem->iBufferAddress == 0)||
+		((TUint32)aItem->iBufferAddress % 4) )
+		{
+		return StopModeDebug::ExitPoint(KErrArgument);
+		}
+
+	switch(aItem->iListId)
+		{
+		case ECodeSegs:
+			{
+			return StopModeDebug::ExitPoint(StopModeDebug::GetCodeSegList(aItem, aCheckConsistent));
+			}
+		case EProcesses:
+			{
+			return StopModeDebug::ExitPoint(StopModeDebug::GetProcessList(aItem, aCheckConsistent));
+			}
+		case EStaticInfo:
+		    {
+		    return StopModeDebug::ExitPoint(StopModeDebug::GetStaticInfo(aItem, aCheckConsistent));
+		    }
+		default:
+			{
+			return StopModeDebug::ExitPoint(KErrUnknown);
+			}
+		}
+	}
+
+TInt StopModeDebug::CopyAndExpandDes(const TDesC& aSrc, TDes& aDest)
+	{
+	//check bounds
+	if(aSrc.Length() * 2 > aDest.MaxLength())
+		{
+		return KErrArgument;
+		}
+
+	//get a pointer to the start of the destination descriptor
+	TUint16* destPtr = (TUint16*)aDest.Ptr();
+
+	//get pointers to the start and end of the aSrc descriptor
+	const TUint8* srcPtr = aSrc.Ptr();
+	const TUint8* srcEnd = srcPtr + aSrc.Length();
+
+	//copy the characters from aSrc into aDest, expanding to make them 16-bit characters
+	while(srcPtr < srcEnd)
+		{
+		*destPtr = (TUint16)*srcPtr;
+		destPtr++;
+		srcPtr++;
+		}
+
+	//set aDest's length to reflect the new contents
+	aDest.SetLength(2*aSrc.Length());
+	return KErrNone;
+	}
+
+/** 
+ * This is a function used to test communications with the Stop Mode API
+ * We pass in aItem which is interpreted in a different way to normal to allow 
+ * us to test different scenarios:
+ *		
+ *		1. Sending in aItem.iSize = 0xFFFFFFFF will result in the response buffer being
+ *		   filled with 0xFFFFFFFF
+ *
+ * @param aItem Drives the test according to its parameters
+ */
+EXPORT_C TInt StopModeDebug::TestAPI(const TListItem* aItem)
+	{
+	//Check params are valid
+	if(!aItem	||	((TUint32)aItem->iBufferAddress % 4)	||
+		   ((TUint32)aItem->iBufferAddress == 0) ||
+		   (aItem->iBufferSize % 4)	)
+		{
+		return StopModeDebug::ExitPoint(KErrArgument);
+		}
+
+	//Performs the test function
+	if(aItem->iSize == 0xFFFFFFFF)
+		{		
+		//Write all 0xFFFFFFFF into the entire buffer
+		TUint8* pos = (TUint8*)aItem->iBufferAddress;
+		while(pos < (	(TUint8*)aItem->iBufferAddress + aItem->iBufferSize) )
+			{
+			*pos = 0xFF;
+			++pos;
+			}
+		}
+		
+	return StopModeDebug::ExitPoint(KErrNone);
+	}
+
+/**
+ * Reads the raw name for this object instead of using API in DObject,
+ * as we can't meet the preconditions
+ * @param DObject object whose name we want
+ */
+void StopModeDebug::GetObjectFullName(const DObject* aObj, TFullName& aName)
+	{
+	if(aObj->iOwner)
+		{
+		GetObjectFullName(aObj->iOwner, aName);
+		aName.Append(KColonColon);
+		}
+	
+    if (aObj->iName)
+		{
+        aName.Append(*aObj->iName);
+		}
+     else
+        {
+        aName.Append(KLitLocal);
+        aName.AppendNumFixedWidth((TInt)aObj,EHex,8);
+        }
+	}
+
+#endif
+
+
+// End of file d_stopmode.cpp