kernel/eka/drivers/debug/smdebug/d_stopmode.cpp
author Slion
Tue, 08 Dec 2009 08:11:42 +0100
branchanywhere
changeset 19 f6d3d9676ee4
parent 0 a41df078684a
child 245 647ab20fee2e
permissions -rw-r--r--
Trying to figure out how to implement my WINC like compatibility layer. Going the emulation way is probably not so smart. We should not use the kernel but rather hook native functions in the Exec calls.

// 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