debugsrv/runmodedebug/rmdriver/src/d_target_process.cpp
author hgs
Fri, 08 Oct 2010 14:56:39 +0300
changeset 56 aa2539c91954
parent 42 0ff24a8f6ca2
permissions -rw-r--r--
201041
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
42
hgs
parents:
diff changeset
     1
// Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     2
// All rights reserved.
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
56
hgs
parents: 42
diff changeset
     4
// under the terms of "Eclipse Public License v1.0"
42
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
hgs
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     7
//
hgs
parents:
diff changeset
     8
// Initial Contributors:
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    10
//
hgs
parents:
diff changeset
    11
// Contributors:
hgs
parents:
diff changeset
    12
//
hgs
parents:
diff changeset
    13
// Description:
hgs
parents:
diff changeset
    14
// Purpose: The DProcessTracker object tracks which processes are being
hgs
parents:
diff changeset
    15
// debugged. The DProcessTracker class uses a DTargetProcess object for
hgs
parents:
diff changeset
    16
// each process being debugged.
hgs
parents:
diff changeset
    17
// Note: Although TheDProcessTracker object is a global, it should be unique
hgs
parents:
diff changeset
    18
// as only the Debug Security Server should load and use this driver.
hgs
parents:
diff changeset
    19
//
hgs
parents:
diff changeset
    20
//
hgs
parents:
diff changeset
    21
hgs
parents:
diff changeset
    22
#include <e32def.h>
hgs
parents:
diff changeset
    23
#include <e32def_private.h>
hgs
parents:
diff changeset
    24
#include <e32cmn.h>
hgs
parents:
diff changeset
    25
#include <e32cmn_private.h>
hgs
parents:
diff changeset
    26
#include <kernel/kernel.h>
hgs
parents:
diff changeset
    27
#include <kernel/kern_priv.h>
hgs
parents:
diff changeset
    28
#include "nk_priv.h"
hgs
parents:
diff changeset
    29
#include <rm_debug_api.h>
hgs
parents:
diff changeset
    30
hgs
parents:
diff changeset
    31
#include "d_target_process.h"
hgs
parents:
diff changeset
    32
#include "debug_logging.h"
hgs
parents:
diff changeset
    33
#include "debug_utils.h"
hgs
parents:
diff changeset
    34
hgs
parents:
diff changeset
    35
// ctor
hgs
parents:
diff changeset
    36
DTargetProcess::DTargetProcess()
hgs
parents:
diff changeset
    37
	:iProcessName(NULL)
hgs
parents:
diff changeset
    38
	{
hgs
parents:
diff changeset
    39
	}
hgs
parents:
diff changeset
    40
hgs
parents:
diff changeset
    41
// dtor
hgs
parents:
diff changeset
    42
DTargetProcess::~DTargetProcess()
hgs
parents:
diff changeset
    43
	{
hgs
parents:
diff changeset
    44
	delete iProcessName;
hgs
parents:
diff changeset
    45
	iAgentList.ResetAndDestroy();
hgs
parents:
diff changeset
    46
	}
hgs
parents:
diff changeset
    47
hgs
parents:
diff changeset
    48
// Compare two DTargetProcess items. They are the same if they have the same name.
hgs
parents:
diff changeset
    49
TInt DTargetProcess::Compare(const DTargetProcess& aFirst, const DTargetProcess& aSecond)
hgs
parents:
diff changeset
    50
	{
hgs
parents:
diff changeset
    51
	const TDesC& left = aFirst.iProcessName ? *aFirst.iProcessName : KNullDesC();
hgs
parents:
diff changeset
    52
	const TDesC& right = aSecond.iProcessName ? *aSecond.iProcessName : KNullDesC();
hgs
parents:
diff changeset
    53
	return left.Compare(right);
hgs
parents:
diff changeset
    54
	}
hgs
parents:
diff changeset
    55
hgs
parents:
diff changeset
    56
// Set the name of the process we are tracking
hgs
parents:
diff changeset
    57
TInt DTargetProcess::SetProcessName(const TDesC8& aProcessName)
hgs
parents:
diff changeset
    58
	{
hgs
parents:
diff changeset
    59
	// Argument checking
hgs
parents:
diff changeset
    60
	if (aProcessName.Length() < 1)
hgs
parents:
diff changeset
    61
		{
hgs
parents:
diff changeset
    62
		return KErrArgument;
hgs
parents:
diff changeset
    63
		}
hgs
parents:
diff changeset
    64
hgs
parents:
diff changeset
    65
	if (iProcessName) 
hgs
parents:
diff changeset
    66
		return KErrNotReady; // You can only set the processname once
hgs
parents:
diff changeset
    67
	iProcessName = HBuf8::New(aProcessName);
hgs
parents:
diff changeset
    68
	if (!iProcessName) 
hgs
parents:
diff changeset
    69
		return KErrNoMemory;
hgs
parents:
diff changeset
    70
	return KErrNone;
hgs
parents:
diff changeset
    71
	}
hgs
parents:
diff changeset
    72
hgs
parents:
diff changeset
    73
// Obtain the name of the process being tracked
hgs
parents:
diff changeset
    74
const TDesC& DTargetProcess::ProcessName() const
hgs
parents:
diff changeset
    75
	{
hgs
parents:
diff changeset
    76
	return iProcessName ? *iProcessName : KNullDesC();
hgs
parents:
diff changeset
    77
	}
hgs
parents:
diff changeset
    78
hgs
parents:
diff changeset
    79
// Returns a pointer to the DDebugAgent with aAgentId.
hgs
parents:
diff changeset
    80
// If the agent is not in the list, it returns NULL.
hgs
parents:
diff changeset
    81
DDebugAgent* DTargetProcess::Agent(TUint64 aAgentId)
hgs
parents:
diff changeset
    82
	{
hgs
parents:
diff changeset
    83
	for(TInt i = 0; i < iAgentList.Count(); i++)
hgs
parents:
diff changeset
    84
		{
hgs
parents:
diff changeset
    85
		if (iAgentList[i]->Id() == aAgentId)
hgs
parents:
diff changeset
    86
			{
hgs
parents:
diff changeset
    87
			return iAgentList[i];
hgs
parents:
diff changeset
    88
			}
hgs
parents:
diff changeset
    89
		}
hgs
parents:
diff changeset
    90
hgs
parents:
diff changeset
    91
	// what do we return if we don't have any agents?
hgs
parents:
diff changeset
    92
	return NULL;
hgs
parents:
diff changeset
    93
	}
hgs
parents:
diff changeset
    94
hgs
parents:
diff changeset
    95
// Adds aAgentId as a tracking agent for this process.
hgs
parents:
diff changeset
    96
TInt DTargetProcess::AddAgent(TUint64 aAgentId)
hgs
parents:
diff changeset
    97
	{
hgs
parents:
diff changeset
    98
	DDebugAgent* agent = DDebugAgent::New(aAgentId);
hgs
parents:
diff changeset
    99
	LOG_MSG4("DTargetProcess::AddAgent(), agentId=%d, curr iAgentList.Count=%d, new agent=0x%08x",
hgs
parents:
diff changeset
   100
		I64LOW(aAgentId), iAgentList.Count(), agent );
hgs
parents:
diff changeset
   101
hgs
parents:
diff changeset
   102
	if(agent == NULL)
hgs
parents:
diff changeset
   103
		{
hgs
parents:
diff changeset
   104
		LOG_MSG("DTargetProcess::AddAgent() couldn't allocate memory for DDebugAgent");
hgs
parents:
diff changeset
   105
		return KErrNoMemory;
hgs
parents:
diff changeset
   106
		}
hgs
parents:
diff changeset
   107
	return iAgentList.Insert(agent,0);
hgs
parents:
diff changeset
   108
	}
hgs
parents:
diff changeset
   109
hgs
parents:
diff changeset
   110
// Stops tracking the process with this agent
hgs
parents:
diff changeset
   111
TInt DTargetProcess::RemoveAgent(TUint64 aAgentId)
hgs
parents:
diff changeset
   112
	{
hgs
parents:
diff changeset
   113
	// We need to find and then remove the agent
hgs
parents:
diff changeset
   114
	for(TUint i = 0; i < iAgentList.Count(); i++)
hgs
parents:
diff changeset
   115
		{
hgs
parents:
diff changeset
   116
		if (iAgentList[i]->Id() == aAgentId)
hgs
parents:
diff changeset
   117
			{
hgs
parents:
diff changeset
   118
			LOG_MSG4("DTargetProcess::RemoveAgent(), deleting agent[%d], id 0x%x, address=0x%x",
hgs
parents:
diff changeset
   119
					i, I64LOW(aAgentId), iAgentList[i]); 
hgs
parents:
diff changeset
   120
			delete iAgentList[i];
hgs
parents:
diff changeset
   121
			iAgentList.Remove(i);
hgs
parents:
diff changeset
   122
			return KErrNone;
hgs
parents:
diff changeset
   123
			}
hgs
parents:
diff changeset
   124
		}
hgs
parents:
diff changeset
   125
hgs
parents:
diff changeset
   126
	return KErrNotFound;
hgs
parents:
diff changeset
   127
	}
hgs
parents:
diff changeset
   128
hgs
parents:
diff changeset
   129
// Index through the agents by position
hgs
parents:
diff changeset
   130
DDebugAgent* DTargetProcess::operator[](TInt aIndex)
hgs
parents:
diff changeset
   131
	{
hgs
parents:
diff changeset
   132
	return iAgentList[aIndex];
hgs
parents:
diff changeset
   133
	}
hgs
parents:
diff changeset
   134
hgs
parents:
diff changeset
   135
// returns the number of agents tracking this process.
hgs
parents:
diff changeset
   136
TInt DTargetProcess::AgentCount() const
hgs
parents:
diff changeset
   137
	{
hgs
parents:
diff changeset
   138
	return iAgentList.Count();
hgs
parents:
diff changeset
   139
	}
hgs
parents:
diff changeset
   140
hgs
parents:
diff changeset
   141
void DTargetProcess::NotifyEvent(const TDriverEventInfo& aEventInfo)
hgs
parents:
diff changeset
   142
	{
hgs
parents:
diff changeset
   143
	// Stuff the event info into all the tracking agents event queues
hgs
parents:
diff changeset
   144
	LOG_MSG4("DTargetProcess::NotifyEvent(): num attached agents: %d, iEventType=%d, this=0x%08x", 
hgs
parents:
diff changeset
   145
		AgentCount(), aEventInfo.iEventType, this);
hgs
parents:
diff changeset
   146
hgs
parents:
diff changeset
   147
	for(TInt i = 0; i < AgentCount(); i++)
hgs
parents:
diff changeset
   148
		{
hgs
parents:
diff changeset
   149
		// Index through all the relevant debug agents
hgs
parents:
diff changeset
   150
		DDebugAgent* debugAgent = iAgentList[i];
hgs
parents:
diff changeset
   151
		if(debugAgent != NULL)
hgs
parents:
diff changeset
   152
			{
hgs
parents:
diff changeset
   153
			debugAgent->NotifyEvent(aEventInfo);
hgs
parents:
diff changeset
   154
			}
hgs
parents:
diff changeset
   155
		}
hgs
parents:
diff changeset
   156
	}
hgs
parents:
diff changeset
   157