debugsrv/runmodedebug/rmdebug_test/rm_debug/basic_tests/t_rmdebug2.cpp
author hgs
Fri, 27 Aug 2010 11:37:29 +0300
changeset 42 0ff24a8f6ca2
permissions -rw-r--r--
201033
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
hgs
parents:
diff changeset
     4
// under the terms of the License "Eclipse Public License v1.0"
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
// Tests the functionality of the run mode debug device driver.
hgs
parents:
diff changeset
    15
//
hgs
parents:
diff changeset
    16
//
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
#include <e32base.h>
hgs
parents:
diff changeset
    19
#include <e32base_private.h>
hgs
parents:
diff changeset
    20
#include <e32cons.h>
hgs
parents:
diff changeset
    21
#include <e32test.h>
hgs
parents:
diff changeset
    22
#include <e32ldr.h>
hgs
parents:
diff changeset
    23
#include <e32cmn.h>
hgs
parents:
diff changeset
    24
#include <e32cmn_private.h>
hgs
parents:
diff changeset
    25
#include <f32dbg.h>
hgs
parents:
diff changeset
    26
#include <f32file.h>
hgs
parents:
diff changeset
    27
#include <hal.h>
hgs
parents:
diff changeset
    28
#include <u32hal.h>
hgs
parents:
diff changeset
    29
#include <e32property.h>
hgs
parents:
diff changeset
    30
hgs
parents:
diff changeset
    31
#include "t_rmdebug_dll.h"
hgs
parents:
diff changeset
    32
hgs
parents:
diff changeset
    33
#include <rm_debug_api.h>
hgs
parents:
diff changeset
    34
#include "d_rmdebugthread2.h"
hgs
parents:
diff changeset
    35
#include "t_rmdebug2.h"
hgs
parents:
diff changeset
    36
#include "t_rmdebug_app.h"
hgs
parents:
diff changeset
    37
hgs
parents:
diff changeset
    38
#ifdef __MARM_ARMV4__
hgs
parents:
diff changeset
    39
#include "d_rmdebug_step_test_armv4.h"
hgs
parents:
diff changeset
    40
#endif
hgs
parents:
diff changeset
    41
hgs
parents:
diff changeset
    42
#ifdef __MARM_ARMV5__
hgs
parents:
diff changeset
    43
#include "d_rmdebug_step_test.h"
hgs
parents:
diff changeset
    44
#include "d_rmdebug_bkpt_test.h"
hgs
parents:
diff changeset
    45
#endif
hgs
parents:
diff changeset
    46
hgs
parents:
diff changeset
    47
#include "d_demand_paging.h"
hgs
parents:
diff changeset
    48
hgs
parents:
diff changeset
    49
#ifdef KERNEL_OOM_TESTING
hgs
parents:
diff changeset
    50
	#ifdef USER_OOM_TESTING
hgs
parents:
diff changeset
    51
		#error "Cannot define both KERNEL_OOM_TESTING and USER_OOM_TESTING"
hgs
parents:
diff changeset
    52
	#endif
hgs
parents:
diff changeset
    53
#endif
hgs
parents:
diff changeset
    54
hgs
parents:
diff changeset
    55
#if  defined (NO_DEBUGTOKEN)  || defined (SOMECAPS_DEBUGTOKEN) || defined (FEWCAPS_DEBUGTOKEN)
hgs
parents:
diff changeset
    56
_LIT8(KCrashDummyData, "This is a sample write");
hgs
parents:
diff changeset
    57
#endif
hgs
parents:
diff changeset
    58
hgs
parents:
diff changeset
    59
using namespace Debug;
hgs
parents:
diff changeset
    60
hgs
parents:
diff changeset
    61
const TVersion securityServerVersion(0,1,1);
hgs
parents:
diff changeset
    62
hgs
parents:
diff changeset
    63
const TVersion testVersion(2,1,0);
hgs
parents:
diff changeset
    64
hgs
parents:
diff changeset
    65
IMPORT_C TInt StartDebugThread(RThread& aServerThread, const TDesC& aDebugThreadName);
hgs
parents:
diff changeset
    66
 
hgs
parents:
diff changeset
    67
extern TInt TestData;
hgs
parents:
diff changeset
    68
extern TTestFunction FunctionChooser;
hgs
parents:
diff changeset
    69
extern TBuf8<SYMBIAN_RMDBG_MEMORYSIZE> gMemoryAccessBytes;
hgs
parents:
diff changeset
    70
hgs
parents:
diff changeset
    71
IMPORT_C TInt TestFunction();
hgs
parents:
diff changeset
    72
IMPORT_C void TestPagedCode();
hgs
parents:
diff changeset
    73
IMPORT_C extern TInt RMDebugDemandPagingTest();
hgs
parents:
diff changeset
    74
hgs
parents:
diff changeset
    75
// Device driver name
hgs
parents:
diff changeset
    76
_LIT(KDebugDriverFileName,"rm_debug.ldd");
hgs
parents:
diff changeset
    77
_LIT(KRMDebugAppName, "t_rmdebug_app");
hgs
parents:
diff changeset
    78
hgs
parents:
diff changeset
    79
hgs
parents:
diff changeset
    80
#if defined(NO_DEBUGTOKEN)
hgs
parents:
diff changeset
    81
    _LIT(KTestName, "T_RMDEBUG2");
hgs
parents:
diff changeset
    82
#elif defined(SOMECAPS_DEBUGTOKEN)
hgs
parents:
diff changeset
    83
    _LIT(KTestName, "T_RMDEBUG2_OEM");
hgs
parents:
diff changeset
    84
#elif defined(FEWCAPS_DEBUGTOKEN)
hgs
parents:
diff changeset
    85
    _LIT(KTestName, "T_RMDEBUG2_OEM2");
hgs
parents:
diff changeset
    86
#elif defined(ALLCAPS_DEBUGTOKEN)
hgs
parents:
diff changeset
    87
    _LIT(KTestName, "T_RMDEBUG2_ALLCAPS");
hgs
parents:
diff changeset
    88
#endif
hgs
parents:
diff changeset
    89
hgs
parents:
diff changeset
    90
#define TIMED_WAIT(request, timeoutInMs) CRunModeAgent::TimedWait(request, timeoutInMs, __LINE__)
hgs
parents:
diff changeset
    91
hgs
parents:
diff changeset
    92
LOCAL_D RTest test(KTestName);
hgs
parents:
diff changeset
    93
hgs
parents:
diff changeset
    94
TBool gUseDelay;
hgs
parents:
diff changeset
    95
hgs
parents:
diff changeset
    96
CRunModeAgent::CRunModeAgent()
hgs
parents:
diff changeset
    97
//
hgs
parents:
diff changeset
    98
// CRunModeAgent constructor
hgs
parents:
diff changeset
    99
//
hgs
parents:
diff changeset
   100
	{
hgs
parents:
diff changeset
   101
	FillArray();
hgs
parents:
diff changeset
   102
	RProcess thisProcess;
hgs
parents:
diff changeset
   103
	iFileName = thisProcess.FileName();
hgs
parents:
diff changeset
   104
	thisProcess.Close();
hgs
parents:
diff changeset
   105
	}
hgs
parents:
diff changeset
   106
hgs
parents:
diff changeset
   107
CRunModeAgent* CRunModeAgent::NewL()
hgs
parents:
diff changeset
   108
//
hgs
parents:
diff changeset
   109
// CRunModeAgent::NewL
hgs
parents:
diff changeset
   110
//
hgs
parents:
diff changeset
   111
	{
hgs
parents:
diff changeset
   112
	CRunModeAgent* self = new(ELeave) CRunModeAgent();
hgs
parents:
diff changeset
   113
hgs
parents:
diff changeset
   114
  	self->ConstructL();
hgs
parents:
diff changeset
   115
hgs
parents:
diff changeset
   116
	return self;
hgs
parents:
diff changeset
   117
	}
hgs
parents:
diff changeset
   118
hgs
parents:
diff changeset
   119
CRunModeAgent::~CRunModeAgent()
hgs
parents:
diff changeset
   120
//
hgs
parents:
diff changeset
   121
// CRunModeAgent destructor
hgs
parents:
diff changeset
   122
//
hgs
parents:
diff changeset
   123
	{
hgs
parents:
diff changeset
   124
    iTimer.Close();
hgs
parents:
diff changeset
   125
    iRunCountSubscribe.Close();
hgs
parents:
diff changeset
   126
    
hgs
parents:
diff changeset
   127
	User::FreeLogicalDevice(KDebugDriverFileName);
hgs
parents:
diff changeset
   128
	iServSession.Close();
hgs
parents:
diff changeset
   129
	iDebugThread.Close();
hgs
parents:
diff changeset
   130
	}
hgs
parents:
diff changeset
   131
hgs
parents:
diff changeset
   132
void CRunModeAgent::ConstructL()
hgs
parents:
diff changeset
   133
//
hgs
parents:
diff changeset
   134
// CRunModeAgent::ConstructL
hgs
parents:
diff changeset
   135
//
hgs
parents:
diff changeset
   136
	{
hgs
parents:
diff changeset
   137
	// nothing to do here
hgs
parents:
diff changeset
   138
	}
hgs
parents:
diff changeset
   139
hgs
parents:
diff changeset
   140
void CRunModeAgent::SetupAndAttachToDSS()
hgs
parents:
diff changeset
   141
//
hgs
parents:
diff changeset
   142
// CRunModeAgent::SetupAndAttachToDSS
hgs
parents:
diff changeset
   143
//
hgs
parents:
diff changeset
   144
	{
hgs
parents:
diff changeset
   145
	TInt err = StartDebugThread(iDebugThread, KDebugThreadName);
hgs
parents:
diff changeset
   146
hgs
parents:
diff changeset
   147
	// get the thread id for use in the tests
hgs
parents:
diff changeset
   148
	iThreadID = iDebugThread.Id();
hgs
parents:
diff changeset
   149
hgs
parents:
diff changeset
   150
	if (err != KErrNone)
hgs
parents:
diff changeset
   151
		{
hgs
parents:
diff changeset
   152
		User::Panic(_L("Can't start debug thread"), err);
hgs
parents:
diff changeset
   153
		}
hgs
parents:
diff changeset
   154
hgs
parents:
diff changeset
   155
    err = iRunCountSubscribe.Attach( RProcess().SecureId(), CDebugServThread::ERMDBGRunCountProperty);
hgs
parents:
diff changeset
   156
    if (err != KErrNone)
hgs
parents:
diff changeset
   157
        {
hgs
parents:
diff changeset
   158
        User::Panic(_L("Can't attach to RProperty iRunCountSubscribe"), err);
hgs
parents:
diff changeset
   159
        }
hgs
parents:
diff changeset
   160
hgs
parents:
diff changeset
   161
    err = iTimer.CreateLocal(); 
hgs
parents:
diff changeset
   162
    if (err != KErrNone)
hgs
parents:
diff changeset
   163
        {
hgs
parents:
diff changeset
   164
        User::Panic(_L("Can't create RTimer::CreateLocal()"), err);
hgs
parents:
diff changeset
   165
        }
hgs
parents:
diff changeset
   166
    
hgs
parents:
diff changeset
   167
	err = iServSession.Connect(securityServerVersion);
hgs
parents:
diff changeset
   168
	if (err != KErrNone)
hgs
parents:
diff changeset
   169
		{
hgs
parents:
diff changeset
   170
		User::Panic(_L("Can't open server session"), err);
hgs
parents:
diff changeset
   171
		}
hgs
parents:
diff changeset
   172
	}
hgs
parents:
diff changeset
   173
hgs
parents:
diff changeset
   174
CRunModeAgent *RunModeAgent;
hgs
parents:
diff changeset
   175
hgs
parents:
diff changeset
   176
// helper function to check whether the listing of type aListId is supported for a scope of aListScope
hgs
parents:
diff changeset
   177
TBool CRunModeAgent::ListingSupported(const TListId aListId, const TListScope aListScope)
hgs
parents:
diff changeset
   178
	{
hgs
parents:
diff changeset
   179
	TTag tag = GetTag(ETagHeaderList, aListId);
hgs
parents:
diff changeset
   180
hgs
parents:
diff changeset
   181
	return (tag.iValue) & aListScope;
hgs
parents:
diff changeset
   182
	}
hgs
parents:
diff changeset
   183
hgs
parents:
diff changeset
   184
//---------------------------------------------
hgs
parents:
diff changeset
   185
//! @SYMTestCaseID KBase-T-RMDEBUG2-0426
hgs
parents:
diff changeset
   186
//! @SYMTestType
hgs
parents:
diff changeset
   187
//! @SYMPREQ PREQ1426
hgs
parents:
diff changeset
   188
//! @SYMTestCaseDesc Test getting the list of XIP libraries
hgs
parents:
diff changeset
   189
//! @SYMTestActions The XIP library list should be successfully obtained
hgs
parents:
diff changeset
   190
//! @SYMTestExpectedResults The specified ldd file should be present in the obtained listing
hgs
parents:
diff changeset
   191
//! @SYMTestPriority High
hgs
parents:
diff changeset
   192
//! @SYMTestStatus Implemented
hgs
parents:
diff changeset
   193
//---------------------------------------------
hgs
parents:
diff changeset
   194
void CRunModeAgent::TestGetXipLibrariesList()
hgs
parents:
diff changeset
   195
	{
hgs
parents:
diff changeset
   196
	test.Next(_L("TestGetXipLibrariesList\n"));
hgs
parents:
diff changeset
   197
hgs
parents:
diff changeset
   198
	test(ListingSupported(EXipLibraries, EScopeGlobal));
hgs
parents:
diff changeset
   199
	test(!ListingSupported(EXipLibraries, EScopeProcessSpecific));
hgs
parents:
diff changeset
   200
	test(!ListingSupported(EXipLibraries, EScopeThreadSpecific));
hgs
parents:
diff changeset
   201
hgs
parents:
diff changeset
   202
	//allocate a very small buffer so the GetList call initially fails
hgs
parents:
diff changeset
   203
	RBuf8 buffer;
hgs
parents:
diff changeset
   204
	test(KErrNone == buffer.Create(1));
hgs
parents:
diff changeset
   205
	TUint32 size = 0;
hgs
parents:
diff changeset
   206
hgs
parents:
diff changeset
   207
	//get the list data
hgs
parents:
diff changeset
   208
	DoGetList(EXipLibraries, EScopeGlobal, buffer, size);
hgs
parents:
diff changeset
   209
hgs
parents:
diff changeset
   210
	//search the buffer for entry corresponding to the debug kernel driver
hgs
parents:
diff changeset
   211
	//which should be in the rom
hgs
parents:
diff changeset
   212
	_LIT(KRmDebugLddName, "z:\\sys\\bin\\rm_debug.ldd");
hgs
parents:
diff changeset
   213
hgs
parents:
diff changeset
   214
	//iterate through the buffer and set found to ETrue if we find the driver
hgs
parents:
diff changeset
   215
	TBool found = EFalse;
hgs
parents:
diff changeset
   216
	TUint8* ptr = (TUint8*)buffer.Ptr();
hgs
parents:
diff changeset
   217
	const TUint8* ptrEnd = ptr + size;
hgs
parents:
diff changeset
   218
	while(ptr < ptrEnd)
hgs
parents:
diff changeset
   219
		{
hgs
parents:
diff changeset
   220
		TXipLibraryListEntry& xipLibrary = *(TXipLibraryListEntry*)ptr;
hgs
parents:
diff changeset
   221
hgs
parents:
diff changeset
   222
		//get the name of the library
hgs
parents:
diff changeset
   223
		TPtr name(&xipLibrary.iName[0], xipLibrary.iNameLength, xipLibrary.iNameLength);
hgs
parents:
diff changeset
   224
		if(name.CompareF(KRmDebugLddName()) == 0)
hgs
parents:
diff changeset
   225
			{
hgs
parents:
diff changeset
   226
			//found the library but continue reading the rest of the buffer to
hgs
parents:
diff changeset
   227
			//check nothing bad happens towards the end
hgs
parents:
diff changeset
   228
			found = ETrue;
hgs
parents:
diff changeset
   229
			}
hgs
parents:
diff changeset
   230
		//move pointer on to next library
hgs
parents:
diff changeset
   231
		ptr += Align4(xipLibrary.GetSize());
hgs
parents:
diff changeset
   232
		}
hgs
parents:
diff changeset
   233
	test(found);
hgs
parents:
diff changeset
   234
hgs
parents:
diff changeset
   235
	//do cleanup
hgs
parents:
diff changeset
   236
	buffer.Close();
hgs
parents:
diff changeset
   237
	}
hgs
parents:
diff changeset
   238
hgs
parents:
diff changeset
   239
//---------------------------------------------
hgs
parents:
diff changeset
   240
//! @SYMTestCaseID KBase-T-RMDEBUG2-0427
hgs
parents:
diff changeset
   241
//! @SYMTestType
hgs
parents:
diff changeset
   242
//! @SYMPREQ PREQ1426
hgs
parents:
diff changeset
   243
//! @SYMTestCaseDesc Test getting the list of executables
hgs
parents:
diff changeset
   244
//! @SYMTestActions The list of debuggable executable files should be obtained
hgs
parents:
diff changeset
   245
//! @SYMTestExpectedResults The client exe should appear in the list
hgs
parents:
diff changeset
   246
//! @SYMTestPriority High
hgs
parents:
diff changeset
   247
//! @SYMTestStatus Implemented
hgs
parents:
diff changeset
   248
//---------------------------------------------
hgs
parents:
diff changeset
   249
void CRunModeAgent::TestGetExecutablesList()
hgs
parents:
diff changeset
   250
	{
hgs
parents:
diff changeset
   251
	test.Next(_L("TestGetExecutablesList\n"));
hgs
parents:
diff changeset
   252
hgs
parents:
diff changeset
   253
	test(ListingSupported(EExecutables, EScopeGlobal));
hgs
parents:
diff changeset
   254
	test(!ListingSupported(EExecutables, EScopeProcessSpecific));
hgs
parents:
diff changeset
   255
	test(!ListingSupported(EExecutables, EScopeThreadSpecific));
hgs
parents:
diff changeset
   256
hgs
parents:
diff changeset
   257
	//allocate a very small buffer so the GetList call initially fails
hgs
parents:
diff changeset
   258
	RBuf8 buffer;
hgs
parents:
diff changeset
   259
	test(KErrNone == buffer.Create(1));
hgs
parents:
diff changeset
   260
	TUint32 size = 0;
hgs
parents:
diff changeset
   261
hgs
parents:
diff changeset
   262
	test(KErrNone == iServSession.AttachExecutable(iFileName, EFalse));
hgs
parents:
diff changeset
   263
hgs
parents:
diff changeset
   264
	//get the list data
hgs
parents:
diff changeset
   265
	DoGetList(EExecutables, EScopeGlobal, buffer, size);
hgs
parents:
diff changeset
   266
hgs
parents:
diff changeset
   267
	//get this process' name
hgs
parents:
diff changeset
   268
	RProcess thisProcess;
hgs
parents:
diff changeset
   269
	TFileName thisProcessName = thisProcess.FileName();
hgs
parents:
diff changeset
   270
hgs
parents:
diff changeset
   271
	//look through the buffer and check if the target debug thread is there
hgs
parents:
diff changeset
   272
	TBool found = EFalse;
hgs
parents:
diff changeset
   273
	TUint8* ptr = (TUint8*)buffer.Ptr();
hgs
parents:
diff changeset
   274
	const TUint8* ptrEnd = ptr + size;
hgs
parents:
diff changeset
   275
	while(ptr < ptrEnd)
hgs
parents:
diff changeset
   276
		{
hgs
parents:
diff changeset
   277
		TExecutablesListEntry& entry = *(TExecutablesListEntry*)ptr;
hgs
parents:
diff changeset
   278
		//get name
hgs
parents:
diff changeset
   279
		TPtr name(&entry.iName[0], entry.iNameLength, entry.iNameLength);
hgs
parents:
diff changeset
   280
		if( (entry.iIsActivelyDebugged != 0) && (0 == thisProcessName.CompareF(name)) )
hgs
parents:
diff changeset
   281
			{
hgs
parents:
diff changeset
   282
			//found this process and asserted it is being actively debugged
hgs
parents:
diff changeset
   283
			found = ETrue;
hgs
parents:
diff changeset
   284
			}
hgs
parents:
diff changeset
   285
		//move pointer on to next entry
hgs
parents:
diff changeset
   286
		ptr += Align4(entry.GetSize());
hgs
parents:
diff changeset
   287
		}
hgs
parents:
diff changeset
   288
	test(found);
hgs
parents:
diff changeset
   289
hgs
parents:
diff changeset
   290
	//clean up
hgs
parents:
diff changeset
   291
	buffer.Close();
hgs
parents:
diff changeset
   292
hgs
parents:
diff changeset
   293
	test(KErrNone == iServSession.DetachExecutable(iFileName));
hgs
parents:
diff changeset
   294
	}
hgs
parents:
diff changeset
   295
hgs
parents:
diff changeset
   296
//---------------------------------------------
hgs
parents:
diff changeset
   297
//! @SYMTestCaseID KBase-T-RMDEBUG2-0428
hgs
parents:
diff changeset
   298
//! @SYMTestType
hgs
parents:
diff changeset
   299
//! @SYMPREQ PREQ1426
hgs
parents:
diff changeset
   300
//! @SYMTestCaseDesc Test error conditions for the GetList calls
hgs
parents:
diff changeset
   301
//! @SYMTestActions Multiple calls to test calling GetList with bad arguments
hgs
parents:
diff changeset
   302
//! @SYMTestExpectedResults All tests should fail with the appropriate error codes
hgs
parents:
diff changeset
   303
//! @SYMTestPriority High
hgs
parents:
diff changeset
   304
//! @SYMTestStatus Implemented
hgs
parents:
diff changeset
   305
//---------------------------------------------
hgs
parents:
diff changeset
   306
void CRunModeAgent::TestGetListInvalidData()
hgs
parents:
diff changeset
   307
	{
hgs
parents:
diff changeset
   308
	test.Next(_L("TestGetListInvalidData\n"));
hgs
parents:
diff changeset
   309
hgs
parents:
diff changeset
   310
	//allocate a buffer, the size should not matter as expecting all calls to fail
hgs
parents:
diff changeset
   311
	RBuf8 buffer;
hgs
parents:
diff changeset
   312
	test(KErrNone == buffer.Create(1));
hgs
parents:
diff changeset
   313
	TUint32 size = 0;
hgs
parents:
diff changeset
   314
hgs
parents:
diff changeset
   315
	//test what happens if we ask for an unsupported list type globally
hgs
parents:
diff changeset
   316
	test(KErrNotSupported == iServSession.GetList((TListId)1234, buffer, size));
hgs
parents:
diff changeset
   317
hgs
parents:
diff changeset
   318
	//test what happens if we ask for an unsupported list type
hgs
parents:
diff changeset
   319
	test(KErrNotSupported == iServSession.GetList(RThread().Id(), (TListId)1234, buffer, size));
hgs
parents:
diff changeset
   320
hgs
parents:
diff changeset
   321
	//test what happens if we try to get a non-global libraries list
hgs
parents:
diff changeset
   322
	test(KErrArgument == iServSession.GetList(RThread().Id(), EXipLibraries, buffer, size));
hgs
parents:
diff changeset
   323
hgs
parents:
diff changeset
   324
	//test what happens if we try to get a non-global executables list
hgs
parents:
diff changeset
   325
	test(KErrArgument == iServSession.GetList(RThread().Id(), EExecutables, buffer, size));
hgs
parents:
diff changeset
   326
hgs
parents:
diff changeset
   327
	//test what happens if we try to get a non-global process list
hgs
parents:
diff changeset
   328
	test(KErrArgument == iServSession.GetList(RThread().Id(), EProcesses, buffer, size));
hgs
parents:
diff changeset
   329
hgs
parents:
diff changeset
   330
	//check that using a process id fails
hgs
parents:
diff changeset
   331
	test(KErrArgument == iServSession.GetList(RProcess().Id(), EProcesses, buffer, size));
hgs
parents:
diff changeset
   332
hgs
parents:
diff changeset
   333
	//check that specifying a non-existant thread id fails
hgs
parents:
diff changeset
   334
	test(KErrArgument == iServSession.GetList((TThreadId)0x12345678, EThreads, buffer, size));
hgs
parents:
diff changeset
   335
hgs
parents:
diff changeset
   336
	//check that specifying a non-existant process id fails
hgs
parents:
diff changeset
   337
	test(KErrArgument == iServSession.GetList((TProcessId)0x12345678, EThreads, buffer, size));
hgs
parents:
diff changeset
   338
hgs
parents:
diff changeset
   339
	//check that specifying a non-existant thread id fails
hgs
parents:
diff changeset
   340
	test(KErrArgument == iServSession.GetList((TThreadId)0x12345678, ECodeSegs, buffer, size));
hgs
parents:
diff changeset
   341
hgs
parents:
diff changeset
   342
	//check that specifying a non-existant process id fails
hgs
parents:
diff changeset
   343
	test(KErrArgument == iServSession.GetList((TProcessId)0x12345678, ECodeSegs, buffer, size));
hgs
parents:
diff changeset
   344
hgs
parents:
diff changeset
   345
	//cleanup
hgs
parents:
diff changeset
   346
	buffer.Close();
hgs
parents:
diff changeset
   347
	}
hgs
parents:
diff changeset
   348
hgs
parents:
diff changeset
   349
//---------------------------------------------
hgs
parents:
diff changeset
   350
//! @SYMTestCaseID KBase-T-RMDEBUG2-0429
hgs
parents:
diff changeset
   351
//! @SYMTestType
hgs
parents:
diff changeset
   352
//! @SYMPREQ PREQ1426
hgs
parents:
diff changeset
   353
//! @SYMTestCaseDesc Test getting the process list
hgs
parents:
diff changeset
   354
//! @SYMTestActions Get the process listing
hgs
parents:
diff changeset
   355
//! @SYMTestExpectedResults The process listing should be successfully obtained and the current process should be present in the list
hgs
parents:
diff changeset
   356
//! @SYMTestPriority High
hgs
parents:
diff changeset
   357
//! @SYMTestStatus Implemented
hgs
parents:
diff changeset
   358
//---------------------------------------------
hgs
parents:
diff changeset
   359
void CRunModeAgent::TestGetProcessList()
hgs
parents:
diff changeset
   360
	{
hgs
parents:
diff changeset
   361
	test.Next(_L("TestGetProcessList\n"));
hgs
parents:
diff changeset
   362
hgs
parents:
diff changeset
   363
	test(ListingSupported(EProcesses, EScopeGlobal));
hgs
parents:
diff changeset
   364
	test(!ListingSupported(EProcesses, EScopeProcessSpecific));
hgs
parents:
diff changeset
   365
	test(!ListingSupported(EProcesses, EScopeThreadSpecific));
hgs
parents:
diff changeset
   366
hgs
parents:
diff changeset
   367
	//allocate a very small buffer so the GetList call fails
hgs
parents:
diff changeset
   368
	RBuf8 buffer;
hgs
parents:
diff changeset
   369
	test(KErrNone == buffer.Create(1));
hgs
parents:
diff changeset
   370
	TUint32 size = 0;
hgs
parents:
diff changeset
   371
hgs
parents:
diff changeset
   372
	//get the list data
hgs
parents:
diff changeset
   373
	DoGetList(EProcesses, EScopeGlobal, buffer, size);
hgs
parents:
diff changeset
   374
hgs
parents:
diff changeset
   375
	//initialise data about the target debug thread to compare the kernel's data against
hgs
parents:
diff changeset
   376
	RProcess thisProcess;
hgs
parents:
diff changeset
   377
	TFileName thisProcessName = thisProcess.FileName();
hgs
parents:
diff changeset
   378
	TUint32 processId = thisProcess.Id().Id();
hgs
parents:
diff changeset
   379
hgs
parents:
diff changeset
   380
	//look through the buffer and check if the target debug thread is there
hgs
parents:
diff changeset
   381
	TBool found = EFalse;
hgs
parents:
diff changeset
   382
	TUint8* ptr = (TUint8*)buffer.Ptr();
hgs
parents:
diff changeset
   383
	const TUint8* ptrEnd = ptr + size;
hgs
parents:
diff changeset
   384
	while(ptr < ptrEnd)
hgs
parents:
diff changeset
   385
		{
hgs
parents:
diff changeset
   386
		TProcessListEntry& entry = *(TProcessListEntry*)ptr;
hgs
parents:
diff changeset
   387
		if( (RProcess().Id().Id() == entry.iProcessId) &&
hgs
parents:
diff changeset
   388
			(0 == thisProcessName.CompareF(TPtr(&(entry.iNames[0]), entry.iFileNameLength, entry.iFileNameLength))) &&
hgs
parents:
diff changeset
   389
		 	(0 == thisProcess.FullName().CompareF(TPtr(&(entry.iNames[0]) + entry.iFileNameLength, entry.iDynamicNameLength, entry.iDynamicNameLength))) &&
hgs
parents:
diff changeset
   390
			0x4321bbbb /* Magic */ == entry.iUid3)
hgs
parents:
diff changeset
   391
			{
hgs
parents:
diff changeset
   392
			//if all match then we've found it
hgs
parents:
diff changeset
   393
			found = ETrue;
hgs
parents:
diff changeset
   394
			}
hgs
parents:
diff changeset
   395
		ptr += Align4(entry.GetSize());
hgs
parents:
diff changeset
   396
		}
hgs
parents:
diff changeset
   397
hgs
parents:
diff changeset
   398
	//check whether the expected result happened
hgs
parents:
diff changeset
   399
	test(found);
hgs
parents:
diff changeset
   400
hgs
parents:
diff changeset
   401
	//clean up
hgs
parents:
diff changeset
   402
	buffer.Close();
hgs
parents:
diff changeset
   403
	}
hgs
parents:
diff changeset
   404
hgs
parents:
diff changeset
   405
//---------------------------------------------
hgs
parents:
diff changeset
   406
//! @SYMTestCaseID KBase-T-RMDEBUG2-0430
hgs
parents:
diff changeset
   407
//! @SYMTestType
hgs
parents:
diff changeset
   408
//! @SYMPREQ PREQ1426
hgs
parents:
diff changeset
   409
//! @SYMTestCaseDesc Test getting the thread list
hgs
parents:
diff changeset
   410
//! @SYMTestActions Get the thread listing globally and for a specified thread or process
hgs
parents:
diff changeset
   411
//! @SYMTestExpectedResults The thread listings should all be successfully obtained and the current thread should be present in all listings
hgs
parents:
diff changeset
   412
//! @SYMTestPriority High
hgs
parents:
diff changeset
   413
//! @SYMTestStatus Implemented
hgs
parents:
diff changeset
   414
//---------------------------------------------
hgs
parents:
diff changeset
   415
void CRunModeAgent::TestGetThreadList()
hgs
parents:
diff changeset
   416
	{
hgs
parents:
diff changeset
   417
	test.Next(_L("TestGetThreadList\n"));
hgs
parents:
diff changeset
   418
hgs
parents:
diff changeset
   419
	test(ListingSupported(EThreads, EScopeGlobal));
hgs
parents:
diff changeset
   420
	test(ListingSupported(EThreads, EScopeProcessSpecific));
hgs
parents:
diff changeset
   421
	test(ListingSupported(EThreads, EScopeThreadSpecific));
hgs
parents:
diff changeset
   422
hgs
parents:
diff changeset
   423
	test(KErrNone == iServSession.AttachExecutable(iFileName, EFalse));
hgs
parents:
diff changeset
   424
	test(KErrNone == iServSession.SuspendThread(iThreadID));
hgs
parents:
diff changeset
   425
hgs
parents:
diff changeset
   426
	TBool found = EFalse;
hgs
parents:
diff changeset
   427
	
hgs
parents:
diff changeset
   428
	/* We need these loops because on some system the kernel run mode debugger does not 
hgs
parents:
diff changeset
   429
	 immediately present the thread in the thread list. 
hgs
parents:
diff changeset
   430
	 */
hgs
parents:
diff changeset
   431
	
hgs
parents:
diff changeset
   432
	for(TInt retryCount = 0; retryCount < 10 && !found; retryCount++ )
hgs
parents:
diff changeset
   433
		{
hgs
parents:
diff changeset
   434
		//test getting this process's thread list, ETrue as should find the target debug thread
hgs
parents:
diff changeset
   435
		User::After(50000);
hgs
parents:
diff changeset
   436
		found = DoTestGetThreadList(ETrue, EScopeProcessSpecific, RProcess().Id().Id());
hgs
parents:
diff changeset
   437
		}
hgs
parents:
diff changeset
   438
	test( found );
hgs
parents:
diff changeset
   439
	found = EFalse;
hgs
parents:
diff changeset
   440
hgs
parents:
diff changeset
   441
	for(TInt retryCount = 0; retryCount < 10 && !found; retryCount++ )
hgs
parents:
diff changeset
   442
		{
hgs
parents:
diff changeset
   443
		//test getting the global list, ETrue as should find the target debug thread
hgs
parents:
diff changeset
   444
		User::After(50000);
hgs
parents:
diff changeset
   445
		found = DoTestGetThreadList(ETrue, EScopeGlobal);
hgs
parents:
diff changeset
   446
		}
hgs
parents:
diff changeset
   447
	test( found );
hgs
parents:
diff changeset
   448
hgs
parents:
diff changeset
   449
	found = EFalse;
hgs
parents:
diff changeset
   450
	for(TInt retryCount = 0; retryCount < 10 && !found; retryCount++ )
hgs
parents:
diff changeset
   451
		{
hgs
parents:
diff changeset
   452
		//test getting this thread's thread list, ETrue as should find the target debug thread
hgs
parents:
diff changeset
   453
		User::After(50000);
hgs
parents:
diff changeset
   454
		found = DoTestGetThreadList(ETrue, EScopeThreadSpecific, RThread().Id().Id());
hgs
parents:
diff changeset
   455
		}
hgs
parents:
diff changeset
   456
	test( found );
hgs
parents:
diff changeset
   457
hgs
parents:
diff changeset
   458
	test(KErrNone == iServSession.ResumeThread(iThreadID));
hgs
parents:
diff changeset
   459
	test(KErrNone == iServSession.DetachExecutable(iFileName));
hgs
parents:
diff changeset
   460
	}
hgs
parents:
diff changeset
   461
			
hgs
parents:
diff changeset
   462
TBool CRunModeAgent::DoTestGetThreadList(const TBool aShouldPass, const TListScope aListScope, const TUint64 aTargetId)
hgs
parents:
diff changeset
   463
	{
hgs
parents:
diff changeset
   464
	//create data to pass
hgs
parents:
diff changeset
   465
	RBuf8 buffer;
hgs
parents:
diff changeset
   466
	TUint32 size = 0;
hgs
parents:
diff changeset
   467
hgs
parents:
diff changeset
   468
	//perform the call to get the thread list
hgs
parents:
diff changeset
   469
	DoGetList(EThreads, aListScope, buffer, size, aTargetId);
hgs
parents:
diff changeset
   470
hgs
parents:
diff changeset
   471
	//initialise data about the target debug thread to compare the kernel's data against
hgs
parents:
diff changeset
   472
	TFileName name = iDebugThread.FullName();
hgs
parents:
diff changeset
   473
	RProcess thisProcess;
hgs
parents:
diff changeset
   474
	TUint64 processId = thisProcess.Id();
hgs
parents:
diff changeset
   475
	TUint64 threadId = iDebugThread.Id();
hgs
parents:
diff changeset
   476
hgs
parents:
diff changeset
   477
	//look through the buffer and check if the target debug thread is there
hgs
parents:
diff changeset
   478
	TBool found = EFalse;
hgs
parents:
diff changeset
   479
	TUint8* ptr = (TUint8*)buffer.Ptr();
hgs
parents:
diff changeset
   480
	const TUint8* ptrEnd = ptr + size;
hgs
parents:
diff changeset
   481
	while(ptr < ptrEnd)
hgs
parents:
diff changeset
   482
		{
hgs
parents:
diff changeset
   483
		TThreadListEntry* entry = (TThreadListEntry*)ptr;
hgs
parents:
diff changeset
   484
		TPtr entryName(&(entry->iName[0]), entry->iNameLength, entry->iNameLength);
hgs
parents:
diff changeset
   485
hgs
parents:
diff changeset
   486
		if( (threadId == entry->iThreadId) && (processId == entry->iProcessId) && (0 == name.CompareF(entryName)) )
hgs
parents:
diff changeset
   487
			{
hgs
parents:
diff changeset
   488
			test(entry->iSupervisorStackBaseValid);
hgs
parents:
diff changeset
   489
			test(entry->iSupervisorStackSizeValid);
hgs
parents:
diff changeset
   490
			//if all match then we've found it
hgs
parents:
diff changeset
   491
			found = ETrue;
hgs
parents:
diff changeset
   492
			break;
hgs
parents:
diff changeset
   493
			}
hgs
parents:
diff changeset
   494
hgs
parents:
diff changeset
   495
		ptr += Align4(entry->GetSize());
hgs
parents:
diff changeset
   496
		}
hgs
parents:
diff changeset
   497
hgs
parents:
diff changeset
   498
	//clean up
hgs
parents:
diff changeset
   499
	buffer.Close();
hgs
parents:
diff changeset
   500
	return found;
hgs
parents:
diff changeset
   501
hgs
parents:
diff changeset
   502
	}
hgs
parents:
diff changeset
   503
hgs
parents:
diff changeset
   504
//---------------------------------------------
hgs
parents:
diff changeset
   505
//! @SYMTestCaseID KBase-T-RMDEBUG2-0431
hgs
parents:
diff changeset
   506
//! @SYMTestType
hgs
parents:
diff changeset
   507
//! @SYMPREQ PREQ1426
hgs
parents:
diff changeset
   508
//! @SYMTestCaseDesc Test getting the code segment list
hgs
parents:
diff changeset
   509
//! @SYMTestActions Get the code segment list global and for a specified thread
hgs
parents:
diff changeset
   510
//! @SYMTestExpectedResults The listings should be returned successfully
hgs
parents:
diff changeset
   511
//! @SYMTestPriority High
hgs
parents:
diff changeset
   512
//! @SYMTestStatus Implemented
hgs
parents:
diff changeset
   513
//---------------------------------------------
hgs
parents:
diff changeset
   514
void CRunModeAgent::TestGetCodeSegsList()
hgs
parents:
diff changeset
   515
	{
hgs
parents:
diff changeset
   516
	test.Next(_L("TestGetCodeSegsList\n"));
hgs
parents:
diff changeset
   517
hgs
parents:
diff changeset
   518
	test(ListingSupported(ECodeSegs, EScopeGlobal));
hgs
parents:
diff changeset
   519
	test(ListingSupported(ECodeSegs, EScopeProcessSpecific));
hgs
parents:
diff changeset
   520
	test(ListingSupported(ECodeSegs, EScopeThreadSpecific));
hgs
parents:
diff changeset
   521
hgs
parents:
diff changeset
   522
	// Cannot perform this test with OEM2 debug token, as the t_rmdebug2 app
hgs
parents:
diff changeset
   523
	// needs AllFiles, and the OEM2 debug token does not authorise this.
hgs
parents:
diff changeset
   524
	// It seems reasonable to suppose that it would work anyway
hgs
parents:
diff changeset
   525
hgs
parents:
diff changeset
   526
#ifndef FEWCAPS_DEBUGTOKEN
hgs
parents:
diff changeset
   527
	test(KErrNone == iServSession.AttachExecutable(iFileName, EFalse));
hgs
parents:
diff changeset
   528
hgs
parents:
diff changeset
   529
 	//test getting the global list, ETrue as should find this process' main codeSeg
hgs
parents:
diff changeset
   530
	DoTestGetCodeSegsList(ETrue, EScopeGlobal);
hgs
parents:
diff changeset
   531
hgs
parents:
diff changeset
   532
	//test getting this process' codeSegs, ETrue as should find this process' main codeSeg
hgs
parents:
diff changeset
   533
	DoTestGetCodeSegsList(ETrue, EScopeProcessSpecific, RProcess().Id().Id());
hgs
parents:
diff changeset
   534
hgs
parents:
diff changeset
   535
	//test getting this thread's codeSegs, ETrue as should find this process' main codeSeg
hgs
parents:
diff changeset
   536
	DoTestGetCodeSegsList(ETrue, EScopeThreadSpecific, RThread().Id().Id());
hgs
parents:
diff changeset
   537
hgs
parents:
diff changeset
   538
	test(KErrNone == iServSession.DetachExecutable(iFileName));
hgs
parents:
diff changeset
   539
#endif // FEWCAPS_DEBUGTOKEN
hgs
parents:
diff changeset
   540
hgs
parents:
diff changeset
   541
	}
hgs
parents:
diff changeset
   542
hgs
parents:
diff changeset
   543
void CRunModeAgent::DoTestGetCodeSegsList(const TBool aShouldPass, const TListScope aListScope, const TUint64 aTargetId)
hgs
parents:
diff changeset
   544
	{
hgs
parents:
diff changeset
   545
	//create data to pass
hgs
parents:
diff changeset
   546
	RBuf8 buffer;
hgs
parents:
diff changeset
   547
	TUint32 size = 0;
hgs
parents:
diff changeset
   548
hgs
parents:
diff changeset
   549
	//perform the call to get the Code segs
hgs
parents:
diff changeset
   550
	DoGetList(ECodeSegs, aListScope, buffer, size, aTargetId);
hgs
parents:
diff changeset
   551
hgs
parents:
diff changeset
   552
	//create memoryInfo to contain info about this process
hgs
parents:
diff changeset
   553
	RProcess thisProcess;
hgs
parents:
diff changeset
   554
	TModuleMemoryInfo memoryInfo;
hgs
parents:
diff changeset
   555
	test(KErrNone == thisProcess.GetMemoryInfo(memoryInfo));
hgs
parents:
diff changeset
   556
hgs
parents:
diff changeset
   557
	// check whether this process came from a file in ROM so we know whether to
hgs
parents:
diff changeset
   558
	// expect the code seg to be XIP or not.
hgs
parents:
diff changeset
   559
	RFs fs;
hgs
parents:
diff changeset
   560
	test(KErrNone == fs.Connect());
hgs
parents:
diff changeset
   561
	TBool thisFileIsInRom = EFalse;
hgs
parents:
diff changeset
   562
	if(fs.IsFileInRom(iFileName))
hgs
parents:
diff changeset
   563
		{
hgs
parents:
diff changeset
   564
		thisFileIsInRom = ETrue;
hgs
parents:
diff changeset
   565
		}
hgs
parents:
diff changeset
   566
hgs
parents:
diff changeset
   567
	//look through the buffer to find this process' main code seg
hgs
parents:
diff changeset
   568
	TBool found = EFalse;
hgs
parents:
diff changeset
   569
	TUint8* ptr = (TUint8*)buffer.Ptr();
hgs
parents:
diff changeset
   570
	const TUint8* ptrEnd = ptr + size;
hgs
parents:
diff changeset
   571
	while(ptr < ptrEnd)
hgs
parents:
diff changeset
   572
		{
hgs
parents:
diff changeset
   573
		TCodeSegListEntry* codeSeg = (TCodeSegListEntry*)ptr;
hgs
parents:
diff changeset
   574
hgs
parents:
diff changeset
   575
		if( (codeSeg->iIsXip == thisFileIsInRom) && (0 == iFileName.CompareF(TPtr(&(codeSeg->iName[0]), codeSeg->iNameLength, codeSeg->iNameLength))) )
hgs
parents:
diff changeset
   576
			{
hgs
parents:
diff changeset
   577
			if( (memoryInfo.iCodeBase == codeSeg->iCodeBase) &&
hgs
parents:
diff changeset
   578
					(memoryInfo.iCodeSize == codeSeg->iCodeSize) &&
hgs
parents:
diff changeset
   579
					(memoryInfo.iConstDataSize == codeSeg->iConstDataSize) &&
hgs
parents:
diff changeset
   580
					(memoryInfo.iInitialisedDataBase == codeSeg->iInitialisedDataBase) &&
hgs
parents:
diff changeset
   581
					(memoryInfo.iInitialisedDataSize == codeSeg->iInitialisedDataSize) &&
hgs
parents:
diff changeset
   582
					(memoryInfo.iUninitialisedDataSize == codeSeg->iUninitialisedDataSize))
hgs
parents:
diff changeset
   583
				{
hgs
parents:
diff changeset
   584
				//all matched so means we've found the codeSeg we're looking for
hgs
parents:
diff changeset
   585
				found = ETrue;
hgs
parents:
diff changeset
   586
				}
hgs
parents:
diff changeset
   587
			}
hgs
parents:
diff changeset
   588
		ptr += Align4(codeSeg->GetSize());
hgs
parents:
diff changeset
   589
		}
hgs
parents:
diff changeset
   590
hgs
parents:
diff changeset
   591
	//check whether the result was as expected
hgs
parents:
diff changeset
   592
	test(found == aShouldPass);
hgs
parents:
diff changeset
   593
hgs
parents:
diff changeset
   594
	// only care about rm_debug.ldd if we have global scope (belongs to the system not this process)
hgs
parents:
diff changeset
   595
	if (aListScope == EScopeGlobal)
hgs
parents:
diff changeset
   596
	{
hgs
parents:
diff changeset
   597
		// Search for rm_debug.ldd library and check its UID3 is correct
hgs
parents:
diff changeset
   598
		found = EFalse;
hgs
parents:
diff changeset
   599
hgs
parents:
diff changeset
   600
_LIT(KRMDebugDriverFileName,"Z:\\sys\bin\\rm_debug.ldd");
hgs
parents:
diff changeset
   601
hgs
parents:
diff changeset
   602
		TFileName rmdebugFilename(KRMDebugDriverFileName);
hgs
parents:
diff changeset
   603
hgs
parents:
diff changeset
   604
		// reset the Ptr
hgs
parents:
diff changeset
   605
		ptr = (TUint8*)buffer.Ptr();
hgs
parents:
diff changeset
   606
		ptrEnd = ptr+size;
hgs
parents:
diff changeset
   607
		while(ptr < ptrEnd)
hgs
parents:
diff changeset
   608
		{
hgs
parents:
diff changeset
   609
			TCodeSegListEntry* codeSeg = (TCodeSegListEntry*)ptr;
hgs
parents:
diff changeset
   610
hgs
parents:
diff changeset
   611
			if( rmdebugFilename.CompareF(TPtr(&(codeSeg->iName[0]), codeSeg->iNameLength, codeSeg->iNameLength)))
hgs
parents:
diff changeset
   612
				{
hgs
parents:
diff changeset
   613
				if(codeSeg->iUid3 == 0x101f7157 /* Magic */)
hgs
parents:
diff changeset
   614
					{
hgs
parents:
diff changeset
   615
					//all matched so means we've found the codeSeg we're looking for
hgs
parents:
diff changeset
   616
					found = ETrue;
hgs
parents:
diff changeset
   617
					}
hgs
parents:
diff changeset
   618
				}
hgs
parents:
diff changeset
   619
			ptr += Align4(codeSeg->GetSize());
hgs
parents:
diff changeset
   620
		}
hgs
parents:
diff changeset
   621
		test((TUint32)found == (TUint32)ETrue);
hgs
parents:
diff changeset
   622
	}
hgs
parents:
diff changeset
   623
hgs
parents:
diff changeset
   624
	//clean up
hgs
parents:
diff changeset
   625
	buffer.Close();
hgs
parents:
diff changeset
   626
hgs
parents:
diff changeset
   627
	}
hgs
parents:
diff changeset
   628
hgs
parents:
diff changeset
   629
hgs
parents:
diff changeset
   630
/**
hgs
parents:
diff changeset
   631
 * Get a list from the run mode debug system. Most list calls will initially return KErrTooBig, 
hgs
parents:
diff changeset
   632
 * since the initial size of the buffer is 0. However it is sometimes valid for a list to be empty
hgs
parents:
diff changeset
   633
 * given its filtering and scope. These calls should return KErrNone.
hgs
parents:
diff changeset
   634
 */
hgs
parents:
diff changeset
   635
void CRunModeAgent::DoGetList(const TListId aListId, const TListScope aListScope, RBuf8& aBuffer, TUint32& aSize, const TUint64 aTargetId)
hgs
parents:
diff changeset
   636
	{
hgs
parents:
diff changeset
   637
	//close the buffer in case there's stuff allocated in it
hgs
parents:
diff changeset
   638
	aBuffer.Close();
hgs
parents:
diff changeset
   639
	//initialise it to be one byte big, which will guarantee data won't fit in it
hgs
parents:
diff changeset
   640
	test(KErrNone == aBuffer.Create(1));
hgs
parents:
diff changeset
   641
	aSize = 0;
hgs
parents:
diff changeset
   642
	
hgs
parents:
diff changeset
   643
	TInt ret = KErrNone;
hgs
parents:
diff changeset
   644
	//should pass this test (assuming we've passed in sensible arguments above...)
hgs
parents:
diff changeset
   645
	if(EScopeGlobal == aListScope)
hgs
parents:
diff changeset
   646
		{
hgs
parents:
diff changeset
   647
		ret = iServSession.GetList(aListId, aBuffer, aSize);
hgs
parents:
diff changeset
   648
		}
hgs
parents:
diff changeset
   649
	else if(EScopeThreadSpecific == aListScope)
hgs
parents:
diff changeset
   650
		{
hgs
parents:
diff changeset
   651
		ret = iServSession.GetList((TThreadId)aTargetId, aListId, aBuffer, aSize);
hgs
parents:
diff changeset
   652
		}
hgs
parents:
diff changeset
   653
	else if(EScopeProcessSpecific == aListScope)
hgs
parents:
diff changeset
   654
		{
hgs
parents:
diff changeset
   655
		ret = iServSession.GetList((TProcessId)aTargetId, aListId, aBuffer, aSize);
hgs
parents:
diff changeset
   656
		}
hgs
parents:
diff changeset
   657
	else
hgs
parents:
diff changeset
   658
		{
hgs
parents:
diff changeset
   659
		// unknown list scope
hgs
parents:
diff changeset
   660
		test(0);
hgs
parents:
diff changeset
   661
		}
hgs
parents:
diff changeset
   662
hgs
parents:
diff changeset
   663
	if( KErrNone == ret )
hgs
parents:
diff changeset
   664
		{
hgs
parents:
diff changeset
   665
		/* In the case that there is no data, just return and let the caller check
hgs
parents:
diff changeset
   666
		the buffer. It is valid for a caller to not expect any data to be returned.
hgs
parents:
diff changeset
   667
		*/
hgs
parents:
diff changeset
   668
		return;
hgs
parents:
diff changeset
   669
		}
hgs
parents:
diff changeset
   670
	
hgs
parents:
diff changeset
   671
	// The only other allowed return is KErrTooBig
hgs
parents:
diff changeset
   672
	test( ret == KErrTooBig );
hgs
parents:
diff changeset
   673
hgs
parents:
diff changeset
   674
	//keep allocating larger buffers, beginning with the aSize returned by the above call,
hgs
parents:
diff changeset
   675
	//and hopefully we'll eventually make a large enough one
hgs
parents:
diff changeset
   676
	test(KErrNone == aBuffer.ReAlloc(aSize));
hgs
parents:
diff changeset
   677
hgs
parents:
diff changeset
   678
	for(;;)
hgs
parents:
diff changeset
   679
		{
hgs
parents:
diff changeset
   680
		TInt err = KErrNone;
hgs
parents:
diff changeset
   681
		if(EScopeGlobal == aListScope)
hgs
parents:
diff changeset
   682
			{
hgs
parents:
diff changeset
   683
			err = iServSession.GetList(aListId, aBuffer, aSize);
hgs
parents:
diff changeset
   684
			}
hgs
parents:
diff changeset
   685
		else if(EScopeThreadSpecific == aListScope)
hgs
parents:
diff changeset
   686
			{
hgs
parents:
diff changeset
   687
			err = iServSession.GetList((TThreadId)aTargetId, aListId, aBuffer, aSize);
hgs
parents:
diff changeset
   688
			}
hgs
parents:
diff changeset
   689
		else if(EScopeProcessSpecific == aListScope)
hgs
parents:
diff changeset
   690
			{
hgs
parents:
diff changeset
   691
			err = iServSession.GetList((TProcessId)aTargetId, aListId, aBuffer, aSize);
hgs
parents:
diff changeset
   692
			}
hgs
parents:
diff changeset
   693
		else
hgs
parents:
diff changeset
   694
			{
hgs
parents:
diff changeset
   695
			// unknown list scope
hgs
parents:
diff changeset
   696
			test(0);
hgs
parents:
diff changeset
   697
			}
hgs
parents:
diff changeset
   698
		if(err == KErrTooBig)
hgs
parents:
diff changeset
   699
			{
hgs
parents:
diff changeset
   700
			//wasn't big enough so double it
hgs
parents:
diff changeset
   701
			aSize = aSize << 1;
hgs
parents:
diff changeset
   702
			err = aBuffer.ReAlloc(aSize);
hgs
parents:
diff changeset
   703
			if(err != KErrNone)
hgs
parents:
diff changeset
   704
				{
hgs
parents:
diff changeset
   705
				//print out a message if couldn't allocate memory and quit
hgs
parents:
diff changeset
   706
				test.Printf(_L("Out ot memory when attempting to allocate %d bytes."), aSize);
hgs
parents:
diff changeset
   707
				test(KErrNone == err);
hgs
parents:
diff changeset
   708
				}
hgs
parents:
diff changeset
   709
hgs
parents:
diff changeset
   710
			RDebug::Printf(" List size =%d", aSize );
hgs
parents:
diff changeset
   711
			}
hgs
parents:
diff changeset
   712
		else
hgs
parents:
diff changeset
   713
			{
hgs
parents:
diff changeset
   714
			test(KErrNone == err);
hgs
parents:
diff changeset
   715
			test(aBuffer.Length() == aSize);
hgs
parents:
diff changeset
   716
			//break out of the loop if the list has been successfully read in
hgs
parents:
diff changeset
   717
			break;
hgs
parents:
diff changeset
   718
			}
hgs
parents:
diff changeset
   719
		}
hgs
parents:
diff changeset
   720
	}
hgs
parents:
diff changeset
   721
hgs
parents:
diff changeset
   722
//---------------------------------------------
hgs
parents:
diff changeset
   723
//! @SYMTestCaseID KBase-T-RMDEBUG2-0432
hgs
parents:
diff changeset
   724
//! @SYMTestType
hgs
parents:
diff changeset
   725
//! @SYMPREQ PREQ1426
hgs
parents:
diff changeset
   726
//! @SYMTestCaseDesc Test reading and writing memory
hgs
parents:
diff changeset
   727
//! @SYMTestActions Multiple calls to read and write memory, with various sizes and at various locations.
hgs
parents:
diff changeset
   728
//!	Also test that bad input values cause appropriate errors to be returned.
hgs
parents:
diff changeset
   729
//! @SYMTestExpectedResults All tests should pass and the target process should be left unaffected
hgs
parents:
diff changeset
   730
//! @SYMTestPriority High
hgs
parents:
diff changeset
   731
//! @SYMTestStatus Implemented
hgs
parents:
diff changeset
   732
//---------------------------------------------
hgs
parents:
diff changeset
   733
void CRunModeAgent::TestMemoryAccess()
hgs
parents:
diff changeset
   734
{
hgs
parents:
diff changeset
   735
	TInt err;
hgs
parents:
diff changeset
   736
hgs
parents:
diff changeset
   737
	test.Next(_L("TestMemoryAccess - Read Memory\n"));
hgs
parents:
diff changeset
   738
hgs
parents:
diff changeset
   739
	//initialise buffer
hgs
parents:
diff changeset
   740
	gMemoryAccessBytes.SetLength(0);
hgs
parents:
diff changeset
   741
	for (TInt i=0; i<SYMBIAN_RMDBG_MEMORYSIZE; i++)
hgs
parents:
diff changeset
   742
		{
hgs
parents:
diff changeset
   743
		gMemoryAccessBytes.Append(i);
hgs
parents:
diff changeset
   744
		}
hgs
parents:
diff changeset
   745
hgs
parents:
diff changeset
   746
	TUint32 address = (TUint32)(&gMemoryAccessBytes[0]);
hgs
parents:
diff changeset
   747
	TUint32 dataSize = SYMBIAN_RMDBG_MEMORYSIZE;
hgs
parents:
diff changeset
   748
hgs
parents:
diff changeset
   749
	//create size for buffer that is rounded up to nearest 4 bytes if not
hgs
parents:
diff changeset
   750
	//already 4 byte aligned
hgs
parents:
diff changeset
   751
	TUint32 size = dataSize;
hgs
parents:
diff changeset
   752
	if(size % 4 != 0)
hgs
parents:
diff changeset
   753
		{
hgs
parents:
diff changeset
   754
		size += (4 - (size % 4));
hgs
parents:
diff changeset
   755
		}
hgs
parents:
diff changeset
   756
hgs
parents:
diff changeset
   757
	RBuf8 dataBlock;
hgs
parents:
diff changeset
   758
	err = dataBlock.Create(size);
hgs
parents:
diff changeset
   759
	test(err==KErrNone);
hgs
parents:
diff changeset
   760
	test(KErrNone == iServSession.AttachExecutable(iFileName, EFalse));
hgs
parents:
diff changeset
   761
hgs
parents:
diff changeset
   762
	//suspend the thread prior to memory operations
hgs
parents:
diff changeset
   763
	test(KErrNone == iServSession.SuspendThread(iThreadID));
hgs
parents:
diff changeset
   764
hgs
parents:
diff changeset
   765
	err = iServSession.ReadMemory(iThreadID, address, size, dataBlock, EAccess32, EEndLE8);
hgs
parents:
diff changeset
   766
	test(err==KErrNone);
hgs
parents:
diff changeset
   767
hgs
parents:
diff changeset
   768
	for (TInt i=0; i<dataSize; i++)
hgs
parents:
diff changeset
   769
		{
hgs
parents:
diff changeset
   770
		test(dataBlock.Ptr()[i] == gMemoryAccessBytes[i]);
hgs
parents:
diff changeset
   771
		}
hgs
parents:
diff changeset
   772
hgs
parents:
diff changeset
   773
	test.Next(_L("TestMemoryAccess - Write Memory\n"));
hgs
parents:
diff changeset
   774
hgs
parents:
diff changeset
   775
	// Now reset the buffer
hgs
parents:
diff changeset
   776
	for (TInt i=0; i<dataSize; i++)
hgs
parents:
diff changeset
   777
		{
hgs
parents:
diff changeset
   778
		gMemoryAccessBytes[i] = 0;
hgs
parents:
diff changeset
   779
		}
hgs
parents:
diff changeset
   780
hgs
parents:
diff changeset
   781
	// Write our data into the buffer
hgs
parents:
diff changeset
   782
	err = iServSession.WriteMemory(iThreadID, address, size, dataBlock, EAccess32, EEndLE8);
hgs
parents:
diff changeset
   783
	test(err==KErrNone);
hgs
parents:
diff changeset
   784
hgs
parents:
diff changeset
   785
	for (TInt i=0; i<dataSize; i++)
hgs
parents:
diff changeset
   786
		{
hgs
parents:
diff changeset
   787
		test(dataBlock.Ptr()[i] == gMemoryAccessBytes[i]);
hgs
parents:
diff changeset
   788
		}
hgs
parents:
diff changeset
   789
hgs
parents:
diff changeset
   790
	//final test that everything's not been going wrong
hgs
parents:
diff changeset
   791
	test(gMemoryAccessBytes[5] != 0);
hgs
parents:
diff changeset
   792
hgs
parents:
diff changeset
   793
	test.Next(_L("TestMemoryAccess - Invalid arguments\n"));
hgs
parents:
diff changeset
   794
	test.Printf(_L("This test may emit crash-like information. This is intended.\n"));
hgs
parents:
diff changeset
   795
hgs
parents:
diff changeset
   796
	//test address that is not 32 bit aligned
hgs
parents:
diff changeset
   797
	err = iServSession.ReadMemory(iThreadID, address + 1, size, dataBlock, EAccess32, EEndLE8);
hgs
parents:
diff changeset
   798
	test(err == KErrArgument);
hgs
parents:
diff changeset
   799
hgs
parents:
diff changeset
   800
	//test size that is not multiple of 4 bytes
hgs
parents:
diff changeset
   801
	err = iServSession.WriteMemory(iThreadID, address, size + 2, dataBlock, EAccess32, EEndLE8);
hgs
parents:
diff changeset
   802
	test(err == KErrArgument);
hgs
parents:
diff changeset
   803
hgs
parents:
diff changeset
   804
	//test size > max block size
hgs
parents:
diff changeset
   805
	err = iServSession.ReadMemory(iThreadID, address, (1<<15), dataBlock, EAccess32, EEndLE8);
hgs
parents:
diff changeset
   806
	test(err == KErrArgument);
hgs
parents:
diff changeset
   807
hgs
parents:
diff changeset
   808
	//test access size == 2 bytes
hgs
parents:
diff changeset
   809
	err = iServSession.ReadMemory(iThreadID, address, size, dataBlock, EAccess16, EEndLE8);
hgs
parents:
diff changeset
   810
	test(err == KErrNotSupported);
hgs
parents:
diff changeset
   811
hgs
parents:
diff changeset
   812
	//test access size == 1 byte
hgs
parents:
diff changeset
   813
	err = iServSession.WriteMemory(iThreadID, address, size, dataBlock, EAccess8, EEndLE8);
hgs
parents:
diff changeset
   814
	test(err == KErrNotSupported);
hgs
parents:
diff changeset
   815
hgs
parents:
diff changeset
   816
	//test endianess == EEndBE8
hgs
parents:
diff changeset
   817
	err = iServSession.ReadMemory(iThreadID, address, size, dataBlock, EAccess32, EEndBE8);
hgs
parents:
diff changeset
   818
	test(err == KErrNotSupported);
hgs
parents:
diff changeset
   819
hgs
parents:
diff changeset
   820
	//test endianess == EEndBE32
hgs
parents:
diff changeset
   821
	err = iServSession.WriteMemory(iThreadID, address, size, dataBlock, EAccess32, EEndBE32);
hgs
parents:
diff changeset
   822
	test(err == KErrNotSupported);
hgs
parents:
diff changeset
   823
hgs
parents:
diff changeset
   824
	//test reading off end of memory
hgs
parents:
diff changeset
   825
	err = iServSession.ReadMemory(iThreadID, 0xffffff00, 0x00000101, dataBlock, EAccess32, EEndLE8);
hgs
parents:
diff changeset
   826
	test(err == KErrArgument);
hgs
parents:
diff changeset
   827
hgs
parents:
diff changeset
   828
	//The following three tests check that edge conditions in the range check are handled correctly.
hgs
parents:
diff changeset
   829
	err = iServSession.ReadMemory(iThreadID, 0xffffff00, 0x000000FF, dataBlock, EAccess32, EEndLE8);
hgs
parents:
diff changeset
   830
	test(err == KErrArgument);
hgs
parents:
diff changeset
   831
hgs
parents:
diff changeset
   832
	err = iServSession.ReadMemory(iThreadID, 0xffffff00, 0x000000F0, dataBlock, EAccess32, EEndLE8);
hgs
parents:
diff changeset
   833
	test(err == KErrBadDescriptor);
hgs
parents:
diff changeset
   834
hgs
parents:
diff changeset
   835
	//Third range check test. Check that range check is handled correctly even when base + size wraps to 0.
hgs
parents:
diff changeset
   836
	err = iServSession.ReadMemory(iThreadID, 0xffffff00, 0x00000100, dataBlock, EAccess32, EEndLE8);
hgs
parents:
diff changeset
   837
	test(err == KErrBadDescriptor);
hgs
parents:
diff changeset
   838
	//end of range check tests
hgs
parents:
diff changeset
   839
hgs
parents:
diff changeset
   840
	//test size == 0
hgs
parents:
diff changeset
   841
	err = iServSession.WriteMemory(iThreadID, address, 0, dataBlock, EAccess32, EEndLE8);
hgs
parents:
diff changeset
   842
	test(err == KErrArgument);
hgs
parents:
diff changeset
   843
hgs
parents:
diff changeset
   844
	//attempt to write to address outside of process data segments,
hgs
parents:
diff changeset
   845
	//this address corresponds to the vectors so shouldn't be able to write
hgs
parents:
diff changeset
   846
	err = iServSession.WriteMemory(iThreadID, 0xffff0000, size, dataBlock, EAccess32, EEndLE8);
hgs
parents:
diff changeset
   847
	test(err == KErrBadDescriptor);
hgs
parents:
diff changeset
   848
hgs
parents:
diff changeset
   849
	//attempt to read and write to address in process code segment
hgs
parents:
diff changeset
   850
hgs
parents:
diff changeset
   851
	//open a handle to the thread
hgs
parents:
diff changeset
   852
	RThread debugThread;
hgs
parents:
diff changeset
   853
	test(debugThread.Open(iThreadID) == KErrNone);
hgs
parents:
diff changeset
   854
hgs
parents:
diff changeset
   855
	//get a reference to the debug process
hgs
parents:
diff changeset
   856
	RProcess debugProcess;
hgs
parents:
diff changeset
   857
	test(debugThread.Process(debugProcess) == KErrNone);
hgs
parents:
diff changeset
   858
hgs
parents:
diff changeset
   859
	//get the memory info for the process
hgs
parents:
diff changeset
   860
	TProcessMemoryInfo info;
hgs
parents:
diff changeset
   861
	test(debugProcess.GetMemoryInfo(info) == KErrNone);
hgs
parents:
diff changeset
   862
hgs
parents:
diff changeset
   863
	address = info.iCodeBase;
hgs
parents:
diff changeset
   864
	if(size <= info.iCodeSize)
hgs
parents:
diff changeset
   865
		{
hgs
parents:
diff changeset
   866
		test(KErrNone == iServSession.ReadMemory(iThreadID, address, size, dataBlock, EAccess32, EEndLE8));
hgs
parents:
diff changeset
   867
		test(KErrBadDescriptor == iServSession.WriteMemory(iThreadID, address, size, dataBlock, EAccess32, EEndLE8));
hgs
parents:
diff changeset
   868
		}
hgs
parents:
diff changeset
   869
hgs
parents:
diff changeset
   870
	// Some performance tests now
hgs
parents:
diff changeset
   871
	TUint32 bytesRead = 0;
hgs
parents:
diff changeset
   872
hgs
parents:
diff changeset
   873
	// Allocate a data buffer
hgs
parents:
diff changeset
   874
	TUint32* p = (TUint32*)User::Alloc(size);
hgs
parents:
diff changeset
   875
	test(p != 0);
hgs
parents:
diff changeset
   876
hgs
parents:
diff changeset
   877
	TInt nanokernel_tick_period;
hgs
parents:
diff changeset
   878
	HAL::Get(HAL::ENanoTickPeriod, nanokernel_tick_period);
hgs
parents:
diff changeset
   879
	test (nanokernel_tick_period != 0);
hgs
parents:
diff changeset
   880
hgs
parents:
diff changeset
   881
	static const TInt KOneMillion = 1000000;
hgs
parents:
diff changeset
   882
hgs
parents:
diff changeset
   883
	TInt nkTicksPerSecond = KOneMillion/nanokernel_tick_period;
hgs
parents:
diff changeset
   884
hgs
parents:
diff changeset
   885
	TUint32 stopTickCount = User::NTickCount() + nkTicksPerSecond;
hgs
parents:
diff changeset
   886
hgs
parents:
diff changeset
   887
	while (User::NTickCount() < stopTickCount)
hgs
parents:
diff changeset
   888
		{
hgs
parents:
diff changeset
   889
		err = iServSession.ReadMemory(iThreadID, (TUint32)p, size, dataBlock, EAccess32, EEndLE8);
hgs
parents:
diff changeset
   890
		test(err==KErrNone);
hgs
parents:
diff changeset
   891
hgs
parents:
diff changeset
   892
		// Increase the count of bytes read
hgs
parents:
diff changeset
   893
		bytesRead += size;
hgs
parents:
diff changeset
   894
		}
hgs
parents:
diff changeset
   895
hgs
parents:
diff changeset
   896
	test(bytesRead != 0);
hgs
parents:
diff changeset
   897
	iMemoryReadKbytesPerSecond = bytesRead/1024;
hgs
parents:
diff changeset
   898
hgs
parents:
diff changeset
   899
	// write memory test
hgs
parents:
diff changeset
   900
	TUint32 bytesWritten = 0;
hgs
parents:
diff changeset
   901
hgs
parents:
diff changeset
   902
	stopTickCount = User::NTickCount() + nkTicksPerSecond;
hgs
parents:
diff changeset
   903
hgs
parents:
diff changeset
   904
	while (User::NTickCount() < stopTickCount)
hgs
parents:
diff changeset
   905
		{
hgs
parents:
diff changeset
   906
		err = iServSession.WriteMemory(iThreadID, (TUint32)p, size, dataBlock, EAccess32, EEndLE8);
hgs
parents:
diff changeset
   907
		test(err==KErrNone);
hgs
parents:
diff changeset
   908
hgs
parents:
diff changeset
   909
		// Increase the count of bytes read
hgs
parents:
diff changeset
   910
		bytesWritten += size;
hgs
parents:
diff changeset
   911
		}
hgs
parents:
diff changeset
   912
hgs
parents:
diff changeset
   913
	test (bytesWritten != 0);
hgs
parents:
diff changeset
   914
	iMemoryWriteKbytesPerSecond = bytesWritten/1024;
hgs
parents:
diff changeset
   915
hgs
parents:
diff changeset
   916
	User::Free(p);
hgs
parents:
diff changeset
   917
hgs
parents:
diff changeset
   918
	//resume the thread
hgs
parents:
diff changeset
   919
	test(KErrNone == iServSession.ResumeThread(iThreadID));
hgs
parents:
diff changeset
   920
hgs
parents:
diff changeset
   921
	debugThread.Close();
hgs
parents:
diff changeset
   922
	dataBlock.Close();
hgs
parents:
diff changeset
   923
hgs
parents:
diff changeset
   924
	test(KErrNone == iServSession.DetachExecutable(iFileName));
hgs
parents:
diff changeset
   925
	}
hgs
parents:
diff changeset
   926
hgs
parents:
diff changeset
   927
//---------------------------------------------
hgs
parents:
diff changeset
   928
//! @SYMTestCaseID KBase-T-RMDEBUG2-0433
hgs
parents:
diff changeset
   929
//! @SYMTestType
hgs
parents:
diff changeset
   930
//! @SYMPREQ PREQ1426
hgs
parents:
diff changeset
   931
//! @SYMTestCaseDesc Test suspending and resuming threads
hgs
parents:
diff changeset
   932
//! @SYMTestActions Multiple calls to suspend and resume threads with and without attaching to the thread
hgs
parents:
diff changeset
   933
//! @SYMTestExpectedResults All tests should pass and the target process should be left unaffected
hgs
parents:
diff changeset
   934
//! @SYMTestPriority High
hgs
parents:
diff changeset
   935
//! @SYMTestStatus Implemented
hgs
parents:
diff changeset
   936
//---------------------------------------------
hgs
parents:
diff changeset
   937
void CRunModeAgent::TestSuspendResume()
hgs
parents:
diff changeset
   938
	{
hgs
parents:
diff changeset
   939
	TInt err;
hgs
parents:
diff changeset
   940
hgs
parents:
diff changeset
   941
	test.Next(_L("TestSuspendResume - Suspend\n"));
hgs
parents:
diff changeset
   942
hgs
parents:
diff changeset
   943
	test(KErrNone == iServSession.AttachExecutable(iFileName, EFalse));
hgs
parents:
diff changeset
   944
hgs
parents:
diff changeset
   945
	err = iServSession.SuspendThread(iThreadID);
hgs
parents:
diff changeset
   946
	test(err==KErrNone);
hgs
parents:
diff changeset
   947
	err = TestRunCountSame( iRunCountSubscribe, iTimer );
hgs
parents:
diff changeset
   948
	test( KErrNone == err );
hgs
parents:
diff changeset
   949
	
hgs
parents:
diff changeset
   950
	// Resume the thread
hgs
parents:
diff changeset
   951
	test.Next(_L("TestSuspendResume - Resume\n"));
hgs
parents:
diff changeset
   952
	err = iServSession.ResumeThread(iThreadID);
hgs
parents:
diff changeset
   953
	test(err==KErrNone);
hgs
parents:
diff changeset
   954
hgs
parents:
diff changeset
   955
	test(KErrNone == iServSession.DetachExecutable(iFileName));
hgs
parents:
diff changeset
   956
hgs
parents:
diff changeset
   957
	err = WaitForRunCountChange( iRunCountSubscribe, iTimer );
hgs
parents:
diff changeset
   958
	test(KErrNone == err );
hgs
parents:
diff changeset
   959
	
hgs
parents:
diff changeset
   960
	// check that agent can resume thread which it previously detached from
hgs
parents:
diff changeset
   961
	test(KErrNone == iServSession.AttachExecutable(iFileName, EFalse));
hgs
parents:
diff changeset
   962
	test(KErrNone == iServSession.SuspendThread(iThreadID));
hgs
parents:
diff changeset
   963
	test(KErrNone == iServSession.DetachExecutable(iFileName));
hgs
parents:
diff changeset
   964
hgs
parents:
diff changeset
   965
	test(KErrNone == iServSession.AttachExecutable(iFileName, EFalse));
hgs
parents:
diff changeset
   966
	err = TestRunCountSame( iRunCountSubscribe, iTimer );
hgs
parents:
diff changeset
   967
	test( KErrNone == err );
hgs
parents:
diff changeset
   968
	test(KErrNone == iServSession.ResumeThread(iThreadID));
hgs
parents:
diff changeset
   969
	test(KErrNone == iServSession.DetachExecutable(iFileName));
hgs
parents:
diff changeset
   970
hgs
parents:
diff changeset
   971
	err = WaitForRunCountChange( iRunCountSubscribe, iTimer );
hgs
parents:
diff changeset
   972
	test( KErrNone == err );
hgs
parents:
diff changeset
   973
	
hgs
parents:
diff changeset
   974
	test(KErrNone == iServSession.AttachExecutable(iFileName, EFalse));
hgs
parents:
diff changeset
   975
	test(KErrNone == iServSession.SuspendThread(iThreadID));
hgs
parents:
diff changeset
   976
	err = TestRunCountSame( iRunCountSubscribe, iTimer );
hgs
parents:
diff changeset
   977
	test( KErrNone == err );
hgs
parents:
diff changeset
   978
	test(KErrNone == iServSession.DetachExecutable(iFileName));
hgs
parents:
diff changeset
   979
	err = TestRunCountSame( iRunCountSubscribe, iTimer );
hgs
parents:
diff changeset
   980
	test( KErrNone == err );
hgs
parents:
diff changeset
   981
	    
hgs
parents:
diff changeset
   982
	test(KErrNone == iServSession.AttachExecutable(iFileName, EFalse));
hgs
parents:
diff changeset
   983
	err = TestRunCountSame( iRunCountSubscribe, iTimer );
hgs
parents:
diff changeset
   984
	test( KErrNone == err );
hgs
parents:
diff changeset
   985
	test(KErrNone == iServSession.ResumeThread(iThreadID));
hgs
parents:
diff changeset
   986
	test(KErrNone == iServSession.DetachExecutable(iFileName));
hgs
parents:
diff changeset
   987
	
hgs
parents:
diff changeset
   988
	err = WaitForRunCountChange( iRunCountSubscribe, iTimer );
hgs
parents:
diff changeset
   989
    test( KErrNone == err );
hgs
parents:
diff changeset
   990
	}
hgs
parents:
diff changeset
   991
hgs
parents:
diff changeset
   992
//---------------------------------------------
hgs
parents:
diff changeset
   993
//! @SYMTestCaseID KBase-T-RMDEBUG2-0434
hgs
parents:
diff changeset
   994
//! @SYMTestType
hgs
parents:
diff changeset
   995
//! @SYMPREQ PREQ1426
hgs
parents:
diff changeset
   996
//! @SYMTestCaseDesc Test getting the debug functionality from the driver
hgs
parents:
diff changeset
   997
//! @SYMTestActions Get the size and contents of the debug functionality block
hgs
parents:
diff changeset
   998
//! @SYMTestExpectedResults All tests should pass and the expected data should appear in the functionality block
hgs
parents:
diff changeset
   999
//! @SYMTestPriority High
hgs
parents:
diff changeset
  1000
//! @SYMTestStatus Implemented
hgs
parents:
diff changeset
  1001
//---------------------------------------------
hgs
parents:
diff changeset
  1002
void CRunModeAgent::TestDebugFunctionality()
hgs
parents:
diff changeset
  1003
	{
hgs
parents:
diff changeset
  1004
hgs
parents:
diff changeset
  1005
	TInt err;
hgs
parents:
diff changeset
  1006
hgs
parents:
diff changeset
  1007
	test.Next(_L("TestDebugFunctionality - GetDebugFunctionalityBufSize\n"));
hgs
parents:
diff changeset
  1008
hgs
parents:
diff changeset
  1009
	TUint32 bufsize = 0;	// Safe default size
hgs
parents:
diff changeset
  1010
hgs
parents:
diff changeset
  1011
	// Get functionality block size
hgs
parents:
diff changeset
  1012
	err = iServSession.GetDebugFunctionalityBufSize(&bufsize);
hgs
parents:
diff changeset
  1013
	test(err==KErrNone);
hgs
parents:
diff changeset
  1014
	test.Next(_L("TestDebugFunctionality - GetDebugFunctionality\n"));
hgs
parents:
diff changeset
  1015
hgs
parents:
diff changeset
  1016
	// Ensure we have a finite buffer size
hgs
parents:
diff changeset
  1017
	test(bufsize!=0);
hgs
parents:
diff changeset
  1018
hgs
parents:
diff changeset
  1019
	// Allocate space for the functionality data
hgs
parents:
diff changeset
  1020
	HBufC8* dftext = HBufC8::NewLC(bufsize);
hgs
parents:
diff changeset
  1021
hgs
parents:
diff changeset
  1022
	// create an empty TPtr8 refering to dftext
hgs
parents:
diff changeset
  1023
	TPtr8 dftextPtr(dftext->Des());
hgs
parents:
diff changeset
  1024
hgs
parents:
diff changeset
  1025
	// Get the functionality block
hgs
parents:
diff changeset
  1026
	err = iServSession.GetDebugFunctionality(dftextPtr);
hgs
parents:
diff changeset
  1027
	test(err==KErrNone);
hgs
parents:
diff changeset
  1028
hgs
parents:
diff changeset
  1029
	// Check that the first entry is correct
hgs
parents:
diff changeset
  1030
	TTagHeader RefHdr =
hgs
parents:
diff changeset
  1031
	{
hgs
parents:
diff changeset
  1032
		ETagHeaderIdCore,ECoreLast,
hgs
parents:
diff changeset
  1033
	};
hgs
parents:
diff changeset
  1034
hgs
parents:
diff changeset
  1035
	// First header passed from rm_debug.ldd
hgs
parents:
diff changeset
  1036
	TTagHeader* TestHdr = (TTagHeader*)dftextPtr.Ptr();
hgs
parents:
diff changeset
  1037
hgs
parents:
diff changeset
  1038
	// Check
hgs
parents:
diff changeset
  1039
	test(RefHdr.iTagHdrId==TestHdr->iTagHdrId);
hgs
parents:
diff changeset
  1040
	// this test might fail if the agent is used with a Debug Security Server different from
hgs
parents:
diff changeset
  1041
	// the one it was compiled against. So removing it for now.
hgs
parents:
diff changeset
  1042
	//test(RefHdr.iNumTags==TestHdr->iNumTags);
hgs
parents:
diff changeset
  1043
hgs
parents:
diff changeset
  1044
	// read a value from the data to check it has come through as expected
hgs
parents:
diff changeset
  1045
	TTagHeader* header = GetTagHdr(dftext->Des(), ETagHeaderIdApiConstants);
hgs
parents:
diff changeset
  1046
	test(header != NULL);
hgs
parents:
diff changeset
  1047
	TTag* tag = GetTag(header, EApiConstantsTEventInfoSize);
hgs
parents:
diff changeset
  1048
	test(tag != NULL);
hgs
parents:
diff changeset
  1049
	// this test might fail if the agent is used with a Debug Security Server different from
hgs
parents:
diff changeset
  1050
	// the one it was compiled against. So removing it for now.
hgs
parents:
diff changeset
  1051
	//test(sizeof(TEventInfo) == tag->iValue);
hgs
parents:
diff changeset
  1052
hgs
parents:
diff changeset
  1053
	// Remove our temporary buffer
hgs
parents:
diff changeset
  1054
	CleanupStack::PopAndDestroy(dftext);
hgs
parents:
diff changeset
  1055
	}
hgs
parents:
diff changeset
  1056
hgs
parents:
diff changeset
  1057
//---------------------------------------------
hgs
parents:
diff changeset
  1058
//! @SYMTestCaseID KBase-T-RMDEBUG2-0435
hgs
parents:
diff changeset
  1059
//! @SYMTestType
hgs
parents:
diff changeset
  1060
//! @SYMPREQ PREQ1426
hgs
parents:
diff changeset
  1061
//! @SYMTestCaseDesc Test setting and clearing consecutive breakpoints
hgs
parents:
diff changeset
  1062
//! @SYMTestActions Set and clear consecutive breakpoints of all combinations of breakpoint types
hgs
parents:
diff changeset
  1063
//! @SYMTestExpectedResults All breakpoints should be set and cleared without error
hgs
parents:
diff changeset
  1064
//! @SYMTestPriority High
hgs
parents:
diff changeset
  1065
//! @SYMTestStatus Implemented
hgs
parents:
diff changeset
  1066
//---------------------------------------------
hgs
parents:
diff changeset
  1067
void CRunModeAgent::TestConsecutiveBreakPoints()
hgs
parents:
diff changeset
  1068
	{
hgs
parents:
diff changeset
  1069
	test.Next(_L("TestConsecutiveBreakPoints\n"));
hgs
parents:
diff changeset
  1070
hgs
parents:
diff changeset
  1071
	test(KErrNone == iServSession.SuspendThread(iThreadID));
hgs
parents:
diff changeset
  1072
hgs
parents:
diff changeset
  1073
	// just a temporary structure for storing info about a breakpoint
hgs
parents:
diff changeset
  1074
	struct TBreakPoint
hgs
parents:
diff changeset
  1075
		{
hgs
parents:
diff changeset
  1076
	public:
hgs
parents:
diff changeset
  1077
		TBreakPoint()
hgs
parents:
diff changeset
  1078
			:iId(0),
hgs
parents:
diff changeset
  1079
			iMode((TArchitectureMode)0),
hgs
parents:
diff changeset
  1080
			iAddress(0)
hgs
parents:
diff changeset
  1081
			{}
hgs
parents:
diff changeset
  1082
		TBreakId iId;
hgs
parents:
diff changeset
  1083
		TArchitectureMode iMode;
hgs
parents:
diff changeset
  1084
		TUint32 iAddress;
hgs
parents:
diff changeset
  1085
		inline TInt Size() { return (EArmMode == iMode) ? 4 : 2; }
hgs
parents:
diff changeset
  1086
		};
hgs
parents:
diff changeset
  1087
hgs
parents:
diff changeset
  1088
	//an address in the target debug thread
hgs
parents:
diff changeset
  1089
	TUint32 address = (TUint32)(&TestFunction);
hgs
parents:
diff changeset
  1090
hgs
parents:
diff changeset
  1091
	// there are six orders in which three breakpoints can be set, these are looped
hgs
parents:
diff changeset
  1092
	// through below to check setting and clearing consecutive breakpoints works
hgs
parents:
diff changeset
  1093
	TUint8 order[6][3] =
hgs
parents:
diff changeset
  1094
		{
hgs
parents:
diff changeset
  1095
			{0,1,2},
hgs
parents:
diff changeset
  1096
			{0,2,1},
hgs
parents:
diff changeset
  1097
			{1,0,2},
hgs
parents:
diff changeset
  1098
			{1,2,0},
hgs
parents:
diff changeset
  1099
			{2,0,1},
hgs
parents:
diff changeset
  1100
			{2,1,0}
hgs
parents:
diff changeset
  1101
		};
hgs
parents:
diff changeset
  1102
hgs
parents:
diff changeset
  1103
	// The following code checks that setting and clearing consecutive breakpoints works correctly:
hgs
parents:
diff changeset
  1104
	// It checks that setting all combinations of three arm and thumb breakpoints succeeds, and check that the
hgs
parents:
diff changeset
  1105
	// breakpoints can be set in any order, and then cleared in any order
hgs
parents:
diff changeset
  1106
hgs
parents:
diff changeset
  1107
	// the 3 least significant bits of i control whether each of the three breakpoints should be arm or thumb
hgs
parents:
diff changeset
  1108
	for(TInt i=0; i<8; i++)
hgs
parents:
diff changeset
  1109
		{
hgs
parents:
diff changeset
  1110
		// controls the order in which the breakpoints should be set
hgs
parents:
diff changeset
  1111
		for(TInt j=0; j<6; j++)
hgs
parents:
diff changeset
  1112
			{
hgs
parents:
diff changeset
  1113
			// create the three breakpoints and set their modes
hgs
parents:
diff changeset
  1114
			TBreakPoint bp[3];
hgs
parents:
diff changeset
  1115
			bp[0].iMode = (i&1) ? EArmMode : EThumbMode;
hgs
parents:
diff changeset
  1116
			bp[1].iMode = (i&2) ? EArmMode : EThumbMode;
hgs
parents:
diff changeset
  1117
			bp[2].iMode = (i&4) ? EArmMode : EThumbMode;
hgs
parents:
diff changeset
  1118
hgs
parents:
diff changeset
  1119
			// set the address of each of the breakpoints
hgs
parents:
diff changeset
  1120
			bp[0].iAddress = address;
hgs
parents:
diff changeset
  1121
			if(EArmMode == bp[0].iMode)
hgs
parents:
diff changeset
  1122
				{ // if an arm breakpoint then must be on a four byte boundary
hgs
parents:
diff changeset
  1123
				bp[0].iAddress = Align4(bp[0].iAddress);
hgs
parents:
diff changeset
  1124
				}
hgs
parents:
diff changeset
  1125
			bp[1].iAddress = bp[0].iAddress + bp[0].Size();
hgs
parents:
diff changeset
  1126
			if(EArmMode == bp[1].iMode)
hgs
parents:
diff changeset
  1127
				{ // if an arm breakpoint then must be on a four byte boundary
hgs
parents:
diff changeset
  1128
				bp[1].iAddress = Align4(bp[1].iAddress);
hgs
parents:
diff changeset
  1129
				}
hgs
parents:
diff changeset
  1130
			bp[2].iAddress = bp[1].iAddress + bp[1].Size();
hgs
parents:
diff changeset
  1131
			if(EArmMode == bp[2].iMode)
hgs
parents:
diff changeset
  1132
				{ // if an arm breakpoint then must be on a four byte boundary
hgs
parents:
diff changeset
  1133
				bp[2].iAddress = Align4(bp[2].iAddress);
hgs
parents:
diff changeset
  1134
				}
hgs
parents:
diff changeset
  1135
			for(TInt k=0; k<6; k++)
hgs
parents:
diff changeset
  1136
				{
hgs
parents:
diff changeset
  1137
				// set the three breakpoints in the order defined by j and then clear them in the order defined by k
hgs
parents:
diff changeset
  1138
				test(KErrNone==iServSession.SetBreak(bp[order[j][0]].iId, iThreadID, bp[order[j][0]].iAddress, bp[order[j][0]].iMode));
hgs
parents:
diff changeset
  1139
				test(KErrNone==iServSession.SetBreak(bp[order[j][1]].iId, iThreadID, bp[order[j][1]].iAddress, bp[order[j][1]].iMode));
hgs
parents:
diff changeset
  1140
				test(KErrNone==iServSession.SetBreak(bp[order[j][2]].iId, iThreadID, bp[order[j][2]].iAddress, bp[order[j][2]].iMode));
hgs
parents:
diff changeset
  1141
				test(KErrNone==iServSession.ClearBreak(bp[order[k][0]].iId));
hgs
parents:
diff changeset
  1142
				test(KErrNone==iServSession.ClearBreak(bp[order[k][1]].iId));
hgs
parents:
diff changeset
  1143
				test(KErrNone==iServSession.ClearBreak(bp[order[k][2]].iId));
hgs
parents:
diff changeset
  1144
				}
hgs
parents:
diff changeset
  1145
			}
hgs
parents:
diff changeset
  1146
		}
hgs
parents:
diff changeset
  1147
hgs
parents:
diff changeset
  1148
	// resume the thread
hgs
parents:
diff changeset
  1149
	test(KErrNone == iServSession.ResumeThread(iThreadID));
hgs
parents:
diff changeset
  1150
	}
hgs
parents:
diff changeset
  1151
hgs
parents:
diff changeset
  1152
//---------------------------------------------
hgs
parents:
diff changeset
  1153
//! @SYMTestCaseID KBase-T-RMDEBUG2-0436
hgs
parents:
diff changeset
  1154
//! @SYMTestType
hgs
parents:
diff changeset
  1155
//! @SYMPREQ PREQ1426
hgs
parents:
diff changeset
  1156
//! @SYMTestCaseDesc Test breakpoint functionality
hgs
parents:
diff changeset
  1157
//! @SYMTestActions Multiple calls to set and clear breakpoints. Checking bad input produces appropriate errors.
hgs
parents:
diff changeset
  1158
//! @SYMTestExpectedResults All tests should pass and the target debug thread should be left unaffected
hgs
parents:
diff changeset
  1159
//! @SYMTestPriority High
hgs
parents:
diff changeset
  1160
//! @SYMTestStatus Implemented
hgs
parents:
diff changeset
  1161
//---------------------------------------------
hgs
parents:
diff changeset
  1162
void CRunModeAgent::TestBreakPoints()
hgs
parents:
diff changeset
  1163
	{
hgs
parents:
diff changeset
  1164
	TInt err;
hgs
parents:
diff changeset
  1165
hgs
parents:
diff changeset
  1166
	test.Next(_L("TestBreakPoints - Set\n"));
hgs
parents:
diff changeset
  1167
hgs
parents:
diff changeset
  1168
	test(KErrNone == iServSession.AttachExecutable(iFileName, EFalse));
hgs
parents:
diff changeset
  1169
hgs
parents:
diff changeset
  1170
	TestConsecutiveBreakPoints();
hgs
parents:
diff changeset
  1171
hgs
parents:
diff changeset
  1172
	//an address in the target debug thread
hgs
parents:
diff changeset
  1173
	TUint32 address = (TUint32)(&TestFunction);
hgs
parents:
diff changeset
  1174
hgs
parents:
diff changeset
  1175
	/*
hgs
parents:
diff changeset
  1176
	 * Ensure that breakpoint operations don't
hgs
parents:
diff changeset
  1177
	 * affect memory read/write by checking that reads/writes
hgs
parents:
diff changeset
  1178
	 * in locations containing breakpoints don't change behaviour
hgs
parents:
diff changeset
  1179
	 * because of the breakpoints.
hgs
parents:
diff changeset
  1180
	 */
hgs
parents:
diff changeset
  1181
hgs
parents:
diff changeset
  1182
	TUint32 size = SYMBIAN_RMDBG_MEMORYSIZE;
hgs
parents:
diff changeset
  1183
hgs
parents:
diff changeset
  1184
	RBuf8 originalDataBlock;
hgs
parents:
diff changeset
  1185
	err = originalDataBlock.Create(size);
hgs
parents:
diff changeset
  1186
	test(err==KErrNone);
hgs
parents:
diff changeset
  1187
hgs
parents:
diff changeset
  1188
	//suspend the thread
hgs
parents:
diff changeset
  1189
	test(KErrNone == iServSession.SuspendThread(iThreadID));
hgs
parents:
diff changeset
  1190
hgs
parents:
diff changeset
  1191
	err = iServSession.ReadMemory(iThreadID, address, size, originalDataBlock, EAccess32, EEndLE8);
hgs
parents:
diff changeset
  1192
	test(err==KErrNone);
hgs
parents:
diff changeset
  1193
hgs
parents:
diff changeset
  1194
	// Test data block for comparison
hgs
parents:
diff changeset
  1195
	RBuf8 testDataBlock;
hgs
parents:
diff changeset
  1196
	err = testDataBlock.Create(size);
hgs
parents:
diff changeset
  1197
	test(err==KErrNone);
hgs
parents:
diff changeset
  1198
hgs
parents:
diff changeset
  1199
	/*
hgs
parents:
diff changeset
  1200
	 * set an arm breakpoint
hgs
parents:
diff changeset
  1201
	 */
hgs
parents:
diff changeset
  1202
	test.Next(_L("TestBreakPoints - set an arm breakpoint1"));
hgs
parents:
diff changeset
  1203
hgs
parents:
diff changeset
  1204
	TBreakId armBreakId = 0;
hgs
parents:
diff changeset
  1205
	err = iServSession.SetBreak(armBreakId, iThreadID, address, EArmMode);
hgs
parents:
diff changeset
  1206
	test(err == KErrNone);
hgs
parents:
diff changeset
  1207
hgs
parents:
diff changeset
  1208
	// Ensure that memory read is not corrupted
hgs
parents:
diff changeset
  1209
	test.Next(_L("TestBreakPoints - read mem 2"));
hgs
parents:
diff changeset
  1210
	err = iServSession.ReadMemory(iThreadID, address, size, testDataBlock, EAccess32, EEndLE8);
hgs
parents:
diff changeset
  1211
	test(err==KErrNone);
hgs
parents:
diff changeset
  1212
hgs
parents:
diff changeset
  1213
	test (testDataBlock == originalDataBlock);
hgs
parents:
diff changeset
  1214
hgs
parents:
diff changeset
  1215
	/*
hgs
parents:
diff changeset
  1216
	 * set a thumb breakpoint
hgs
parents:
diff changeset
  1217
	 */
hgs
parents:
diff changeset
  1218
	test.Next(_L("TestBreak- set a thumb breakpoint1"));
hgs
parents:
diff changeset
  1219
	TBreakId thumbBreakId = 0;
hgs
parents:
diff changeset
  1220
	err = iServSession.SetBreak(thumbBreakId, iThreadID, address+4, EThumbMode);
hgs
parents:
diff changeset
  1221
	test(err == KErrNone);
hgs
parents:
diff changeset
  1222
hgs
parents:
diff changeset
  1223
	/*
hgs
parents:
diff changeset
  1224
	 * set a thumb2EE breakpoint
hgs
parents:
diff changeset
  1225
	 */
hgs
parents:
diff changeset
  1226
	test.Next(_L("TestBreak- set a thumb2EE breakpoint"));
hgs
parents:
diff changeset
  1227
hgs
parents:
diff changeset
  1228
	TBreakId thumb2EEBreakId = 0;
hgs
parents:
diff changeset
  1229
	err = iServSession.SetBreak(thumb2EEBreakId, iThreadID, address+8, EThumb2EEMode);
hgs
parents:
diff changeset
  1230
	test(err == KErrNotSupported);
hgs
parents:
diff changeset
  1231
hgs
parents:
diff changeset
  1232
	/*
hgs
parents:
diff changeset
  1233
	 * overlapping breakpoint (same address/threadId/mode)
hgs
parents:
diff changeset
  1234
	 */
hgs
parents:
diff changeset
  1235
	test.Next(_L("TestBreak- set overlapping breakpoint 1"));
hgs
parents:
diff changeset
  1236
	TBreakId overlapBreakId = 0;
hgs
parents:
diff changeset
  1237
	err = iServSession.SetBreak(overlapBreakId, iThreadID, address, EArmMode);
hgs
parents:
diff changeset
  1238
	test(err == KErrAlreadyExists);
hgs
parents:
diff changeset
  1239
hgs
parents:
diff changeset
  1240
	/*
hgs
parents:
diff changeset
  1241
	 * overlapping breakpoint (different address/same threadId/different mode)
hgs
parents:
diff changeset
  1242
	 *
hgs
parents:
diff changeset
  1243
	 * address - EArmBreakpoint
hgs
parents:
diff changeset
  1244
	 * address+2 - EThumbBreakpoint
hgs
parents:
diff changeset
  1245
	 */
hgs
parents:
diff changeset
  1246
	test.Next(_L("TestBreak- set overlapping breakpoint 2"));
hgs
parents:
diff changeset
  1247
	TBreakId overlap2BreakId = 0;
hgs
parents:
diff changeset
  1248
	err = iServSession.SetBreak(overlap2BreakId, iThreadID, address+2, EThumbMode);
hgs
parents:
diff changeset
  1249
	test(err == KErrAlreadyExists);
hgs
parents:
diff changeset
  1250
hgs
parents:
diff changeset
  1251
	/*
hgs
parents:
diff changeset
  1252
	 * Un-aligned address (arm)
hgs
parents:
diff changeset
  1253
	 */
hgs
parents:
diff changeset
  1254
	test.Next(_L("TestBreak- set Un-aligned address (arm)"));
hgs
parents:
diff changeset
  1255
	TBreakId armUnalignedBreakId = 0;
hgs
parents:
diff changeset
  1256
	err = iServSession.SetBreak(armUnalignedBreakId, iThreadID, address+6, EArmMode);
hgs
parents:
diff changeset
  1257
	test(err == KErrArgument);
hgs
parents:
diff changeset
  1258
hgs
parents:
diff changeset
  1259
	/*
hgs
parents:
diff changeset
  1260
	 * Un-aligned address (thumb)
hgs
parents:
diff changeset
  1261
	 */
hgs
parents:
diff changeset
  1262
	test.Next(_L("TestBreak- set Un-aligned address (thumb)"));
hgs
parents:
diff changeset
  1263
	TBreakId thumbUnalignedBreakId = 0;
hgs
parents:
diff changeset
  1264
	err = iServSession.SetBreak(thumbUnalignedBreakId, iThreadID, address+7, EThumbMode);
hgs
parents:
diff changeset
  1265
	test(err == KErrArgument);
hgs
parents:
diff changeset
  1266
hgs
parents:
diff changeset
  1267
	/*
hgs
parents:
diff changeset
  1268
	 * Invalid address (arm)
hgs
parents:
diff changeset
  1269
	 */
hgs
parents:
diff changeset
  1270
	test.Next(_L("TestBreak- set Invalid address (arm)"));
hgs
parents:
diff changeset
  1271
	TBreakId armBadAddressBreakId = 0;
hgs
parents:
diff changeset
  1272
	err = iServSession.SetBreak(armBadAddressBreakId, iThreadID, 0 /* address */, EThumbMode);
hgs
parents:
diff changeset
  1273
	test(err == KErrBadDescriptor);
hgs
parents:
diff changeset
  1274
hgs
parents:
diff changeset
  1275
	/*
hgs
parents:
diff changeset
  1276
	 * Different thread, same address. Should fail for the same process, but succeed
hgs
parents:
diff changeset
  1277
	 * for a different process.
hgs
parents:
diff changeset
  1278
	 */
hgs
parents:
diff changeset
  1279
hgs
parents:
diff changeset
  1280
	/*
hgs
parents:
diff changeset
  1281
	 * Invalid thread
hgs
parents:
diff changeset
  1282
	 */
hgs
parents:
diff changeset
  1283
	TBreakId invalidThreadBreakId = 0;
hgs
parents:
diff changeset
  1284
	err = iServSession.SetBreak(invalidThreadBreakId, 0xbabababa, address, EThumbMode);
hgs
parents:
diff changeset
  1285
	test(err == KErrPermissionDenied);
hgs
parents:
diff changeset
  1286
hgs
parents:
diff changeset
  1287
	// Clear the ARM breakpoint
hgs
parents:
diff changeset
  1288
	err = iServSession.ClearBreak(armBreakId);
hgs
parents:
diff changeset
  1289
	test(err == KErrNone);
hgs
parents:
diff changeset
  1290
hgs
parents:
diff changeset
  1291
	// Clear the Thumb breakpoint
hgs
parents:
diff changeset
  1292
	err = iServSession.ClearBreak(thumbBreakId);
hgs
parents:
diff changeset
  1293
	test(err == KErrNone);
hgs
parents:
diff changeset
  1294
hgs
parents:
diff changeset
  1295
	// to do : two threads at the same address
hgs
parents:
diff changeset
  1296
	// to do : two processes at the same address
hgs
parents:
diff changeset
  1297
hgs
parents:
diff changeset
  1298
	// Ensure that memory read is not corrupted after clearing the breakpoints
hgs
parents:
diff changeset
  1299
	err = iServSession.ReadMemory(iThreadID, address, size, testDataBlock, EAccess32, EEndLE8);
hgs
parents:
diff changeset
  1300
	test(err==KErrNone);
hgs
parents:
diff changeset
  1301
hgs
parents:
diff changeset
  1302
	test (testDataBlock == originalDataBlock);
hgs
parents:
diff changeset
  1303
hgs
parents:
diff changeset
  1304
	/*
hgs
parents:
diff changeset
  1305
	 * How fast can we set breakpoints?
hgs
parents:
diff changeset
  1306
	 *
hgs
parents:
diff changeset
  1307
	 * Measure the time by setting/clearing breakpoints for 1 second.
hgs
parents:
diff changeset
  1308
     */
hgs
parents:
diff changeset
  1309
	TInt nanokernel_tick_period;
hgs
parents:
diff changeset
  1310
	HAL::Get(HAL::ENanoTickPeriod, nanokernel_tick_period);
hgs
parents:
diff changeset
  1311
	test (nanokernel_tick_period != 0);
hgs
parents:
diff changeset
  1312
hgs
parents:
diff changeset
  1313
	TInt nkTicksPerSecond = HelpTicksPerSecond();
hgs
parents:
diff changeset
  1314
hgs
parents:
diff changeset
  1315
	TInt breaksPerSecond = 0;
hgs
parents:
diff changeset
  1316
hgs
parents:
diff changeset
  1317
	TUint32 stopTickCount = User::NTickCount() + nkTicksPerSecond;
hgs
parents:
diff changeset
  1318
hgs
parents:
diff changeset
  1319
	while (User::NTickCount() < stopTickCount)
hgs
parents:
diff changeset
  1320
		{
hgs
parents:
diff changeset
  1321
		// set the breakpoint
hgs
parents:
diff changeset
  1322
		TBreakId armBreakId = 0;
hgs
parents:
diff changeset
  1323
		err = iServSession.SetBreak(armBreakId, iThreadID, address, EArmMode);
hgs
parents:
diff changeset
  1324
		test(err == KErrNone);
hgs
parents:
diff changeset
  1325
hgs
parents:
diff changeset
  1326
		// Clear the breakpoint
hgs
parents:
diff changeset
  1327
		err = iServSession.ClearBreak(armBreakId);
hgs
parents:
diff changeset
  1328
		test(err == KErrNone);
hgs
parents:
diff changeset
  1329
hgs
parents:
diff changeset
  1330
		// Update the count of breakpoints
hgs
parents:
diff changeset
  1331
		breaksPerSecond++;
hgs
parents:
diff changeset
  1332
hgs
parents:
diff changeset
  1333
		// Gone wrong if we wrap to negative breakpoints (cannot set 2billion/second!)
hgs
parents:
diff changeset
  1334
		test(breaksPerSecond >0);
hgs
parents:
diff changeset
  1335
		}
hgs
parents:
diff changeset
  1336
hgs
parents:
diff changeset
  1337
	// Store the results for later
hgs
parents:
diff changeset
  1338
	iBreakpointsPerSecond = breaksPerSecond;
hgs
parents:
diff changeset
  1339
hgs
parents:
diff changeset
  1340
	/*
hgs
parents:
diff changeset
  1341
	 * How many breakpoints can we set?
hgs
parents:
diff changeset
  1342
	 */
hgs
parents:
diff changeset
  1343
hgs
parents:
diff changeset
  1344
	TBool done = EFalse;
hgs
parents:
diff changeset
  1345
hgs
parents:
diff changeset
  1346
	// We assume all the breakpoints id's are issued in ascending order
hgs
parents:
diff changeset
  1347
	TInt maxBreakPoints = 0;
hgs
parents:
diff changeset
  1348
hgs
parents:
diff changeset
  1349
	// Temporary buffer
hgs
parents:
diff changeset
  1350
	RArray<TBreakId> breakIdList;
hgs
parents:
diff changeset
  1351
hgs
parents:
diff changeset
  1352
	TUint32 testAddress = address;
hgs
parents:
diff changeset
  1353
hgs
parents:
diff changeset
  1354
	while(!done)
hgs
parents:
diff changeset
  1355
		{
hgs
parents:
diff changeset
  1356
		TBreakId breakId = 0;
hgs
parents:
diff changeset
  1357
hgs
parents:
diff changeset
  1358
		// set the breakpoint
hgs
parents:
diff changeset
  1359
		testAddress += 4;	// ensure the addresses don't overlap
hgs
parents:
diff changeset
  1360
hgs
parents:
diff changeset
  1361
		err = iServSession.SetBreak(breakId, iThreadID, testAddress, EArmMode);
hgs
parents:
diff changeset
  1362
		test (err == KErrNone || err == KErrOverflow);
hgs
parents:
diff changeset
  1363
		if (err != KErrNone)
hgs
parents:
diff changeset
  1364
			{
hgs
parents:
diff changeset
  1365
			// we've reached the limit of the number of breaks we can set
hgs
parents:
diff changeset
  1366
			done = ETrue;
hgs
parents:
diff changeset
  1367
			break;
hgs
parents:
diff changeset
  1368
			}
hgs
parents:
diff changeset
  1369
hgs
parents:
diff changeset
  1370
		// store the id of this breakpoint
hgs
parents:
diff changeset
  1371
		breakIdList.Append(breakId);
hgs
parents:
diff changeset
  1372
hgs
parents:
diff changeset
  1373
		// Increase the count of breakpoints
hgs
parents:
diff changeset
  1374
		maxBreakPoints++;
hgs
parents:
diff changeset
  1375
		test(maxBreakPoints > 0);
hgs
parents:
diff changeset
  1376
		}
hgs
parents:
diff changeset
  1377
hgs
parents:
diff changeset
  1378
	// How many breakpoints can we set?
hgs
parents:
diff changeset
  1379
	iMaxBreakpoints = maxBreakPoints;
hgs
parents:
diff changeset
  1380
hgs
parents:
diff changeset
  1381
	// now clear all those breakpoints again
hgs
parents:
diff changeset
  1382
	while(breakIdList.Count() != 0)
hgs
parents:
diff changeset
  1383
		{
hgs
parents:
diff changeset
  1384
		// Place it into a TBreakId
hgs
parents:
diff changeset
  1385
		TBreakId id = breakIdList[0];
hgs
parents:
diff changeset
  1386
hgs
parents:
diff changeset
  1387
		err = iServSession.ClearBreak(id);
hgs
parents:
diff changeset
  1388
		test(err == KErrNone);
hgs
parents:
diff changeset
  1389
hgs
parents:
diff changeset
  1390
		// next id
hgs
parents:
diff changeset
  1391
		breakIdList.Remove(0);
hgs
parents:
diff changeset
  1392
		}
hgs
parents:
diff changeset
  1393
hgs
parents:
diff changeset
  1394
	breakIdList.Close();
hgs
parents:
diff changeset
  1395
hgs
parents:
diff changeset
  1396
	// close our temporary buffers
hgs
parents:
diff changeset
  1397
	originalDataBlock.Close();
hgs
parents:
diff changeset
  1398
	testDataBlock.Close();
hgs
parents:
diff changeset
  1399
hgs
parents:
diff changeset
  1400
	err = iServSession.ResumeThread(iThreadID);
hgs
parents:
diff changeset
  1401
	test (err == KErrNone);
hgs
parents:
diff changeset
  1402
hgs
parents:
diff changeset
  1403
	test(KErrNone == iServSession.DetachExecutable(iFileName));
hgs
parents:
diff changeset
  1404
	}
hgs
parents:
diff changeset
  1405
hgs
parents:
diff changeset
  1406
//---------------------------------------------
hgs
parents:
diff changeset
  1407
//! @SYMTestCaseID KBase-T-RMDEBUG2-0437
hgs
parents:
diff changeset
  1408
//! @SYMTestType
hgs
parents:
diff changeset
  1409
//! @SYMPREQ PREQ1426
hgs
parents:
diff changeset
  1410
//! @SYMTestCaseDesc Test modifying breakpoints
hgs
parents:
diff changeset
  1411
//! @SYMTestActions Several calls to modify breakpoints
hgs
parents:
diff changeset
  1412
//! @SYMTestExpectedResults Valid requests should result in the breakpoints being changed, invalid requests should return errors
hgs
parents:
diff changeset
  1413
//! @SYMTestPriority High
hgs
parents:
diff changeset
  1414
//! @SYMTestStatus Implemented
hgs
parents:
diff changeset
  1415
//---------------------------------------------
hgs
parents:
diff changeset
  1416
void CRunModeAgent::TestModifyBreak()
hgs
parents:
diff changeset
  1417
	{
hgs
parents:
diff changeset
  1418
	test.Next(_L("TestModifyBreak\n"));
hgs
parents:
diff changeset
  1419
hgs
parents:
diff changeset
  1420
	DoTestModifyBreak(ETrue);
hgs
parents:
diff changeset
  1421
	DoTestModifyBreak(EFalse);
hgs
parents:
diff changeset
  1422
	}
hgs
parents:
diff changeset
  1423
hgs
parents:
diff changeset
  1424
void CRunModeAgent::DoTestModifyBreak(TBool aThreadSpecific)
hgs
parents:
diff changeset
  1425
	{
hgs
parents:
diff changeset
  1426
	test.Printf(_L("DoTestModifyBreak: aThreadSpecific: %d\n"), aThreadSpecific?1:0);
hgs
parents:
diff changeset
  1427
hgs
parents:
diff changeset
  1428
	TInt err;
hgs
parents:
diff changeset
  1429
hgs
parents:
diff changeset
  1430
	RProcess process;
hgs
parents:
diff changeset
  1431
	TProcessId processId = process.Id();
hgs
parents:
diff changeset
  1432
	process.Close();
hgs
parents:
diff changeset
  1433
hgs
parents:
diff changeset
  1434
	test(KErrNone == iServSession.AttachExecutable(iFileName, EFalse));
hgs
parents:
diff changeset
  1435
hgs
parents:
diff changeset
  1436
	//suspend the thread
hgs
parents:
diff changeset
  1437
	test(KErrNone == iServSession.SuspendThread(iThreadID));
hgs
parents:
diff changeset
  1438
hgs
parents:
diff changeset
  1439
	//an address in the target debug thread
hgs
parents:
diff changeset
  1440
	TUint32 address = (TUint32)(&TestFunction);
hgs
parents:
diff changeset
  1441
hgs
parents:
diff changeset
  1442
	//set an arm mode break point
hgs
parents:
diff changeset
  1443
	TBreakId armBreakId = 0;
hgs
parents:
diff changeset
  1444
	err = aThreadSpecific
hgs
parents:
diff changeset
  1445
		? iServSession.SetBreak(armBreakId, iThreadID, address, EArmMode)
hgs
parents:
diff changeset
  1446
		: iServSession.SetProcessBreak(armBreakId, processId, address, EArmMode);
hgs
parents:
diff changeset
  1447
	test(err == KErrNone);
hgs
parents:
diff changeset
  1448
hgs
parents:
diff changeset
  1449
	/*
hgs
parents:
diff changeset
  1450
	 * Invalid thread
hgs
parents:
diff changeset
  1451
	 */
hgs
parents:
diff changeset
  1452
	err = aThreadSpecific
hgs
parents:
diff changeset
  1453
		? iServSession.ModifyBreak(armBreakId, 0xbabababa, address, EArmMode)
hgs
parents:
diff changeset
  1454
		: iServSession.ModifyProcessBreak(armBreakId, 0xbabababa, address, EArmMode);
hgs
parents:
diff changeset
  1455
	test(err == KErrPermissionDenied);
hgs
parents:
diff changeset
  1456
hgs
parents:
diff changeset
  1457
	/*
hgs
parents:
diff changeset
  1458
	 * Valid address
hgs
parents:
diff changeset
  1459
	 */
hgs
parents:
diff changeset
  1460
	err = aThreadSpecific
hgs
parents:
diff changeset
  1461
		? iServSession.ModifyBreak(armBreakId, iThreadID, address+4, EArmMode)
hgs
parents:
diff changeset
  1462
		: iServSession.ModifyProcessBreak(armBreakId, processId, address+4, EArmMode);
hgs
parents:
diff changeset
  1463
	test(err == KErrNone);
hgs
parents:
diff changeset
  1464
hgs
parents:
diff changeset
  1465
	/*
hgs
parents:
diff changeset
  1466
	 * Invalid address
hgs
parents:
diff changeset
  1467
	 */
hgs
parents:
diff changeset
  1468
	err = aThreadSpecific
hgs
parents:
diff changeset
  1469
		? iServSession.ModifyBreak(armBreakId, iThreadID, 0, EArmMode)
hgs
parents:
diff changeset
  1470
		: iServSession.ModifyProcessBreak(armBreakId, processId, 0, EArmMode);
hgs
parents:
diff changeset
  1471
	test(err == KErrBadDescriptor);
hgs
parents:
diff changeset
  1472
hgs
parents:
diff changeset
  1473
	/*
hgs
parents:
diff changeset
  1474
	 * Thumb mode
hgs
parents:
diff changeset
  1475
	 */
hgs
parents:
diff changeset
  1476
	err = aThreadSpecific
hgs
parents:
diff changeset
  1477
		? iServSession.ModifyBreak(armBreakId, iThreadID, address, EThumbMode)
hgs
parents:
diff changeset
  1478
		: iServSession.ModifyProcessBreak(armBreakId, processId, address, EThumbMode);
hgs
parents:
diff changeset
  1479
	test(err == KErrNone);
hgs
parents:
diff changeset
  1480
hgs
parents:
diff changeset
  1481
	/*
hgs
parents:
diff changeset
  1482
	 * Thumb2EE mode
hgs
parents:
diff changeset
  1483
	 */
hgs
parents:
diff changeset
  1484
	err = aThreadSpecific
hgs
parents:
diff changeset
  1485
		? iServSession.ModifyBreak(armBreakId, iThreadID, address, EThumb2EEMode)
hgs
parents:
diff changeset
  1486
		: iServSession.ModifyProcessBreak(armBreakId, processId, address, EThumb2EEMode);
hgs
parents:
diff changeset
  1487
	test(err == KErrNotSupported);
hgs
parents:
diff changeset
  1488
hgs
parents:
diff changeset
  1489
	/*
hgs
parents:
diff changeset
  1490
	 * Arm mode
hgs
parents:
diff changeset
  1491
	 */
hgs
parents:
diff changeset
  1492
	err = aThreadSpecific
hgs
parents:
diff changeset
  1493
		? iServSession.ModifyBreak(armBreakId, iThreadID, address, EArmMode)
hgs
parents:
diff changeset
  1494
		: iServSession.ModifyProcessBreak(armBreakId, processId, address, EArmMode);
hgs
parents:
diff changeset
  1495
	test(err == KErrNone);
hgs
parents:
diff changeset
  1496
hgs
parents:
diff changeset
  1497
	// Finally, clear the breakpoint
hgs
parents:
diff changeset
  1498
	err = iServSession.ClearBreak(armBreakId);
hgs
parents:
diff changeset
  1499
	test(err == KErrNone);
hgs
parents:
diff changeset
  1500
hgs
parents:
diff changeset
  1501
	//resume the thread
hgs
parents:
diff changeset
  1502
	test(KErrNone == iServSession.ResumeThread(iThreadID));
hgs
parents:
diff changeset
  1503
	test(KErrNone == iServSession.DetachExecutable(iFileName));
hgs
parents:
diff changeset
  1504
	}
hgs
parents:
diff changeset
  1505
hgs
parents:
diff changeset
  1506
//---------------------------------------------
hgs
parents:
diff changeset
  1507
//! @SYMTestCaseID KBase-T-RMDEBUG2-0438
hgs
parents:
diff changeset
  1508
//! @SYMTestType
hgs
parents:
diff changeset
  1509
//! @SYMPREQ PREQ1426
hgs
parents:
diff changeset
  1510
//! @SYMTestCaseDesc Test extracting information about breakpoints
hgs
parents:
diff changeset
  1511
//! @SYMTestActions Several calls to get information about breakpoints
hgs
parents:
diff changeset
  1512
//! @SYMTestExpectedResults All tests should pass and the target process should be left unaffected
hgs
parents:
diff changeset
  1513
//! @SYMTestPriority High
hgs
parents:
diff changeset
  1514
//! @SYMTestStatus Implemented
hgs
parents:
diff changeset
  1515
//---------------------------------------------
hgs
parents:
diff changeset
  1516
void CRunModeAgent::TestBreakInfo()
hgs
parents:
diff changeset
  1517
	{
hgs
parents:
diff changeset
  1518
	test.Next(_L("TestBreakInfo\n"));
hgs
parents:
diff changeset
  1519
hgs
parents:
diff changeset
  1520
	DoTestBreakInfo(ETrue);
hgs
parents:
diff changeset
  1521
	DoTestBreakInfo(EFalse);
hgs
parents:
diff changeset
  1522
	}
hgs
parents:
diff changeset
  1523
hgs
parents:
diff changeset
  1524
void CRunModeAgent::DoTestBreakInfo(TBool aThreadSpecific)
hgs
parents:
diff changeset
  1525
	{
hgs
parents:
diff changeset
  1526
	test.Printf(_L("DoTestModifyBreak: aThreadSpecific: %d\n"), aThreadSpecific?1:0);
hgs
parents:
diff changeset
  1527
hgs
parents:
diff changeset
  1528
	TInt err;
hgs
parents:
diff changeset
  1529
hgs
parents:
diff changeset
  1530
	RProcess process;
hgs
parents:
diff changeset
  1531
	TProcessId processId = process.Id();
hgs
parents:
diff changeset
  1532
	process.Close();
hgs
parents:
diff changeset
  1533
hgs
parents:
diff changeset
  1534
	//an address in the target debug thread
hgs
parents:
diff changeset
  1535
	TUint32 address = (TUint32)(&TestFunction);
hgs
parents:
diff changeset
  1536
hgs
parents:
diff changeset
  1537
	test(KErrNone == iServSession.AttachExecutable(iFileName, EFalse));
hgs
parents:
diff changeset
  1538
hgs
parents:
diff changeset
  1539
	//suspend thread
hgs
parents:
diff changeset
  1540
	test(KErrNone == iServSession.SuspendThread(iThreadID));
hgs
parents:
diff changeset
  1541
hgs
parents:
diff changeset
  1542
	//set an arm mode break point
hgs
parents:
diff changeset
  1543
	TBreakId armBreakId = 0;
hgs
parents:
diff changeset
  1544
	err = aThreadSpecific
hgs
parents:
diff changeset
  1545
		? iServSession.SetBreak(armBreakId, iThreadID, address, EArmMode)
hgs
parents:
diff changeset
  1546
		: iServSession.SetProcessBreak(armBreakId, processId, address, EArmMode);
hgs
parents:
diff changeset
  1547
	test(err == KErrNone);
hgs
parents:
diff changeset
  1548
hgs
parents:
diff changeset
  1549
	// Read back the information and check it is correct
hgs
parents:
diff changeset
  1550
	TThreadId testThreadId = TThreadId(0);
hgs
parents:
diff changeset
  1551
	TProcessId testProcessId = TProcessId(0);
hgs
parents:
diff changeset
  1552
	TUint32 testAddress = 0;
hgs
parents:
diff changeset
  1553
	TArchitectureMode testMode = EArmMode;
hgs
parents:
diff changeset
  1554
hgs
parents:
diff changeset
  1555
	err = aThreadSpecific
hgs
parents:
diff changeset
  1556
		? iServSession.BreakInfo(armBreakId,testThreadId,testAddress, testMode)
hgs
parents:
diff changeset
  1557
		: iServSession.ProcessBreakInfo(armBreakId, testProcessId, testAddress, testMode);
hgs
parents:
diff changeset
  1558
	test (err == KErrNone);
hgs
parents:
diff changeset
  1559
	test (aThreadSpecific ? (testThreadId == iThreadID) : (testProcessId == processId));
hgs
parents:
diff changeset
  1560
	test (testAddress == address);
hgs
parents:
diff changeset
  1561
	test (testMode == EArmMode);
hgs
parents:
diff changeset
  1562
hgs
parents:
diff changeset
  1563
	//change the address
hgs
parents:
diff changeset
  1564
	TUint32 changeAddress = address + 64;
hgs
parents:
diff changeset
  1565
	err = aThreadSpecific
hgs
parents:
diff changeset
  1566
		? iServSession.ModifyBreak(armBreakId, iThreadID, changeAddress,EArmMode)
hgs
parents:
diff changeset
  1567
		: iServSession.ModifyProcessBreak(armBreakId, processId, changeAddress, EArmMode);
hgs
parents:
diff changeset
  1568
	test(err == KErrNone);
hgs
parents:
diff changeset
  1569
hgs
parents:
diff changeset
  1570
	// Check the address has changed
hgs
parents:
diff changeset
  1571
	err = aThreadSpecific
hgs
parents:
diff changeset
  1572
		? iServSession.BreakInfo(armBreakId,testThreadId,testAddress, testMode)
hgs
parents:
diff changeset
  1573
		: iServSession.ProcessBreakInfo(armBreakId, testProcessId, testAddress, testMode);
hgs
parents:
diff changeset
  1574
	test (err == KErrNone);
hgs
parents:
diff changeset
  1575
	test (testAddress == changeAddress);
hgs
parents:
diff changeset
  1576
hgs
parents:
diff changeset
  1577
	// change the architecture type
hgs
parents:
diff changeset
  1578
	TArchitectureMode checkMode = EThumbMode;
hgs
parents:
diff changeset
  1579
	err = aThreadSpecific
hgs
parents:
diff changeset
  1580
		? iServSession.ModifyBreak(armBreakId, iThreadID, address,checkMode)
hgs
parents:
diff changeset
  1581
		: iServSession.ModifyProcessBreak(armBreakId, processId, address, checkMode);
hgs
parents:
diff changeset
  1582
	test (err == KErrNone);
hgs
parents:
diff changeset
  1583
hgs
parents:
diff changeset
  1584
	// Check the mode has changed
hgs
parents:
diff changeset
  1585
	err = aThreadSpecific
hgs
parents:
diff changeset
  1586
		? iServSession.BreakInfo(armBreakId,testThreadId,testAddress,testMode)
hgs
parents:
diff changeset
  1587
		: iServSession.ProcessBreakInfo(armBreakId, testProcessId, testAddress, testMode);
hgs
parents:
diff changeset
  1588
	test (err == KErrNone);
hgs
parents:
diff changeset
  1589
	test (testMode == checkMode);
hgs
parents:
diff changeset
  1590
hgs
parents:
diff changeset
  1591
	// clear the breakpoint again
hgs
parents:
diff changeset
  1592
	err = iServSession.ClearBreak(armBreakId);
hgs
parents:
diff changeset
  1593
	test (err == KErrNone);
hgs
parents:
diff changeset
  1594
hgs
parents:
diff changeset
  1595
	//resume thread
hgs
parents:
diff changeset
  1596
	test(KErrNone == iServSession.ResumeThread(iThreadID));
hgs
parents:
diff changeset
  1597
	test(KErrNone == iServSession.DetachExecutable(iFileName));
hgs
parents:
diff changeset
  1598
	}
hgs
parents:
diff changeset
  1599
hgs
parents:
diff changeset
  1600
// Needed for the RunToBreak test
hgs
parents:
diff changeset
  1601
IMPORT_C extern void RMDebug_BranchTst1();
hgs
parents:
diff changeset
  1602
IMPORT_C extern void RMDebug_BranchTst2();
hgs
parents:
diff changeset
  1603
hgs
parents:
diff changeset
  1604
//---------------------------------------------
hgs
parents:
diff changeset
  1605
//! @SYMTestCaseID KBase-T-RMDEBUG2-0439
hgs
parents:
diff changeset
  1606
//! @SYMTestType
hgs
parents:
diff changeset
  1607
//! @SYMPREQ PREQ1426
hgs
parents:
diff changeset
  1608
//! @SYMTestCaseDesc Test hitting various types of breakpoints
hgs
parents:
diff changeset
  1609
//! @SYMTestActions Several calls to register to observe breakpoints and to hit breakpoints of different types
hgs
parents:
diff changeset
  1610
//! @SYMTestExpectedResults All tests should pass and the target process should be left unaffected
hgs
parents:
diff changeset
  1611
//! @SYMTestPriority High
hgs
parents:
diff changeset
  1612
//! @SYMTestStatus Implemented
hgs
parents:
diff changeset
  1613
//---------------------------------------------
hgs
parents:
diff changeset
  1614
void CRunModeAgent::TestRunToBreak()
hgs
parents:
diff changeset
  1615
	{
hgs
parents:
diff changeset
  1616
	test.Next(_L("TestRunToBreak\n"));
hgs
parents:
diff changeset
  1617
hgs
parents:
diff changeset
  1618
	DoTestRunToBreak(ETrue);
hgs
parents:
diff changeset
  1619
	DoTestRunToBreak(EFalse);
hgs
parents:
diff changeset
  1620
	}
hgs
parents:
diff changeset
  1621
hgs
parents:
diff changeset
  1622
void CRunModeAgent::DoTestRunToBreak(TBool aThreadSpecific)
hgs
parents:
diff changeset
  1623
	{
hgs
parents:
diff changeset
  1624
	test.Printf(_L("DoTestRunToBreak: aThreadSpecific: %d\n"), aThreadSpecific?1:0);
hgs
parents:
diff changeset
  1625
hgs
parents:
diff changeset
  1626
	TInt err = KErrNone;
hgs
parents:
diff changeset
  1627
hgs
parents:
diff changeset
  1628
	RProcess process;
hgs
parents:
diff changeset
  1629
	TProcessId processId = process.Id();
hgs
parents:
diff changeset
  1630
	process.Close();
hgs
parents:
diff changeset
  1631
hgs
parents:
diff changeset
  1632
	test(KErrNone == iServSession.AttachExecutable(iFileName, EFalse));
hgs
parents:
diff changeset
  1633
	// we should suspend the thread first, then set the breakpoint
hgs
parents:
diff changeset
  1634
	err = iServSession.SuspendThread(iThreadID);
hgs
parents:
diff changeset
  1635
	test (err == KErrNone);
hgs
parents:
diff changeset
  1636
hgs
parents:
diff changeset
  1637
	// Try to set the breakpoint
hgs
parents:
diff changeset
  1638
	TBreakId armBreakId;
hgs
parents:
diff changeset
  1639
	TUint32 address = (TUint32)(&RMDebug_BranchTst1);
hgs
parents:
diff changeset
  1640
hgs
parents:
diff changeset
  1641
	err = aThreadSpecific
hgs
parents:
diff changeset
  1642
		? iServSession.SetBreak(armBreakId,iThreadID,address,EArmMode)
hgs
parents:
diff changeset
  1643
		: iServSession.SetProcessBreak(armBreakId, processId, address, EArmMode);
hgs
parents:
diff changeset
  1644
	test(err == KErrNone);
hgs
parents:
diff changeset
  1645
hgs
parents:
diff changeset
  1646
	err = aThreadSpecific
hgs
parents:
diff changeset
  1647
		? iServSession.SetEventAction(iFileName,EEventsBreakPoint, EActionContinue)
hgs
parents:
diff changeset
  1648
		: iServSession.SetEventAction(iFileName,EEventsProcessBreakPoint, EActionContinue);
hgs
parents:
diff changeset
  1649
	test (err == KErrNone);
hgs
parents:
diff changeset
  1650
hgs
parents:
diff changeset
  1651
	// Continue the thread
hgs
parents:
diff changeset
  1652
	err = iServSession.ResumeThread(iThreadID);
hgs
parents:
diff changeset
  1653
	test (err == KErrNone);
hgs
parents:
diff changeset
  1654
hgs
parents:
diff changeset
  1655
	// wait for the breakpoint to be hit
hgs
parents:
diff changeset
  1656
	TEventInfo info;
hgs
parents:
diff changeset
  1657
	static TRequestStatus status;
hgs
parents:
diff changeset
  1658
hgs
parents:
diff changeset
  1659
	TPtr8 infoPtr((TUint8*)&info,0,sizeof(TEventInfo));
hgs
parents:
diff changeset
  1660
hgs
parents:
diff changeset
  1661
	iServSession.GetEvent(iFileName,status,infoPtr);
hgs
parents:
diff changeset
  1662
hgs
parents:
diff changeset
  1663
	// Wait for notification of the breakpoint hit event
hgs
parents:
diff changeset
  1664
	User::WaitForRequest(status);
hgs
parents:
diff changeset
  1665
	test(status==KErrNone);
hgs
parents:
diff changeset
  1666
hgs
parents:
diff changeset
  1667
	// info should now be filled with the details
hgs
parents:
diff changeset
  1668
	test(info.iEventType == (aThreadSpecific ? EEventsBreakPoint : EEventsProcessBreakPoint));
hgs
parents:
diff changeset
  1669
	test(info.iThreadBreakPointInfo.iRmdArmExcInfo.iR15 == address);
hgs
parents:
diff changeset
  1670
	test(info.iProcessIdValid);
hgs
parents:
diff changeset
  1671
	test(info.iThreadIdValid);
hgs
parents:
diff changeset
  1672
hgs
parents:
diff changeset
  1673
	// Not interested in breakpoint events any more
hgs
parents:
diff changeset
  1674
	err = aThreadSpecific
hgs
parents:
diff changeset
  1675
		? iServSession.SetEventAction(iFileName,EEventsBreakPoint, EActionIgnore)
hgs
parents:
diff changeset
  1676
		: iServSession.SetEventAction(iFileName, EEventsProcessBreakPoint, EActionIgnore);
hgs
parents:
diff changeset
  1677
	test (err == KErrNone);
hgs
parents:
diff changeset
  1678
hgs
parents:
diff changeset
  1679
	// Clear the breakpoint again
hgs
parents:
diff changeset
  1680
	err = iServSession.ClearBreak(armBreakId);
hgs
parents:
diff changeset
  1681
	test(err == KErrNone);
hgs
parents:
diff changeset
  1682
hgs
parents:
diff changeset
  1683
	// continue the thread again
hgs
parents:
diff changeset
  1684
	err = iServSession.ResumeThread(iThreadID);
hgs
parents:
diff changeset
  1685
	test (err == KErrNone);
hgs
parents:
diff changeset
  1686
	test(KErrNone == iServSession.DetachExecutable(iFileName));
hgs
parents:
diff changeset
  1687
	}
hgs
parents:
diff changeset
  1688
hgs
parents:
diff changeset
  1689
//---------------------------------------------
hgs
parents:
diff changeset
  1690
//! @SYMTestCaseID KBASE-rmdebug2-2704
hgs
parents:
diff changeset
  1691
//! @SYMTestType
hgs
parents:
diff changeset
  1692
//! @SYMPREQ PREQ1426
hgs
parents:
diff changeset
  1693
//! @SYMTestCaseDesc Test breakpoints in a loop
hgs
parents:
diff changeset
  1694
//! @SYMTestActions Several calls to register to verify breakpoints are stopping at correct address
hgs
parents:
diff changeset
  1695
//! @SYMTestExpectedResults All tests should pass and the target thread should be left unaffected
hgs
parents:
diff changeset
  1696
//! @SYMTestPriority High
hgs
parents:
diff changeset
  1697
//! @SYMTestStatus Implemented
hgs
parents:
diff changeset
  1698
//---------------------------------------------
hgs
parents:
diff changeset
  1699
void CRunModeAgent::TestBreakPointsInLoop()
hgs
parents:
diff changeset
  1700
	{
hgs
parents:
diff changeset
  1701
	test.Next(_L("TestBreakPointsInLoop\n"));
hgs
parents:
diff changeset
  1702
hgs
parents:
diff changeset
  1703
	DoTestBreakPointsInLoop(ETrue);
hgs
parents:
diff changeset
  1704
	DoTestBreakPointsInLoop(EFalse);
hgs
parents:
diff changeset
  1705
	}
hgs
parents:
diff changeset
  1706
hgs
parents:
diff changeset
  1707
void CRunModeAgent::DoTestBreakPointsInLoop(TBool aThreadSpecific)
hgs
parents:
diff changeset
  1708
	{
hgs
parents:
diff changeset
  1709
	test.Printf(_L("DoTestBreakPointsInLoop: aThreadSpecific: %d\n"), aThreadSpecific?1:0);
hgs
parents:
diff changeset
  1710
hgs
parents:
diff changeset
  1711
	TInt err = KErrNone;
hgs
parents:
diff changeset
  1712
	TProcessId processId = RProcess().Id(); 
hgs
parents:
diff changeset
  1713
hgs
parents:
diff changeset
  1714
	test(KErrNone == iServSession.AttachExecutable(iFileName, EFalse));
hgs
parents:
diff changeset
  1715
	
hgs
parents:
diff changeset
  1716
	// We should suspend the thread first, then set the breakpoint
hgs
parents:
diff changeset
  1717
	err = iServSession.SuspendThread(iThreadID);
hgs
parents:
diff changeset
  1718
	test (err == KErrNone);
hgs
parents:
diff changeset
  1719
hgs
parents:
diff changeset
  1720
	// 2 breakpoints are sufficient to find issues with hitting breakpoints in a loop
hgs
parents:
diff changeset
  1721
	const TInt numOfBreakPointsInLoop = 2;
hgs
parents:
diff changeset
  1722
hgs
parents:
diff changeset
  1723
	TBreakId armBreakId[numOfBreakPointsInLoop];
hgs
parents:
diff changeset
  1724
	TUint32 address[numOfBreakPointsInLoop];
hgs
parents:
diff changeset
  1725
   	
hgs
parents:
diff changeset
  1726
	TUint32 entryAddress = (TUint32)(&RMDebug_Bkpt_Test_Entry);
hgs
parents:
diff changeset
  1727
	TBreakId entryArmBreakId;
hgs
parents:
diff changeset
  1728
hgs
parents:
diff changeset
  1729
	// Copy breakpoint address's in array
hgs
parents:
diff changeset
  1730
	address[0] = (TUint32)(&RMDebug_Bkpt_Test_Loop_Break_1);
hgs
parents:
diff changeset
  1731
	address[1] = (TUint32)(&RMDebug_Bkpt_Test_Loop_Break_2);
hgs
parents:
diff changeset
  1732
hgs
parents:
diff changeset
  1733
	err = aThreadSpecific
hgs
parents:
diff changeset
  1734
		? iServSession.SetBreak(entryArmBreakId,iThreadID,entryAddress,EArmMode)
hgs
parents:
diff changeset
  1735
		: iServSession.SetProcessBreak(entryArmBreakId, processId, entryAddress, EArmMode);
hgs
parents:
diff changeset
  1736
	test(err == KErrNone);
hgs
parents:
diff changeset
  1737
hgs
parents:
diff changeset
  1738
	// Try to set the breakpoints inside loop
hgs
parents:
diff changeset
  1739
	for (TInt i = 0; i < numOfBreakPointsInLoop; i++)
hgs
parents:
diff changeset
  1740
		{
hgs
parents:
diff changeset
  1741
		err = aThreadSpecific
hgs
parents:
diff changeset
  1742
			? iServSession.SetBreak(armBreakId[i],iThreadID,address[i],EArmMode)
hgs
parents:
diff changeset
  1743
			: iServSession.SetProcessBreak(armBreakId[i], processId, address[i], EArmMode);
hgs
parents:
diff changeset
  1744
		test(err == KErrNone);
hgs
parents:
diff changeset
  1745
		}
hgs
parents:
diff changeset
  1746
hgs
parents:
diff changeset
  1747
	err = aThreadSpecific
hgs
parents:
diff changeset
  1748
		? iServSession.SetEventAction(iFileName,EEventsBreakPoint, EActionSuspend)
hgs
parents:
diff changeset
  1749
		: iServSession.SetEventAction(iFileName,EEventsProcessBreakPoint, EActionSuspend);
hgs
parents:
diff changeset
  1750
	test (err == KErrNone);
hgs
parents:
diff changeset
  1751
hgs
parents:
diff changeset
  1752
	// Continue the thread
hgs
parents:
diff changeset
  1753
	err = iServSession.ResumeThread(iThreadID);
hgs
parents:
diff changeset
  1754
	test (err == KErrNone);
hgs
parents:
diff changeset
  1755
hgs
parents:
diff changeset
  1756
	// Wait for the breakpoint to be hit
hgs
parents:
diff changeset
  1757
	TEventInfo info;
hgs
parents:
diff changeset
  1758
	TRequestStatus status;
hgs
parents:
diff changeset
  1759
hgs
parents:
diff changeset
  1760
	TPtr8 infoPtr((TUint8*)&info,0,sizeof(TEventInfo));
hgs
parents:
diff changeset
  1761
	iServSession.GetEvent(iFileName,status,infoPtr);
hgs
parents:
diff changeset
  1762
hgs
parents:
diff changeset
  1763
	// Wait for notification of breakpoint event
hgs
parents:
diff changeset
  1764
	User::WaitForRequest(status);
hgs
parents:
diff changeset
  1765
	test(status==KErrNone);
hgs
parents:
diff changeset
  1766
hgs
parents:
diff changeset
  1767
	// Info should now be filled with the details
hgs
parents:
diff changeset
  1768
	test(info.iEventType == (aThreadSpecific ? EEventsBreakPoint : EEventsProcessBreakPoint));
hgs
parents:
diff changeset
  1769
hgs
parents:
diff changeset
  1770
	// Have we stopped at the correct breakpoint?
hgs
parents:
diff changeset
  1771
	test(info.iThreadBreakPointInfo.iRmdArmExcInfo.iR15 == entryAddress);
hgs
parents:
diff changeset
  1772
	test(info.iProcessIdValid);
hgs
parents:
diff changeset
  1773
	test(info.iThreadIdValid);
hgs
parents:
diff changeset
  1774
hgs
parents:
diff changeset
  1775
	// Don't require the entry breakpoint anymore
hgs
parents:
diff changeset
  1776
	err = iServSession.ClearBreak(entryArmBreakId);
hgs
parents:
diff changeset
  1777
	test(err == KErrNone);
hgs
parents:
diff changeset
  1778
	
hgs
parents:
diff changeset
  1779
	// Stress the system by setting loop count to 100
hgs
parents:
diff changeset
  1780
	const TUint32 loopCount = 100;
hgs
parents:
diff changeset
  1781
hgs
parents:
diff changeset
  1782
	for (TInt i = 0; i < loopCount; i++)
hgs
parents:
diff changeset
  1783
		{
hgs
parents:
diff changeset
  1784
		// Continue the thread
hgs
parents:
diff changeset
  1785
		err = iServSession.ResumeThread(iThreadID);
hgs
parents:
diff changeset
  1786
		test (err == KErrNone);
hgs
parents:
diff changeset
  1787
hgs
parents:
diff changeset
  1788
		// Wait for the breakpoint to be hit
hgs
parents:
diff changeset
  1789
		iServSession.GetEvent(iFileName,status,infoPtr);
hgs
parents:
diff changeset
  1790
		
hgs
parents:
diff changeset
  1791
		// Wait for notification of the breakpoint hit event
hgs
parents:
diff changeset
  1792
		User::WaitForRequest(status);
hgs
parents:
diff changeset
  1793
		test(status==KErrNone);
hgs
parents:
diff changeset
  1794
		
hgs
parents:
diff changeset
  1795
		// Info should now be filled with the details
hgs
parents:
diff changeset
  1796
		test(info.iEventType == (aThreadSpecific ? EEventsBreakPoint : EEventsProcessBreakPoint));
hgs
parents:
diff changeset
  1797
		
hgs
parents:
diff changeset
  1798
		// Have we stopped at the correct breakpoint?
hgs
parents:
diff changeset
  1799
		test(info.iThreadBreakPointInfo.iRmdArmExcInfo.iR15 == address[i%numOfBreakPointsInLoop]);
hgs
parents:
diff changeset
  1800
		
hgs
parents:
diff changeset
  1801
		// Check process and thread id too
hgs
parents:
diff changeset
  1802
		test(info.iProcessIdValid);
hgs
parents:
diff changeset
  1803
		test(info.iThreadIdValid);
hgs
parents:
diff changeset
  1804
		}
hgs
parents:
diff changeset
  1805
hgs
parents:
diff changeset
  1806
	// Not interested in breakpoint events any more
hgs
parents:
diff changeset
  1807
	err = aThreadSpecific
hgs
parents:
diff changeset
  1808
		? iServSession.SetEventAction(iFileName,EEventsBreakPoint, EActionIgnore)
hgs
parents:
diff changeset
  1809
		: iServSession.SetEventAction(iFileName, EEventsProcessBreakPoint, EActionIgnore);
hgs
parents:
diff changeset
  1810
	test (err == KErrNone);
hgs
parents:
diff changeset
  1811
hgs
parents:
diff changeset
  1812
	// Clear breakpoints
hgs
parents:
diff changeset
  1813
	for (TInt i = 0; i < numOfBreakPointsInLoop; i++)
hgs
parents:
diff changeset
  1814
		{
hgs
parents:
diff changeset
  1815
		err = iServSession.ClearBreak(armBreakId[i]);
hgs
parents:
diff changeset
  1816
		test(err == KErrNone);
hgs
parents:
diff changeset
  1817
		}
hgs
parents:
diff changeset
  1818
	
hgs
parents:
diff changeset
  1819
	// Continue the thread again
hgs
parents:
diff changeset
  1820
	err = iServSession.ResumeThread(iThreadID);
hgs
parents:
diff changeset
  1821
	test (err == KErrNone);
hgs
parents:
diff changeset
  1822
	test(KErrNone == iServSession.DetachExecutable(iFileName));
hgs
parents:
diff changeset
  1823
	}
hgs
parents:
diff changeset
  1824
hgs
parents:
diff changeset
  1825
//----------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
  1826
//! @SYMTestCaseID      KBase-T-RMDEBUG2-0440
hgs
parents:
diff changeset
  1827
//! @SYMTestType
hgs
parents:
diff changeset
  1828
//! @SYMPREQ            PREQ1426
hgs
parents:
diff changeset
  1829
//! @SYMTestCaseDesc    Test access to target user-side registers.
hgs
parents:
diff changeset
  1830
//! @SYMTestActions     Suspends a target thread, and reads/writes target thread register contents
hgs
parents:
diff changeset
  1831
//!
hgs
parents:
diff changeset
  1832
//! @SYMTestExpectedResults KErrNone. Should access target registers without problems.
hgs
parents:
diff changeset
  1833
//! @SYMTestPriority        High
hgs
parents:
diff changeset
  1834
//! @SYMTestStatus          Implemented
hgs
parents:
diff changeset
  1835
//----------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
  1836
hgs
parents:
diff changeset
  1837
void CRunModeAgent::TestRegisterAccess()
hgs
parents:
diff changeset
  1838
	{
hgs
parents:
diff changeset
  1839
	TInt err;
hgs
parents:
diff changeset
  1840
hgs
parents:
diff changeset
  1841
	test.Next(_L("TestRegisterAccess - Read\n"));
hgs
parents:
diff changeset
  1842
hgs
parents:
diff changeset
  1843
	test(KErrNone == iServSession.AttachExecutable(iFileName, EFalse));
hgs
parents:
diff changeset
  1844
hgs
parents:
diff changeset
  1845
	//suspend the thread to read registers
hgs
parents:
diff changeset
  1846
	err = iServSession.SuspendThread(iThreadID);
hgs
parents:
diff changeset
  1847
	test(err==KErrNone);
hgs
parents:
diff changeset
  1848
hgs
parents:
diff changeset
  1849
	//we'll try to read/write registers ERegisterR0 - ERegisterCPSR and ERegisterR13_IRQ
hgs
parents:
diff changeset
  1850
	//this way should get valid register values back, invalid ones and not supported ones, and it
hgs
parents:
diff changeset
  1851
	//means that the register IDs are not completely contiguous
hgs
parents:
diff changeset
  1852
hgs
parents:
diff changeset
  1853
	TInt firstRegister = 0;
hgs
parents:
diff changeset
  1854
	TInt lastRegister = 17;
hgs
parents:
diff changeset
  1855
	TInt numberOfRegisters = (lastRegister - firstRegister) + 1;
hgs
parents:
diff changeset
  1856
hgs
parents:
diff changeset
  1857
	RBuf8 ids;
hgs
parents:
diff changeset
  1858
	err = ids.Create(numberOfRegisters * sizeof(TRegisterInfo));
hgs
parents:
diff changeset
  1859
	test(err == KErrNone);
hgs
parents:
diff changeset
  1860
hgs
parents:
diff changeset
  1861
	for(TInt i=0; i<numberOfRegisters - 1; i++)
hgs
parents:
diff changeset
  1862
		{
hgs
parents:
diff changeset
  1863
		TRegisterInfo reg = (TRegisterInfo)((i + firstRegister)<<8);
hgs
parents:
diff changeset
  1864
		ids.Append(reinterpret_cast<const TUint8*>(&reg), sizeof(TRegisterInfo));
hgs
parents:
diff changeset
  1865
		}
hgs
parents:
diff changeset
  1866
hgs
parents:
diff changeset
  1867
	TRegisterInfo reg = ERegisterR13Irq;
hgs
parents:
diff changeset
  1868
	ids.Append(reinterpret_cast<const TUint8*>(&reg), sizeof(TRegisterInfo));
hgs
parents:
diff changeset
  1869
hgs
parents:
diff changeset
  1870
	//create a buffer to store the register values in
hgs
parents:
diff changeset
  1871
	RBuf8 originalValues;
hgs
parents:
diff changeset
  1872
	err = originalValues.Create(numberOfRegisters*sizeof(TUint32));
hgs
parents:
diff changeset
  1873
	test(err == KErrNone);
hgs
parents:
diff changeset
  1874
hgs
parents:
diff changeset
  1875
	//create a buffer to store the register flags in
hgs
parents:
diff changeset
  1876
	RBuf8 originalFlags;
hgs
parents:
diff changeset
  1877
	err = originalFlags.Create(numberOfRegisters*sizeof(TUint8));
hgs
parents:
diff changeset
  1878
	test(err == KErrNone);
hgs
parents:
diff changeset
  1879
hgs
parents:
diff changeset
  1880
	//read register values
hgs
parents:
diff changeset
  1881
	err = iServSession.ReadRegisters(iThreadID, ids, originalValues, originalFlags);
hgs
parents:
diff changeset
  1882
	test(err == KErrNone);
hgs
parents:
diff changeset
  1883
hgs
parents:
diff changeset
  1884
	//create a buffer containing data to write into the registers
hgs
parents:
diff changeset
  1885
	RBuf8 tempValues;
hgs
parents:
diff changeset
  1886
	err = tempValues.Create(numberOfRegisters*sizeof(TUint32));
hgs
parents:
diff changeset
  1887
	test(err == KErrNone);
hgs
parents:
diff changeset
  1888
hgs
parents:
diff changeset
  1889
	TUint cpsrId = 16;
hgs
parents:
diff changeset
  1890
	for(TUint8 i=0; i<numberOfRegisters*sizeof(TUint32); i++)
hgs
parents:
diff changeset
  1891
		{
hgs
parents:
diff changeset
  1892
		if(i/sizeof(TUint32) == cpsrId)
hgs
parents:
diff changeset
  1893
			{
hgs
parents:
diff changeset
  1894
			//For the CPSR we wish to write data that makes sense - for USR mode we are
hgs
parents:
diff changeset
  1895
			//allowed change all except the mode, ie. we must stay in usr mode. We try that here
hgs
parents:
diff changeset
  1896
			//(allowedCPSRValue[4:0] = 10000) thus not changing the mode.
hgs
parents:
diff changeset
  1897
			TUint32 allowedCPSRValue = 0x50000010;
hgs
parents:
diff changeset
  1898
			tempValues.Append((TUint8*)&allowedCPSRValue, 4);
hgs
parents:
diff changeset
  1899
			i += 3;
hgs
parents:
diff changeset
  1900
			}
hgs
parents:
diff changeset
  1901
		else
hgs
parents:
diff changeset
  1902
			{
hgs
parents:
diff changeset
  1903
			tempValues.Append(&i, 1);
hgs
parents:
diff changeset
  1904
			}
hgs
parents:
diff changeset
  1905
		}
hgs
parents:
diff changeset
  1906
hgs
parents:
diff changeset
  1907
	test.Next(_L("TestRegisterAccess - Write\n"));
hgs
parents:
diff changeset
  1908
hgs
parents:
diff changeset
  1909
	//create a buffer to store the register flags in
hgs
parents:
diff changeset
  1910
	RBuf8 tempWriteFlags;
hgs
parents:
diff changeset
  1911
	err = tempWriteFlags.Create(numberOfRegisters*sizeof(TUint8));
hgs
parents:
diff changeset
  1912
	test(err == KErrNone);
hgs
parents:
diff changeset
  1913
hgs
parents:
diff changeset
  1914
	//write the temp data into the registers
hgs
parents:
diff changeset
  1915
	err = iServSession.WriteRegisters(iThreadID, ids, tempValues, tempWriteFlags);
hgs
parents:
diff changeset
  1916
	test(err == KErrNone);
hgs
parents:
diff changeset
  1917
hgs
parents:
diff changeset
  1918
	//create another buffer to store the register flags in
hgs
parents:
diff changeset
  1919
	RBuf8 tempReadFlags;
hgs
parents:
diff changeset
  1920
	err = tempReadFlags.Create(numberOfRegisters*sizeof(TUint8));
hgs
parents:
diff changeset
  1921
	test(err == KErrNone);
hgs
parents:
diff changeset
  1922
hgs
parents:
diff changeset
  1923
	RBuf8 tempReadValues;
hgs
parents:
diff changeset
  1924
	err = tempReadValues.Create(numberOfRegisters*sizeof(TUint32));
hgs
parents:
diff changeset
  1925
	test(err == KErrNone);
hgs
parents:
diff changeset
  1926
hgs
parents:
diff changeset
  1927
	//read the temp data out again
hgs
parents:
diff changeset
  1928
	err = iServSession.ReadRegisters(iThreadID, ids, tempReadValues, tempReadFlags);
hgs
parents:
diff changeset
  1929
	test(err == KErrNone);
hgs
parents:
diff changeset
  1930
hgs
parents:
diff changeset
  1931
	//check values are correct
hgs
parents:
diff changeset
  1932
	for(TInt i=0; i<numberOfRegisters; i++)
hgs
parents:
diff changeset
  1933
		{
hgs
parents:
diff changeset
  1934
		TRegisterFlag writeFlag;
hgs
parents:
diff changeset
  1935
		err = GetFlag(tempWriteFlags, i, writeFlag);
hgs
parents:
diff changeset
  1936
		test(err == KErrNone);
hgs
parents:
diff changeset
  1937
hgs
parents:
diff changeset
  1938
		TRegisterFlag readFlag;
hgs
parents:
diff changeset
  1939
		err = GetFlag(tempReadFlags, i, readFlag);
hgs
parents:
diff changeset
  1940
		test(err == KErrNone);
hgs
parents:
diff changeset
  1941
hgs
parents:
diff changeset
  1942
		if((writeFlag == EValid) && (readFlag == EValid))
hgs
parents:
diff changeset
  1943
			{
hgs
parents:
diff changeset
  1944
			TUint8 offset = i * sizeof(TUint32);
hgs
parents:
diff changeset
  1945
			for(TUint j = offset; j< offset + sizeof(TUint32); j++)
hgs
parents:
diff changeset
  1946
				{
hgs
parents:
diff changeset
  1947
				test(tempValues.Ptr()[j] == tempReadValues.Ptr()[j]);
hgs
parents:
diff changeset
  1948
				}
hgs
parents:
diff changeset
  1949
			}
hgs
parents:
diff changeset
  1950
		}
hgs
parents:
diff changeset
  1951
hgs
parents:
diff changeset
  1952
	//write the original data into the registers
hgs
parents:
diff changeset
  1953
	err = iServSession.WriteRegisters(iThreadID, ids, originalValues, originalFlags);
hgs
parents:
diff changeset
  1954
	test(err == KErrNone);
hgs
parents:
diff changeset
  1955
hgs
parents:
diff changeset
  1956
	//read the data out again
hgs
parents:
diff changeset
  1957
	err = iServSession.ReadRegisters(iThreadID, ids, tempValues, tempReadFlags);
hgs
parents:
diff changeset
  1958
	test(err == KErrNone);
hgs
parents:
diff changeset
  1959
hgs
parents:
diff changeset
  1960
	//check values are correct
hgs
parents:
diff changeset
  1961
	for(TInt i=0; i<numberOfRegisters; i++)
hgs
parents:
diff changeset
  1962
		{
hgs
parents:
diff changeset
  1963
		TRegisterFlag writeFlag;
hgs
parents:
diff changeset
  1964
		err = GetFlag(originalFlags, i, writeFlag);
hgs
parents:
diff changeset
  1965
		test(err == KErrNone);
hgs
parents:
diff changeset
  1966
hgs
parents:
diff changeset
  1967
		TRegisterFlag readFlag;
hgs
parents:
diff changeset
  1968
		err = GetFlag(tempReadFlags, i, readFlag);
hgs
parents:
diff changeset
  1969
		test(err == KErrNone);
hgs
parents:
diff changeset
  1970
hgs
parents:
diff changeset
  1971
		if((writeFlag == EValid) && (readFlag == EValid))
hgs
parents:
diff changeset
  1972
			{
hgs
parents:
diff changeset
  1973
			TUint8 offset = i * sizeof(TUint32);
hgs
parents:
diff changeset
  1974
			for(TUint j = offset; j< offset + sizeof(TUint32); j++)
hgs
parents:
diff changeset
  1975
				{
hgs
parents:
diff changeset
  1976
				test(tempValues.Ptr()[j] == originalValues.Ptr()[j]);
hgs
parents:
diff changeset
  1977
				}
hgs
parents:
diff changeset
  1978
			}
hgs
parents:
diff changeset
  1979
		}
hgs
parents:
diff changeset
  1980
hgs
parents:
diff changeset
  1981
	test.Next(_L("TestRegisterAccess - Invalid data\n"));
hgs
parents:
diff changeset
  1982
hgs
parents:
diff changeset
  1983
	//create a buffer of max size 1
hgs
parents:
diff changeset
  1984
	RBuf8 emptyBuffer;
hgs
parents:
diff changeset
  1985
	emptyBuffer.Create(1);
hgs
parents:
diff changeset
  1986
hgs
parents:
diff changeset
  1987
	//test register IDs buffer not being a multiple of sizeof(TRegisterInfo)
hgs
parents:
diff changeset
  1988
	err = iServSession.ReadRegisters(iThreadID, emptyBuffer, tempValues, tempReadFlags);
hgs
parents:
diff changeset
  1989
	test(err == KErrArgument);
hgs
parents:
diff changeset
  1990
hgs
parents:
diff changeset
  1991
	//test register values buffer not being a multiple of sizeof(TUint32)
hgs
parents:
diff changeset
  1992
	err = iServSession.ReadRegisters(iThreadID, ids, emptyBuffer, tempReadFlags);
hgs
parents:
diff changeset
  1993
	test(err == KErrArgument);
hgs
parents:
diff changeset
  1994
hgs
parents:
diff changeset
  1995
	//test flags buffer being representing different number of registers from other two
hgs
parents:
diff changeset
  1996
	err = iServSession.ReadRegisters(iThreadID, ids, tempValues, emptyBuffer);
hgs
parents:
diff changeset
  1997
	test(err == KErrArgument);
hgs
parents:
diff changeset
  1998
hgs
parents:
diff changeset
  1999
	//set max length to 0
hgs
parents:
diff changeset
  2000
	emptyBuffer.ReAlloc(0);
hgs
parents:
diff changeset
  2001
hgs
parents:
diff changeset
  2002
	//test ids buffer being of 0 max length
hgs
parents:
diff changeset
  2003
	err = iServSession.ReadRegisters(iThreadID, emptyBuffer, tempValues, tempReadFlags);
hgs
parents:
diff changeset
  2004
	test(err == KErrArgument);
hgs
parents:
diff changeset
  2005
hgs
parents:
diff changeset
  2006
	//do cleanup
hgs
parents:
diff changeset
  2007
	emptyBuffer.Close();
hgs
parents:
diff changeset
  2008
	tempValues.Close();
hgs
parents:
diff changeset
  2009
	tempWriteFlags.Close();
hgs
parents:
diff changeset
  2010
	tempReadFlags.Close();
hgs
parents:
diff changeset
  2011
	tempReadValues.Close();
hgs
parents:
diff changeset
  2012
hgs
parents:
diff changeset
  2013
	test.Next(_L("TestRegisterAccess - Setting PC value\n"));
hgs
parents:
diff changeset
  2014
hgs
parents:
diff changeset
  2015
	//create buffer containing PC register ID
hgs
parents:
diff changeset
  2016
	RBuf8 pcId;
hgs
parents:
diff changeset
  2017
	err = pcId.Create(sizeof(TRegisterInfo));
hgs
parents:
diff changeset
  2018
	test(err == KErrNone);
hgs
parents:
diff changeset
  2019
	TRegisterInfo reg1 = (TRegisterInfo)0x00000f00;
hgs
parents:
diff changeset
  2020
	pcId.Append(reinterpret_cast<const TUint8*>(&reg1), sizeof(TRegisterInfo));
hgs
parents:
diff changeset
  2021
hgs
parents:
diff changeset
  2022
	//create buffer containing desired PC value
hgs
parents:
diff changeset
  2023
	RBuf8 pcValue;
hgs
parents:
diff changeset
  2024
	err = pcValue.Create(sizeof(TUint32));
hgs
parents:
diff changeset
  2025
	test(err == KErrNone);
hgs
parents:
diff changeset
  2026
	TUint32 address = (TUint32)(&TestFunction);
hgs
parents:
diff changeset
  2027
	pcValue.Append(reinterpret_cast<const TUint8*>(&address), sizeof(TUint32));
hgs
parents:
diff changeset
  2028
hgs
parents:
diff changeset
  2029
	//craete buffer for PC flag value
hgs
parents:
diff changeset
  2030
	RBuf8 pcFlag;
hgs
parents:
diff changeset
  2031
	err = pcFlag.Create(sizeof(TUint8));
hgs
parents:
diff changeset
  2032
hgs
parents:
diff changeset
  2033
	//write the new PC value
hgs
parents:
diff changeset
  2034
	err = iServSession.WriteRegisters(iThreadID, pcId, pcValue, pcFlag);
hgs
parents:
diff changeset
  2035
	test(err==KErrNone);
hgs
parents:
diff changeset
  2036
hgs
parents:
diff changeset
  2037
	//get the flag and check the PC value was written ok
hgs
parents:
diff changeset
  2038
	TRegisterFlag flag = ENotSupported;
hgs
parents:
diff changeset
  2039
	err = GetFlag(pcFlag, 0, flag);
hgs
parents:
diff changeset
  2040
	test(err==KErrNone);
hgs
parents:
diff changeset
  2041
	test( flag == EValid);
hgs
parents:
diff changeset
  2042
	if(flag == EValid)
hgs
parents:
diff changeset
  2043
		{
hgs
parents:
diff changeset
  2044
		/* The PC value was changed to execute the function TestFunction.
hgs
parents:
diff changeset
  2045
		* TestFunction changes the value of TestData to a given value and 
hgs
parents:
diff changeset
  2046
		* then calls RMDebug_BranchTst1.
hgs
parents:
diff changeset
  2047
		* We place a breakpoint on RMDebug_BranchTst1 so that to we are able 
hgs
parents:
diff changeset
  2048
		* to test the value of TestData.
hgs
parents:
diff changeset
  2049
		*/
hgs
parents:
diff changeset
  2050
hgs
parents:
diff changeset
  2051
		test(KErrNone == iServSession.SetEventAction(iFileName,EEventsBreakPoint, EActionSuspend));
hgs
parents:
diff changeset
  2052
		TBreakId armBreakId;
hgs
parents:
diff changeset
  2053
		TUint32 address = (TUint32)(&RMDebug_BranchTst1);
hgs
parents:
diff changeset
  2054
		test(KErrNone == iServSession.SetBreak(armBreakId,iThreadID,address,EArmMode));
hgs
parents:
diff changeset
  2055
hgs
parents:
diff changeset
  2056
		// Continue the thread
hgs
parents:
diff changeset
  2057
		test(KErrNone == iServSession.ResumeThread(iThreadID));
hgs
parents:
diff changeset
  2058
hgs
parents:
diff changeset
  2059
		// wait for the breakpoint to be hit
hgs
parents:
diff changeset
  2060
		TEventInfo info;
hgs
parents:
diff changeset
  2061
		static TRequestStatus status;
hgs
parents:
diff changeset
  2062
hgs
parents:
diff changeset
  2063
		TPtr8 infoPtr((TUint8*)&info,0,sizeof(TEventInfo));
hgs
parents:
diff changeset
  2064
		iServSession.GetEvent(iFileName,status,infoPtr);
hgs
parents:
diff changeset
  2065
hgs
parents:
diff changeset
  2066
		// Wait for notification of the breakpoint hit event
hgs
parents:
diff changeset
  2067
		User::WaitForRequest(status);
hgs
parents:
diff changeset
  2068
		test(status==KErrNone);
hgs
parents:
diff changeset
  2069
hgs
parents:
diff changeset
  2070
		// info should now be filled with the details
hgs
parents:
diff changeset
  2071
		test(info.iEventType == EEventsBreakPoint);
hgs
parents:
diff changeset
  2072
		test(info.iThreadBreakPointInfo.iRmdArmExcInfo.iR15 == address);
hgs
parents:
diff changeset
  2073
		test(info.iProcessIdValid);
hgs
parents:
diff changeset
  2074
		test(info.iThreadIdValid);
hgs
parents:
diff changeset
  2075
hgs
parents:
diff changeset
  2076
		test(KErrNone == iServSession.ClearBreak(armBreakId));
hgs
parents:
diff changeset
  2077
hgs
parents:
diff changeset
  2078
		// Finally test the value
hgs
parents:
diff changeset
  2079
		test(TestData == 0xffeeddcc);
hgs
parents:
diff changeset
  2080
		}
hgs
parents:
diff changeset
  2081
hgs
parents:
diff changeset
  2082
	//Make sure we cannot change the CPSR
hgs
parents:
diff changeset
  2083
	test.Next(_L("Verifying we cannot change the CPSR mode from USR Mode"));
hgs
parents:
diff changeset
  2084
hgs
parents:
diff changeset
  2085
	TUint32 disallowedCpsr = 0x50000013;
hgs
parents:
diff changeset
  2086
hgs
parents:
diff changeset
  2087
	RBuf8 cpsrRegId;
hgs
parents:
diff changeset
  2088
	err = cpsrRegId.Create(sizeof(TUint32));
hgs
parents:
diff changeset
  2089
	test(err == KErrNone);
hgs
parents:
diff changeset
  2090
hgs
parents:
diff changeset
  2091
	TRegisterInfo cpsr = (TRegisterInfo)((cpsrId + firstRegister)<<8);
hgs
parents:
diff changeset
  2092
	cpsrRegId.Append(reinterpret_cast<const TUint8*>(&cpsr), sizeof(TRegisterInfo));
hgs
parents:
diff changeset
  2093
hgs
parents:
diff changeset
  2094
	RBuf8 cpsrRegFlags;
hgs
parents:
diff changeset
  2095
	err = cpsrRegFlags.Create(sizeof(TUint8));
hgs
parents:
diff changeset
  2096
	test(err == KErrNone);
hgs
parents:
diff changeset
  2097
hgs
parents:
diff changeset
  2098
	RBuf8 cpsrVal;
hgs
parents:
diff changeset
  2099
	err = cpsrVal.Create(sizeof(TUint32));
hgs
parents:
diff changeset
  2100
	test(err == KErrNone);
hgs
parents:
diff changeset
  2101
hgs
parents:
diff changeset
  2102
	cpsrVal.Append((TUint8*)&disallowedCpsr, 4);
hgs
parents:
diff changeset
  2103
hgs
parents:
diff changeset
  2104
	//attempt to write disallowed CPSR in
hgs
parents:
diff changeset
  2105
	err = iServSession.WriteRegisters(iThreadID, cpsrRegId, cpsrVal, cpsrRegFlags);
hgs
parents:
diff changeset
  2106
	test(err == KErrNone);
hgs
parents:
diff changeset
  2107
hgs
parents:
diff changeset
  2108
	RBuf8 cpsrReadVal;
hgs
parents:
diff changeset
  2109
	err = cpsrReadVal.Create(sizeof(TUint32));
hgs
parents:
diff changeset
  2110
	test(err == KErrNone);
hgs
parents:
diff changeset
  2111
hgs
parents:
diff changeset
  2112
	//Read back the CPSR
hgs
parents:
diff changeset
  2113
	err = iServSession.ReadRegisters(iThreadID, cpsrRegId, cpsrReadVal, cpsrRegFlags);
hgs
parents:
diff changeset
  2114
	test(err == KErrNone);
hgs
parents:
diff changeset
  2115
hgs
parents:
diff changeset
  2116
	//Make sure we havent switched modes ie. its not what we wrote
hgs
parents:
diff changeset
  2117
	TUint32* readVal = (TUint32*)cpsrReadVal.Ptr();
hgs
parents:
diff changeset
  2118
	test(*readVal != disallowedCpsr);
hgs
parents:
diff changeset
  2119
hgs
parents:
diff changeset
  2120
	cpsrRegId.Close();
hgs
parents:
diff changeset
  2121
	cpsrRegFlags.Close();
hgs
parents:
diff changeset
  2122
	cpsrVal.Close();
hgs
parents:
diff changeset
  2123
	cpsrReadVal.Close();
hgs
parents:
diff changeset
  2124
hgs
parents:
diff changeset
  2125
	//write the original values back into here
hgs
parents:
diff changeset
  2126
	err = iServSession.WriteRegisters(iThreadID, ids, originalValues, originalFlags);
hgs
parents:
diff changeset
  2127
	test(err == KErrNone);
hgs
parents:
diff changeset
  2128
	
hgs
parents:
diff changeset
  2129
	test(KErrNone == SwitchTestFunction(EDefaultFunction));
hgs
parents:
diff changeset
  2130
hgs
parents:
diff changeset
  2131
	// Resume the thread
hgs
parents:
diff changeset
  2132
	err = iServSession.ResumeThread(iThreadID);
hgs
parents:
diff changeset
  2133
	test(err==KErrNone);
hgs
parents:
diff changeset
  2134
hgs
parents:
diff changeset
  2135
	test(KErrNone == iServSession.DetachExecutable(iFileName));
hgs
parents:
diff changeset
  2136
hgs
parents:
diff changeset
  2137
	//do cleanup
hgs
parents:
diff changeset
  2138
	pcId.Close();
hgs
parents:
diff changeset
  2139
	pcValue.Close();
hgs
parents:
diff changeset
  2140
	pcFlag.Close();
hgs
parents:
diff changeset
  2141
	ids.Close();
hgs
parents:
diff changeset
  2142
	originalValues.Close();
hgs
parents:
diff changeset
  2143
	originalFlags.Close();
hgs
parents:
diff changeset
  2144
	}
hgs
parents:
diff changeset
  2145
hgs
parents:
diff changeset
  2146
//----------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
  2147
//! @SYMTestCaseID      KBase-T-RMDEBUG2-0441
hgs
parents:
diff changeset
  2148
//! @SYMTestType
hgs
parents:
diff changeset
  2149
//! @SYMPREQ            PREQ1426
hgs
parents:
diff changeset
  2150
//! @SYMTestCaseDesc    Test registration/de-registration of debug interest in target exe with the Debug Security Server
hgs
parents:
diff changeset
  2151
//! @SYMTestActions     As per description
hgs
parents:
diff changeset
  2152
//!
hgs
parents:
diff changeset
  2153
//! @SYMTestExpectedResults KErrNone.
hgs
parents:
diff changeset
  2154
//! @SYMTestPriority        High
hgs
parents:
diff changeset
  2155
//! @SYMTestStatus          Implemented
hgs
parents:
diff changeset
  2156
//----------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
  2157
hgs
parents:
diff changeset
  2158
void CRunModeAgent::TestAttachExecutable()
hgs
parents:
diff changeset
  2159
	{
hgs
parents:
diff changeset
  2160
hgs
parents:
diff changeset
  2161
	test.Next(_L("TestAttachExecutable - Attach\n"));
hgs
parents:
diff changeset
  2162
hgs
parents:
diff changeset
  2163
	//attach to process passively
hgs
parents:
diff changeset
  2164
	test(KErrNone == iServSession.AttachExecutable(iFileName, ETrue));
hgs
parents:
diff changeset
  2165
hgs
parents:
diff changeset
  2166
	//make a thread id for a non-existent thread
hgs
parents:
diff changeset
  2167
	TThreadId threadId(0x12345678);
hgs
parents:
diff changeset
  2168
hgs
parents:
diff changeset
  2169
	//get a handle to the target thread
hgs
parents:
diff changeset
  2170
	RThread targetThread;
hgs
parents:
diff changeset
  2171
	TInt err = targetThread.Open(threadId);
hgs
parents:
diff changeset
  2172
	test(err != KErrNone);
hgs
parents:
diff changeset
  2173
hgs
parents:
diff changeset
  2174
	//not registered for this thread's process (as it doesn't exist)
hgs
parents:
diff changeset
  2175
	//so should fail security check
hgs
parents:
diff changeset
  2176
	err = iServSession.ResumeThread(threadId);
hgs
parents:
diff changeset
  2177
	test(err==KErrPermissionDenied || err==KErrNotFound); // newer DSS returns the more-descriptive KErrNotFound here
hgs
parents:
diff changeset
  2178
hgs
parents:
diff changeset
  2179
	//try to attach to the same process (and fail)
hgs
parents:
diff changeset
  2180
	test(KErrAlreadyExists == iServSession.AttachExecutable(iFileName, EFalse));
hgs
parents:
diff changeset
  2181
hgs
parents:
diff changeset
  2182
	test.Next(_L("TestAttachExecutable - Detach\n"));
hgs
parents:
diff changeset
  2183
hgs
parents:
diff changeset
  2184
	//detach from process
hgs
parents:
diff changeset
  2185
	test(KErrNone == iServSession.DetachExecutable(iFileName));
hgs
parents:
diff changeset
  2186
hgs
parents:
diff changeset
  2187
	//attach non-passively
hgs
parents:
diff changeset
  2188
	test(KErrNone == iServSession.AttachExecutable(iFileName, EFalse));
hgs
parents:
diff changeset
  2189
hgs
parents:
diff changeset
  2190
	//not registered for this thread's process (as it doesn't exist)
hgs
parents:
diff changeset
  2191
	//so should fail security check
hgs
parents:
diff changeset
  2192
	err = iServSession.ResumeThread(0x12345678);
hgs
parents:
diff changeset
  2193
	test(err==KErrPermissionDenied || err==KErrNotFound); // newer DSS returns the more-descriptive KErrNotFound here
hgs
parents:
diff changeset
  2194
	test(KErrNone == iServSession.DetachExecutable(iFileName));
hgs
parents:
diff changeset
  2195
	}
hgs
parents:
diff changeset
  2196
hgs
parents:
diff changeset
  2197
//----------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
  2198
//! @SYMTestCaseID      KBase-T-RMDEBUG2-0442
hgs
parents:
diff changeset
  2199
//! @SYMTestType
hgs
parents:
diff changeset
  2200
//! @SYMPREQ            PREQ1426
hgs
parents:
diff changeset
  2201
//! @SYMTestCaseDesc    Tests single-stepping target threads.
hgs
parents:
diff changeset
  2202
//! @SYMTestActions     Steps target thread assembly level instructions, mainly branch/change PC
hgs
parents:
diff changeset
  2203
//!
hgs
parents:
diff changeset
  2204
//! @SYMTestExpectedResults KErrNone.
hgs
parents:
diff changeset
  2205
//! @SYMTestPriority        High
hgs
parents:
diff changeset
  2206
//! @SYMTestStatus          Implemented
hgs
parents:
diff changeset
  2207
//----------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
  2208
hgs
parents:
diff changeset
  2209
void CRunModeAgent::TestStep()
hgs
parents:
diff changeset
  2210
	{
hgs
parents:
diff changeset
  2211
	test.Next(_L("TestStep\n"));
hgs
parents:
diff changeset
  2212
hgs
parents:
diff changeset
  2213
	DoTestStep(EFalse);
hgs
parents:
diff changeset
  2214
	DoTestStep(ETrue);
hgs
parents:
diff changeset
  2215
	}
hgs
parents:
diff changeset
  2216
hgs
parents:
diff changeset
  2217
void CRunModeAgent::DoTestStep(TBool aThreadSpecific)
hgs
parents:
diff changeset
  2218
	{
hgs
parents:
diff changeset
  2219
	test.Printf(_L("DoTestStep: aThreadSpecific: %d\n"), aThreadSpecific?1:0);
hgs
parents:
diff changeset
  2220
hgs
parents:
diff changeset
  2221
	TInt err = KErrNone;
hgs
parents:
diff changeset
  2222
hgs
parents:
diff changeset
  2223
	RProcess process;
hgs
parents:
diff changeset
  2224
	TProcessId processId = process.Id();
hgs
parents:
diff changeset
  2225
	process.Close();
hgs
parents:
diff changeset
  2226
hgs
parents:
diff changeset
  2227
	test(KErrNone == iServSession.AttachExecutable(iFileName, EFalse));
hgs
parents:
diff changeset
  2228
	//set the target thread to execute the stepping functions
hgs
parents:
diff changeset
  2229
	test(KErrNone == SwitchTestFunction(EStepFunction, EFalse));
hgs
parents:
diff changeset
  2230
hgs
parents:
diff changeset
  2231
	
hgs
parents:
diff changeset
  2232
	err = iServSession.SetEventAction(iFileName,EEventsBreakPoint, EActionContinue);
hgs
parents:
diff changeset
  2233
	test (err == KErrNone);
hgs
parents:
diff changeset
  2234
hgs
parents:
diff changeset
  2235
	if(!aThreadSpecific)
hgs
parents:
diff changeset
  2236
		{
hgs
parents:
diff changeset
  2237
		err = iServSession.SetEventAction(iFileName, EEventsProcessBreakPoint, EActionContinue);
hgs
parents:
diff changeset
  2238
		test (err == KErrNone);
hgs
parents:
diff changeset
  2239
		}
hgs
parents:
diff changeset
  2240
hgs
parents:
diff changeset
  2241
	TUint32	startAddress;
hgs
parents:
diff changeset
  2242
	TUint32	endAddress;
hgs
parents:
diff changeset
  2243
hgs
parents:
diff changeset
  2244
	/*
hgs
parents:
diff changeset
  2245
	 * RMDebug_StepTest_Non_PC_Modifying
hgs
parents:
diff changeset
  2246
	 */
hgs
parents:
diff changeset
  2247
	test.Next(_L("TestStep - Non-PC modifying\n"));
hgs
parents:
diff changeset
  2248
hgs
parents:
diff changeset
  2249
	startAddress = (TUint32)(&RMDebug_StepTest_Non_PC_Modifying);
hgs
parents:
diff changeset
  2250
hgs
parents:
diff changeset
  2251
	endAddress = (TUint32)(&RMDebug_StepTest_Non_PC_Modifying_OK);
hgs
parents:
diff changeset
  2252
hgs
parents:
diff changeset
  2253
	err = aThreadSpecific
hgs
parents:
diff changeset
  2254
		? HelpTestStep(iThreadID,startAddress,endAddress,EArmMode,1)
hgs
parents:
diff changeset
  2255
		: HelpTestStep(iThreadID,startAddress,endAddress,EArmMode,1, EFalse, processId);
hgs
parents:
diff changeset
  2256
	test(err==KErrNone);
hgs
parents:
diff changeset
  2257
hgs
parents:
diff changeset
  2258
	/*
hgs
parents:
diff changeset
  2259
	 * RMDebug_StepTest_Branch
hgs
parents:
diff changeset
  2260
	 */
hgs
parents:
diff changeset
  2261
	test.Next(_L("TestStep - Branch\n"));
hgs
parents:
diff changeset
  2262
hgs
parents:
diff changeset
  2263
	startAddress = (TUint32)(&RMDebug_StepTest_Branch);
hgs
parents:
diff changeset
  2264
hgs
parents:
diff changeset
  2265
	endAddress = (TUint32)(&RMDebug_StepTest_Branch_1);
hgs
parents:
diff changeset
  2266
hgs
parents:
diff changeset
  2267
	err = aThreadSpecific
hgs
parents:
diff changeset
  2268
		? HelpTestStep(iThreadID,startAddress,endAddress,EArmMode,1)
hgs
parents:
diff changeset
  2269
		: HelpTestStep(iThreadID,startAddress,endAddress,EArmMode,1, EFalse, processId);
hgs
parents:
diff changeset
  2270
	test(err==KErrNone);
hgs
parents:
diff changeset
  2271
hgs
parents:
diff changeset
  2272
	/*
hgs
parents:
diff changeset
  2273
	 * RMDebug_StepTest_Branch_And_Link
hgs
parents:
diff changeset
  2274
	 */
hgs
parents:
diff changeset
  2275
	test.Next(_L("TestStep - Branch_And_Link\n"));
hgs
parents:
diff changeset
  2276
hgs
parents:
diff changeset
  2277
	startAddress = (TUint32)(&RMDebug_StepTest_Branch_And_Link_1);
hgs
parents:
diff changeset
  2278
hgs
parents:
diff changeset
  2279
	endAddress = (TUint32)(&RMDebug_StepTest_Branch_And_Link_2);
hgs
parents:
diff changeset
  2280
hgs
parents:
diff changeset
  2281
	err = aThreadSpecific
hgs
parents:
diff changeset
  2282
		? HelpTestStep(iThreadID,startAddress,endAddress,EArmMode,1)
hgs
parents:
diff changeset
  2283
		: HelpTestStep(iThreadID,startAddress,endAddress,EArmMode,1, EFalse, processId);
hgs
parents:
diff changeset
  2284
	test(err==KErrNone);
hgs
parents:
diff changeset
  2285
hgs
parents:
diff changeset
  2286
	/*
hgs
parents:
diff changeset
  2287
	 * RMDebug_StepTest_MOV_PC
hgs
parents:
diff changeset
  2288
	 */
hgs
parents:
diff changeset
  2289
	test.Next(_L("TestStep - MOV PC,X\n"));
hgs
parents:
diff changeset
  2290
hgs
parents:
diff changeset
  2291
	startAddress = (TUint32)(&RMDebug_StepTest_MOV_PC_1);
hgs
parents:
diff changeset
  2292
hgs
parents:
diff changeset
  2293
	endAddress = (TUint32)(&RMDebug_StepTest_MOV_PC_2);
hgs
parents:
diff changeset
  2294
hgs
parents:
diff changeset
  2295
	err = aThreadSpecific
hgs
parents:
diff changeset
  2296
		? HelpTestStep(iThreadID,startAddress,endAddress,EArmMode,1)
hgs
parents:
diff changeset
  2297
		: HelpTestStep(iThreadID,startAddress,endAddress,EArmMode,1, EFalse, processId);
hgs
parents:
diff changeset
  2298
	test(err==KErrNone);
hgs
parents:
diff changeset
  2299
hgs
parents:
diff changeset
  2300
	/*
hgs
parents:
diff changeset
  2301
	 * RMDebug_StepTest_LDR_PC
hgs
parents:
diff changeset
  2302
	 */
hgs
parents:
diff changeset
  2303
	test.Next(_L("TestStep - LDR PC\n"));
hgs
parents:
diff changeset
  2304
hgs
parents:
diff changeset
  2305
	startAddress = (TUint32)(&RMDebug_StepTest_LDR_PC);
hgs
parents:
diff changeset
  2306
hgs
parents:
diff changeset
  2307
	endAddress = (TUint32)(&RMDebug_StepTest_LDR_PC_1);
hgs
parents:
diff changeset
  2308
hgs
parents:
diff changeset
  2309
	err = aThreadSpecific
hgs
parents:
diff changeset
  2310
		? HelpTestStep(iThreadID,startAddress,endAddress,EArmMode,1)
hgs
parents:
diff changeset
  2311
		: HelpTestStep(iThreadID,startAddress,endAddress,EArmMode,1, EFalse, processId);
hgs
parents:
diff changeset
  2312
	test(err==KErrNone);
hgs
parents:
diff changeset
  2313
hgs
parents:
diff changeset
  2314
// thumb and interworking tests are not supported on armv4
hgs
parents:
diff changeset
  2315
#ifdef __MARM_ARMV5__
hgs
parents:
diff changeset
  2316
hgs
parents:
diff changeset
  2317
	/*
hgs
parents:
diff changeset
  2318
	 * RMDebug_StepTest_Thumb_Non_PC_Modifying
hgs
parents:
diff changeset
  2319
	 */
hgs
parents:
diff changeset
  2320
	test.Next(_L("TestStep - Thumb Non PC-Modifying\n"));
hgs
parents:
diff changeset
  2321
hgs
parents:
diff changeset
  2322
	startAddress = (TUint32)(&RMDebug_StepTest_Thumb_Non_PC_Modifying_1);
hgs
parents:
diff changeset
  2323
hgs
parents:
diff changeset
  2324
	endAddress = (TUint32)(&RMDebug_StepTest_Thumb_Non_PC_Modifying_2);
hgs
parents:
diff changeset
  2325
hgs
parents:
diff changeset
  2326
	err = aThreadSpecific
hgs
parents:
diff changeset
  2327
		? HelpTestStep(iThreadID,startAddress,endAddress,EThumbMode,1)
hgs
parents:
diff changeset
  2328
		: HelpTestStep(iThreadID,startAddress,endAddress,EThumbMode,1, EFalse, processId);
hgs
parents:
diff changeset
  2329
	test(err==KErrNone);
hgs
parents:
diff changeset
  2330
hgs
parents:
diff changeset
  2331
	/*
hgs
parents:
diff changeset
  2332
	 * RMDebug_StepTest_Thumb_Branch
hgs
parents:
diff changeset
  2333
	 */
hgs
parents:
diff changeset
  2334
	test.Next(_L("TestStep - Thumb Branch\n"));
hgs
parents:
diff changeset
  2335
hgs
parents:
diff changeset
  2336
	startAddress = (TUint32)(&RMDebug_StepTest_Thumb_Branch_1);
hgs
parents:
diff changeset
  2337
hgs
parents:
diff changeset
  2338
	endAddress = (TUint32)(&RMDebug_StepTest_Thumb_Branch_2);
hgs
parents:
diff changeset
  2339
hgs
parents:
diff changeset
  2340
	err = aThreadSpecific
hgs
parents:
diff changeset
  2341
		? HelpTestStep(iThreadID,startAddress,endAddress,EThumbMode,1)
hgs
parents:
diff changeset
  2342
		: HelpTestStep(iThreadID,startAddress,endAddress,EThumbMode,1, EFalse, processId);
hgs
parents:
diff changeset
  2343
	test(err==KErrNone);
hgs
parents:
diff changeset
  2344
hgs
parents:
diff changeset
  2345
	/*
hgs
parents:
diff changeset
  2346
	 * RMDebug_StepTest_Thumb_Branch_And_Link
hgs
parents:
diff changeset
  2347
	 */
hgs
parents:
diff changeset
  2348
	test.Next(_L("TestStep - Thumb Branch_And_Link\n"));
hgs
parents:
diff changeset
  2349
hgs
parents:
diff changeset
  2350
	startAddress = (TUint32)(&RMDebug_StepTest_Thumb_Branch_And_Link_2);
hgs
parents:
diff changeset
  2351
hgs
parents:
diff changeset
  2352
	endAddress = (TUint32)(&RMDebug_StepTest_Thumb_Branch_And_Link_3);
hgs
parents:
diff changeset
  2353
hgs
parents:
diff changeset
  2354
	TInt muid=0;
hgs
parents:
diff changeset
  2355
    test(HAL::Get(HAL::EMachineUid, muid)==KErrNone);
hgs
parents:
diff changeset
  2356
hgs
parents:
diff changeset
  2357
	// check if running on ARMv7 core
hgs
parents:
diff changeset
  2358
	if(muid==HAL::EMachineUid_OmapH6 || muid==HAL::EMachineUid_OmapZoom || muid==HAL::EMachineUid_EmuBoard)
hgs
parents:
diff changeset
  2359
        {
hgs
parents:
diff changeset
  2360
        // Note: ARMv7 treats BL instructions as single 32-bit instructions
hgs
parents:
diff changeset
  2361
        err = aThreadSpecific
hgs
parents:
diff changeset
  2362
		? HelpTestStep(iThreadID,startAddress,endAddress,EThumbMode,1)
hgs
parents:
diff changeset
  2363
		: HelpTestStep(iThreadID,startAddress,endAddress,EThumbMode,1, EFalse, processId);
hgs
parents:
diff changeset
  2364
        }
hgs
parents:
diff changeset
  2365
    else
hgs
parents:
diff changeset
  2366
	    {
hgs
parents:
diff changeset
  2367
        // Note: Due to the fact that the stepper treats BL instructions
hgs
parents:
diff changeset
  2368
		// as two instructions (as the hardware does), then we must step
hgs
parents:
diff changeset
  2369
		// the first half instruction first)
hgs
parents:
diff changeset
  2370
hgs
parents:
diff changeset
  2371
		err = aThreadSpecific
hgs
parents:
diff changeset
  2372
		? HelpTestStep(iThreadID,startAddress,startAddress+2,EThumbMode,1)
hgs
parents:
diff changeset
  2373
		: HelpTestStep(iThreadID,startAddress,startAddress+2,EThumbMode,1, EFalse, processId);
hgs
parents:
diff changeset
  2374
		test(err==KErrNone);
hgs
parents:
diff changeset
  2375
hgs
parents:
diff changeset
  2376
	// Now we actually do the BL
hgs
parents:
diff changeset
  2377
	err = aThreadSpecific
hgs
parents:
diff changeset
  2378
		? HelpTestStep(iThreadID,startAddress+2,endAddress,EThumbMode,1)
hgs
parents:
diff changeset
  2379
		: HelpTestStep(iThreadID,startAddress+2,endAddress,EThumbMode,1, EFalse, processId);
hgs
parents:
diff changeset
  2380
        }
hgs
parents:
diff changeset
  2381
	test(err==KErrNone);
hgs
parents:
diff changeset
  2382
hgs
parents:
diff changeset
  2383
	/*
hgs
parents:
diff changeset
  2384
	 * RMDebug_StepTest_Thumb_Back_Branch_And_Link
hgs
parents:
diff changeset
  2385
	 */
hgs
parents:
diff changeset
  2386
	test.Next(_L("TestStep - Thumb Back_Branch_And_Link\n"));
hgs
parents:
diff changeset
  2387
hgs
parents:
diff changeset
  2388
	startAddress = (TUint32)(&RMDebug_StepTest_Thumb_Back_Branch_And_Link_2);
hgs
parents:
diff changeset
  2389
hgs
parents:
diff changeset
  2390
	endAddress = (TUint32)(&RMDebug_StepTest_Thumb_Back_Branch_And_Link_3);
hgs
parents:
diff changeset
  2391
hgs
parents:
diff changeset
  2392
	// check if running on ARMv7 core
hgs
parents:
diff changeset
  2393
	if(muid==HAL::EMachineUid_OmapH6 || muid==HAL::EMachineUid_OmapZoom || muid==HAL::EMachineUid_EmuBoard)
hgs
parents:
diff changeset
  2394
		{
hgs
parents:
diff changeset
  2395
		// Note: ARMv7 treats BL instructions as single 32-bit instructions
hgs
parents:
diff changeset
  2396
		err = aThreadSpecific
hgs
parents:
diff changeset
  2397
			? HelpTestStep(iThreadID,startAddress,endAddress,EThumbMode,1)
hgs
parents:
diff changeset
  2398
			: HelpTestStep(iThreadID,startAddress,endAddress,EThumbMode,1, EFalse, processId);
hgs
parents:
diff changeset
  2399
		}
hgs
parents:
diff changeset
  2400
	else
hgs
parents:
diff changeset
  2401
		{
hgs
parents:
diff changeset
  2402
		// Note: Due to the fact that the stepper treats BL instructions
hgs
parents:
diff changeset
  2403
		// as two instructions (as the hardware does), then we must step
hgs
parents:
diff changeset
  2404
		// the first half instruction first)
hgs
parents:
diff changeset
  2405
hgs
parents:
diff changeset
  2406
		err = aThreadSpecific
hgs
parents:
diff changeset
  2407
	   		? HelpTestStep(iThreadID,startAddress,startAddress+2,EThumbMode,1)
hgs
parents:
diff changeset
  2408
			: HelpTestStep(iThreadID,startAddress,startAddress+2,EThumbMode,1, EFalse, processId);
hgs
parents:
diff changeset
  2409
		test(err==KErrNone);
hgs
parents:
diff changeset
  2410
hgs
parents:
diff changeset
  2411
	   	// Now we actually do the BL
hgs
parents:
diff changeset
  2412
		err = aThreadSpecific
hgs
parents:
diff changeset
  2413
   			? HelpTestStep(iThreadID,startAddress+2,endAddress,EThumbMode,1)
hgs
parents:
diff changeset
  2414
			: HelpTestStep(iThreadID,startAddress+2,endAddress,EThumbMode,1, EFalse, processId);
hgs
parents:
diff changeset
  2415
		}
hgs
parents:
diff changeset
  2416
	test(err==KErrNone);
hgs
parents:
diff changeset
  2417
hgs
parents:
diff changeset
  2418
	/*
hgs
parents:
diff changeset
  2419
	 * RMDebug_StepTest_Thumb_AddPC
hgs
parents:
diff changeset
  2420
	 */
hgs
parents:
diff changeset
  2421
	test.Next(_L("TestStep - Thumb ADD PC, PC, R0\n"));
hgs
parents:
diff changeset
  2422
hgs
parents:
diff changeset
  2423
	startAddress = (TUint32)(&RMDebug_StepTest_Thumb_AddPC_2);
hgs
parents:
diff changeset
  2424
hgs
parents:
diff changeset
  2425
	endAddress = (TUint32)(&RMDebug_StepTest_Thumb_AddPC_3);
hgs
parents:
diff changeset
  2426
hgs
parents:
diff changeset
  2427
	err = aThreadSpecific
hgs
parents:
diff changeset
  2428
		? HelpTestStep(iThreadID,startAddress,endAddress,EThumbMode,1)
hgs
parents:
diff changeset
  2429
		: HelpTestStep(iThreadID,startAddress,endAddress,EThumbMode,1, EFalse, processId);
hgs
parents:
diff changeset
  2430
	test(err==KErrNone);
hgs
parents:
diff changeset
  2431
hgs
parents:
diff changeset
  2432
	/*
hgs
parents:
diff changeset
  2433
	 * RMDebug_StepTest_Interwork ARM to Thumb
hgs
parents:
diff changeset
  2434
	 */
hgs
parents:
diff changeset
  2435
	test.Next(_L("TestStep - Interworking ARM to Thumb - BLX \n"));
hgs
parents:
diff changeset
  2436
hgs
parents:
diff changeset
  2437
	startAddress = (TUint32)(&RMDebug_StepTest_Interwork_1);
hgs
parents:
diff changeset
  2438
hgs
parents:
diff changeset
  2439
	endAddress = (TUint32)(&RMDebug_StepTest_Interwork_2);
hgs
parents:
diff changeset
  2440
hgs
parents:
diff changeset
  2441
	err = aThreadSpecific // nb initial breakpoint in ARM code
hgs
parents:
diff changeset
  2442
		? HelpTestStep(iThreadID,startAddress,endAddress,EArmMode,1)
hgs
parents:
diff changeset
  2443
		: HelpTestStep(iThreadID,startAddress,endAddress,EArmMode,1, EFalse, processId);
hgs
parents:
diff changeset
  2444
hgs
parents:
diff changeset
  2445
	test(err==KErrNone);
hgs
parents:
diff changeset
  2446
hgs
parents:
diff changeset
  2447
	/*
hgs
parents:
diff changeset
  2448
	 * RMDebug_StepTest_Interwork Thumb to ARM
hgs
parents:
diff changeset
  2449
	 */
hgs
parents:
diff changeset
  2450
	test.Next(_L("TestStep - Interworking Thumb to ARM - BLX\n"));
hgs
parents:
diff changeset
  2451
hgs
parents:
diff changeset
  2452
	startAddress = (TUint32)(&RMDebug_StepTest_Interwork_2);
hgs
parents:
diff changeset
  2453
hgs
parents:
diff changeset
  2454
	endAddress = (TUint32)(&RMDebug_StepTest_Interwork_3);
hgs
parents:
diff changeset
  2455
hgs
parents:
diff changeset
  2456
	// check if running on ARMv7 core
hgs
parents:
diff changeset
  2457
	if(muid==HAL::EMachineUid_OmapH6 || muid==HAL::EMachineUid_OmapZoom || muid==HAL::EMachineUid_EmuBoard)
hgs
parents:
diff changeset
  2458
        {
hgs
parents:
diff changeset
  2459
        // ARMv7 treats BLX instructions as single 32-bit instructions
hgs
parents:
diff changeset
  2460
        err = aThreadSpecific
hgs
parents:
diff changeset
  2461
		? HelpTestStep(iThreadID,startAddress,endAddress,EThumbMode,1)
hgs
parents:
diff changeset
  2462
		: HelpTestStep(iThreadID,startAddress,endAddress,EThumbMode,1, EFalse, processId);
hgs
parents:
diff changeset
  2463
        }
hgs
parents:
diff changeset
  2464
    else
hgs
parents:
diff changeset
  2465
        {
hgs
parents:
diff changeset
  2466
    	// Stepper treats this as a two-stage instruction (just like the hardware)
hgs
parents:
diff changeset
  2467
	err = aThreadSpecific
hgs
parents:
diff changeset
  2468
		? HelpTestStep(iThreadID,startAddress,startAddress+2,EThumbMode,1)
hgs
parents:
diff changeset
  2469
		: HelpTestStep(iThreadID,startAddress,startAddress+2,EThumbMode,1, EFalse, processId);
hgs
parents:
diff changeset
  2470
	test(err == KErrNone);
hgs
parents:
diff changeset
  2471
hgs
parents:
diff changeset
  2472
	err = aThreadSpecific
hgs
parents:
diff changeset
  2473
		? HelpTestStep(iThreadID,startAddress+2,endAddress,EThumbMode,1)
hgs
parents:
diff changeset
  2474
		: HelpTestStep(iThreadID,startAddress+2,endAddress,EThumbMode,1, EFalse, processId);
hgs
parents:
diff changeset
  2475
        }
hgs
parents:
diff changeset
  2476
	test(err == KErrNone);
hgs
parents:
diff changeset
  2477
hgs
parents:
diff changeset
  2478
#endif // __MARM_ARMV5__
hgs
parents:
diff changeset
  2479
hgs
parents:
diff changeset
  2480
	/*
hgs
parents:
diff changeset
  2481
	 * Test multiple-step of ARM code
hgs
parents:
diff changeset
  2482
	 */
hgs
parents:
diff changeset
  2483
	test.Next(_L("TestStep - ARM Multiple instruction step\n"));
hgs
parents:
diff changeset
  2484
hgs
parents:
diff changeset
  2485
	startAddress = (TUint32)(&RMDebug_StepTest_ARM_Step_Multiple);
hgs
parents:
diff changeset
  2486
hgs
parents:
diff changeset
  2487
	endAddress = (TUint32)(&RMDebug_StepTest_ARM_Step_Multiple_1);
hgs
parents:
diff changeset
  2488
hgs
parents:
diff changeset
  2489
	err = aThreadSpecific
hgs
parents:
diff changeset
  2490
		? HelpTestStep(iThreadID,startAddress,endAddress,EArmMode,5)
hgs
parents:
diff changeset
  2491
		: HelpTestStep(iThreadID,startAddress,endAddress,EArmMode,5, EFalse, processId);
hgs
parents:
diff changeset
  2492
	test(err == KErrNone);
hgs
parents:
diff changeset
  2493
	// stepping performance
hgs
parents:
diff changeset
  2494
	test.Next(_L("TestStep - Steps per second\n"));
hgs
parents:
diff changeset
  2495
hgs
parents:
diff changeset
  2496
	// run until we reach RMDebug_StepTest_Count_1
hgs
parents:
diff changeset
  2497
	TBreakId stepBreakId;
hgs
parents:
diff changeset
  2498
	startAddress = (TUint32)(&RMDebug_StepTest_Count_1);
hgs
parents:
diff changeset
  2499
	endAddress = (TUint32)(&RMDebug_StepTest_Count_2);
hgs
parents:
diff changeset
  2500
hgs
parents:
diff changeset
  2501
	err = aThreadSpecific
hgs
parents:
diff changeset
  2502
		? HelpTestStepSetBreak(stepBreakId,iThreadID,startAddress,EArmMode)
hgs
parents:
diff changeset
  2503
		: HelpTestStepSetBreak(stepBreakId,iThreadID,startAddress,EArmMode,EFalse,processId);
hgs
parents:
diff changeset
  2504
	test (err == KErrNone);
hgs
parents:
diff changeset
  2505
hgs
parents:
diff changeset
  2506
	// wait until we hit the breakpoint
hgs
parents:
diff changeset
  2507
	TEventInfo info;
hgs
parents:
diff changeset
  2508
	err = HelpTestStepWaitForBreak(iFileName,info);
hgs
parents:
diff changeset
  2509
	test (err == KErrNone);
hgs
parents:
diff changeset
  2510
hgs
parents:
diff changeset
  2511
	// Now clear the breakpoint
hgs
parents:
diff changeset
  2512
	err = iServSession.ClearBreak(stepBreakId);
hgs
parents:
diff changeset
  2513
	test(err == KErrNone);
hgs
parents:
diff changeset
  2514
hgs
parents:
diff changeset
  2515
	if(aThreadSpecific)
hgs
parents:
diff changeset
  2516
		{
hgs
parents:
diff changeset
  2517
		// now step the code
hgs
parents:
diff changeset
  2518
		TInt stepsPerSecond = 0;
hgs
parents:
diff changeset
  2519
hgs
parents:
diff changeset
  2520
		TUint32 stopTickCount = User::NTickCount() + HelpTicksPerSecond();
hgs
parents:
diff changeset
  2521
hgs
parents:
diff changeset
  2522
		while (User::NTickCount() < stopTickCount)
hgs
parents:
diff changeset
  2523
			{
hgs
parents:
diff changeset
  2524
			err = iServSession.Step(iThreadID,1);
hgs
parents:
diff changeset
  2525
			test (err == KErrNone);
hgs
parents:
diff changeset
  2526
hgs
parents:
diff changeset
  2527
			// we need to wait now until the step completes before asking for the next step
hgs
parents:
diff changeset
  2528
				{
hgs
parents:
diff changeset
  2529
				TEventInfo info;
hgs
parents:
diff changeset
  2530
				static TRequestStatus status;
hgs
parents:
diff changeset
  2531
hgs
parents:
diff changeset
  2532
				TPtr8 infoPtr((TUint8*)&info,0,sizeof(TEventInfo));
hgs
parents:
diff changeset
  2533
hgs
parents:
diff changeset
  2534
				iServSession.GetEvent(iFileName,status,infoPtr);
hgs
parents:
diff changeset
  2535
hgs
parents:
diff changeset
  2536
				// Wait for notification of the breakpoint hit event
hgs
parents:
diff changeset
  2537
				User::WaitForRequest(status);
hgs
parents:
diff changeset
  2538
				test(status==KErrNone);
hgs
parents:
diff changeset
  2539
				}
hgs
parents:
diff changeset
  2540
hgs
parents:
diff changeset
  2541
			// Update the count of steps
hgs
parents:
diff changeset
  2542
			stepsPerSecond += 1;
hgs
parents:
diff changeset
  2543
hgs
parents:
diff changeset
  2544
			// Gone wrong if we do too many
hgs
parents:
diff changeset
  2545
			test(stepsPerSecond < 10000);
hgs
parents:
diff changeset
  2546
			}
hgs
parents:
diff changeset
  2547
hgs
parents:
diff changeset
  2548
		iStepsPerSecond = stepsPerSecond;
hgs
parents:
diff changeset
  2549
		test(iStepsPerSecond != 0);
hgs
parents:
diff changeset
  2550
		}
hgs
parents:
diff changeset
  2551
hgs
parents:
diff changeset
  2552
	// finally resume the thread
hgs
parents:
diff changeset
  2553
	err = iServSession.ResumeThread(iThreadID);
hgs
parents:
diff changeset
  2554
	test (err == KErrNone);
hgs
parents:
diff changeset
  2555
hgs
parents:
diff changeset
  2556
	err = iServSession.SetEventAction(iFileName,EEventsBreakPoint, EActionIgnore);
hgs
parents:
diff changeset
  2557
	test (err == KErrNone);
hgs
parents:
diff changeset
  2558
hgs
parents:
diff changeset
  2559
	if(!aThreadSpecific)
hgs
parents:
diff changeset
  2560
		{
hgs
parents:
diff changeset
  2561
		err = iServSession.SetEventAction(iFileName, EEventsProcessBreakPoint, EActionIgnore);
hgs
parents:
diff changeset
  2562
		test (err == KErrNone);
hgs
parents:
diff changeset
  2563
		}
hgs
parents:
diff changeset
  2564
hgs
parents:
diff changeset
  2565
	test(KErrNone == iServSession.DetachExecutable(iFileName));
hgs
parents:
diff changeset
  2566
	}
hgs
parents:
diff changeset
  2567
hgs
parents:
diff changeset
  2568
//----------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
  2569
//! @SYMTestCaseID      KBase-T-RMDEBUG2-0443
hgs
parents:
diff changeset
  2570
//! @SYMTestType
hgs
parents:
diff changeset
  2571
//! @SYMPREQ            PREQ1426
hgs
parents:
diff changeset
  2572
//! @SYMTestCaseDesc    Tests registration and occurrence of target thread event (in this case panic)
hgs
parents:
diff changeset
  2573
//! @SYMTestActions     Registers for a panic in the target thread, causes it, and catches the panic notification.
hgs
parents:
diff changeset
  2574
//!
hgs
parents:
diff changeset
  2575
//! @SYMTestExpectedResults KErrNone.
hgs
parents:
diff changeset
  2576
//! @SYMTestPriority        High
hgs
parents:
diff changeset
  2577
//! @SYMTestStatus          Implemented
hgs
parents:
diff changeset
  2578
//----------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
  2579
hgs
parents:
diff changeset
  2580
void CRunModeAgent::TestEvents()
hgs
parents:
diff changeset
  2581
	{
hgs
parents:
diff changeset
  2582
	TInt err = KErrNone;
hgs
parents:
diff changeset
  2583
hgs
parents:
diff changeset
  2584
	test.Next(_L("TestEvents\n"));
hgs
parents:
diff changeset
  2585
hgs
parents:
diff changeset
  2586
	TInt panicReason = 12345;
hgs
parents:
diff changeset
  2587
hgs
parents:
diff changeset
  2588
	test.Printf(_L("Thread t_rmdebug.exe::DebugThread should panic with reason %d.\n"), panicReason);
hgs
parents:
diff changeset
  2589
hgs
parents:
diff changeset
  2590
	//attach non-passively
hgs
parents:
diff changeset
  2591
	test(KErrNone == iServSession.AttachExecutable(iFileName, EFalse));
hgs
parents:
diff changeset
  2592
hgs
parents:
diff changeset
  2593
	RThread threadToPanic;
hgs
parents:
diff changeset
  2594
	test(KErrNone == StartDebugThread(threadToPanic, _L("EventsThread")));
hgs
parents:
diff changeset
  2595
	TThreadId threadToPanicId = threadToPanic.Id();
hgs
parents:
diff changeset
  2596
	TEventInfo info;
hgs
parents:
diff changeset
  2597
hgs
parents:
diff changeset
  2598
	// Set things up to wait for a thread kill event
hgs
parents:
diff changeset
  2599
	err = iServSession.SetEventAction(iFileName, EEventsKillThread, EActionContinue);
hgs
parents:
diff changeset
  2600
	test(err==KErrNone);
hgs
parents:
diff changeset
  2601
hgs
parents:
diff changeset
  2602
	// Wait for an event to occur in this process - nothing should have happened yet.
hgs
parents:
diff changeset
  2603
	static TRequestStatus status;
hgs
parents:
diff changeset
  2604
hgs
parents:
diff changeset
  2605
	TPtr8 infoPtr((TUint8*)&info,0,sizeof(TEventInfo));
hgs
parents:
diff changeset
  2606
hgs
parents:
diff changeset
  2607
	iServSession.GetEvent(iFileName,status,infoPtr);
hgs
parents:
diff changeset
  2608
hgs
parents:
diff changeset
  2609
	// Test Request cancellation
hgs
parents:
diff changeset
  2610
	err = iServSession.CancelGetEvent(iFileName);
hgs
parents:
diff changeset
  2611
	test (err==KErrNone);
hgs
parents:
diff changeset
  2612
hgs
parents:
diff changeset
  2613
	// Again wait for an event to occur in our process - we will provoke the
hgs
parents:
diff changeset
  2614
	// thread kill event by panic'ing the test thread.
hgs
parents:
diff changeset
  2615
	iServSession.GetEvent(iFileName,status,infoPtr);
hgs
parents:
diff changeset
  2616
hgs
parents:
diff changeset
  2617
	// Panic the debug thread to cause a thread kill event
hgs
parents:
diff changeset
  2618
	threadToPanic.Panic(_L("t_rmdebug panic thread test"), panicReason);
hgs
parents:
diff changeset
  2619
hgs
parents:
diff changeset
  2620
	// Wait for notification of the Thread Kill event
hgs
parents:
diff changeset
  2621
	User::WaitForRequest(status);
hgs
parents:
diff changeset
  2622
	test(status==KErrNone);
hgs
parents:
diff changeset
  2623
hgs
parents:
diff changeset
  2624
	// Check we are really recieving information about the panic
hgs
parents:
diff changeset
  2625
	test(info.iProcessIdValid);
hgs
parents:
diff changeset
  2626
	test(info.iThreadIdValid);
hgs
parents:
diff changeset
  2627
	test(info.iProcessId==RProcess().Id());
hgs
parents:
diff changeset
  2628
	test(info.iThreadId==threadToPanicId);
hgs
parents:
diff changeset
  2629
	test(info.iEventType==EEventsKillThread);
hgs
parents:
diff changeset
  2630
	test(info.iThreadKillInfo.iExitType==EExitPanic);
hgs
parents:
diff changeset
  2631
hgs
parents:
diff changeset
  2632
	// Ignore other panic events
hgs
parents:
diff changeset
  2633
	err = iServSession.SetEventAction(iFileName, EEventsKillThread, EActionIgnore);
hgs
parents:
diff changeset
  2634
	test(err==KErrNone);
hgs
parents:
diff changeset
  2635
hgs
parents:
diff changeset
  2636
	test(KErrNone == iServSession.DetachExecutable(iFileName));
hgs
parents:
diff changeset
  2637
	}
hgs
parents:
diff changeset
  2638
hgs
parents:
diff changeset
  2639
//----------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
  2640
//! @SYMTestCaseID      KBase-T-RMDEBUG2-0444
hgs
parents:
diff changeset
  2641
//! @SYMTestType
hgs
parents:
diff changeset
  2642
//! @SYMPREQ            PREQ1426
hgs
parents:
diff changeset
  2643
//! @SYMTestCaseDesc    Tests registration and occurence of target thread events in separate process.
hgs
parents:
diff changeset
  2644
//! @SYMTestActions     Registers for a hardware exception and kill thread events, and receives them.
hgs
parents:
diff changeset
  2645
//!
hgs
parents:
diff changeset
  2646
//! @SYMTestExpectedResults KErrNone.
hgs
parents:
diff changeset
  2647
//! @SYMTestPriority        High
hgs
parents:
diff changeset
  2648
//! @SYMTestStatus          Implemented
hgs
parents:
diff changeset
  2649
//----------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
  2650
void CRunModeAgent::TestEventsForExternalProcess()
hgs
parents:
diff changeset
  2651
	{
hgs
parents:
diff changeset
  2652
	test.Next(_L("TestEventsForExternalProcess\n"));
hgs
parents:
diff changeset
  2653
hgs
parents:
diff changeset
  2654
	for(TInt main=0; main<3; main++)
hgs
parents:
diff changeset
  2655
		{
hgs
parents:
diff changeset
  2656
		for(TInt extra=0; extra<3; extra++)
hgs
parents:
diff changeset
  2657
			{
hgs
parents:
diff changeset
  2658
			TestEventsWithExtraThreads((TKernelEventAction)main, (TKernelEventAction)extra, 0);
hgs
parents:
diff changeset
  2659
			TestEventsWithExtraThreads((TKernelEventAction)main, (TKernelEventAction)extra, 2);
hgs
parents:
diff changeset
  2660
			}
hgs
parents:
diff changeset
  2661
		}
hgs
parents:
diff changeset
  2662
	}
hgs
parents:
diff changeset
  2663
hgs
parents:
diff changeset
  2664
void CRunModeAgent::TestEventsWithExtraThreads(TKernelEventAction aActionMain, TKernelEventAction aActionExtra, TUint32 aExtraThreads)
hgs
parents:
diff changeset
  2665
	{
hgs
parents:
diff changeset
  2666
	const TInt KNumberOfTypes = 8;
hgs
parents:
diff changeset
  2667
	struct TEventStruct
hgs
parents:
diff changeset
  2668
		{
hgs
parents:
diff changeset
  2669
		public:
hgs
parents:
diff changeset
  2670
		TDebugFunctionType iDebugFunctionType;
hgs
parents:
diff changeset
  2671
		TEventType iEventType;
hgs
parents:
diff changeset
  2672
		};
hgs
parents:
diff changeset
  2673
hgs
parents:
diff changeset
  2674
	TEventStruct type[KNumberOfTypes] =
hgs
parents:
diff changeset
  2675
		{
hgs
parents:
diff changeset
  2676
			{EStackOverflowFunction, EEventsHwExc},
hgs
parents:
diff changeset
  2677
			{EUserPanicFunction, EEventsKillThread},
hgs
parents:
diff changeset
  2678
			{EPrefetchAbortFunction, EEventsHwExc},
hgs
parents:
diff changeset
  2679
			{EDataAbortFunction, EEventsHwExc},
hgs
parents:
diff changeset
  2680
			{EUndefInstructionFunction, EEventsHwExc},
hgs
parents:
diff changeset
  2681
			{EDataReadErrorFunction, EEventsHwExc},
hgs
parents:
diff changeset
  2682
			{EDataWriteErrorFunction, EEventsHwExc},
hgs
parents:
diff changeset
  2683
			{EUserExceptionFunction, EEventsSwExc},
hgs
parents:
diff changeset
  2684
		};
hgs
parents:
diff changeset
  2685
hgs
parents:
diff changeset
  2686
	for(TInt j=0; j<KNumberOfTypes; j++)
hgs
parents:
diff changeset
  2687
		{
hgs
parents:
diff changeset
  2688
		if( gUseDelay ) User::After(500000);
hgs
parents:
diff changeset
  2689
hgs
parents:
diff changeset
  2690
		RDebug::Printf("CRunModeAgent::TestEventsWithExtraThreads type: %d, main action: %d, extra action: %d, extraThreads: %d", 
hgs
parents:
diff changeset
  2691
			j, (TUint32)aActionMain, (TUint32)aActionExtra, aExtraThreads);
hgs
parents:
diff changeset
  2692
hgs
parents:
diff changeset
  2693
		// do this check as it seems to hard to do these cases with the current set up
hgs
parents:
diff changeset
  2694
		if(EEventsKillThread == type[j].iEventType)
hgs
parents:
diff changeset
  2695
			{
hgs
parents:
diff changeset
  2696
			if(EActionSuspend != aActionMain)
hgs
parents:
diff changeset
  2697
				{
hgs
parents:
diff changeset
  2698
				if(aActionMain != aActionExtra)
hgs
parents:
diff changeset
  2699
					{
hgs
parents:
diff changeset
  2700
					return;
hgs
parents:
diff changeset
  2701
					}
hgs
parents:
diff changeset
  2702
				}
hgs
parents:
diff changeset
  2703
			}
hgs
parents:
diff changeset
  2704
		// attach to KRMDebugTestApplication
hgs
parents:
diff changeset
  2705
		test(KErrNone == iServSession.AttachExecutable(KRMDebugTestApplication, EFalse));
hgs
parents:
diff changeset
  2706
hgs
parents:
diff changeset
  2707
		// Set things up to wait for the expected exception in KRMDebugTestApplication
hgs
parents:
diff changeset
  2708
		test(KErrNone == iServSession.SetEventAction(KRMDebugTestApplication, type[j].iEventType, aActionMain));
hgs
parents:
diff changeset
  2709
hgs
parents:
diff changeset
  2710
		if(EActionSuspend != aActionMain)
hgs
parents:
diff changeset
  2711
			{
hgs
parents:
diff changeset
  2712
			test(KErrNone == iServSession.SetEventAction(KRMDebugTestApplication, EEventsKillThread, aActionExtra));
hgs
parents:
diff changeset
  2713
			}
hgs
parents:
diff changeset
  2714
hgs
parents:
diff changeset
  2715
		// declare a TRequestStatus object for asynchronous calls
hgs
parents:
diff changeset
  2716
		TRequestStatus status;
hgs
parents:
diff changeset
  2717
hgs
parents:
diff changeset
  2718
		TEventInfo info;
hgs
parents:
diff changeset
  2719
		TPtr8 infoBuffer = TPtr8((TUint8*)&info,0,sizeof(TEventInfo));
hgs
parents:
diff changeset
  2720
		if(EActionIgnore != aActionMain)
hgs
parents:
diff changeset
  2721
			{
hgs
parents:
diff changeset
  2722
			iServSession.GetEvent(KRMDebugTestApplication(), status, infoBuffer);
hgs
parents:
diff changeset
  2723
			}
hgs
parents:
diff changeset
  2724
hgs
parents:
diff changeset
  2725
		// launch the target process to trigger the expected exception
hgs
parents:
diff changeset
  2726
		RProcess targetProcess;
hgs
parents:
diff changeset
  2727
		test(KErrNone == LaunchProcess(targetProcess, KRMDebugTestApplication(), type[j].iDebugFunctionType, 0, aExtraThreads));
hgs
parents:
diff changeset
  2728
		TProcessId processId(targetProcess.Id());
hgs
parents:
diff changeset
  2729
		targetProcess.Close();
hgs
parents:
diff changeset
  2730
hgs
parents:
diff changeset
  2731
		if(EActionIgnore != aActionMain)
hgs
parents:
diff changeset
  2732
			{
hgs
parents:
diff changeset
  2733
			// wait for notification of the exception
hgs
parents:
diff changeset
  2734
			User::WaitForRequest(status);
hgs
parents:
diff changeset
  2735
			test(KErrNone == status.Int());
hgs
parents:
diff changeset
  2736
hgs
parents:
diff changeset
  2737
			// check that this is the event we were expecting
hgs
parents:
diff changeset
  2738
			test(info.iProcessIdValid);
hgs
parents:
diff changeset
  2739
			test(info.iThreadIdValid);
hgs
parents:
diff changeset
  2740
			test(info.iProcessId==processId);
hgs
parents:
diff changeset
  2741
			test(info.iEventType==type[j].iEventType);
hgs
parents:
diff changeset
  2742
			}
hgs
parents:
diff changeset
  2743
hgs
parents:
diff changeset
  2744
		if(EActionSuspend == aActionMain)
hgs
parents:
diff changeset
  2745
			{
hgs
parents:
diff changeset
  2746
			//RDebug::Printf("CRunModeAgent::TestEventsWithExtraThreads EActionSuspend == aActionMain, j=%d", j);
hgs
parents:
diff changeset
  2747
			// read the thread list, partly to check the call works, and partly to check the thread still exists
hgs
parents:
diff changeset
  2748
			test(ThreadExistsForProcess(info.iThreadId, info.iProcessId));
hgs
parents:
diff changeset
  2749
hgs
parents:
diff changeset
  2750
			// register to catch all the thread kills which will occur
hgs
parents:
diff changeset
  2751
			test(KErrNone == iServSession.SetEventAction(KRMDebugTestApplication, EEventsKillThread, aActionExtra));
hgs
parents:
diff changeset
  2752
			// we specified EActionSuspend earlier so need to call resume on this thread
hgs
parents:
diff changeset
  2753
			test(KErrNone == iServSession.ResumeThread(info.iThreadId));
hgs
parents:
diff changeset
  2754
			}
hgs
parents:
diff changeset
  2755
hgs
parents:
diff changeset
  2756
		// find out how many threads there are in the process and catch all the thread kill events,
hgs
parents:
diff changeset
  2757
		// the number of kill thread events should correspond to the number of extra threads launched,
hgs
parents:
diff changeset
  2758
		// plus one if the main thread panicked with a Sw/Hw exception
hgs
parents:
diff changeset
  2759
		if(EActionIgnore != aActionExtra)
hgs
parents:
diff changeset
  2760
			{
hgs
parents:
diff changeset
  2761
			TInt dyingThreads = aExtraThreads + ( (type[j].iEventType != EEventsKillThread) ? 1 : 0);
hgs
parents:
diff changeset
  2762
			for(TInt k=0; k<dyingThreads; k++)
hgs
parents:
diff changeset
  2763
				{
hgs
parents:
diff changeset
  2764
				//RDebug::Printf("CRunModeAgent::TestEventsWithExtraThreads dyingThreads, k=%d, j=%d", k,j);
hgs
parents:
diff changeset
  2765
				iServSession.GetEvent(KRMDebugTestApplication(), status, infoBuffer);
hgs
parents:
diff changeset
  2766
hgs
parents:
diff changeset
  2767
				// wait for notification of the kill thread
hgs
parents:
diff changeset
  2768
				User::WaitForRequest(status);
hgs
parents:
diff changeset
  2769
				test(KErrNone == status.Int());
hgs
parents:
diff changeset
  2770
hgs
parents:
diff changeset
  2771
				// check that this is the event we were expecting
hgs
parents:
diff changeset
  2772
				test(info.iProcessIdValid);
hgs
parents:
diff changeset
  2773
				test(info.iThreadIdValid);
hgs
parents:
diff changeset
  2774
				test(info.iProcessId==processId);
hgs
parents:
diff changeset
  2775
				test(info.iEventType==EEventsKillThread);
hgs
parents:
diff changeset
  2776
				if(EActionSuspend == aActionExtra)
hgs
parents:
diff changeset
  2777
					{
hgs
parents:
diff changeset
  2778
					// do some calls to check listings work ok at this stage
hgs
parents:
diff changeset
  2779
					test(ProcessExists(info.iProcessId));
hgs
parents:
diff changeset
  2780
					test(ThreadExistsForProcess(info.iThreadId, info.iProcessId));
hgs
parents:
diff changeset
  2781
					// we specified EActionSuspend earlier so need to call resume on this thread
hgs
parents:
diff changeset
  2782
					test(KErrNone == iServSession.ResumeThread(info.iThreadId));
hgs
parents:
diff changeset
  2783
					}
hgs
parents:
diff changeset
  2784
				}
hgs
parents:
diff changeset
  2785
			}
hgs
parents:
diff changeset
  2786
hgs
parents:
diff changeset
  2787
		if( gUseDelay ) User::After(500000);
hgs
parents:
diff changeset
  2788
hgs
parents:
diff changeset
  2789
		// reset the thread kill event
hgs
parents:
diff changeset
  2790
		test(KErrNone == iServSession.SetEventAction(KRMDebugTestApplication(), EEventsKillThread, EActionIgnore));
hgs
parents:
diff changeset
  2791
hgs
parents:
diff changeset
  2792
		// reset events for KRMDebugTestApplication
hgs
parents:
diff changeset
  2793
		test(KErrNone == iServSession.SetEventAction(KRMDebugTestApplication(), type[j].iEventType, EActionIgnore));
hgs
parents:
diff changeset
  2794
hgs
parents:
diff changeset
  2795
		// finished debugging KRMDebugTestApplication so detach
hgs
parents:
diff changeset
  2796
		test(KErrNone == iServSession.DetachExecutable(KRMDebugTestApplication()));
hgs
parents:
diff changeset
  2797
	
hgs
parents:
diff changeset
  2798
		// want to validate that the process has really exited, i.e. we're not accidentally keeping a handle to it...
hgs
parents:
diff changeset
  2799
		TInt waitCount = 10;
hgs
parents:
diff changeset
  2800
		while((waitCount-- > 0) && ProcessExists(processId))
hgs
parents:
diff changeset
  2801
			{
hgs
parents:
diff changeset
  2802
			/* Wait a little while and try again, just in case the process is still being removed.
hgs
parents:
diff changeset
  2803
			This can happen on a very busy system or when a popup for the events is still active
hgs
parents:
diff changeset
  2804
			*/
hgs
parents:
diff changeset
  2805
			RDebug::Printf("CRunModeAgent::TestEventsWithExtraThreads. ProcessExists(id=%d), waiting count exit=%d", 
hgs
parents:
diff changeset
  2806
				I64LOW(processId), waitCount);
hgs
parents:
diff changeset
  2807
			User::After(50000);
hgs
parents:
diff changeset
  2808
			}
hgs
parents:
diff changeset
  2809
		test(!ProcessExists(processId));
hgs
parents:
diff changeset
  2810
		}
hgs
parents:
diff changeset
  2811
	}
hgs
parents:
diff changeset
  2812
hgs
parents:
diff changeset
  2813
// helper function to check whether a thread with id aThreadId exists in the process with id aProcessId
hgs
parents:
diff changeset
  2814
TBool CRunModeAgent::ThreadExistsForProcess(const TThreadId aThreadId, const TProcessId aProcessId)
hgs
parents:
diff changeset
  2815
	{
hgs
parents:
diff changeset
  2816
	RThread lThread;
hgs
parents:
diff changeset
  2817
	TInt ret = lThread.Open( aThreadId.Id() );
hgs
parents:
diff changeset
  2818
hgs
parents:
diff changeset
  2819
	if( ret != KErrNone )
hgs
parents:
diff changeset
  2820
		{
hgs
parents:
diff changeset
  2821
		RDebug::Printf("ThreadExistsForProcess: thread id=%d opening returned %d",
hgs
parents:
diff changeset
  2822
			I64LOW( aThreadId.Id() ), ret );
hgs
parents:
diff changeset
  2823
		lThread.Close();
hgs
parents:
diff changeset
  2824
		return EFalse;
hgs
parents:
diff changeset
  2825
		}
hgs
parents:
diff changeset
  2826
hgs
parents:
diff changeset
  2827
	RProcess lProcess;
hgs
parents:
diff changeset
  2828
	ret = lThread.Process( lProcess );
hgs
parents:
diff changeset
  2829
hgs
parents:
diff changeset
  2830
	lThread.Close();
hgs
parents:
diff changeset
  2831
hgs
parents:
diff changeset
  2832
	if( ret != KErrNone )
hgs
parents:
diff changeset
  2833
		{
hgs
parents:
diff changeset
  2834
		RDebug::Printf("ThreadExistsForProcess: proc opening returned %d", ret );
hgs
parents:
diff changeset
  2835
		ret = KErrNotFound;
hgs
parents:
diff changeset
  2836
		}
hgs
parents:
diff changeset
  2837
	else if( lProcess.Id() != aProcessId )
hgs
parents:
diff changeset
  2838
		{
hgs
parents:
diff changeset
  2839
		RDebug::Printf("ThreadExistsForProcess: lProcess.Id()(%d)!= aProcessId(%d)",
hgs
parents:
diff changeset
  2840
				I64LOW(lProcess.Id().Id()), I64LOW(aProcessId.Id()));
hgs
parents:
diff changeset
  2841
		ret = KErrNotFound;
hgs
parents:
diff changeset
  2842
		}
hgs
parents:
diff changeset
  2843
hgs
parents:
diff changeset
  2844
	lProcess.Close();
hgs
parents:
diff changeset
  2845
	
hgs
parents:
diff changeset
  2846
	return ( ret == KErrNone );
hgs
parents:
diff changeset
  2847
	}
hgs
parents:
diff changeset
  2848
hgs
parents:
diff changeset
  2849
// helper function to check whether a process with id aProcessId exists
hgs
parents:
diff changeset
  2850
TBool CRunModeAgent::ProcessExists(const TProcessId aProcessId)
hgs
parents:
diff changeset
  2851
	{
hgs
parents:
diff changeset
  2852
	TUint32 size;
hgs
parents:
diff changeset
  2853
	RBuf8 buffer;
hgs
parents:
diff changeset
  2854
	test(KErrNone == buffer.Create(1024));
hgs
parents:
diff changeset
  2855
	TInt err = iServSession.GetList(EProcesses, buffer, size);
hgs
parents:
diff changeset
  2856
	while(KErrTooBig == err)
hgs
parents:
diff changeset
  2857
		{
hgs
parents:
diff changeset
  2858
		size*=2;
hgs
parents:
diff changeset
  2859
		test(size<=47*1024); // 256 TProcessListEntrys is about 46KB. (256 is max num processes)
hgs
parents:
diff changeset
  2860
		test(KErrNone == buffer.ReAlloc(size));
hgs
parents:
diff changeset
  2861
		err = iServSession.GetList(EProcesses, buffer, size);
hgs
parents:
diff changeset
  2862
		}
hgs
parents:
diff changeset
  2863
	test(KErrNone == err);
hgs
parents:
diff changeset
  2864
hgs
parents:
diff changeset
  2865
	//look through the buffer and check if the target debug thread is there
hgs
parents:
diff changeset
  2866
	TUint8* ptr = (TUint8*)buffer.Ptr();
hgs
parents:
diff changeset
  2867
	const TUint8* ptrEnd = ptr + size;
hgs
parents:
diff changeset
  2868
	while(ptr < ptrEnd)
hgs
parents:
diff changeset
  2869
		{
hgs
parents:
diff changeset
  2870
		TProcessListEntry& entry = *(TProcessListEntry*)ptr;
hgs
parents:
diff changeset
  2871
		if(aProcessId.Id() == entry.iProcessId)
hgs
parents:
diff changeset
  2872
			{
hgs
parents:
diff changeset
  2873
			buffer.Close();
hgs
parents:
diff changeset
  2874
			return ETrue;
hgs
parents:
diff changeset
  2875
			}
hgs
parents:
diff changeset
  2876
		ptr += Align4(entry.GetSize());
hgs
parents:
diff changeset
  2877
		}
hgs
parents:
diff changeset
  2878
	buffer.Close();
hgs
parents:
diff changeset
  2879
	return EFalse;
hgs
parents:
diff changeset
  2880
	}
hgs
parents:
diff changeset
  2881
hgs
parents:
diff changeset
  2882
//----------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
  2883
//! @SYMTestCaseID      KBase-T-RMDEBUG2-0445
hgs
parents:
diff changeset
  2884
//! @SYMTestType
hgs
parents:
diff changeset
  2885
//! @SYMPREQ            PREQ1426
hgs
parents:
diff changeset
  2886
//! @SYMTestCaseDesc    Tests basic debug functions work on demand-paged target threads
hgs
parents:
diff changeset
  2887
//! @SYMTestActions     Checks it can r/w memory, set breakpoints etc in a demand paged target.
hgs
parents:
diff changeset
  2888
//!
hgs
parents:
diff changeset
  2889
//! @SYMTestExpectedResults KErrNone.
hgs
parents:
diff changeset
  2890
//! @SYMTestPriority        High
hgs
parents:
diff changeset
  2891
//! @SYMTestStatus          Implemented
hgs
parents:
diff changeset
  2892
//----------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
  2893
hgs
parents:
diff changeset
  2894
void CRunModeAgent::TestDemandPaging(void)
hgs
parents:
diff changeset
  2895
	{
hgs
parents:
diff changeset
  2896
	test.Next(_L("TestDemandPaging\n"));
hgs
parents:
diff changeset
  2897
hgs
parents:
diff changeset
  2898
	test(KErrNone == iServSession.AttachExecutable(iFileName, EFalse));
hgs
parents:
diff changeset
  2899
	test(KErrNone == iServSession.SuspendThread(iThreadID));
hgs
parents:
diff changeset
  2900
hgs
parents:
diff changeset
  2901
	// get the address of a function in code that will be paged in
hgs
parents:
diff changeset
  2902
	TUint32 address = (TUint32)(&RMDebugDemandPagingTest);
hgs
parents:
diff changeset
  2903
	const TUint32 armInstSize = 4;
hgs
parents:
diff changeset
  2904
hgs
parents:
diff changeset
  2905
	// read the memory at &RMDebugDemandPagingTest to check that reading memory in demand paged code works
hgs
parents:
diff changeset
  2906
	TUint32 demandPagedInst = 0;
hgs
parents:
diff changeset
  2907
	TPtr8 demandPagedInstBuf((TUint8*)&demandPagedInst, armInstSize);
hgs
parents:
diff changeset
  2908
	test(KErrNone == iServSession.ReadMemory(iThreadID, address, armInstSize, demandPagedInstBuf, EAccess32, EEndLE8));
hgs
parents:
diff changeset
  2909
hgs
parents:
diff changeset
  2910
	// this is the MOVS instruction that we expect to find in RMDebugDemandPagingTest
hgs
parents:
diff changeset
  2911
	TUint32 expectedDemandPagedInst = 0xe1b02000;
hgs
parents:
diff changeset
  2912
hgs
parents:
diff changeset
  2913
	// check that the instruction we read is as expected
hgs
parents:
diff changeset
  2914
	test(demandPagedInst == expectedDemandPagedInst);
hgs
parents:
diff changeset
  2915
hgs
parents:
diff changeset
  2916
	// set event action for break points
hgs
parents:
diff changeset
  2917
	test(KErrNone == iServSession.SetEventAction(RProcess().FileName(), EEventsBreakPoint, EActionContinue));
hgs
parents:
diff changeset
  2918
hgs
parents:
diff changeset
  2919
	// set an arm breakpoint on RMDebugDemandPagingTest
hgs
parents:
diff changeset
  2920
	TBreakId armBreakId = 0;
hgs
parents:
diff changeset
  2921
	test(KErrNone == iServSession.SetBreak(armBreakId, iThreadID, address, EArmMode));
hgs
parents:
diff changeset
  2922
hgs
parents:
diff changeset
  2923
	// Ensure that after setting the breakpoint the memory read returns the correct value
hgs
parents:
diff changeset
  2924
	TUint32 demandPagedInstWithBreakPoint = 0;
hgs
parents:
diff changeset
  2925
	TPtr8 spinForeverInstWithBreakPointBuf((TUint8*)&demandPagedInstWithBreakPoint, armInstSize);
hgs
parents:
diff changeset
  2926
	test(KErrNone == iServSession.ReadMemory(iThreadID, address, armInstSize, spinForeverInstWithBreakPointBuf, EAccess32, EEndLE8));
hgs
parents:
diff changeset
  2927
	test(demandPagedInst == demandPagedInstWithBreakPoint);
hgs
parents:
diff changeset
  2928
hgs
parents:
diff changeset
  2929
	// switch the target thread to run the demand paging function
hgs
parents:
diff changeset
  2930
	test(KErrNone == SwitchTestFunction(EDemandPagingFunction));
hgs
parents:
diff changeset
  2931
hgs
parents:
diff changeset
  2932
	// set up event watcher to catch breakpoint being hit in demand paged code
hgs
parents:
diff changeset
  2933
	TEventInfo info;
hgs
parents:
diff changeset
  2934
	static TRequestStatus status;
hgs
parents:
diff changeset
  2935
	TPtr8 infoPtr((TUint8*)&info,sizeof(TEventInfo));
hgs
parents:
diff changeset
  2936
	iServSession.GetEvent(RProcess().FileName(), status, infoPtr);
hgs
parents:
diff changeset
  2937
hgs
parents:
diff changeset
  2938
	// resume the thread
hgs
parents:
diff changeset
  2939
	test(KErrNone == iServSession.ResumeThread(iThreadID));
hgs
parents:
diff changeset
  2940
	// wait for notification of the breakpoint hit event
hgs
parents:
diff changeset
  2941
	User::WaitForRequest(status);
hgs
parents:
diff changeset
  2942
	test(status==KErrNone);
hgs
parents:
diff changeset
  2943
hgs
parents:
diff changeset
  2944
	// info should now be filled with the details
hgs
parents:
diff changeset
  2945
	test(info.iProcessIdValid);
hgs
parents:
diff changeset
  2946
	test(info.iThreadIdValid);
hgs
parents:
diff changeset
  2947
	test(info.iEventType == EEventsBreakPoint);
hgs
parents:
diff changeset
  2948
	test(info.iThreadBreakPointInfo.iRmdArmExcInfo.iR15 == address);
hgs
parents:
diff changeset
  2949
hgs
parents:
diff changeset
  2950
	// remove the break point and resume the thread
hgs
parents:
diff changeset
  2951
	test(KErrNone == iServSession.ClearBreak(armBreakId));
hgs
parents:
diff changeset
  2952
hgs
parents:
diff changeset
  2953
	// switch the target thread to run the default function
hgs
parents:
diff changeset
  2954
	test(KErrNone == SwitchTestFunction(EDefaultFunction));
hgs
parents:
diff changeset
  2955
hgs
parents:
diff changeset
  2956
	test(KErrNone == iServSession.ResumeThread(iThreadID));
hgs
parents:
diff changeset
  2957
	test(KErrNone == iServSession.DetachExecutable(iFileName));
hgs
parents:
diff changeset
  2958
	}
hgs
parents:
diff changeset
  2959
hgs
parents:
diff changeset
  2960
// Names of some test programs used for testing security
hgs
parents:
diff changeset
  2961
_LIT(KRMDebugSecurity0FileName,"z:\\sys\\bin\\t_rmdebug_security0.exe"); // Debuggable
hgs
parents:
diff changeset
  2962
_LIT(KRMDebugSecurity1FileName,"z:\\sys\\bin\\t_rmdebug_security1.exe"); // Not debuggable
hgs
parents:
diff changeset
  2963
hgs
parents:
diff changeset
  2964
#if defined (NO_DEBUGTOKEN) || defined (SOMECAPS_DEBUGTOKEN) || defined(FEWCAPS_DEBUGTOKEN)
hgs
parents:
diff changeset
  2965
_LIT(KRMDebugSecurity2FileName,"z:\\sys\\bin\\t_rmdebug_security2.exe"); // AllFiles
hgs
parents:
diff changeset
  2966
#endif
hgs
parents:
diff changeset
  2967
hgs
parents:
diff changeset
  2968
_LIT(KRMDebugSecurity3FileName,"z:\\sys\\bin\\t_rmdebug_security3.exe"); // TCB AllFiles
hgs
parents:
diff changeset
  2969
hgs
parents:
diff changeset
  2970
// include the test header file here
hgs
parents:
diff changeset
  2971
#include "rm_debug_kerneldriver.h"
hgs
parents:
diff changeset
  2972
hgs
parents:
diff changeset
  2973
//----------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
  2974
//! @SYMTestCaseID      KBase-T-RMDEBUG2-0446
hgs
parents:
diff changeset
  2975
//! @SYMTestType
hgs
parents:
diff changeset
  2976
//! @SYMPREQ            PREQ1426
hgs
parents:
diff changeset
  2977
//! @SYMTestCaseDesc    Tests Debug Device Driver is locked to the SID of the Debug Security Svr.
hgs
parents:
diff changeset
  2978
//! @SYMTestActions     Loads rm-debug.ldd and tries to open a handle to it. This should fail.
hgs
parents:
diff changeset
  2979
//!
hgs
parents:
diff changeset
  2980
//! @SYMTestExpectedResults KErrPermissionDenied.
hgs
parents:
diff changeset
  2981
//! @SYMTestPriority        High
hgs
parents:
diff changeset
  2982
//! @SYMTestStatus          Implemented
hgs
parents:
diff changeset
  2983
//----------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
  2984
hgs
parents:
diff changeset
  2985
void CRunModeAgent::TestDriverSecurity(void)
hgs
parents:
diff changeset
  2986
	{
hgs
parents:
diff changeset
  2987
	test.Next(_L("TestDriverSecurity\n"));
hgs
parents:
diff changeset
  2988
hgs
parents:
diff changeset
  2989
	RRM_DebugDriver kernelDriver;
hgs
parents:
diff changeset
  2990
hgs
parents:
diff changeset
  2991
	// Load the debug device driver
hgs
parents:
diff changeset
  2992
	TInt err = User::LoadLogicalDevice( KDebugDriverFileName );
hgs
parents:
diff changeset
  2993
	test((KErrNone == err) || (KErrAlreadyExists == err));
hgs
parents:
diff changeset
  2994
hgs
parents:
diff changeset
  2995
	// we were allowed to load the driver, or its already loaded.
hgs
parents:
diff changeset
  2996
hgs
parents:
diff changeset
  2997
	// Try to open a handle to the driver - this should return KErrPermissionDenied as we don't have the DSS SID
hgs
parents:
diff changeset
  2998
	TRM_DebugDriverInfo driverInfo;
hgs
parents:
diff changeset
  2999
	driverInfo.iUserLibraryEnd = 0;
hgs
parents:
diff changeset
  3000
	err = kernelDriver.Open(driverInfo);
hgs
parents:
diff changeset
  3001
	test((err == KErrInUse) || (err == KErrPermissionDenied));
hgs
parents:
diff changeset
  3002
hgs
parents:
diff changeset
  3003
	}
hgs
parents:
diff changeset
  3004
hgs
parents:
diff changeset
  3005
//----------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
  3006
//! @SYMTestCaseID      KBase-T-RMDEBUG2-0447
hgs
parents:
diff changeset
  3007
//! @SYMTestType
hgs
parents:
diff changeset
  3008
//! @SYMPREQ            PREQ1426
hgs
parents:
diff changeset
  3009
//! @SYMTestCaseDesc    Tests Debug driver can only be access via the DSS. Also tests DSS cannot
hgs
parents:
diff changeset
  3010
//!						be subverted. Tests functionality of two representative OEM Debug Tokens.
hgs
parents:
diff changeset
  3011
//! @SYMTestActions     Tries to open rm_debug.ldd (should fail). Tries to debug various processes
hgs
parents:
diff changeset
  3012
//!						(only debuggable one should succeed). Checks that DSS behaves correctly
hgs
parents:
diff changeset
  3013
//!						when different versions are passed in to Connect().
hgs
parents:
diff changeset
  3014
//!
hgs
parents:
diff changeset
  3015
//! @SYMTestExpectedResults KErrPermissionDenied.
hgs
parents:
diff changeset
  3016
//! @SYMTestPriority        High
hgs
parents:
diff changeset
  3017
//! @SYMTestStatus          Implemented
hgs
parents:
diff changeset
  3018
//----------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
  3019
hgs
parents:
diff changeset
  3020
void CRunModeAgent::TestSecurity(void)
hgs
parents:
diff changeset
  3021
	{
hgs
parents:
diff changeset
  3022
	// Things to test
hgs
parents:
diff changeset
  3023
	//
hgs
parents:
diff changeset
  3024
	// try to use debug driver directly ( should have the wrong UID/SID value!)
hgs
parents:
diff changeset
  3025
	test.Next(_L("TestSecurity - Bypass Debug Security Server to Debug Device Driver - DSS running\n"));
hgs
parents:
diff changeset
  3026
hgs
parents:
diff changeset
  3027
	// Things to test
hgs
parents:
diff changeset
  3028
	//
hgs
parents:
diff changeset
  3029
	// Load the debug device driver
hgs
parents:
diff changeset
  3030
	RRM_DebugDriver kernelDriver;
hgs
parents:
diff changeset
  3031
	TInt err = User::LoadLogicalDevice( KDebugDriverFileName );
hgs
parents:
diff changeset
  3032
	test((KErrNone == err) || (KErrAlreadyExists == err));
hgs
parents:
diff changeset
  3033
hgs
parents:
diff changeset
  3034
	// we were allowed to load the driver, or its already loaded.
hgs
parents:
diff changeset
  3035
hgs
parents:
diff changeset
  3036
	// Try to open handle a to the driver - this should return KErrPermission/KErrInUse as we don't have the DSS SID
hgs
parents:
diff changeset
  3037
	// and we expect the DSS to already be using it.
hgs
parents:
diff changeset
  3038
	TRM_DebugDriverInfo driverInfo;
hgs
parents:
diff changeset
  3039
	driverInfo.iUserLibraryEnd = 0;
hgs
parents:
diff changeset
  3040
	err = kernelDriver.Open(driverInfo);
hgs
parents:
diff changeset
  3041
	test(err == KErrInUse);
hgs
parents:
diff changeset
  3042
hgs
parents:
diff changeset
  3043
	// Try requesting an unsupported version of DSS
hgs
parents:
diff changeset
  3044
	test.Next(_L("TestSecurity - requesting unsupported versions of DSS\n"));
hgs
parents:
diff changeset
  3045
	RSecuritySvrSession dss;
hgs
parents:
diff changeset
  3046
	err = dss.Connect(TVersion(999999, 0, 0));
hgs
parents:
diff changeset
  3047
	test(err == KErrNotSupported); // Prior to DEF142018 this would crash, causing a KErrServerTerminated
hgs
parents:
diff changeset
  3048
	err = dss.Connect(TVersion(KDebugServMajorVersionNumber, 999999, 0));
hgs
parents:
diff changeset
  3049
	test(err == KErrNotSupported); // Explicitly asking for a minor version should give KErrNotSupported too if it's newer than what's running.
hgs
parents:
diff changeset
  3050
	err = dss.Connect(TVersion(KDebugServMajorVersionNumber, 0, 0));
hgs
parents:
diff changeset
  3051
	test(err == KErrNone); // But the correct major version and no explicit minor version should always succeed
hgs
parents:
diff changeset
  3052
	dss.Close();
hgs
parents:
diff changeset
  3053
	
hgs
parents:
diff changeset
  3054
	//
hgs
parents:
diff changeset
  3055
	// Attach to the Debug Security Server (passive)
hgs
parents:
diff changeset
  3056
	//
hgs
parents:
diff changeset
  3057
	test.Next(_L("TestSecurity - Attach to the Debug Security Server (passive)\n"));
hgs
parents:
diff changeset
  3058
hgs
parents:
diff changeset
  3059
	_LIT(KSecurityServerProcessName, "z:\\sys\\bin\\rm_debug_svr.exe");
hgs
parents:
diff changeset
  3060
hgs
parents:
diff changeset
  3061
	test(KErrPermissionDenied == iServSession.AttachExecutable(KSecurityServerProcessName, ETrue));
hgs
parents:
diff changeset
  3062
hgs
parents:
diff changeset
  3063
	//
hgs
parents:
diff changeset
  3064
	// Attach to the Debug Security Server (active)
hgs
parents:
diff changeset
  3065
	//
hgs
parents:
diff changeset
  3066
	test.Next(_L("TestSecurity - Attach to the Debug Security Server (active)\n"));
hgs
parents:
diff changeset
  3067
hgs
parents:
diff changeset
  3068
	test(KErrPermissionDenied == iServSession.AttachExecutable(KSecurityServerProcessName, EFalse));
hgs
parents:
diff changeset
  3069
hgs
parents:
diff changeset
  3070
	//
hgs
parents:
diff changeset
  3071
	// Attach to Process 0
hgs
parents:
diff changeset
  3072
	//
hgs
parents:
diff changeset
  3073
	// Target: Debuggable
hgs
parents:
diff changeset
  3074
	//
hgs
parents:
diff changeset
  3075
	test.Next(_L("TestSecurity - Attach to test process 0\n"));
hgs
parents:
diff changeset
  3076
hgs
parents:
diff changeset
  3077
	// Agent can debug the target app as it is marked debuggable - ie capabilities are ignored)
hgs
parents:
diff changeset
  3078
	HelpTestSecurityAttachDetachExecutable(KRMDebugSecurity0FileName,ETrue);
hgs
parents:
diff changeset
  3079
hgs
parents:
diff changeset
  3080
	//
hgs
parents:
diff changeset
  3081
	// Attach to Process - 1
hgs
parents:
diff changeset
  3082
	//
hgs
parents:
diff changeset
  3083
	// Target: Non-debuggable for ordinary debug agent, debuggable for OEM/OEM2 token authorised agent
hgs
parents:
diff changeset
  3084
	//
hgs
parents:
diff changeset
  3085
	// Note: This target app has no PlatSec capabilities
hgs
parents:
diff changeset
  3086
	//
hgs
parents:
diff changeset
  3087
	// Agent cannot debug the app unless it has an OEM/OEM2 Debug Token
hgs
parents:
diff changeset
  3088
hgs
parents:
diff changeset
  3089
hgs
parents:
diff changeset
  3090
#ifdef NO_DEBUGTOKEN
hgs
parents:
diff changeset
  3091
	test.Next(_L("TestSecurity NO_DEBUGTOKEN - Attach to test process 1\n"));
hgs
parents:
diff changeset
  3092
	HelpTestSecurityAttachDetachExecutable(KRMDebugSecurity1FileName,EFalse);
hgs
parents:
diff changeset
  3093
#endif
hgs
parents:
diff changeset
  3094
hgs
parents:
diff changeset
  3095
#ifdef SOMECAPS_DEBUGTOKEN
hgs
parents:
diff changeset
  3096
	test.Next(_L("TestSecurity SOMECAPS_DEBUGTOKEN - Attach to test process 1\n"));
hgs
parents:
diff changeset
  3097
	HelpTestSecurityAttachDetachExecutable(KRMDebugSecurity1FileName,ETrue);
hgs
parents:
diff changeset
  3098
#endif
hgs
parents:
diff changeset
  3099
hgs
parents:
diff changeset
  3100
#ifdef FEWCAPS_DEBUGTOKEN
hgs
parents:
diff changeset
  3101
	test.Next(_L("TestSecurity FEWCAPS_DEBUGTOKEN - Attach to test process 1\n"));
hgs
parents:
diff changeset
  3102
	HelpTestSecurityAttachDetachExecutable(KRMDebugSecurity1FileName,ETrue);
hgs
parents:
diff changeset
  3103
#endif
hgs
parents:
diff changeset
  3104
hgs
parents:
diff changeset
  3105
	//
hgs
parents:
diff changeset
  3106
	// Attach to Process - 2
hgs
parents:
diff changeset
  3107
	//
hgs
parents:
diff changeset
  3108
	// Target: Non-debuggable for ordinary debug agent, non-debuggable for OEM2 authorised agent (insufficient caps)
hgs
parents:
diff changeset
  3109
	//
hgs
parents:
diff changeset
  3110
	// Note: This target app has AllFiles capability
hgs
parents:
diff changeset
  3111
	//
hgs
parents:
diff changeset
  3112
	// Agent cannot debug the app unless it has an OEM Debug Token
hgs
parents:
diff changeset
  3113
hgs
parents:
diff changeset
  3114
hgs
parents:
diff changeset
  3115
#ifdef NO_DEBUGTOKEN
hgs
parents:
diff changeset
  3116
	test.Next(_L("TestSecurity NO_DEBUGTOKEN - Attach to test process 2\n"));
hgs
parents:
diff changeset
  3117
	HelpTestSecurityAttachDetachExecutable(KRMDebugSecurity2FileName,EFalse);
hgs
parents:
diff changeset
  3118
#endif
hgs
parents:
diff changeset
  3119
hgs
parents:
diff changeset
  3120
#ifdef SOMECAPS_DEBUGTOKEN
hgs
parents:
diff changeset
  3121
	test.Next(_L("TestSecurity SOMECAPS_DEBUGTOKEN - Attach to test process 2\n"));
hgs
parents:
diff changeset
  3122
	HelpTestSecurityAttachDetachExecutable(KRMDebugSecurity2FileName,ETrue);
hgs
parents:
diff changeset
  3123
#endif
hgs
parents:
diff changeset
  3124
hgs
parents:
diff changeset
  3125
#ifdef FEWCAPS_DEBUGTOKEN
hgs
parents:
diff changeset
  3126
	test.Next(_L("TestSecurity FEWCAPS_DEBUGTOKEN - Attach to test process 2\n"));
hgs
parents:
diff changeset
  3127
	HelpTestSecurityAttachDetachExecutable(KRMDebugSecurity2FileName,EFalse);
hgs
parents:
diff changeset
  3128
#endif
hgs
parents:
diff changeset
  3129
hgs
parents:
diff changeset
  3130
	//
hgs
parents:
diff changeset
  3131
	// Attach to Process - 3
hgs
parents:
diff changeset
  3132
	//
hgs
parents:
diff changeset
  3133
	// Target: Non-debuggable for ordinary debug agent, non-debuggable for OEM authorised agent (insufficient caps)
hgs
parents:
diff changeset
  3134
	//
hgs
parents:
diff changeset
  3135
	// Note: This target app has AllFiles and TCB and NetworkControl capabilities
hgs
parents:
diff changeset
  3136
	//
hgs
parents:
diff changeset
  3137
hgs
parents:
diff changeset
  3138
#if  defined (NO_DEBUGTOKEN)  || defined (SOMECAPS_DEBUGTOKEN) || defined (FEWCAPS_DEBUGTOKEN)
hgs
parents:
diff changeset
  3139
	test.Next(_L("TestSecurity - Attach to test process 3 : Should not be able to debug it\n"));
hgs
parents:
diff changeset
  3140
	HelpTestSecurityAttachDetachExecutable(KRMDebugSecurity3FileName,EFalse);
hgs
parents:
diff changeset
  3141
#else
hgs
parents:
diff changeset
  3142
	test.Next(_L("TestSecurity - Attach to test process 3 : Should be able to debug it\n"));
hgs
parents:
diff changeset
  3143
	HelpTestSecurityAttachDetachExecutable(KRMDebugSecurity3FileName,ETrue);
hgs
parents:
diff changeset
  3144
#endif
hgs
parents:
diff changeset
  3145
	}
hgs
parents:
diff changeset
  3146
hgs
parents:
diff changeset
  3147
//----------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
  3148
//! @SYMTestCaseID      KBase-T-RMDEBUG2-0543
hgs
parents:
diff changeset
  3149
//! @SYMTestType
hgs
parents:
diff changeset
  3150
//! @SYMPREQ            PREQ1426
hgs
parents:
diff changeset
  3151
//! @SYMTestCaseDesc    Validates that a dll can be built which #include's the rm_debug_api.h header, i.e. rm_debug_api.h contains no static data.
hgs
parents:
diff changeset
  3152
//! @SYMTestActions     Calls a dummy function in t_rmdebug_dll.dll which implies the dll has been built correctly.
hgs
parents:
diff changeset
  3153
//!
hgs
parents:
diff changeset
  3154
//! @SYMTestExpectedResults KErrNone.
hgs
parents:
diff changeset
  3155
//! @SYMTestPriority        High
hgs
parents:
diff changeset
  3156
//! @SYMTestStatus          Implemented
hgs
parents:
diff changeset
  3157
//----------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
  3158
void CRunModeAgent::TestDllUsage(void)
hgs
parents:
diff changeset
  3159
	{
hgs
parents:
diff changeset
  3160
	test.Next(_L("TestDllUsage\n"));
hgs
parents:
diff changeset
  3161
	test(KUidDebugSecurityServer == GetDSSUid());
hgs
parents:
diff changeset
  3162
	}
hgs
parents:
diff changeset
  3163
hgs
parents:
diff changeset
  3164
//----------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
  3165
//! @SYMTestCaseID      KBase-T-RMDEBUG2-0812
hgs
parents:
diff changeset
  3166
//! @SYMTestType
hgs
parents:
diff changeset
  3167
//! @SYMPREQ            PREQ1700
hgs
parents:
diff changeset
  3168
//! @SYMTestCaseDesc    Writes a known data to the crash flash and validates the data written
hgs
parents:
diff changeset
  3169
//!						using the read operation and finally erase the data. In the absence
hgs
parents:
diff changeset
  3170
//!						of an OEM debug token, access to the crash partition should not be allowed
hgs
parents:
diff changeset
  3171
//! @SYMTestActions     Invoke the flash write method in DSS and call the read method in DSS
hgs
parents:
diff changeset
  3172
//!						to validate the data is written correctly and then erase the written area
hgs
parents:
diff changeset
  3173
//!
hgs
parents:
diff changeset
  3174
//! @SYMTestExpectedResults KErrNone.
hgs
parents:
diff changeset
  3175
//! @SYMTestPriority        High
hgs
parents:
diff changeset
  3176
//! @SYMTestStatus          Implemented
hgs
parents:
diff changeset
  3177
//----------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
  3178
void CRunModeAgent::TestCrashFlash(void)
hgs
parents:
diff changeset
  3179
	{
hgs
parents:
diff changeset
  3180
#if  defined (NO_DEBUGTOKEN)  || defined (FEWCAPS_DEBUGTOKEN)
hgs
parents:
diff changeset
  3181
hgs
parents:
diff changeset
  3182
	test.Next(_L("@SYMTestCaseID:DT-debug-securityserver-006 Testing We cannot Erase the Crash Flash with insufficient privileges"));
hgs
parents:
diff changeset
  3183
hgs
parents:
diff changeset
  3184
	TUint32 size = 0;
hgs
parents:
diff changeset
  3185
	TInt err = iServSession.EraseCrashLog(0, 1);
hgs
parents:
diff changeset
  3186
	test(KErrPermissionDenied == err);
hgs
parents:
diff changeset
  3187
hgs
parents:
diff changeset
  3188
	test.Next(_L("@SYMTestCaseID:DT-debug-securityserver-005 Testing We can't Write to the Crash Flash with insufficient privileges"));
hgs
parents:
diff changeset
  3189
hgs
parents:
diff changeset
  3190
	err = iServSession.WriteCrashConfig(0, KCrashDummyData, size);
hgs
parents:
diff changeset
  3191
	test(KErrPermissionDenied == err);
hgs
parents:
diff changeset
  3192
	test(size == 0);
hgs
parents:
diff changeset
  3193
hgs
parents:
diff changeset
  3194
	test.Next(_L("@SYMTestCaseID:DT-debug-securityserver-008 Testing We can't Read from the Crash Flash with insufficient privileges"));
hgs
parents:
diff changeset
  3195
hgs
parents:
diff changeset
  3196
	TUint32 readSize = 0x10;
hgs
parents:
diff changeset
  3197
	RBuf8 buf;
hgs
parents:
diff changeset
  3198
	buf.CleanupClosePushL();
hgs
parents:
diff changeset
  3199
	err = buf.Create(readSize);
hgs
parents:
diff changeset
  3200
hgs
parents:
diff changeset
  3201
	test(err == KErrNone);
hgs
parents:
diff changeset
  3202
hgs
parents:
diff changeset
  3203
	err = iServSession.ReadCrashLog(0, buf, readSize);
hgs
parents:
diff changeset
  3204
	test(KErrPermissionDenied == err);
hgs
parents:
diff changeset
  3205
hgs
parents:
diff changeset
  3206
	test.Next(_L("@SYMTestCaseID:DT-debug-securityserver-004 Testing Writing To an invalid location"));
hgs
parents:
diff changeset
  3207
hgs
parents:
diff changeset
  3208
	TUint32 writeSize = 0;
hgs
parents:
diff changeset
  3209
	err = iServSession.WriteCrashConfig(0xFFFFFFFF, KCrashDummyData, writeSize);
hgs
parents:
diff changeset
  3210
hgs
parents:
diff changeset
  3211
	test(err == KErrPermissionDenied);
hgs
parents:
diff changeset
  3212
hgs
parents:
diff changeset
  3213
	test.Next(_L("@SYMTestCaseID:DT-debug-securityserver-003 Testing Reading from an invalid location"));
hgs
parents:
diff changeset
  3214
hgs
parents:
diff changeset
  3215
	buf.FillZ();
hgs
parents:
diff changeset
  3216
	err = iServSession.ReadCrashLog(0, buf, writeSize);
hgs
parents:
diff changeset
  3217
hgs
parents:
diff changeset
  3218
	test(err == KErrPermissionDenied);
hgs
parents:
diff changeset
  3219
hgs
parents:
diff changeset
  3220
	CleanupStack::PopAndDestroy(&buf);
hgs
parents:
diff changeset
  3221
hgs
parents:
diff changeset
  3222
#endif
hgs
parents:
diff changeset
  3223
hgs
parents:
diff changeset
  3224
#ifdef SOMECAPS_DEBUGTOKEN
hgs
parents:
diff changeset
  3225
hgs
parents:
diff changeset
  3226
	TInt err = KErrNone;
hgs
parents:
diff changeset
  3227
hgs
parents:
diff changeset
  3228
	test.Next(_L("@SYMTestCaseID:DT-debug-securityserver-007 Testing We can Erase the Crash Flash with sufficient privileges"));
hgs
parents:
diff changeset
  3229
hgs
parents:
diff changeset
  3230
	err = iServSession.EraseCrashLog(0, 1);
hgs
parents:
diff changeset
  3231
hgs
parents:
diff changeset
  3232
	// For platforms where NAND flash is not currently supported we get a KErrNotSupported - this is still a pass
hgs
parents:
diff changeset
  3233
	if (KErrNotSupported == err)
hgs
parents:
diff changeset
  3234
		{
hgs
parents:
diff changeset
  3235
		test.Printf(_L("Nand flash not supported - continue"));
hgs
parents:
diff changeset
  3236
		return;
hgs
parents:
diff changeset
  3237
		}
hgs
parents:
diff changeset
  3238
hgs
parents:
diff changeset
  3239
 	//For platforms without a flash partition we get KErrNotFound - this is still a pass
hgs
parents:
diff changeset
  3240
 	if(KErrNotFound == err)
hgs
parents:
diff changeset
  3241
 		{
hgs
parents:
diff changeset
  3242
 		test.Printf(_L("Platform has no flash partition - continue"));
hgs
parents:
diff changeset
  3243
 		return;
hgs
parents:
diff changeset
  3244
 		}
hgs
parents:
diff changeset
  3245
hgs
parents:
diff changeset
  3246
	test(KErrNone == err);
hgs
parents:
diff changeset
  3247
hgs
parents:
diff changeset
  3248
	//Read back the start of the block to make sure its 0xFFFFFFFF
hgs
parents:
diff changeset
  3249
	const TUint numBytesToCheck = 0x80;  //We dont know the block size
hgs
parents:
diff changeset
  3250
	TBuf8<numBytesToCheck> eraseCheck;
hgs
parents:
diff changeset
  3251
	eraseCheck.SetLength(numBytesToCheck);
hgs
parents:
diff changeset
  3252
hgs
parents:
diff changeset
  3253
	err = iServSession.ReadCrashLog(0, eraseCheck, numBytesToCheck);
hgs
parents:
diff changeset
  3254
	test(err == KErrNone);
hgs
parents:
diff changeset
  3255
hgs
parents:
diff changeset
  3256
	TBool dataIsOk = ETrue;
hgs
parents:
diff changeset
  3257
	for(TUint cnt = 0; cnt < numBytesToCheck; cnt++)
hgs
parents:
diff changeset
  3258
		{
hgs
parents:
diff changeset
  3259
		if(eraseCheck[cnt] != 0xFF)
hgs
parents:
diff changeset
  3260
			{
hgs
parents:
diff changeset
  3261
			dataIsOk = EFalse;
hgs
parents:
diff changeset
  3262
			}
hgs
parents:
diff changeset
  3263
		}
hgs
parents:
diff changeset
  3264
hgs
parents:
diff changeset
  3265
	test(dataIsOk);
hgs
parents:
diff changeset
  3266
hgs
parents:
diff changeset
  3267
	test.Next(_L("@SYMTestCaseID:DT-debug-securityserver-002 Testing We can Write to the Crash Flash with sufficient privileges"));
hgs
parents:
diff changeset
  3268
hgs
parents:
diff changeset
  3269
	TUint32 writeSize = 0;
hgs
parents:
diff changeset
  3270
	err = iServSession.WriteCrashConfig(0, KCrashDummyData, writeSize);
hgs
parents:
diff changeset
  3271
hgs
parents:
diff changeset
  3272
	test(writeSize == KCrashDummyData().Length());
hgs
parents:
diff changeset
  3273
hgs
parents:
diff changeset
  3274
	test.Next(_L("@SYMTestCaseID:DT-debug-securityserver-001 Testing We can Read from the Crash Flash with sufficient privileges"));
hgs
parents:
diff changeset
  3275
hgs
parents:
diff changeset
  3276
	RBuf8 buf;
hgs
parents:
diff changeset
  3277
	buf.CleanupClosePushL();
hgs
parents:
diff changeset
  3278
	err = buf.Create(writeSize);
hgs
parents:
diff changeset
  3279
hgs
parents:
diff changeset
  3280
	test(err == KErrNone);
hgs
parents:
diff changeset
  3281
hgs
parents:
diff changeset
  3282
	buf.FillZ();
hgs
parents:
diff changeset
  3283
hgs
parents:
diff changeset
  3284
	err = iServSession.ReadCrashLog(0, buf, writeSize);
hgs
parents:
diff changeset
  3285
hgs
parents:
diff changeset
  3286
	test(0 == buf.Compare(KCrashDummyData));
hgs
parents:
diff changeset
  3287
hgs
parents:
diff changeset
  3288
	test.Next(_L("@SYMTestCaseID:DT-debug-securityserver-004 Testing Writing To an invalid location"));
hgs
parents:
diff changeset
  3289
hgs
parents:
diff changeset
  3290
	writeSize = 0;
hgs
parents:
diff changeset
  3291
	err = iServSession.WriteCrashConfig(0xFFFFFFFF, KCrashDummyData, writeSize);
hgs
parents:
diff changeset
  3292
hgs
parents:
diff changeset
  3293
	test(err == KErrArgument);
hgs
parents:
diff changeset
  3294
hgs
parents:
diff changeset
  3295
	test.Next(_L("@SYMTestCaseID:DT-debug-securityserver-003 Testing Reading from an invalid location"));
hgs
parents:
diff changeset
  3296
hgs
parents:
diff changeset
  3297
	buf.FillZ();
hgs
parents:
diff changeset
  3298
	err = iServSession.ReadCrashLog(0xFFFFFFFF, buf, writeSize);
hgs
parents:
diff changeset
  3299
hgs
parents:
diff changeset
  3300
	test(err == KErrArgument);
hgs
parents:
diff changeset
  3301
hgs
parents:
diff changeset
  3302
	CleanupStack::PopAndDestroy(&buf);
hgs
parents:
diff changeset
  3303
hgs
parents:
diff changeset
  3304
#endif
hgs
parents:
diff changeset
  3305
	}
hgs
parents:
diff changeset
  3306
//----------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
  3307
//! @SYMTestCaseID      KBase-T-RMDEBUG2-0735
hgs
parents:
diff changeset
  3308
//! @SYMTestType
hgs
parents:
diff changeset
  3309
//! @SYMPREQ            PREQ1426
hgs
parents:
diff changeset
  3310
//! @SYMTestCaseDesc    Tests the Kill Process functionality. Only can kill a debuggable process.
hgs
parents:
diff changeset
  3311
//! @SYMTestActions     Launches a debuggable and non-debuggable process and tries to kill both.
hgs
parents:
diff changeset
  3312
//!
hgs
parents:
diff changeset
  3313
//! @SYMTestExpectedResults KErrNone.
hgs
parents:
diff changeset
  3314
//! @SYMTestPriority        High
hgs
parents:
diff changeset
  3315
//! @SYMTestStatus          Implemented
hgs
parents:
diff changeset
  3316
//----------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
  3317
void CRunModeAgent::TestKillProcess(void)
hgs
parents:
diff changeset
  3318
	{
hgs
parents:
diff changeset
  3319
	test.Next(_L("TestKillProcess\n"));
hgs
parents:
diff changeset
  3320
hgs
parents:
diff changeset
  3321
	// Kill a debuggable process
hgs
parents:
diff changeset
  3322
hgs
parents:
diff changeset
  3323
	// check that killing a process is supported
hgs
parents:
diff changeset
  3324
	TTag tag = GetTag(ETagHeaderIdKillObjects, EFunctionalityKillProcess);
hgs
parents:
diff changeset
  3325
	test(tag.iValue);
hgs
parents:
diff changeset
  3326
	// check that killing a thread is not supported
hgs
parents:
diff changeset
  3327
	tag = GetTag(ETagHeaderIdKillObjects, EFunctionalityKillThread);
hgs
parents:
diff changeset
  3328
	test(!tag.iValue);
hgs
parents:
diff changeset
  3329
hgs
parents:
diff changeset
  3330
	// attach first!
hgs
parents:
diff changeset
  3331
	TInt err = iServSession.AttachExecutable(KRMDebugTestApplication, EFalse /* Active */);
hgs
parents:
diff changeset
  3332
	test(err == KErrNone);
hgs
parents:
diff changeset
  3333
hgs
parents:
diff changeset
  3334
	// first launch a debuggable process
hgs
parents:
diff changeset
  3335
	RProcess process;
hgs
parents:
diff changeset
  3336
	err = LaunchProcess(process, KRMDebugTestApplication(),ESpinForever, 0, 0);
hgs
parents:
diff changeset
  3337
	test (err == KErrNone);
hgs
parents:
diff changeset
  3338
hgs
parents:
diff changeset
  3339
	// try to find the process in the list
hgs
parents:
diff changeset
  3340
_LIT(KRMDebugAppName, "t_rmdebug_app");
hgs
parents:
diff changeset
  3341
hgs
parents:
diff changeset
  3342
	TBool found = ProcessExists(KRMDebugAppName);
hgs
parents:
diff changeset
  3343
	test (found);
hgs
parents:
diff changeset
  3344
hgs
parents:
diff changeset
  3345
	TInt processId = process.Id();
hgs
parents:
diff changeset
  3346
	process.Close();
hgs
parents:
diff changeset
  3347
hgs
parents:
diff changeset
  3348
	// program now running, so try to kill it
hgs
parents:
diff changeset
  3349
	err = iServSession.KillProcess(processId, 0 /* kill reason */);
hgs
parents:
diff changeset
  3350
	test(err == KErrNone);
hgs
parents:
diff changeset
  3351
hgs
parents:
diff changeset
  3352
	User::After(2000000);	// should die within two seconds.
hgs
parents:
diff changeset
  3353
hgs
parents:
diff changeset
  3354
	// can we still find it? Should be gone
hgs
parents:
diff changeset
  3355
	found = ProcessExists(KRMDebugAppName);
hgs
parents:
diff changeset
  3356
	test (!found);
hgs
parents:
diff changeset
  3357
hgs
parents:
diff changeset
  3358
	// release the program again.
hgs
parents:
diff changeset
  3359
	err = iServSession.DetachExecutable(KRMDebugTestApplication);
hgs
parents:
diff changeset
  3360
	test(err == KErrNone);
hgs
parents:
diff changeset
  3361
hgs
parents:
diff changeset
  3362
	// Try to kill a non-debuggable process and fail.
hgs
parents:
diff changeset
  3363
hgs
parents:
diff changeset
  3364
	// first launch a non-debuggable process
hgs
parents:
diff changeset
  3365
	RProcess process2;
hgs
parents:
diff changeset
  3366
	err = LaunchProcess(process2, KRMDebugSecurity1FileName(),ESpinForever, 0, 0);
hgs
parents:
diff changeset
  3367
	test (err == KErrNone);
hgs
parents:
diff changeset
  3368
hgs
parents:
diff changeset
  3369
	// try to find the process in the list
hgs
parents:
diff changeset
  3370
_LIT(KRMDebugAppName2, "t_rmdebug_security1");
hgs
parents:
diff changeset
  3371
hgs
parents:
diff changeset
  3372
	TBool found2 = ProcessExists(KRMDebugAppName2);
hgs
parents:
diff changeset
  3373
	test (found2);
hgs
parents:
diff changeset
  3374
hgs
parents:
diff changeset
  3375
	TInt process2Id = process2.Id();
hgs
parents:
diff changeset
  3376
	process2.Close();
hgs
parents:
diff changeset
  3377
hgs
parents:
diff changeset
  3378
	// program now running, so try to kill it
hgs
parents:
diff changeset
  3379
	err = iServSession.KillProcess(process2Id, 0 /* kill reason */);
hgs
parents:
diff changeset
  3380
	test(err == KErrPermissionDenied);
hgs
parents:
diff changeset
  3381
hgs
parents:
diff changeset
  3382
	User::After(2000000);	// should die within two seconds if it is going to die.
hgs
parents:
diff changeset
  3383
hgs
parents:
diff changeset
  3384
	// can we still find it? Should be still around!
hgs
parents:
diff changeset
  3385
	found2 = ProcessExists(KRMDebugAppName2);
hgs
parents:
diff changeset
  3386
	test (found2);
hgs
parents:
diff changeset
  3387
hgs
parents:
diff changeset
  3388
	}
hgs
parents:
diff changeset
  3389
hgs
parents:
diff changeset
  3390
//----------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
  3391
//! @SYMTestCaseID      KBase-T-RMDEBUG2-1388
hgs
parents:
diff changeset
  3392
//! @SYMTestType
hgs
parents:
diff changeset
  3393
//! @SYMPREQ            PREQ1426
hgs
parents:
diff changeset
  3394
//! @SYMTestCaseDesc    Tests the correct operation of the AddProcess and Remove Process
hgs
parents:
diff changeset
  3395
//! @SYMTestActions     1. Registers for AddProcess and Remove Process events
hgs
parents:
diff changeset
  3396
//!                     2. Starts a test process z:\sys\bin\t_rmdebug_security0.exe
hgs
parents:
diff changeset
  3397
//!                     3. Wait for the AddProcess event to be reported
hgs
parents:
diff changeset
  3398
//!                     4. Kill the newly started test process
hgs
parents:
diff changeset
  3399
//!                     5. Wait for the RemoveProcess event to be reported
hgs
parents:
diff changeset
  3400
//!                     6. Tell the DSS it is no longer interested in AddProcess and RemoveProcess events
hgs
parents:
diff changeset
  3401
//!
hgs
parents:
diff changeset
  3402
//! @SYMTestExpectedResults KErrNone.
hgs
parents:
diff changeset
  3403
//! @SYMTestPriority        High
hgs
parents:
diff changeset
  3404
//! @SYMTestStatus          Implemented
hgs
parents:
diff changeset
  3405
//----------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
  3406
hgs
parents:
diff changeset
  3407
void CRunModeAgent::TestAddRemoveProcessEvents()
hgs
parents:
diff changeset
  3408
	{
hgs
parents:
diff changeset
  3409
	test.Next(_L("TestAddRemoveProcessEvents\n"));
hgs
parents:
diff changeset
  3410
hgs
parents:
diff changeset
  3411
	// attach to a process (e.g. one of the simple security test programs)
hgs
parents:
diff changeset
  3412
	// launch the security program
hgs
parents:
diff changeset
  3413
	// wait for the add event
hgs
parents:
diff changeset
  3414
	// continue the program.
hgs
parents:
diff changeset
  3415
	// wait for the remove event
hgs
parents:
diff changeset
  3416
	// detach process
hgs
parents:
diff changeset
  3417
hgs
parents:
diff changeset
  3418
	test(KErrNone == iServSession.AttachExecutable(KRMDebugSecurity0FileName, EFalse));
hgs
parents:
diff changeset
  3419
hgs
parents:
diff changeset
  3420
	test(KErrNone == iServSession.SetEventAction(KRMDebugSecurity0FileName,EEventsAddProcess, EActionContinue));
hgs
parents:
diff changeset
  3421
hgs
parents:
diff changeset
  3422
	test(KErrNone == iServSession.SetEventAction(KRMDebugSecurity0FileName,EEventsRemoveProcess, EActionContinue));
hgs
parents:
diff changeset
  3423
hgs
parents:
diff changeset
  3424
	// Creator thread ID of the current thread (to be creator of test application)
hgs
parents:
diff changeset
  3425
	TInt creatorThreadId = RThread().Id();
hgs
parents:
diff changeset
  3426
hgs
parents:
diff changeset
  3427
	RProcess process;
hgs
parents:
diff changeset
  3428
	TInt err = process.Create(KRMDebugSecurity0FileName, KNullDesC, EOwnerProcess);
hgs
parents:
diff changeset
  3429
	test (err == KErrNone);
hgs
parents:
diff changeset
  3430
hgs
parents:
diff changeset
  3431
	// Rendezvous with process
hgs
parents:
diff changeset
  3432
	TRequestStatus status;
hgs
parents:
diff changeset
  3433
	process.Rendezvous(status);
hgs
parents:
diff changeset
  3434
hgs
parents:
diff changeset
  3435
	// Start the test program
hgs
parents:
diff changeset
  3436
	process.Resume();
hgs
parents:
diff changeset
  3437
	User::WaitForRequest(status);
hgs
parents:
diff changeset
  3438
	test(status==KErrNone);
hgs
parents:
diff changeset
  3439
hgs
parents:
diff changeset
  3440
	// Wait for the addprocess event
hgs
parents:
diff changeset
  3441
	TEventInfo info;
hgs
parents:
diff changeset
  3442
	TPtr8 infoPtr((TUint8*)&info,0,sizeof(TEventInfo));
hgs
parents:
diff changeset
  3443
hgs
parents:
diff changeset
  3444
	iServSession.GetEvent(KRMDebugSecurity0FileName,status,infoPtr);
hgs
parents:
diff changeset
  3445
hgs
parents:
diff changeset
  3446
	// Wait for notification of the addprocess hit event
hgs
parents:
diff changeset
  3447
	User::WaitForRequest(status);
hgs
parents:
diff changeset
  3448
	test(status==KErrNone);
hgs
parents:
diff changeset
  3449
hgs
parents:
diff changeset
  3450
	// Check this was the right kind of event
hgs
parents:
diff changeset
  3451
	test(info.iEventType == EEventsAddProcess);
hgs
parents:
diff changeset
  3452
hgs
parents:
diff changeset
  3453
	const TInt uid3offset = 2;
hgs
parents:
diff changeset
  3454
hgs
parents:
diff changeset
  3455
	// Get UID3 for current process
hgs
parents:
diff changeset
  3456
	TUint32 Uid3 = process.Type()[uid3offset].iUid;
hgs
parents:
diff changeset
  3457
hgs
parents:
diff changeset
  3458
	// Check correct UID3 is returned from the driver
hgs
parents:
diff changeset
  3459
    test(info.iAddProcessInfo.iUid3 == Uid3);
hgs
parents:
diff changeset
  3460
hgs
parents:
diff changeset
  3461
    // Check correct creator ID for test application is returned from the driver
hgs
parents:
diff changeset
  3462
    test(info.iAddProcessInfo.iCreatorThreadId == creatorThreadId);
hgs
parents:
diff changeset
  3463
hgs
parents:
diff changeset
  3464
	// Kill the process, as we don't need it anymore
hgs
parents:
diff changeset
  3465
	process.Kill(KErrNone);
hgs
parents:
diff changeset
  3466
hgs
parents:
diff changeset
  3467
	// Wait for the remove process event
hgs
parents:
diff changeset
  3468
	iServSession.GetEvent(KRMDebugSecurity0FileName,status,infoPtr);
hgs
parents:
diff changeset
  3469
hgs
parents:
diff changeset
  3470
	// Wait for notification of the remove process hit event
hgs
parents:
diff changeset
  3471
	User::WaitForRequest(status);
hgs
parents:
diff changeset
  3472
	test(status==KErrNone);
hgs
parents:
diff changeset
  3473
hgs
parents:
diff changeset
  3474
	// Check this was the right kind of event
hgs
parents:
diff changeset
  3475
	test(info.iEventType == EEventsRemoveProcess);
hgs
parents:
diff changeset
  3476
hgs
parents:
diff changeset
  3477
	test(KErrNone == iServSession.SetEventAction(KRMDebugSecurity0FileName,EEventsRemoveProcess, EActionIgnore));
hgs
parents:
diff changeset
  3478
hgs
parents:
diff changeset
  3479
	test(KErrNone == iServSession.SetEventAction(KRMDebugSecurity0FileName,EEventsAddProcess, EActionIgnore));
hgs
parents:
diff changeset
  3480
hgs
parents:
diff changeset
  3481
	test(KErrNone == iServSession.DetachExecutable(KRMDebugSecurity0FileName));
hgs
parents:
diff changeset
  3482
hgs
parents:
diff changeset
  3483
	}
hgs
parents:
diff changeset
  3484
hgs
parents:
diff changeset
  3485
//----------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
  3486
//! @SYMTestCaseID      KBase-T-RMDEBUG2-0736
hgs
parents:
diff changeset
  3487
//! @SYMTestType
hgs
parents:
diff changeset
  3488
//! @SYMPREQ            PREQ1426
hgs
parents:
diff changeset
  3489
//! @SYMTestCaseDesc    Checks that process break points can be set, and that they can co-exist alongside thread breakpoints
hgs
parents:
diff changeset
  3490
//! @SYMTestActions     Checks that process break points can be set, and that they can co-exist alongside thread breakpoints
hgs
parents:
diff changeset
  3491
//!
hgs
parents:
diff changeset
  3492
//! @SYMTestExpectedResults KErrNone.
hgs
parents:
diff changeset
  3493
//! @SYMTestPriority        High
hgs
parents:
diff changeset
  3494
//! @SYMTestStatus          Implemented
hgs
parents:
diff changeset
  3495
//----------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
  3496
void CRunModeAgent::TestProcessBreakPoints(void)
hgs
parents:
diff changeset
  3497
	{
hgs
parents:
diff changeset
  3498
	test.Next(_L("TestProcessBreakPoints\n"));
hgs
parents:
diff changeset
  3499
hgs
parents:
diff changeset
  3500
	// check that process breakpoints are supported
hgs
parents:
diff changeset
  3501
	TTag tag = GetTag(ETagHeaderIdBreakpoints, EBreakpointProcess);
hgs
parents:
diff changeset
  3502
	test(tag.iValue);
hgs
parents:
diff changeset
  3503
hgs
parents:
diff changeset
  3504
	test(KErrNone == iServSession.AttachExecutable(iFileName, EFalse));
hgs
parents:
diff changeset
  3505
	test(KErrNone == iServSession.SuspendThread(iThreadID));
hgs
parents:
diff changeset
  3506
hgs
parents:
diff changeset
  3507
	// Try to set the breakpoint
hgs
parents:
diff changeset
  3508
	TBreakId breakId;
hgs
parents:
diff changeset
  3509
	TUint32 address = (TUint32)(&RMDebug_BranchTst1);
hgs
parents:
diff changeset
  3510
	RProcess process;
hgs
parents:
diff changeset
  3511
	TProcessId processId = process.Id();
hgs
parents:
diff changeset
  3512
	process.Close();
hgs
parents:
diff changeset
  3513
hgs
parents:
diff changeset
  3514
	test(KErrNone == iServSession.SetProcessBreak(breakId, processId, address, EArmMode));
hgs
parents:
diff changeset
  3515
	test(KErrAlreadyExists == iServSession.SetBreak(breakId, iThreadID, address, EArmMode));
hgs
parents:
diff changeset
  3516
	test(KErrAlreadyExists == iServSession.SetBreak(breakId, iThreadID, address, EThumbMode));
hgs
parents:
diff changeset
  3517
	test(KErrAlreadyExists == iServSession.SetProcessBreak(breakId, processId, address, EArmMode));
hgs
parents:
diff changeset
  3518
	test(KErrAlreadyExists == iServSession.SetProcessBreak(breakId, processId, address, EThumbMode));
hgs
parents:
diff changeset
  3519
	test(KErrNone == iServSession.ClearBreak(breakId));
hgs
parents:
diff changeset
  3520
hgs
parents:
diff changeset
  3521
	test(KErrNone == iServSession.SetBreak(breakId, iThreadID, address, EArmMode));
hgs
parents:
diff changeset
  3522
	test(KErrAlreadyExists == iServSession.SetProcessBreak(breakId, processId, address, EArmMode));
hgs
parents:
diff changeset
  3523
	test(KErrAlreadyExists == iServSession.SetProcessBreak(breakId, processId, address, EThumbMode));
hgs
parents:
diff changeset
  3524
	test(KErrNone == iServSession.ClearBreak(breakId));
hgs
parents:
diff changeset
  3525
hgs
parents:
diff changeset
  3526
	test(KErrNone == iServSession.ResumeThread(iThreadID));
hgs
parents:
diff changeset
  3527
hgs
parents:
diff changeset
  3528
	test(KErrNone == iServSession.DetachExecutable(iFileName));
hgs
parents:
diff changeset
  3529
	}
hgs
parents:
diff changeset
  3530
hgs
parents:
diff changeset
  3531
//----------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
  3532
//! @SYMTestCaseID      KBase-T-RMDEBUG2-1309
hgs
parents:
diff changeset
  3533
//! @SYMTestType
hgs
parents:
diff changeset
  3534
//! @SYMPREQ            PREQ1426
hgs
parents:
diff changeset
  3535
//! @SYMTestCaseDesc    Checks that in the case of multiple low priority events (user traces in this case) we can still receive higher
hgs
parents:
diff changeset
  3536
//!				priority events should the buffer reach a critical level
hgs
parents:
diff changeset
  3537
//! @SYMTestActions     Run to first breakpoint in our test code. Then multiple trace events are issued. We should still be able to hit
hgs
parents:
diff changeset
  3538
//!				the second breakpoint
hgs
parents:
diff changeset
  3539
//!
hgs
parents:
diff changeset
  3540
//! @SYMTestExpectedResults KErrNone.
hgs
parents:
diff changeset
  3541
//! @SYMTestPriority        High
hgs
parents:
diff changeset
  3542
//! @SYMTestStatus          Implemented
hgs
parents:
diff changeset
  3543
//----------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
  3544
hgs
parents:
diff changeset
  3545
void CRunModeAgent::TestMultipleTraceEvents(void)
hgs
parents:
diff changeset
  3546
	{
hgs
parents:
diff changeset
  3547
	test.Next(_L("TestMultipleTraceEvents\n"));
hgs
parents:
diff changeset
  3548
hgs
parents:
diff changeset
  3549
	//attach to target debug process
hgs
parents:
diff changeset
  3550
	test(KErrNone == iServSession.AttachExecutable(iFileName, EFalse));
hgs
parents:
diff changeset
  3551
hgs
parents:
diff changeset
  3552
	//set the target thread to execute the trace test function
hgs
parents:
diff changeset
  3553
	test(KErrNone == SwitchTestFunction(EMultipleTraceCalls, EFalse));
hgs
parents:
diff changeset
  3554
	
hgs
parents:
diff changeset
  3555
	
hgs
parents:
diff changeset
  3556
hgs
parents:
diff changeset
  3557
	//register interest in BP's & trace events and trace ignored events
hgs
parents:
diff changeset
  3558
	test(KErrNone == iServSession.SetEventAction(iFileName,EEventsBreakPoint, EActionSuspend));
hgs
parents:
diff changeset
  3559
	test(KErrNone == iServSession.SetEventAction(iFileName,EEventsUserTrace, EActionContinue));
hgs
parents:
diff changeset
  3560
	test(KErrNone == iServSession.SetEventAction(iFileName,EEventsUserTracesLost, EActionContinue));
hgs
parents:
diff changeset
  3561
hgs
parents:
diff changeset
  3562
	// Try to set the breakpoints
hgs
parents:
diff changeset
  3563
	TBreakId armBreakId;
hgs
parents:
diff changeset
  3564
	TBreakId armBreakId2;
hgs
parents:
diff changeset
  3565
	TUint32 address = (TUint32)(&RMDebug_BranchTst1);
hgs
parents:
diff changeset
  3566
	TUint32 address2 = (TUint32)(&RMDebug_StepTest_Non_PC_Modifying);
hgs
parents:
diff changeset
  3567
hgs
parents:
diff changeset
  3568
	test(KErrNone == iServSession.SetBreak(armBreakId,iThreadID,address,EArmMode));
hgs
parents:
diff changeset
  3569
	test(KErrNone == iServSession.SetBreak(armBreakId2,iThreadID,address2,EArmMode));
hgs
parents:
diff changeset
  3570
hgs
parents:
diff changeset
  3571
	// Continue the thread
hgs
parents:
diff changeset
  3572
	test(KErrNone == iServSession.ResumeThread(iThreadID));
hgs
parents:
diff changeset
  3573
hgs
parents:
diff changeset
  3574
	// wait for the breakpoint to be hit
hgs
parents:
diff changeset
  3575
	TEventInfo info;
hgs
parents:
diff changeset
  3576
	static TRequestStatus status;
hgs
parents:
diff changeset
  3577
hgs
parents:
diff changeset
  3578
	TPtr8 infoPtr((TUint8*)&info,0,sizeof(TEventInfo));
hgs
parents:
diff changeset
  3579
	iServSession.GetEvent(iFileName,status,infoPtr);
hgs
parents:
diff changeset
  3580
hgs
parents:
diff changeset
  3581
	// Wait for notification of the 1st breakpoint hit event
hgs
parents:
diff changeset
  3582
	User::WaitForRequest(status);
hgs
parents:
diff changeset
  3583
	test(status==KErrNone);
hgs
parents:
diff changeset
  3584
hgs
parents:
diff changeset
  3585
	// info should now be filled with the details
hgs
parents:
diff changeset
  3586
	test(info.iEventType == EEventsBreakPoint);
hgs
parents:
diff changeset
  3587
	test(info.iThreadBreakPointInfo.iRmdArmExcInfo.iR15 == address);
hgs
parents:
diff changeset
  3588
	test(info.iProcessIdValid);
hgs
parents:
diff changeset
  3589
	test(info.iThreadIdValid);
hgs
parents:
diff changeset
  3590
hgs
parents:
diff changeset
  3591
	// Continue the thread
hgs
parents:
diff changeset
  3592
	test(KErrNone == iServSession.ResumeThread(iThreadID));
hgs
parents:
diff changeset
  3593
hgs
parents:
diff changeset
  3594
	//Now we try to hit the second breakpoint. This will occur after a number of trace calls. If we hit this breakpoint it
hgs
parents:
diff changeset
  3595
	//means many trace calls are not preventing us hitting breakpoints.
hgs
parents:
diff changeset
  3596
	iServSession.GetEvent(iFileName,status,infoPtr);
hgs
parents:
diff changeset
  3597
hgs
parents:
diff changeset
  3598
	// Wait for notification of the 2nd breakpoint hit event
hgs
parents:
diff changeset
  3599
	User::WaitForRequest(status);
hgs
parents:
diff changeset
  3600
	test(status==KErrNone);
hgs
parents:
diff changeset
  3601
hgs
parents:
diff changeset
  3602
	TBool receivedTracesLost = EFalse;
hgs
parents:
diff changeset
  3603
hgs
parents:
diff changeset
  3604
	while(info.iEventType == EEventsUserTrace || info.iEventType == EEventsUserTracesLost)
hgs
parents:
diff changeset
  3605
		{
hgs
parents:
diff changeset
  3606
		//ensure we get told traces are being thrown away - we generate enough to flood the buffer
hgs
parents:
diff changeset
  3607
		if(info.iEventType == EEventsUserTracesLost)
hgs
parents:
diff changeset
  3608
			{
hgs
parents:
diff changeset
  3609
			receivedTracesLost = ETrue;
hgs
parents:
diff changeset
  3610
hgs
parents:
diff changeset
  3611
			// Now stop the target thread from generating trace events
hgs
parents:
diff changeset
  3612
			test(KErrNone == SwitchTestFunction(EDoNothing, EFalse));
hgs
parents:
diff changeset
  3613
			break;
hgs
parents:
diff changeset
  3614
			}
hgs
parents:
diff changeset
  3615
		else
hgs
parents:
diff changeset
  3616
			{
hgs
parents:
diff changeset
  3617
			// Its EEventsUserTrace, so delay us in getting the next event so that it will be more 
hgs
parents:
diff changeset
  3618
			// likely to get a EEventsUserTracesLost next time. 
hgs
parents:
diff changeset
  3619
			// This is important on SMP since the platform can process lots of events, and thus
hgs
parents:
diff changeset
  3620
			// withouth the delay it is difficult for this test to reproduce the abnormal situation of 
hgs
parents:
diff changeset
  3621
			// lost trace packets
hgs
parents:
diff changeset
  3622
			User::After(200000);
hgs
parents:
diff changeset
  3623
			}
hgs
parents:
diff changeset
  3624
hgs
parents:
diff changeset
  3625
		iServSession.GetEvent(iFileName,status,infoPtr);
hgs
parents:
diff changeset
  3626
hgs
parents:
diff changeset
  3627
		// Wait for notification of the 2nd breakpoint hit event
hgs
parents:
diff changeset
  3628
		User::WaitForRequest(status);
hgs
parents:
diff changeset
  3629
		test(status==KErrNone);
hgs
parents:
diff changeset
  3630
		}
hgs
parents:
diff changeset
  3631
hgs
parents:
diff changeset
  3632
	//make sure we got told traces were lost
hgs
parents:
diff changeset
  3633
	test(receivedTracesLost != EFalse);
hgs
parents:
diff changeset
  3634
hgs
parents:
diff changeset
  3635
	//dont care for breakpoints or trace events no more
hgs
parents:
diff changeset
  3636
	test(KErrNone == iServSession.SetEventAction(iFileName,EEventsBreakPoint, EActionIgnore));
hgs
parents:
diff changeset
  3637
	test(KErrNone == iServSession.SetEventAction(iFileName,EEventsUserTrace, EActionIgnore));
hgs
parents:
diff changeset
  3638
	test(KErrNone == iServSession.SetEventAction(iFileName,EEventsUserTracesLost, EActionIgnore));
hgs
parents:
diff changeset
  3639
hgs
parents:
diff changeset
  3640
	//clear the breaks we set
hgs
parents:
diff changeset
  3641
	test(KErrNone == iServSession.ClearBreak(armBreakId));
hgs
parents:
diff changeset
  3642
	test(KErrNone == iServSession.ClearBreak(armBreakId2));
hgs
parents:
diff changeset
  3643
hgs
parents:
diff changeset
  3644
	// Continue the thread
hgs
parents:
diff changeset
  3645
	test(KErrNone == iServSession.ResumeThread(iThreadID));
hgs
parents:
diff changeset
  3646
hgs
parents:
diff changeset
  3647
	//attach to target debug process
hgs
parents:
diff changeset
  3648
	test(KErrNone == iServSession.DetachExecutable(iFileName));
hgs
parents:
diff changeset
  3649
hgs
parents:
diff changeset
  3650
	}
hgs
parents:
diff changeset
  3651
hgs
parents:
diff changeset
  3652
//----------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
  3653
//! @SYMTestCaseID KBase-T-RMDEBUG2-2441
hgs
parents:
diff changeset
  3654
//! @SYMTestType
hgs
parents:
diff changeset
  3655
//! @SYMPREQ PREQ1426
hgs
parents:
diff changeset
  3656
//! @SYMTestCaseDesc Test clearing of a process breakpoint once the process has been killed.
hgs
parents:
diff changeset
  3657
//! @SYMTestActions Creates a new process then tries to set a process breakpoint and then kills the process which should clear the previously set breakpoint. Then repeat the step once again.
hgs
parents:
diff changeset
  3658
//! @SYMTestExpectedResults KErrNone
hgs
parents:
diff changeset
  3659
//! @SYMTestPriority High
hgs
parents:
diff changeset
  3660
//! @SYMTestStatus Implemented
hgs
parents:
diff changeset
  3661
//----------------------------------------------------------------------------------------------
hgs
parents:
diff changeset
  3662
hgs
parents:
diff changeset
  3663
void CRunModeAgent::TestProcessKillBreakpoint(void)
hgs
parents:
diff changeset
  3664
	{
hgs
parents:
diff changeset
  3665
	test.Next(_L("TestProcessKillBreakpoint\n"));
hgs
parents:
diff changeset
  3666
hgs
parents:
diff changeset
  3667
	DoTestProcessKillBreakpoint();
hgs
parents:
diff changeset
  3668
	// called once again
hgs
parents:
diff changeset
  3669
	// to check if we can set the breakpoint once again after the process gets killed
hgs
parents:
diff changeset
  3670
	DoTestProcessKillBreakpoint();
hgs
parents:
diff changeset
  3671
hgs
parents:
diff changeset
  3672
	// And do it a couple more times, there was a leaked process handle that didn't show up
hgs
parents:
diff changeset
  3673
	// until the third or fourth time this code was run
hgs
parents:
diff changeset
  3674
	DoTestProcessKillBreakpoint();
hgs
parents:
diff changeset
  3675
	DoTestProcessKillBreakpoint();
hgs
parents:
diff changeset
  3676
	}
hgs
parents:
diff changeset
  3677
hgs
parents:
diff changeset
  3678
void CRunModeAgent::DoTestProcessKillBreakpoint()
hgs
parents:
diff changeset
  3679
	{
hgs
parents:
diff changeset
  3680
	test.Printf(_L("\nDoTestProcessKillBreakpoint\n"));
hgs
parents:
diff changeset
  3681
hgs
parents:
diff changeset
  3682
	// check that killing a process is supported
hgs
parents:
diff changeset
  3683
	TTag tag = GetTag(ETagHeaderIdKillObjects, EFunctionalityKillProcess);
hgs
parents:
diff changeset
  3684
	test(tag.iValue);
hgs
parents:
diff changeset
  3685
	// check that killing a thread is not supported
hgs
parents:
diff changeset
  3686
	tag = GetTag(ETagHeaderIdKillObjects, EFunctionalityKillThread);
hgs
parents:
diff changeset
  3687
	test(!tag.iValue);
hgs
parents:
diff changeset
  3688
hgs
parents:
diff changeset
  3689
	// attach first!
hgs
parents:
diff changeset
  3690
	test ( KErrNone == iServSession.AttachExecutable(KRMDebugTestApplication, EFalse/*  Active */));
hgs
parents:
diff changeset
  3691
hgs
parents:
diff changeset
  3692
	RProcess processDebug;
hgs
parents:
diff changeset
  3693
	TThreadId dontCare;
hgs
parents:
diff changeset
  3694
	LaunchDebugProcessAndSetBreakpoint(processDebug, dontCare);
hgs
parents:
diff changeset
  3695
hgs
parents:
diff changeset
  3696
	// Not interested in breakpoint events any more
hgs
parents:
diff changeset
  3697
	test(KErrNone == iServSession.SetEventAction(KRMDebugTestApplication, EEventsProcessBreakPoint, EActionIgnore));
hgs
parents:
diff changeset
  3698
hgs
parents:
diff changeset
  3699
	// program now running, so try to kill it which should clear all the breakpoints
hgs
parents:
diff changeset
  3700
	test(KErrNone == iServSession.KillProcess(processDebug.Id(), 0  /* kill reason */ ));
hgs
parents:
diff changeset
  3701
hgs
parents:
diff changeset
  3702
	TRequestStatus stat;
hgs
parents:
diff changeset
  3703
	processDebug.NotifyDestruction(stat);
hgs
parents:
diff changeset
  3704
	processDebug.Close();
hgs
parents:
diff changeset
  3705
	TIMED_WAIT(stat, 1000);
hgs
parents:
diff changeset
  3706
hgs
parents:
diff changeset
  3707
	// release the program again
hgs
parents:
diff changeset
  3708
	test(KErrNone == iServSession.DetachExecutable(KRMDebugTestApplication));
hgs
parents:
diff changeset
  3709
	}
hgs
parents:
diff changeset
  3710
hgs
parents:
diff changeset
  3711
void CRunModeAgent::LaunchDebugProcessAndSetBreakpoint(RProcess& aResultProcess, TThreadId& aResultThread)
hgs
parents:
diff changeset
  3712
	{
hgs
parents:
diff changeset
  3713
	// define a property to pass on the address from the other process we would try to debug
hgs
parents:
diff changeset
  3714
	static _LIT_SECURITY_POLICY_PASS(KAllowAllPolicy);
hgs
parents:
diff changeset
  3715
	TInt err = RProperty::Define(RProcess().SecureId(), EMyPropertyInteger, RProperty::EInt, KAllowAllPolicy, KAllowAllPolicy);
hgs
parents:
diff changeset
  3716
	test (err == KErrNone || err == KErrAlreadyExists);
hgs
parents:
diff changeset
  3717
hgs
parents:
diff changeset
  3718
	RSemaphore addressGlobSem;
hgs
parents:
diff changeset
  3719
	//define a global semaphore to synchronise with debuggable process publishing the property
hgs
parents:
diff changeset
  3720
	err = addressGlobSem.CreateGlobal(_L("RMDebugGlobSem"), 0);
hgs
parents:
diff changeset
  3721
	test (err == KErrNone);
hgs
parents:
diff changeset
  3722
hgs
parents:
diff changeset
  3723
	// first launch a debuggable process
hgs
parents:
diff changeset
  3724
	RProcess& processDebug(aResultProcess);
hgs
parents:
diff changeset
  3725
	test ( KErrNone == LaunchProcess(processDebug, KRMDebugTestApplication(),ESpinForeverWithBreakPoint, 0, 0));
hgs
parents:
diff changeset
  3726
hgs
parents:
diff changeset
  3727
	// try to find the process in the list
hgs
parents:
diff changeset
  3728
	TBool found = ProcessExists(KRMDebugAppName);
hgs
parents:
diff changeset
  3729
	test (found);
hgs
parents:
diff changeset
  3730
hgs
parents:
diff changeset
  3731
	//search for the main thread created
hgs
parents:
diff changeset
  3732
   _LIT(KThreadWildCard, "t_rmdebug_app*");
hgs
parents:
diff changeset
  3733
	TProcessId processDebugId = processDebug.Id();
hgs
parents:
diff changeset
  3734
	TThreadId& threadDebugId(aResultThread);
hgs
parents:
diff changeset
  3735
hgs
parents:
diff changeset
  3736
   	TFindThread find(KThreadWildCard);
hgs
parents:
diff changeset
  3737
	TFullName name;
hgs
parents:
diff changeset
  3738
	found = EFalse;
hgs
parents:
diff changeset
  3739
	while(find.Next(name)==KErrNone && !found)
hgs
parents:
diff changeset
  3740
		{
hgs
parents:
diff changeset
  3741
		RThread thread;
hgs
parents:
diff changeset
  3742
		err = thread.Open(find);
hgs
parents:
diff changeset
  3743
       	if (err == KErrNone)
hgs
parents:
diff changeset
  3744
			{
hgs
parents:
diff changeset
  3745
			RProcess process;
hgs
parents:
diff changeset
  3746
			thread.Process(process);
hgs
parents:
diff changeset
  3747
			if (((TUint32)process.Id() == processDebugId))
hgs
parents:
diff changeset
  3748
				{
hgs
parents:
diff changeset
  3749
				TFullName fullname = thread.FullName();
hgs
parents:
diff changeset
  3750
				test.Printf(_L("Match Found Name: %S Process id: %ld Thread id: %ld\n"), &fullname, process.Id().Id(), thread.Id().Id());
hgs
parents:
diff changeset
  3751
				found = ETrue;
hgs
parents:
diff changeset
  3752
				threadDebugId = thread.Id();
hgs
parents:
diff changeset
  3753
				}
hgs
parents:
diff changeset
  3754
			process.Close();
hgs
parents:
diff changeset
  3755
			}
hgs
parents:
diff changeset
  3756
		thread.Close();
hgs
parents:
diff changeset
  3757
   		}
hgs
parents:
diff changeset
  3758
hgs
parents:
diff changeset
  3759
	test (found); //check if we actually found the thread we want to debug
hgs
parents:
diff changeset
  3760
hgs
parents:
diff changeset
  3761
	//waiting on semaphore to be sure that the property is set
hgs
parents:
diff changeset
  3762
	addressGlobSem.Wait();
hgs
parents:
diff changeset
  3763
hgs
parents:
diff changeset
  3764
	//get the value(property) for the breakpoint address for the process to debug
hgs
parents:
diff changeset
  3765
	TInt address;
hgs
parents:
diff changeset
  3766
	test(KErrNone == RProperty::Get(RProcess().SecureId(), EMyPropertyInteger, address));
hgs
parents:
diff changeset
  3767
hgs
parents:
diff changeset
  3768
	test.Printf(_L("Address retrieved to set breakpoint 0x%08x\n"), address);
hgs
parents:
diff changeset
  3769
hgs
parents:
diff changeset
  3770
	//suspend the thread before we set a breakpoint
hgs
parents:
diff changeset
  3771
	test (KErrNone == iServSession.SuspendThread(threadDebugId));
hgs
parents:
diff changeset
  3772
hgs
parents:
diff changeset
  3773
	//set a process breakpoint
hgs
parents:
diff changeset
  3774
	TBreakId breakId;
hgs
parents:
diff changeset
  3775
	test(KErrNone == iServSession.SetProcessBreak(breakId, processDebugId, address, EArmMode));
hgs
parents:
diff changeset
  3776
hgs
parents:
diff changeset
  3777
	test(KErrNone == iServSession.SetEventAction(KRMDebugTestApplication, EEventsProcessBreakPoint, EActionContinue));
hgs
parents:
diff changeset
  3778
hgs
parents:
diff changeset
  3779
	//resume the thread now
hgs
parents:
diff changeset
  3780
	test(KErrNone == iServSession.ResumeThread(threadDebugId));
hgs
parents:
diff changeset
  3781
hgs
parents:
diff changeset
  3782
	// wait for the breakpoint to be hit
hgs
parents:
diff changeset
  3783
	TRequestStatus status;
hgs
parents:
diff changeset
  3784
	TEventInfo info;
hgs
parents:
diff changeset
  3785
	TPtr8 infoPtr((TUint8*)&info,0,sizeof(TEventInfo));
hgs
parents:
diff changeset
  3786
	iServSession.GetEvent(KRMDebugTestApplication,status,infoPtr);
hgs
parents:
diff changeset
  3787
	// Wait for notification of the breakpoint hit event
hgs
parents:
diff changeset
  3788
	TIMED_WAIT(status, 2000);
hgs
parents:
diff changeset
  3789
	test(status==KErrNone);
hgs
parents:
diff changeset
  3790
hgs
parents:
diff changeset
  3791
	// info should now be filled with the details
hgs
parents:
diff changeset
  3792
	test(info.iEventType ==  EEventsProcessBreakPoint);
hgs
parents:
diff changeset
  3793
	test(info.iThreadBreakPointInfo.iRmdArmExcInfo.iR15 == address);
hgs
parents:
diff changeset
  3794
	test(info.iProcessIdValid);
hgs
parents:
diff changeset
  3795
	test(info.iThreadIdValid);
hgs
parents:
diff changeset
  3796
hgs
parents:
diff changeset
  3797
	addressGlobSem.Close();
hgs
parents:
diff changeset
  3798
	}
hgs
parents:
diff changeset
  3799
hgs
parents:
diff changeset
  3800
void CRunModeAgent::HelpTestSecurityAttachDetachExecutable(const TDesC& aProcessName, TBool aExpectSuccess)
hgs
parents:
diff changeset
  3801
	{
hgs
parents:
diff changeset
  3802
	RProcess process;
hgs
parents:
diff changeset
  3803
	TInt err = process.Create(aProcessName, KNullDesC, EOwnerProcess);
hgs
parents:
diff changeset
  3804
	test (err == KErrNone);
hgs
parents:
diff changeset
  3805
hgs
parents:
diff changeset
  3806
	// rendezvous with process
hgs
parents:
diff changeset
  3807
	TRequestStatus status;
hgs
parents:
diff changeset
  3808
	process.Rendezvous(status);
hgs
parents:
diff changeset
  3809
hgs
parents:
diff changeset
  3810
	// start the test program
hgs
parents:
diff changeset
  3811
	process.Resume();
hgs
parents:
diff changeset
  3812
	User::WaitForRequest(status);
hgs
parents:
diff changeset
  3813
	test(status==KErrNone);
hgs
parents:
diff changeset
  3814
hgs
parents:
diff changeset
  3815
	// attach to the program (passively)
hgs
parents:
diff changeset
  3816
	err = iServSession.AttachExecutable(aProcessName, EFalse);
hgs
parents:
diff changeset
  3817
hgs
parents:
diff changeset
  3818
	if( gUseDelay ) User::After(500000);
hgs
parents:
diff changeset
  3819
hgs
parents:
diff changeset
  3820
	// Do we expect to successfully attach
hgs
parents:
diff changeset
  3821
	if (aExpectSuccess)
hgs
parents:
diff changeset
  3822
	{
hgs
parents:
diff changeset
  3823
		// Yes
hgs
parents:
diff changeset
  3824
		test(KErrNone == err);
hgs
parents:
diff changeset
  3825
hgs
parents:
diff changeset
  3826
		// Now detach again
hgs
parents:
diff changeset
  3827
		test(KErrNone == iServSession.DetachExecutable(aProcessName));
hgs
parents:
diff changeset
  3828
		if( gUseDelay ) User::After(500000);
hgs
parents:
diff changeset
  3829
	}
hgs
parents:
diff changeset
  3830
	else
hgs
parents:
diff changeset
  3831
	{
hgs
parents:
diff changeset
  3832
		// No
hgs
parents:
diff changeset
  3833
		test(KErrPermissionDenied == err);
hgs
parents:
diff changeset
  3834
hgs
parents:
diff changeset
  3835
		// Just to be sure, try active attachment
hgs
parents:
diff changeset
  3836
		test(KErrPermissionDenied == iServSession.AttachExecutable(aProcessName, ETrue));
hgs
parents:
diff changeset
  3837
		if( gUseDelay ) User::After(500000);
hgs
parents:
diff changeset
  3838
	}
hgs
parents:
diff changeset
  3839
hgs
parents:
diff changeset
  3840
	// Kill the process, as we don't need it anymore
hgs
parents:
diff changeset
  3841
	process.Kill(KErrNone);
hgs
parents:
diff changeset
  3842
	if( gUseDelay ) User::After(500000);
hgs
parents:
diff changeset
  3843
	}
hgs
parents:
diff changeset
  3844
hgs
parents:
diff changeset
  3845
void CRunModeAgent::ReportPerformance(void)
hgs
parents:
diff changeset
  3846
//
hgs
parents:
diff changeset
  3847
// Reports performance metrics from all the tests
hgs
parents:
diff changeset
  3848
//
hgs
parents:
diff changeset
  3849
	{
hgs
parents:
diff changeset
  3850
	test.Printf(_L("\nPerformance\n"));
hgs
parents:
diff changeset
  3851
	test.Printf(_L("========================\n"));
hgs
parents:
diff changeset
  3852
hgs
parents:
diff changeset
  3853
	// Memory
hgs
parents:
diff changeset
  3854
	test.Printf(_L("Memory read: %d KBytes/sec\n"),iMemoryReadKbytesPerSecond);
hgs
parents:
diff changeset
  3855
	test.Printf(_L("Memory write: %d KBytes/sec\n"),iMemoryWriteKbytesPerSecond);
hgs
parents:
diff changeset
  3856
hgs
parents:
diff changeset
  3857
	// Registers
hgs
parents:
diff changeset
  3858
	// to do
hgs
parents:
diff changeset
  3859
hgs
parents:
diff changeset
  3860
	// events
hgs
parents:
diff changeset
  3861
	// to do
hgs
parents:
diff changeset
  3862
hgs
parents:
diff changeset
  3863
	// Breakpoints
hgs
parents:
diff changeset
  3864
	test.Printf(_L("Breakpoint set/clear: %d/sec\n"),iBreakpointsPerSecond);
hgs
parents:
diff changeset
  3865
	test.Printf(_L("Maximum number of breakpoints: %d\n"),iMaxBreakpoints);
hgs
parents:
diff changeset
  3866
hgs
parents:
diff changeset
  3867
	// Stepping
hgs
parents:
diff changeset
  3868
	test.Printf(_L("Stepping speed: %d/sec\n"),iStepsPerSecond);
hgs
parents:
diff changeset
  3869
hgs
parents:
diff changeset
  3870
	// Runtime
hgs
parents:
diff changeset
  3871
	TInt ticks = HelpGetTestTicks();
hgs
parents:
diff changeset
  3872
	test (ticks != 0);
hgs
parents:
diff changeset
  3873
hgs
parents:
diff changeset
  3874
	TInt nkTicksPerSecond = HelpTicksPerSecond();
hgs
parents:
diff changeset
  3875
	test (nkTicksPerSecond != 0);
hgs
parents:
diff changeset
  3876
hgs
parents:
diff changeset
  3877
	test.Printf(_L("Total test runtime: %d seconds\n"),ticks/nkTicksPerSecond);
hgs
parents:
diff changeset
  3878
hgs
parents:
diff changeset
  3879
	// Final sizes of executables/rom/ram etc
hgs
parents:
diff changeset
  3880
	// to do
hgs
parents:
diff changeset
  3881
hgs
parents:
diff changeset
  3882
	test.Printf(_L("\n"));
hgs
parents:
diff changeset
  3883
	}
hgs
parents:
diff changeset
  3884
hgs
parents:
diff changeset
  3885
/**
hgs
parents:
diff changeset
  3886
 * Helper code for the stepping tests. Sets a breakpoint in a running thread.
hgs
parents:
diff changeset
  3887
 * It suspends the thread, sets the breakpoint, and resumes the thread.
hgs
parents:
diff changeset
  3888
 *
hgs
parents:
diff changeset
  3889
 * @param aBreakId - Reference to a TBreakId which will be set when the breakpoint is set
hgs
parents:
diff changeset
  3890
 * @param aThreadId - The thread id for which we should set the breakpoint.
hgs
parents:
diff changeset
  3891
 * @param aBreakAddress - The address to set the breakpoint
hgs
parents:
diff changeset
  3892
 * @param aMode - The architecture of the breakpoint to be set (ARM/Thumb/Thumb2EE)
hgs
parents:
diff changeset
  3893
 * @return KErrNone if successful. One of the other system wide error codes otherwise.
hgs
parents:
diff changeset
  3894
 */
hgs
parents:
diff changeset
  3895
TInt CRunModeAgent::HelpTestStepSetBreak(TBreakId& aBreakId, TThreadId aThreadId, const TUint32 aBreakAddress, TArchitectureMode aMode, TBool aThreadSpecific, TProcessId aProcessId)
hgs
parents:
diff changeset
  3896
	{
hgs
parents:
diff changeset
  3897
	TInt err = KErrNone;
hgs
parents:
diff changeset
  3898
hgs
parents:
diff changeset
  3899
hgs
parents:
diff changeset
  3900
	// Set the breakpoint
hgs
parents:
diff changeset
  3901
	err = aThreadSpecific
hgs
parents:
diff changeset
  3902
		? iServSession.SetBreak(aBreakId,aThreadId,aBreakAddress,aMode)
hgs
parents:
diff changeset
  3903
		: iServSession.SetProcessBreak(aBreakId, aProcessId, aBreakAddress, aMode);
hgs
parents:
diff changeset
  3904
	if (err != KErrNone)
hgs
parents:
diff changeset
  3905
		{
hgs
parents:
diff changeset
  3906
		test.Printf(_L("HelpTestStepSetBreak - Failed to set breakpoint\n"));
hgs
parents:
diff changeset
  3907
		return err;
hgs
parents:
diff changeset
  3908
		}
hgs
parents:
diff changeset
  3909
hgs
parents:
diff changeset
  3910
	// Continue the thread
hgs
parents:
diff changeset
  3911
	err = iServSession.ResumeThread(aThreadId);
hgs
parents:
diff changeset
  3912
	if (err != KErrNone)
hgs
parents:
diff changeset
  3913
		{
hgs
parents:
diff changeset
  3914
		test.Printf(_L("HelpTestStepSetBreak - Failed to resume thread\n"));
hgs
parents:
diff changeset
  3915
		return err;
hgs
parents:
diff changeset
  3916
		}
hgs
parents:
diff changeset
  3917
hgs
parents:
diff changeset
  3918
	return KErrNone;
hgs
parents:
diff changeset
  3919
	}
hgs
parents:
diff changeset
  3920
hgs
parents:
diff changeset
  3921
/**
hgs
parents:
diff changeset
  3922
 * Helper code for the stepping tests. Clears a breakpoint in a running thread.
hgs
parents:
diff changeset
  3923
 * It suspends the thread, clears the breakpoint, and resumes the thread.
hgs
parents:
diff changeset
  3924
 *
hgs
parents:
diff changeset
  3925
 * @param aBreakId - Reference to a TBreakId which will be set when the breakpoint is set
hgs
parents:
diff changeset
  3926
 * @return KErrNone if successful. One of the other system wide error codes otherwise.
hgs
parents:
diff changeset
  3927
 */
hgs
parents:
diff changeset
  3928
TInt CRunModeAgent::HelpTestStepClearBreak(TBreakId aBreakId, const TThreadId aThreadId, TBool aThreadSpecific)
hgs
parents:
diff changeset
  3929
	{
hgs
parents:
diff changeset
  3930
	TInt err = KErrNone;
hgs
parents:
diff changeset
  3931
hgs
parents:
diff changeset
  3932
	// Find out what thread id we need to suspend
hgs
parents:
diff changeset
  3933
	TThreadId threadId;
hgs
parents:
diff changeset
  3934
	TProcessId processId;
hgs
parents:
diff changeset
  3935
	TUint32 address;
hgs
parents:
diff changeset
  3936
	TArchitectureMode mode;
hgs
parents:
diff changeset
  3937
hgs
parents:
diff changeset
  3938
	err = aThreadSpecific
hgs
parents:
diff changeset
  3939
		? iServSession.BreakInfo(aBreakId, threadId, address, mode)
hgs
parents:
diff changeset
  3940
		: iServSession.ProcessBreakInfo(aBreakId, processId, address, mode);
hgs
parents:
diff changeset
  3941
	if (err != KErrNone )
hgs
parents:
diff changeset
  3942
		{
hgs
parents:
diff changeset
  3943
		test.Printf(_L("HelpTestStepClearBreak - failed to obtain information for breakpoint\n"));
hgs
parents:
diff changeset
  3944
		return err;
hgs
parents:
diff changeset
  3945
		}
hgs
parents:
diff changeset
  3946
	if(aThreadSpecific && aThreadId != threadId)
hgs
parents:
diff changeset
  3947
		{
hgs
parents:
diff changeset
  3948
		test.Printf(_L("HelpTestStepClearBreak - mismatched thread Ids\n"));
hgs
parents:
diff changeset
  3949
		return KErrGeneral;
hgs
parents:
diff changeset
  3950
		}
hgs
parents:
diff changeset
  3951
hgs
parents:
diff changeset
  3952
	// Clear the breakpoint
hgs
parents:
diff changeset
  3953
	err = iServSession.ClearBreak(aBreakId);
hgs
parents:
diff changeset
  3954
	if (err != KErrNone)
hgs
parents:
diff changeset
  3955
		{
hgs
parents:
diff changeset
  3956
		test.Printf(_L("HelpTestStepClearBreak - failed to clear breakpoint\n"));
hgs
parents:
diff changeset
  3957
		return err;
hgs
parents:
diff changeset
  3958
		}
hgs
parents:
diff changeset
  3959
hgs
parents:
diff changeset
  3960
	return KErrNone;
hgs
parents:
diff changeset
  3961
	}
hgs
parents:
diff changeset
  3962
hgs
parents:
diff changeset
  3963
/**
hgs
parents:
diff changeset
  3964
 * Helper code for the stepping tests. Waits for a previously set breakpoint to be hit.
hgs
parents:
diff changeset
  3965
 *
hgs
parents:
diff changeset
  3966
 * @param aProcessName - The name of the process in which the breakpoint is set. E.g. z:\sys\bin\app.exe
hgs
parents:
diff changeset
  3967
 * @param aEventInfo - The event information block which is filled in when the breakpoint is hit.
hgs
parents:
diff changeset
  3968
 * @return KErrNone if successful. One of the other system wide error codes otherwise.
hgs
parents:
diff changeset
  3969
 */
hgs
parents:
diff changeset
  3970
TInt CRunModeAgent::HelpTestStepWaitForBreak(const TDesC& aProcessName, TEventInfo& aEventInfo)
hgs
parents:
diff changeset
  3971
	{
hgs
parents:
diff changeset
  3972
	static TRequestStatus status;
hgs
parents:
diff changeset
  3973
hgs
parents:
diff changeset
  3974
	TPtr8 infoPtr((TUint8*)&aEventInfo,0,sizeof(TEventInfo));
hgs
parents:
diff changeset
  3975
hgs
parents:
diff changeset
  3976
	iServSession.GetEvent(aProcessName,status,infoPtr);
hgs
parents:
diff changeset
  3977
hgs
parents:
diff changeset
  3978
	// Wait for notification of the breakpoint hit event
hgs
parents:
diff changeset
  3979
	User::WaitForRequest(status);
hgs
parents:
diff changeset
  3980
	if (status == KErrNone)
hgs
parents:
diff changeset
  3981
		{
hgs
parents:
diff changeset
  3982
		return KErrNone;
hgs
parents:
diff changeset
  3983
		}
hgs
parents:
diff changeset
  3984
	else
hgs
parents:
diff changeset
  3985
		{
hgs
parents:
diff changeset
  3986
		return KErrGeneral;
hgs
parents:
diff changeset
  3987
		}
hgs
parents:
diff changeset
  3988
	}
hgs
parents:
diff changeset
  3989
hgs
parents:
diff changeset
  3990
/**
hgs
parents:
diff changeset
  3991
 * Helper code for the stepping tests. Reads the current target PC for a given thread.
hgs
parents:
diff changeset
  3992
 *
hgs
parents:
diff changeset
  3993
 * @param aThreadId - Thread id for which to read the current target PC.
hgs
parents:
diff changeset
  3994
 * @param aPc - Reference to a TUint32 which will be set to the current target PC.
hgs
parents:
diff changeset
  3995
 * @return KErrNone if successful. One of the other system wide error codes otherwise.
hgs
parents:
diff changeset
  3996
 */
hgs
parents:
diff changeset
  3997
TInt CRunModeAgent::HelpTestStepReadPC(TThreadId aThreadId, TUint32& aPC)
hgs
parents:
diff changeset
  3998
	{
hgs
parents:
diff changeset
  3999
	TInt err = KErrNone;
hgs
parents:
diff changeset
  4000
hgs
parents:
diff changeset
  4001
	//create buffer containing PC register ID
hgs
parents:
diff changeset
  4002
	RBuf8 pcId;
hgs
parents:
diff changeset
  4003
	err = pcId.Create(sizeof(TRegisterInfo));
hgs
parents:
diff changeset
  4004
	if (err != KErrNone)
hgs
parents:
diff changeset
  4005
		{
hgs
parents:
diff changeset
  4006
		return err;
hgs
parents:
diff changeset
  4007
		}
hgs
parents:
diff changeset
  4008
hgs
parents:
diff changeset
  4009
	TRegisterInfo reg1 = (TRegisterInfo)0x00000f00;
hgs
parents:
diff changeset
  4010
	pcId.Append(reinterpret_cast<const TUint8*>(&reg1), sizeof(TRegisterInfo));
hgs
parents:
diff changeset
  4011
hgs
parents:
diff changeset
  4012
	//create buffer containing desired PC value
hgs
parents:
diff changeset
  4013
	TPtr8 pcValue((TUint8*)&aPC,4,4);
hgs
parents:
diff changeset
  4014
hgs
parents:
diff changeset
  4015
	//create buffer for PC flag value
hgs
parents:
diff changeset
  4016
	RBuf8 pcFlag;
hgs
parents:
diff changeset
  4017
	err = pcFlag.Create(sizeof(TUint8));
hgs
parents:
diff changeset
  4018
hgs
parents:
diff changeset
  4019
	//read the new PC value
hgs
parents:
diff changeset
  4020
	err = iServSession.ReadRegisters(aThreadId, pcId, pcValue, pcFlag);
hgs
parents:
diff changeset
  4021
	if (err != KErrNone)
hgs
parents:
diff changeset
  4022
		{
hgs
parents:
diff changeset
  4023
		//delete temporary buffers
hgs
parents:
diff changeset
  4024
		pcId.Close();
hgs
parents:
diff changeset
  4025
		pcFlag.Close();
hgs
parents:
diff changeset
  4026
		return err;
hgs
parents:
diff changeset
  4027
		}
hgs
parents:
diff changeset
  4028
hgs
parents:
diff changeset
  4029
	//get the flag and check the PC value was read ok
hgs
parents:
diff changeset
  4030
	TRegisterFlag flag = ENotSupported;
hgs
parents:
diff changeset
  4031
	err = GetFlag(pcFlag, 0, flag);
hgs
parents:
diff changeset
  4032
	if (err != KErrNone)
hgs
parents:
diff changeset
  4033
		{
hgs
parents:
diff changeset
  4034
		//delete temporary buffers
hgs
parents:
diff changeset
  4035
		pcId.Close();
hgs
parents:
diff changeset
  4036
		pcFlag.Close();
hgs
parents:
diff changeset
  4037
		return err;
hgs
parents:
diff changeset
  4038
		}
hgs
parents:
diff changeset
  4039
hgs
parents:
diff changeset
  4040
	if (flag == EValid)
hgs
parents:
diff changeset
  4041
		{
hgs
parents:
diff changeset
  4042
		//delete temporary buffers
hgs
parents:
diff changeset
  4043
		pcId.Close();
hgs
parents:
diff changeset
  4044
		pcFlag.Close();
hgs
parents:
diff changeset
  4045
		return KErrNone;
hgs
parents:
diff changeset
  4046
		}
hgs
parents:
diff changeset
  4047
	else
hgs
parents:
diff changeset
  4048
		{
hgs
parents:
diff changeset
  4049
		//delete temporary buffers
hgs
parents:
diff changeset
  4050
		pcId.Close();
hgs
parents:
diff changeset
  4051
		pcFlag.Close();
hgs
parents:
diff changeset
  4052
		return err;
hgs
parents:
diff changeset
  4053
		}
hgs
parents:
diff changeset
  4054
	}
hgs
parents:
diff changeset
  4055
hgs
parents:
diff changeset
  4056
/**
hgs
parents:
diff changeset
  4057
 * Helper code for the stepping tests. Single steps a given thread from aStartAddress to aEndAddress. Note
hgs
parents:
diff changeset
  4058
 * that it reaches aStartAddress by setting a breakpoint at that address and waiting until it is hit.
hgs
parents:
diff changeset
  4059
 *
hgs
parents:
diff changeset
  4060
 * @param aThreadId - Thread id for which to read the current target PC.
hgs
parents:
diff changeset
  4061
 * @param aStartAddress - The target address at which stepping will start.
hgs
parents:
diff changeset
  4062
 * @param aEndAddress - The target address at which stepping will end.
hgs
parents:
diff changeset
  4063
 * @param aMode - The architecture of the breakpoint which must be set at the start address (ARM/Thumb/Thumb2EE).
hgs
parents:
diff changeset
  4064
 * @return KErrNone if successful. One of the other system wide error codes otherwise.
hgs
parents:
diff changeset
  4065
 */
hgs
parents:
diff changeset
  4066
TInt CRunModeAgent::HelpTestStep(TThreadId aThreadId, TUint32 aStartAddress, TUint32 aEndAddress, TArchitectureMode aMode, TUint aNumSteps, TBool aThreadSpecific, TProcessId aProcessId)
hgs
parents:
diff changeset
  4067
	{
hgs
parents:
diff changeset
  4068
	TInt err = KErrNone;
hgs
parents:
diff changeset
  4069
hgs
parents:
diff changeset
  4070
	// Ensure that the supplied addresses are word/half-word aligned as appropriate.
hgs
parents:
diff changeset
  4071
	if (aMode == EArmMode)
hgs
parents:
diff changeset
  4072
		{
hgs
parents:
diff changeset
  4073
		// ARM breakpoints must be word-aligned (2 lsb must be zero)
hgs
parents:
diff changeset
  4074
		aStartAddress &= 0xFFFFFFFC;
hgs
parents:
diff changeset
  4075
		aEndAddress &= 0xFFFFFFFC;
hgs
parents:
diff changeset
  4076
		}
hgs
parents:
diff changeset
  4077
	else if (aMode == EThumbMode)
hgs
parents:
diff changeset
  4078
		{
hgs
parents:
diff changeset
  4079
		// Thumb breakpoints must be half-word aligned (lsb must be zero)
hgs
parents:
diff changeset
  4080
		aStartAddress &= 0xFFFFFFFE;
hgs
parents:
diff changeset
  4081
		aEndAddress	 &= 0xFFFFFFFE;
hgs
parents:
diff changeset
  4082
		}
hgs
parents:
diff changeset
  4083
	else if (aMode == EThumb2EEMode)
hgs
parents:
diff changeset
  4084
	{
hgs
parents:
diff changeset
  4085
		// Thumb2EE breakpoints are not currently supported
hgs
parents:
diff changeset
  4086
		return KErrNotSupported;
hgs
parents:
diff changeset
  4087
	}
hgs
parents:
diff changeset
  4088
hgs
parents:
diff changeset
  4089
	// Set breakpoint at the start address
hgs
parents:
diff changeset
  4090
	TBreakId tempBreakId;
hgs
parents:
diff changeset
  4091
	TEventInfo info;
hgs
parents:
diff changeset
  4092
hgs
parents:
diff changeset
  4093
	err = HelpTestStepSetBreak(tempBreakId,aThreadId,aStartAddress,aMode,aThreadSpecific,aProcessId);
hgs
parents:
diff changeset
  4094
	if (err != KErrNone)
hgs
parents:
diff changeset
  4095
		{
hgs
parents:
diff changeset
  4096
		test.Printf(_L("HelpTestStep - Failed to set breakpoint at aStartAddress 0x%08x\n"),aStartAddress);
hgs
parents:
diff changeset
  4097
		return err;
hgs
parents:
diff changeset
  4098
		}
hgs
parents:
diff changeset
  4099
hgs
parents:
diff changeset
  4100
	// wait for the breakpoint to be hit
hgs
parents:
diff changeset
  4101
	err = HelpTestStepWaitForBreak(iFileName,info);
hgs
parents:
diff changeset
  4102
	if (err != KErrNone)
hgs
parents:
diff changeset
  4103
		{
hgs
parents:
diff changeset
  4104
		test.Printf(_L("HelpTestStep - Failed to hit the breakpoint at aStartAddress 0x%08x\n"),aStartAddress);
hgs
parents:
diff changeset
  4105
		return err;
hgs
parents:
diff changeset
  4106
		}
hgs
parents:
diff changeset
  4107
hgs
parents:
diff changeset
  4108
	// Check the PC == aStartAddress
hgs
parents:
diff changeset
  4109
	TUint32 pc = 0;
hgs
parents:
diff changeset
  4110
	err = HelpTestStepReadPC(aThreadId,pc);
hgs
parents:
diff changeset
  4111
	if (err != KErrNone)
hgs
parents:
diff changeset
  4112
		{
hgs
parents:
diff changeset
  4113
		test.Printf(_L("HelpTestStep - Failed to read the PC after hitting breakpoint at aStartAddress 0x%08x\n"),aStartAddress);
hgs
parents:
diff changeset
  4114
		return err;
hgs
parents:
diff changeset
  4115
		}
hgs
parents:
diff changeset
  4116
hgs
parents:
diff changeset
  4117
	if (pc != aStartAddress)
hgs
parents:
diff changeset
  4118
		{
hgs
parents:
diff changeset
  4119
		test.Printf(_L("HelpTestStep - Incorrect PC value after hitting breakpoint (expected 0x%08x actual 0x%08x)\n"),aStartAddress,pc);
hgs
parents:
diff changeset
  4120
		return KErrGeneral;
hgs
parents:
diff changeset
  4121
		}
hgs
parents:
diff changeset
  4122
hgs
parents:
diff changeset
  4123
	err = iServSession.Step(aThreadId,aNumSteps);
hgs
parents:
diff changeset
  4124
	if (err != KErrNone)
hgs
parents:
diff changeset
  4125
		{
hgs
parents:
diff changeset
  4126
		test.Printf(_L("HelpTestStep - Failed to do step from 0x%08x to 0x%08x\n"),aStartAddress,aEndAddress,aNumSteps);
hgs
parents:
diff changeset
  4127
		return err;
hgs
parents:
diff changeset
  4128
		}
hgs
parents:
diff changeset
  4129
hgs
parents:
diff changeset
  4130
	// only one 'completed step' event in the buffer.
hgs
parents:
diff changeset
  4131
	err = HelpTestStepWaitForBreak(iFileName,info);
hgs
parents:
diff changeset
  4132
	if (err != KErrNone)
hgs
parents:
diff changeset
  4133
		{
hgs
parents:
diff changeset
  4134
		test.Printf(_L("HelpTestStep - Could not read breakpoint event info after stepping"));
hgs
parents:
diff changeset
  4135
		return err;
hgs
parents:
diff changeset
  4136
		}
hgs
parents:
diff changeset
  4137
	// end
hgs
parents:
diff changeset
  4138
hgs
parents:
diff changeset
  4139
	// Check PC == aEndAddress
hgs
parents:
diff changeset
  4140
	err = HelpTestStepReadPC(aThreadId,pc);
hgs
parents:
diff changeset
  4141
	if (err != KErrNone)
hgs
parents:
diff changeset
  4142
		{
hgs
parents:
diff changeset
  4143
		test.Printf(_L("HelpTestStep - failed read the PC after stepping\n"));
hgs
parents:
diff changeset
  4144
		return err;
hgs
parents:
diff changeset
  4145
		}
hgs
parents:
diff changeset
  4146
	if (pc != aEndAddress)
hgs
parents:
diff changeset
  4147
		{
hgs
parents:
diff changeset
  4148
		test.Printf(_L("HelpTestStep - Incorrect PC value after stepping (expected 0x%08x actual 0x%08x)\n"),aEndAddress,pc);
hgs
parents:
diff changeset
  4149
		return KErrGeneral;
hgs
parents:
diff changeset
  4150
		}
hgs
parents:
diff changeset
  4151
hgs
parents:
diff changeset
  4152
	// Clear the breakpoint
hgs
parents:
diff changeset
  4153
	err = HelpTestStepClearBreak(tempBreakId, aThreadId, aThreadSpecific);
hgs
parents:
diff changeset
  4154
	if (err != KErrNone)
hgs
parents:
diff changeset
  4155
		{
hgs
parents:
diff changeset
  4156
		test.Printf(_L("HelpTestStep - failed to clear temporary breakpoint\n"));
hgs
parents:
diff changeset
  4157
		return err;
hgs
parents:
diff changeset
  4158
		}
hgs
parents:
diff changeset
  4159
hgs
parents:
diff changeset
  4160
	return KErrNone;
hgs
parents:
diff changeset
  4161
	}
hgs
parents:
diff changeset
  4162
hgs
parents:
diff changeset
  4163
/**
hgs
parents:
diff changeset
  4164
 * Helper code for the stepping tests. Returns the number of nanokernel ticks in one second.
hgs
parents:
diff changeset
  4165
 *
hgs
parents:
diff changeset
  4166
 * @return Number of nanokernel ticks. 0 if unsuccesful.
hgs
parents:
diff changeset
  4167
 */
hgs
parents:
diff changeset
  4168
TInt CRunModeAgent::HelpTicksPerSecond(void)
hgs
parents:
diff changeset
  4169
	{
hgs
parents:
diff changeset
  4170
	TInt nanokernel_tick_period;
hgs
parents:
diff changeset
  4171
	HAL::Get(HAL::ENanoTickPeriod, nanokernel_tick_period);
hgs
parents:
diff changeset
  4172
hgs
parents:
diff changeset
  4173
	ASSERT(nanokernel_tick_period != 0);
hgs
parents:
diff changeset
  4174
hgs
parents:
diff changeset
  4175
	static const TInt KOneMillion = 1000000;
hgs
parents:
diff changeset
  4176
hgs
parents:
diff changeset
  4177
	return KOneMillion/nanokernel_tick_period;
hgs
parents:
diff changeset
  4178
	}
hgs
parents:
diff changeset
  4179
hgs
parents:
diff changeset
  4180
/**
hgs
parents:
diff changeset
  4181
  Given aTestNumber runs the appropriate test inside heap markers
hgs
parents:
diff changeset
  4182
hgs
parents:
diff changeset
  4183
  @param aTestNumber test to run, corresponds to an entry in iTestArray
hgs
parents:
diff changeset
  4184
hgs
parents:
diff changeset
  4185
  @panic Panic if aTestNumber is not in valid range
hgs
parents:
diff changeset
  4186
  */
hgs
parents:
diff changeset
  4187
void CRunModeAgent::RunTest(TInt aTestNumber)
hgs
parents:
diff changeset
  4188
	{
hgs
parents:
diff changeset
  4189
	if( (aTestNumber<0) || (aTestNumber>=KMaxTests) )
hgs
parents:
diff changeset
  4190
		{
hgs
parents:
diff changeset
  4191
		User::Panic(_L("Test number out of range"), aTestNumber);
hgs
parents:
diff changeset
  4192
		}
hgs
parents:
diff changeset
  4193
	__UHEAP_MARK;
hgs
parents:
diff changeset
  4194
	(this->*(iTestArray[aTestNumber].iFunctionPtr))();
hgs
parents:
diff changeset
  4195
	__UHEAP_MARKEND;
hgs
parents:
diff changeset
  4196
	}
hgs
parents:
diff changeset
  4197
hgs
parents:
diff changeset
  4198
void CRunModeAgent::PrintVersion()
hgs
parents:
diff changeset
  4199
	{
hgs
parents:
diff changeset
  4200
	test.Printf(_L("\nt_rmdebug2.exe\nVersion: %S\n"), &(testVersion.Name()));
hgs
parents:
diff changeset
  4201
	test.Printf(_L("Press any key...\n"));
hgs
parents:
diff changeset
  4202
	test.Getch();
hgs
parents:
diff changeset
  4203
	}
hgs
parents:
diff changeset
  4204
hgs
parents:
diff changeset
  4205
void CRunModeAgent::PrintUsage()
hgs
parents:
diff changeset
  4206
	{
hgs
parents:
diff changeset
  4207
	test.Printf(_L("Invoke with arguments:\n"));
hgs
parents:
diff changeset
  4208
	test.Printf(_L("-r: run specified tests in reverse order\n"));
hgs
parents:
diff changeset
  4209
	test.Printf(_L("-h: display usage information\n"));
hgs
parents:
diff changeset
  4210
	test.Printf(_L("-v: display version\n"));
hgs
parents:
diff changeset
  4211
	test.Printf(_L("-d: use delays\n"));
hgs
parents:
diff changeset
  4212
	test.Printf(_L("<number>: test number to run, can specify more than one from the following list:\n"));
hgs
parents:
diff changeset
  4213
	test.Printf(_L("Press any key for list...\n"));
hgs
parents:
diff changeset
  4214
	test.Getch();
hgs
parents:
diff changeset
  4215
	// if there are too many of these they won't fit on the screen! Stick another Getch() in if there get too many
hgs
parents:
diff changeset
  4216
	for(TInt i=0; i<KMaxTests; i++)
hgs
parents:
diff changeset
  4217
		{
hgs
parents:
diff changeset
  4218
		test.Printf(_L("%2d: %S\n"), i, &(iTestArray[i].iFunctionName));
hgs
parents:
diff changeset
  4219
		}
hgs
parents:
diff changeset
  4220
	test.Printf(_L("Press any key...\n"));
hgs
parents:
diff changeset
  4221
	test.Getch();
hgs
parents:
diff changeset
  4222
	}
hgs
parents:
diff changeset
  4223
hgs
parents:
diff changeset
  4224
/**
hgs
parents:
diff changeset
  4225
  Parse the command line, see CRunModeAgent::PrintUsage for syntax
hgs
parents:
diff changeset
  4226
  */
hgs
parents:
diff changeset
  4227
void CRunModeAgent::ParseCommandLineL(TUint32& aMode, RArray<TInt>& aTests)
hgs
parents:
diff changeset
  4228
	{
hgs
parents:
diff changeset
  4229
	// get the length of the command line arguments
hgs
parents:
diff changeset
  4230
	TInt argc = User::CommandLineLength();
hgs
parents:
diff changeset
  4231
hgs
parents:
diff changeset
  4232
	// allocate a buffer for the command line arguments and extract the data to it
hgs
parents:
diff changeset
  4233
	HBufC* commandLine = HBufC::NewLC(argc);
hgs
parents:
diff changeset
  4234
	TPtr commandLineBuffer = commandLine->Des();
hgs
parents:
diff changeset
  4235
	User::CommandLine(commandLineBuffer);
hgs
parents:
diff changeset
  4236
hgs
parents:
diff changeset
  4237
	// reset mode
hgs
parents:
diff changeset
  4238
	aMode = (TTestMode)0;
hgs
parents:
diff changeset
  4239
hgs
parents:
diff changeset
  4240
	// create a lexer and read through the command line
hgs
parents:
diff changeset
  4241
	TLex lex(*commandLine);
hgs
parents:
diff changeset
  4242
	while (!lex.Eos())
hgs
parents:
diff changeset
  4243
		{
hgs
parents:
diff changeset
  4244
		// expecting the first character to be a '-'
hgs
parents:
diff changeset
  4245
		if (lex.Get() == '-')
hgs
parents:
diff changeset
  4246
			{
hgs
parents:
diff changeset
  4247
			TChar arg = lex.Get();
hgs
parents:
diff changeset
  4248
			switch (arg)
hgs
parents:
diff changeset
  4249
				{
hgs
parents:
diff changeset
  4250
				case 'v':
hgs
parents:
diff changeset
  4251
					//print out the help
hgs
parents:
diff changeset
  4252
					aMode |= EModeVersion;
hgs
parents:
diff changeset
  4253
					break;
hgs
parents:
diff changeset
  4254
				case 'h':
hgs
parents:
diff changeset
  4255
					//print out the help
hgs
parents:
diff changeset
  4256
					aMode |= EModeHelp;
hgs
parents:
diff changeset
  4257
					break;
hgs
parents:
diff changeset
  4258
				case 'r':
hgs
parents:
diff changeset
  4259
					//store the fact that we want to run in reverse
hgs
parents:
diff changeset
  4260
					aMode |= EModeReverse;
hgs
parents:
diff changeset
  4261
					break;
hgs
parents:
diff changeset
  4262
				case 'd':
hgs
parents:
diff changeset
  4263
					//store the fact that we want to run in reverse
hgs
parents:
diff changeset
  4264
					gUseDelay = EFalse;
hgs
parents:
diff changeset
  4265
					RDebug::Printf("Not using delays");
hgs
parents:
diff changeset
  4266
					break;
hgs
parents:
diff changeset
  4267
				default:
hgs
parents:
diff changeset
  4268
					// unknown argument so leave
hgs
parents:
diff changeset
  4269
					User::Leave(KErrArgument);
hgs
parents:
diff changeset
  4270
				}
hgs
parents:
diff changeset
  4271
			}
hgs
parents:
diff changeset
  4272
		else
hgs
parents:
diff changeset
  4273
			{
hgs
parents:
diff changeset
  4274
			lex.UnGet();
hgs
parents:
diff changeset
  4275
			TInt testNumber;
hgs
parents:
diff changeset
  4276
			User::LeaveIfError(lex.Val(testNumber));
hgs
parents:
diff changeset
  4277
			if( (testNumber<0) || (testNumber>=KMaxTests) )
hgs
parents:
diff changeset
  4278
				{
hgs
parents:
diff changeset
  4279
				User::Leave(KErrArgument);
hgs
parents:
diff changeset
  4280
				}
hgs
parents:
diff changeset
  4281
			aTests.AppendL(testNumber);
hgs
parents:
diff changeset
  4282
			}
hgs
parents:
diff changeset
  4283
		lex.SkipSpace();
hgs
parents:
diff changeset
  4284
		}
hgs
parents:
diff changeset
  4285
	// if no tests specified then run them all
hgs
parents:
diff changeset
  4286
	if(aTests.Count() == 0)
hgs
parents:
diff changeset
  4287
		{
hgs
parents:
diff changeset
  4288
		aMode |= EModeAll;
hgs
parents:
diff changeset
  4289
		}
hgs
parents:
diff changeset
  4290
hgs
parents:
diff changeset
  4291
	// do clean up
hgs
parents:
diff changeset
  4292
	CleanupStack::PopAndDestroy(commandLine);
hgs
parents:
diff changeset
  4293
	}
hgs
parents:
diff changeset
  4294
hgs
parents:
diff changeset
  4295
void CRunModeAgent::ClientAppL()
hgs
parents:
diff changeset
  4296
//
hgs
parents:
diff changeset
  4297
// Performs each test in turn
hgs
parents:
diff changeset
  4298
//
hgs
parents:
diff changeset
  4299
	{
hgs
parents:
diff changeset
  4300
	test.Start(_L("ClientAppL"));
hgs
parents:
diff changeset
  4301
hgs
parents:
diff changeset
  4302
	RArray<TInt> testsToRun;
hgs
parents:
diff changeset
  4303
	TUint32 testMode = 0;
hgs
parents:
diff changeset
  4304
	ParseCommandLineL(testMode, testsToRun);
hgs
parents:
diff changeset
  4305
hgs
parents:
diff changeset
  4306
	//if help or version mode specified then just print out the relevant stuff and quit
hgs
parents:
diff changeset
  4307
	if((testMode & EModeHelp) || (testMode & EModeVersion))
hgs
parents:
diff changeset
  4308
		{
hgs
parents:
diff changeset
  4309
		if(testMode & EModeHelp)
hgs
parents:
diff changeset
  4310
			{
hgs
parents:
diff changeset
  4311
			PrintUsage();
hgs
parents:
diff changeset
  4312
			}
hgs
parents:
diff changeset
  4313
		if(testMode & EModeVersion)
hgs
parents:
diff changeset
  4314
			{
hgs
parents:
diff changeset
  4315
			PrintVersion();
hgs
parents:
diff changeset
  4316
			}
hgs
parents:
diff changeset
  4317
		test.End();
hgs
parents:
diff changeset
  4318
		return;
hgs
parents:
diff changeset
  4319
		}
hgs
parents:
diff changeset
  4320
hgs
parents:
diff changeset
  4321
	if(testMode & EModeAll)
hgs
parents:
diff changeset
  4322
		{
hgs
parents:
diff changeset
  4323
		for(TInt i=0; i<KMaxTests; i++)
hgs
parents:
diff changeset
  4324
			{
hgs
parents:
diff changeset
  4325
			testsToRun.AppendL(i);
hgs
parents:
diff changeset
  4326
			}
hgs
parents:
diff changeset
  4327
		}
hgs
parents:
diff changeset
  4328
hgs
parents:
diff changeset
  4329
	// if EModeReverse specified then reverse the array elements
hgs
parents:
diff changeset
  4330
	TInt numberOfTests = testsToRun.Count();
hgs
parents:
diff changeset
  4331
	if(testMode & EModeReverse)
hgs
parents:
diff changeset
  4332
		{
hgs
parents:
diff changeset
  4333
		for(TInt i=0; i<(numberOfTests>>1); i++)
hgs
parents:
diff changeset
  4334
			{
hgs
parents:
diff changeset
  4335
			TInt temp = testsToRun[i];
hgs
parents:
diff changeset
  4336
			testsToRun[i] = testsToRun[numberOfTests - (i+1)];
hgs
parents:
diff changeset
  4337
			testsToRun[numberOfTests - (i+1)] = temp;
hgs
parents:
diff changeset
  4338
			}
hgs
parents:
diff changeset
  4339
		}
hgs
parents:
diff changeset
  4340
hgs
parents:
diff changeset
  4341
	__UHEAP_MARK;
hgs
parents:
diff changeset
  4342
	SetupAndAttachToDSS();
hgs
parents:
diff changeset
  4343
	__UHEAP_MARKEND;
hgs
parents:
diff changeset
  4344
hgs
parents:
diff changeset
  4345
	HelpStartTestTimer();
hgs
parents:
diff changeset
  4346
	for(TInt i=0; i<numberOfTests; i++)
hgs
parents:
diff changeset
  4347
		{
hgs
parents:
diff changeset
  4348
		RunTest(testsToRun[i]);
hgs
parents:
diff changeset
  4349
		if( gUseDelay ) User::After(500000);
hgs
parents:
diff changeset
  4350
		}
hgs
parents:
diff changeset
  4351
	testsToRun.Close();
hgs
parents:
diff changeset
  4352
hgs
parents:
diff changeset
  4353
	HelpStopTestTimer();
hgs
parents:
diff changeset
  4354
hgs
parents:
diff changeset
  4355
	ReportPerformance();
hgs
parents:
diff changeset
  4356
hgs
parents:
diff changeset
  4357
	test.End();
hgs
parents:
diff changeset
  4358
	}
hgs
parents:
diff changeset
  4359
hgs
parents:
diff changeset
  4360
/**
hgs
parents:
diff changeset
  4361
  Fill the test array with pointers to each test.
hgs
parents:
diff changeset
  4362
  */
hgs
parents:
diff changeset
  4363
void CRunModeAgent::FillArray()
hgs
parents:
diff changeset
  4364
	{
hgs
parents:
diff changeset
  4365
	iTestArray[0].iFunctionPtr = &CRunModeAgent::TestDriverSecurity;
hgs
parents:
diff changeset
  4366
	iTestArray[0].iFunctionName = _L("TestDriverSecurity");
hgs
parents:
diff changeset
  4367
	iTestArray[1].iFunctionPtr = &CRunModeAgent::TestDllUsage;
hgs
parents:
diff changeset
  4368
	iTestArray[1].iFunctionName = _L("TestDllUsage");
hgs
parents:
diff changeset
  4369
	iTestArray[2].iFunctionPtr = &CRunModeAgent::TestSecurity;
hgs
parents:
diff changeset
  4370
	iTestArray[2].iFunctionName = _L("TestSecurity");
hgs
parents:
diff changeset
  4371
	iTestArray[3].iFunctionPtr = &CRunModeAgent::TestAttachExecutable;
hgs
parents:
diff changeset
  4372
	iTestArray[3].iFunctionName = _L("TestAttachExecutable");
hgs
parents:
diff changeset
  4373
	iTestArray[4].iFunctionPtr = &CRunModeAgent::TestGetExecutablesList;
hgs
parents:
diff changeset
  4374
	iTestArray[4].iFunctionName = _L("TestGetExecutablesList");
hgs
parents:
diff changeset
  4375
	iTestArray[5].iFunctionPtr = &CRunModeAgent::TestGetProcessList;
hgs
parents:
diff changeset
  4376
	iTestArray[5].iFunctionName = _L("TestGetProcessList");
hgs
parents:
diff changeset
  4377
	iTestArray[6].iFunctionPtr = &CRunModeAgent::TestGetXipLibrariesList;
hgs
parents:
diff changeset
  4378
	iTestArray[6].iFunctionName = _L("TestGetXipLibrariesList");
hgs
parents:
diff changeset
  4379
	iTestArray[7].iFunctionPtr = &CRunModeAgent::TestGetThreadList;
hgs
parents:
diff changeset
  4380
	iTestArray[7].iFunctionName = _L("TestGetThreadList");
hgs
parents:
diff changeset
  4381
	iTestArray[8].iFunctionPtr = &CRunModeAgent::TestGetCodeSegsList;
hgs
parents:
diff changeset
  4382
	iTestArray[8].iFunctionName = _L("TestGetCodeSegsList");
hgs
parents:
diff changeset
  4383
	iTestArray[9].iFunctionPtr = &CRunModeAgent::TestGetListInvalidData;
hgs
parents:
diff changeset
  4384
	iTestArray[9].iFunctionName = _L("TestGetListInvalidData");
hgs
parents:
diff changeset
  4385
	iTestArray[10].iFunctionPtr = &CRunModeAgent::TestMemoryAccess;
hgs
parents:
diff changeset
  4386
	iTestArray[10].iFunctionName = _L("TestMemoryAccess");
hgs
parents:
diff changeset
  4387
	iTestArray[11].iFunctionPtr = &CRunModeAgent::TestDebugFunctionality;
hgs
parents:
diff changeset
  4388
	iTestArray[11].iFunctionName = _L("TestDebugFunctionality");
hgs
parents:
diff changeset
  4389
	iTestArray[12].iFunctionPtr = &CRunModeAgent::TestSuspendResume;
hgs
parents:
diff changeset
  4390
	iTestArray[12].iFunctionName = _L("TestSuspendResume");
hgs
parents:
diff changeset
  4391
	iTestArray[13].iFunctionPtr = &CRunModeAgent::TestBreakPoints;
hgs
parents:
diff changeset
  4392
	iTestArray[13].iFunctionName = _L("TestBreakPoints");
hgs
parents:
diff changeset
  4393
	iTestArray[14].iFunctionPtr = &CRunModeAgent::TestModifyBreak;
hgs
parents:
diff changeset
  4394
	iTestArray[14].iFunctionName = _L("TestModifyBreak");
hgs
parents:
diff changeset
  4395
	iTestArray[15].iFunctionPtr = &CRunModeAgent::TestBreakInfo;
hgs
parents:
diff changeset
  4396
	iTestArray[15].iFunctionName = _L("TestBreakInfo");
hgs
parents:
diff changeset
  4397
	iTestArray[16].iFunctionPtr = &CRunModeAgent::TestRunToBreak;
hgs
parents:
diff changeset
  4398
	iTestArray[16].iFunctionName = _L("TestRunToBreak");
hgs
parents:
diff changeset
  4399
	iTestArray[17].iFunctionPtr = &CRunModeAgent::TestBreakPointsInLoop;
hgs
parents:
diff changeset
  4400
	iTestArray[17].iFunctionName = _L("TestBreakPointsInLoop");
hgs
parents:
diff changeset
  4401
	iTestArray[18].iFunctionPtr = &CRunModeAgent::TestRegisterAccess;
hgs
parents:
diff changeset
  4402
	iTestArray[18].iFunctionName = _L("TestRegisterAccess");
hgs
parents:
diff changeset
  4403
	iTestArray[19].iFunctionPtr = &CRunModeAgent::TestStep;
hgs
parents:
diff changeset
  4404
	iTestArray[19].iFunctionName = _L("TestStep");
hgs
parents:
diff changeset
  4405
	iTestArray[20].iFunctionPtr = &CRunModeAgent::TestDemandPaging;
hgs
parents:
diff changeset
  4406
	iTestArray[20].iFunctionName = _L("TestDemandPaging");
hgs
parents:
diff changeset
  4407
	iTestArray[21].iFunctionPtr = &CRunModeAgent::TestEventsForExternalProcess;
hgs
parents:
diff changeset
  4408
	iTestArray[21].iFunctionName = _L("TestEventsForExternalProcess");
hgs
parents:
diff changeset
  4409
	iTestArray[22].iFunctionPtr = &CRunModeAgent::TestEvents;
hgs
parents:
diff changeset
  4410
	iTestArray[22].iFunctionName = _L("TestEvents");
hgs
parents:
diff changeset
  4411
	iTestArray[23].iFunctionPtr = &CRunModeAgent::TestKillProcess;
hgs
parents:
diff changeset
  4412
	iTestArray[23].iFunctionName = _L("TestKillProcess");
hgs
parents:
diff changeset
  4413
	iTestArray[24].iFunctionPtr = &CRunModeAgent::TestProcessBreakPoints;
hgs
parents:
diff changeset
  4414
	iTestArray[24].iFunctionName = _L("TestProcessBreakPoints");
hgs
parents:
diff changeset
  4415
	iTestArray[25].iFunctionPtr = &CRunModeAgent::TestMultipleTraceEvents;
hgs
parents:
diff changeset
  4416
	iTestArray[25].iFunctionName = _L("TestMultipleTraceEvents");
hgs
parents:
diff changeset
  4417
	iTestArray[26].iFunctionPtr = &CRunModeAgent::TestAddRemoveProcessEvents;
hgs
parents:
diff changeset
  4418
	iTestArray[26].iFunctionName = _L("TestAddRemoveProcessEvents");
hgs
parents:
diff changeset
  4419
	iTestArray[27].iFunctionPtr = &CRunModeAgent::TestCrashFlash;
hgs
parents:
diff changeset
  4420
	iTestArray[27].iFunctionName = _L("TestCrashFlash");
hgs
parents:
diff changeset
  4421
	iTestArray[28].iFunctionPtr = &CRunModeAgent::TestProcessKillBreakpoint;
hgs
parents:
diff changeset
  4422
	iTestArray[28].iFunctionName = _L("TestProcessKillBreakpoint");
hgs
parents:
diff changeset
  4423
	iTestArray[29].iFunctionPtr = &CRunModeAgent::TestAttachToAll;
hgs
parents:
diff changeset
  4424
	iTestArray[29].iFunctionName = _L("TestAttachToAll");
hgs
parents:
diff changeset
  4425
	iTestArray[30].iFunctionPtr = &CRunModeAgent::TestResumeBreakpointsRepeatedly;
hgs
parents:
diff changeset
  4426
	iTestArray[30].iFunctionName = _L("TestResumeBreakpointsRepeatedly");
hgs
parents:
diff changeset
  4427
hgs
parents:
diff changeset
  4428
	};
hgs
parents:
diff changeset
  4429
hgs
parents:
diff changeset
  4430
GLDEF_C TInt E32Main()
hgs
parents:
diff changeset
  4431
//
hgs
parents:
diff changeset
  4432
// Entry point for run mode debug driver test
hgs
parents:
diff changeset
  4433
//
hgs
parents:
diff changeset
  4434
	{
hgs
parents:
diff changeset
  4435
   TInt ret = KErrNone;
hgs
parents:
diff changeset
  4436
hgs
parents:
diff changeset
  4437
	// client
hgs
parents:
diff changeset
  4438
	CTrapCleanup* trap = CTrapCleanup::New();
hgs
parents:
diff changeset
  4439
	if (!trap)
hgs
parents:
diff changeset
  4440
		return KErrNoMemory;
hgs
parents:
diff changeset
  4441
   	test.Title();
hgs
parents:
diff changeset
  4442
   RunModeAgent = CRunModeAgent::NewL();
hgs
parents:
diff changeset
  4443
   if (RunModeAgent != NULL)
hgs
parents:
diff changeset
  4444
       {
hgs
parents:
diff changeset
  4445
        __UHEAP_MARK;
hgs
parents:
diff changeset
  4446
	    TRAP(ret,RunModeAgent->ClientAppL());
hgs
parents:
diff changeset
  4447
	    __UHEAP_MARKEND;
hgs
parents:
diff changeset
  4448
hgs
parents:
diff changeset
  4449
	    delete RunModeAgent;
hgs
parents:
diff changeset
  4450
       }
hgs
parents:
diff changeset
  4451
hgs
parents:
diff changeset
  4452
	delete trap;
hgs
parents:
diff changeset
  4453
hgs
parents:
diff changeset
  4454
	return ret;
hgs
parents:
diff changeset
  4455
	}
hgs
parents:
diff changeset
  4456
hgs
parents:
diff changeset
  4457
/**
hgs
parents:
diff changeset
  4458
Helper function to get the aOffset'th value from aFlags
hgs
parents:
diff changeset
  4459
hgs
parents:
diff changeset
  4460
@param aFlags descriptor containing TRegisterFlag type flags
hgs
parents:
diff changeset
  4461
@param aOffset index of flag value to extract from aFlags
hgs
parents:
diff changeset
  4462
@param aFlagValue the flag value if function returned successfully
hgs
parents:
diff changeset
  4463
hgs
parents:
diff changeset
  4464
@return KErrNone if value was read successfully, KErrTooBig if aOffset is
hgs
parents:
diff changeset
  4465
        greater than aFlags.Length()
hgs
parents:
diff changeset
  4466
*/
hgs
parents:
diff changeset
  4467
TInt CRunModeAgent::GetFlag(const TDes8& aFlags, const TUint aOffset, TRegisterFlag &aFlagValue) const
hgs
parents:
diff changeset
  4468
	{
hgs
parents:
diff changeset
  4469
	//get pointer to data
hgs
parents:
diff changeset
  4470
	const TUint8 *ptr = aFlags.Ptr();
hgs
parents:
diff changeset
  4471
hgs
parents:
diff changeset
  4472
	//check aOffset is valid
hgs
parents:
diff changeset
  4473
	TUint length = aFlags.Length();
hgs
parents:
diff changeset
  4474
	if(aOffset >= length)
hgs
parents:
diff changeset
  4475
		return KErrTooBig;
hgs
parents:
diff changeset
  4476
hgs
parents:
diff changeset
  4477
	//get flag value
hgs
parents:
diff changeset
  4478
	aFlagValue = (TRegisterFlag)ptr[aOffset];
hgs
parents:
diff changeset
  4479
	return KErrNone;
hgs
parents:
diff changeset
  4480
	}
hgs
parents:
diff changeset
  4481
hgs
parents:
diff changeset
  4482
/**
hgs
parents:
diff changeset
  4483
  Helper function to set the value of FunctionChooser in the target debug thread.
hgs
parents:
diff changeset
  4484
hgs
parents:
diff changeset
  4485
  @param aTestFunction TTestFunction enum to set FunctionChooser to
hgs
parents:
diff changeset
  4486
hgs
parents:
diff changeset
  4487
  @return KErrNone if the value was set correctly, or one of the other system wide error codes
hgs
parents:
diff changeset
  4488
  */
hgs
parents:
diff changeset
  4489
TInt CRunModeAgent::SwitchTestFunction(TTestFunction aTestFunction, const TBool aResume)
hgs
parents:
diff changeset
  4490
	{
hgs
parents:
diff changeset
  4491
	//suspend the target thread
hgs
parents:
diff changeset
  4492
	TInt suspendError = iServSession.SuspendThread(iThreadID);
hgs
parents:
diff changeset
  4493
	if(! ( (suspendError == KErrNone) || (suspendError == KErrAlreadyExists) ) )
hgs
parents:
diff changeset
  4494
		{
hgs
parents:
diff changeset
  4495
		//the thread is not suspended so exit
hgs
parents:
diff changeset
  4496
		return suspendError;
hgs
parents:
diff changeset
  4497
		}
hgs
parents:
diff changeset
  4498
hgs
parents:
diff changeset
  4499
	//get the address of FunctionChooser
hgs
parents:
diff changeset
  4500
	TUint32 functionChooserAddress = (TUint32)&FunctionChooser;
hgs
parents:
diff changeset
  4501
	//put the new value for FunctionChooser into a descriptor
hgs
parents:
diff changeset
  4502
	TPtr8 functionBuf((TUint8*)&aTestFunction, sizeof(TTestFunction), sizeof(TTestFunction));
hgs
parents:
diff changeset
  4503
	//write the new value into the target thread
hgs
parents:
diff changeset
  4504
	TInt writeError = iServSession.WriteMemory(iThreadID, functionChooserAddress, sizeof(TTestFunction), functionBuf, EAccess32, EEndLE8);
hgs
parents:
diff changeset
  4505
hgs
parents:
diff changeset
  4506
	if( (KErrNone == suspendError) && aResume )
hgs
parents:
diff changeset
  4507
		{
hgs
parents:
diff changeset
  4508
		//if this function suspended the target thread then we need to resume it
hgs
parents:
diff changeset
  4509
		TInt resumeError = iServSession.ResumeThread(iThreadID);
hgs
parents:
diff changeset
  4510
		if(KErrNone != resumeError)
hgs
parents:
diff changeset
  4511
			{
hgs
parents:
diff changeset
  4512
			//resuming failed so return the error
hgs
parents:
diff changeset
  4513
			return resumeError;
hgs
parents:
diff changeset
  4514
			}
hgs
parents:
diff changeset
  4515
		}
hgs
parents:
diff changeset
  4516
hgs
parents:
diff changeset
  4517
	//suspending and resuming was successful so return the error code from the WriteMemory call
hgs
parents:
diff changeset
  4518
	return writeError;
hgs
parents:
diff changeset
  4519
	}
hgs
parents:
diff changeset
  4520
hgs
parents:
diff changeset
  4521
/**
hgs
parents:
diff changeset
  4522
  Launch a separate process to debug.
hgs
parents:
diff changeset
  4523
hgs
parents:
diff changeset
  4524
  @param aProcess the RProcess object to use to create the process
hgs
parents:
diff changeset
  4525
  @param aFileName file name of the executable to create the process from
hgs
parents:
diff changeset
  4526
  @param aFunctionType function that the target process should call on execution
hgs
parents:
diff changeset
  4527
  @param aDelay delay before the new process should call the function represented by aFunctionType
hgs
parents:
diff changeset
  4528
  @param aExtraThreads number of extra threads to create in the child process
hgs
parents:
diff changeset
  4529
hgs
parents:
diff changeset
  4530
  @return KErrNone on success, or one of the other system wide error codes
hgs
parents:
diff changeset
  4531
  */
hgs
parents:
diff changeset
  4532
TInt CRunModeAgent::LaunchProcess(RProcess& aProcess, const TDesC& aFileName, TDebugFunctionType aFunctionType, TUint32 aDelay, TUint32 aExtraThreads)
hgs
parents:
diff changeset
  4533
	{
hgs
parents:
diff changeset
  4534
	// at the moment we support two arguments, this number might have to be increased to support arguments
hgs
parents:
diff changeset
  4535
	const TUint KMaxCommandLineLength = 32;
hgs
parents:
diff changeset
  4536
hgs
parents:
diff changeset
  4537
	// create a command line buffer
hgs
parents:
diff changeset
  4538
	RBuf commandLine;
hgs
parents:
diff changeset
  4539
	commandLine.Create(KMaxCommandLineLength);
hgs
parents:
diff changeset
  4540
hgs
parents:
diff changeset
  4541
	// append the command line arguments to the buffer
hgs
parents:
diff changeset
  4542
	_LIT(KFArg, "-f");
hgs
parents:
diff changeset
  4543
	commandLine.Append(KFArg());
hgs
parents:
diff changeset
  4544
	commandLine.AppendNum(aFunctionType);
hgs
parents:
diff changeset
  4545
hgs
parents:
diff changeset
  4546
	_LIT(KSpace, " ");
hgs
parents:
diff changeset
  4547
	commandLine.Append(KSpace());
hgs
parents:
diff changeset
  4548
hgs
parents:
diff changeset
  4549
	_LIT(KDArg, "-d");
hgs
parents:
diff changeset
  4550
	commandLine.Append(KDArg());
hgs
parents:
diff changeset
  4551
	commandLine.AppendNum(aDelay);
hgs
parents:
diff changeset
  4552
hgs
parents:
diff changeset
  4553
	commandLine.Append(KSpace());
hgs
parents:
diff changeset
  4554
hgs
parents:
diff changeset
  4555
	_LIT(KEArg, "-e");
hgs
parents:
diff changeset
  4556
	commandLine.Append(KEArg());
hgs
parents:
diff changeset
  4557
	commandLine.AppendNum(aExtraThreads);
hgs
parents:
diff changeset
  4558
hgs
parents:
diff changeset
  4559
	// create the new process, matching on file name only, not specifying uid values
hgs
parents:
diff changeset
  4560
	TInt err = aProcess.Create(aFileName, commandLine);	// owned by the process
hgs
parents:
diff changeset
  4561
hgs
parents:
diff changeset
  4562
	// check that there was no error raised
hgs
parents:
diff changeset
  4563
	if(err != KErrNone)
hgs
parents:
diff changeset
  4564
		{
hgs
parents:
diff changeset
  4565
		commandLine.Close();
hgs
parents:
diff changeset
  4566
		return err;
hgs
parents:
diff changeset
  4567
		}
hgs
parents:
diff changeset
  4568
hgs
parents:
diff changeset
  4569
	TRequestStatus status = KRequestPending;
hgs
parents:
diff changeset
  4570
	aProcess.Rendezvous(status);
hgs
parents:
diff changeset
  4571
hgs
parents:
diff changeset
  4572
	commandLine.Close();	// after target thread starts
hgs
parents:
diff changeset
  4573
hgs
parents:
diff changeset
  4574
	if(KRequestPending != status.Int())
hgs
parents:
diff changeset
  4575
		{
hgs
parents:
diff changeset
  4576
		// startup failed so kill the process
hgs
parents:
diff changeset
  4577
		aProcess.Kill(KErrNone);
hgs
parents:
diff changeset
  4578
		return status.Int();
hgs
parents:
diff changeset
  4579
		}
hgs
parents:
diff changeset
  4580
	else
hgs
parents:
diff changeset
  4581
		{
hgs
parents:
diff changeset
  4582
		// start up succeeded so resume the process
hgs
parents:
diff changeset
  4583
		aProcess.Resume();
hgs
parents:
diff changeset
  4584
		User::WaitForRequest(status);
hgs
parents:
diff changeset
  4585
		if(KErrNone != status.Int())
hgs
parents:
diff changeset
  4586
			{
hgs
parents:
diff changeset
  4587
			aProcess.Kill(KErrNone);
hgs
parents:
diff changeset
  4588
			}
hgs
parents:
diff changeset
  4589
		return status.Int();
hgs
parents:
diff changeset
  4590
		}
hgs
parents:
diff changeset
  4591
	}
hgs
parents:
diff changeset
  4592
hgs
parents:
diff changeset
  4593
/**
hgs
parents:
diff changeset
  4594
  Helper function to read a tag header from a debug functionality block
hgs
parents:
diff changeset
  4595
hgs
parents:
diff changeset
  4596
  @param aDebugFunctionalityBlock block to read header from
hgs
parents:
diff changeset
  4597
  @param aTagHdrId header type to find
hgs
parents:
diff changeset
  4598
hgs
parents:
diff changeset
  4599
  @return pointer to the header, or NULL if not available
hgs
parents:
diff changeset
  4600
  */
hgs
parents:
diff changeset
  4601
TTagHeader* CRunModeAgent::GetTagHdr(const TDesC8& aDebugFunctionalityBlock, const TTagHeaderId aTagHdrId) const
hgs
parents:
diff changeset
  4602
	{
hgs
parents:
diff changeset
  4603
	TUint8* ptr = (TUint8*) aDebugFunctionalityBlock.Ptr();
hgs
parents:
diff changeset
  4604
	TUint8* blockEnd = ptr + aDebugFunctionalityBlock.Size();
hgs
parents:
diff changeset
  4605
hgs
parents:
diff changeset
  4606
	while(ptr < blockEnd)
hgs
parents:
diff changeset
  4607
		{
hgs
parents:
diff changeset
  4608
		TTagHeader* header = (TTagHeader*)ptr;
hgs
parents:
diff changeset
  4609
		if(header->iTagHdrId == aTagHdrId)
hgs
parents:
diff changeset
  4610
			{
hgs
parents:
diff changeset
  4611
			return header;
hgs
parents:
diff changeset
  4612
			}
hgs
parents:
diff changeset
  4613
		ptr += sizeof(TTagHeader) + (header->iNumTags * sizeof(TTag));
hgs
parents:
diff changeset
  4614
		}
hgs
parents:
diff changeset
  4615
	return NULL;
hgs
parents:
diff changeset
  4616
	}
hgs
parents:
diff changeset
  4617
hgs
parents:
diff changeset
  4618
/**
hgs
parents:
diff changeset
  4619
  Helper function to read a tag from a debug functionality block
hgs
parents:
diff changeset
  4620
hgs
parents:
diff changeset
  4621
  @param aTagHdr pointer to a tag header in a debug functionality block
hgs
parents:
diff changeset
  4622
  @param aElement element to return from the header's data
hgs
parents:
diff changeset
  4623
hgs
parents:
diff changeset
  4624
  @return pointer to the tag, or NULL if not available
hgs
parents:
diff changeset
  4625
  */
hgs
parents:
diff changeset
  4626
TTag* CRunModeAgent::GetTag(const TTagHeader* aTagHdr, const TInt aElement) const
hgs
parents:
diff changeset
  4627
	{
hgs
parents:
diff changeset
  4628
	TUint8* ptr = (TUint8*)aTagHdr + sizeof(TTagHeader);
hgs
parents:
diff changeset
  4629
	TUint8* blockEnd = ptr + (aTagHdr->iNumTags * sizeof(TTag));
hgs
parents:
diff changeset
  4630
hgs
parents:
diff changeset
  4631
	while(ptr < blockEnd)
hgs
parents:
diff changeset
  4632
		{
hgs
parents:
diff changeset
  4633
		TTag* tag = (TTag*)ptr;
hgs
parents:
diff changeset
  4634
		if(tag->iTagId == aElement)
hgs
parents:
diff changeset
  4635
			{
hgs
parents:
diff changeset
  4636
			return tag;
hgs
parents:
diff changeset
  4637
			}
hgs
parents:
diff changeset
  4638
		ptr += sizeof(TTag);
hgs
parents:
diff changeset
  4639
		}
hgs
parents:
diff changeset
  4640
	return NULL;
hgs
parents:
diff changeset
  4641
	}
hgs
parents:
diff changeset
  4642
hgs
parents:
diff changeset
  4643
TTag CRunModeAgent::GetTag(const TTagHeaderId aTagHdrId, const TInt aElement)
hgs
parents:
diff changeset
  4644
	{
hgs
parents:
diff changeset
  4645
	TUint32 bufsize = 0;	// Safe default size
hgs
parents:
diff changeset
  4646
hgs
parents:
diff changeset
  4647
	// Get functionality block size
hgs
parents:
diff changeset
  4648
	test(KErrNone == iServSession.GetDebugFunctionalityBufSize(&bufsize));
hgs
parents:
diff changeset
  4649
hgs
parents:
diff changeset
  4650
	// Ensure we have a finite buffer size
hgs
parents:
diff changeset
  4651
	test(bufsize!=0);
hgs
parents:
diff changeset
  4652
hgs
parents:
diff changeset
  4653
	// Allocate space for the functionality data
hgs
parents:
diff changeset
  4654
	HBufC8* dftext = HBufC8::NewLC(bufsize);
hgs
parents:
diff changeset
  4655
hgs
parents:
diff changeset
  4656
	// create an empty TPtr8 refering to dftext
hgs
parents:
diff changeset
  4657
	TPtr8 dftextPtr(dftext->Des());
hgs
parents:
diff changeset
  4658
hgs
parents:
diff changeset
  4659
	// Get the functionality block
hgs
parents:
diff changeset
  4660
	test(KErrNone == iServSession.GetDebugFunctionality(dftextPtr));
hgs
parents:
diff changeset
  4661
hgs
parents:
diff changeset
  4662
	// read a value from the data to check it has come through as expected
hgs
parents:
diff changeset
  4663
	TTagHeader* header = GetTagHdr(dftext->Des(), aTagHdrId);
hgs
parents:
diff changeset
  4664
	test(header != NULL);
hgs
parents:
diff changeset
  4665
	TTag* tag = GetTag(header, aElement);
hgs
parents:
diff changeset
  4666
	test(tag != NULL);
hgs
parents:
diff changeset
  4667
hgs
parents:
diff changeset
  4668
	TTag tagToReturn = *tag;
hgs
parents:
diff changeset
  4669
hgs
parents:
diff changeset
  4670
	// Remove our temporary buffer
hgs
parents:
diff changeset
  4671
	CleanupStack::PopAndDestroy(dftext);
hgs
parents:
diff changeset
  4672
hgs
parents:
diff changeset
  4673
	return tagToReturn;
hgs
parents:
diff changeset
  4674
	}
hgs
parents:
diff changeset
  4675
hgs
parents:
diff changeset
  4676
/**
hgs
parents:
diff changeset
  4677
  Helper function which returns a Boolean indicating with a process with the
hgs
parents:
diff changeset
  4678
  specified name is currently running.
hgs
parents:
diff changeset
  4679
hgs
parents:
diff changeset
  4680
  @param aProcessName - Name of the process to find
hgs
parents:
diff changeset
  4681
  @return ETrue if found, EFalse otherwise
hgs
parents:
diff changeset
  4682
  */
hgs
parents:
diff changeset
  4683
TBool CRunModeAgent::ProcessExists(const TDesC& aProcessName)
hgs
parents:
diff changeset
  4684
	{
hgs
parents:
diff changeset
  4685
	TInt    err=KErrNone;
hgs
parents:
diff changeset
  4686
	TBool	found = FALSE;
hgs
parents:
diff changeset
  4687
hgs
parents:
diff changeset
  4688
_LIT(KWildCard,"*");
hgs
parents:
diff changeset
  4689
hgs
parents:
diff changeset
  4690
	TFindProcess find(KWildCard);
hgs
parents:
diff changeset
  4691
	TFullName name;
hgs
parents:
diff changeset
  4692
	while(find.Next(name)==KErrNone)
hgs
parents:
diff changeset
  4693
		{
hgs
parents:
diff changeset
  4694
		RProcess process;
hgs
parents:
diff changeset
  4695
		err = process.Open(find);
hgs
parents:
diff changeset
  4696
		if (err == KErrNone)
hgs
parents:
diff changeset
  4697
			{
hgs
parents:
diff changeset
  4698
			if (name.Find(aProcessName) != KErrNotFound)
hgs
parents:
diff changeset
  4699
				{
hgs
parents:
diff changeset
  4700
					found = TRUE;
hgs
parents:
diff changeset
  4701
				}
hgs
parents:
diff changeset
  4702
			process.Close();
hgs
parents:
diff changeset
  4703
			}
hgs
parents:
diff changeset
  4704
	   }
hgs
parents:
diff changeset
  4705
hgs
parents:
diff changeset
  4706
	return found;
hgs
parents:
diff changeset
  4707
	}
hgs
parents:
diff changeset
  4708
hgs
parents:
diff changeset
  4709
TInt PanicFn(TAny*)
hgs
parents:
diff changeset
  4710
	{
hgs
parents:
diff changeset
  4711
	User::Panic(_L("trmdebug_dummy"), 123);
hgs
parents:
diff changeset
  4712
	return 0;
hgs
parents:
diff changeset
  4713
	}
hgs
parents:
diff changeset
  4714
hgs
parents:
diff changeset
  4715
void CRunModeAgent::TestAttachToAll()
hgs
parents:
diff changeset
  4716
	{
hgs
parents:
diff changeset
  4717
	test.Next(_L("TestAttachToAll - Attach\n"));
hgs
parents:
diff changeset
  4718
hgs
parents:
diff changeset
  4719
#ifdef ALLCAPS_DEBUGTOKEN
hgs
parents:
diff changeset
  4720
	test.Next(_L("---- First AttachAll \n"));
hgs
parents:
diff changeset
  4721
	test(iServSession.AttachAll() == KErrNone);
hgs
parents:
diff changeset
  4722
	test.Next(_L("---- Second AttachAll \n"));	
hgs
parents:
diff changeset
  4723
	test(iServSession.AttachAll() == KErrAlreadyExists); // Don't think an agent should be allowed to AttachToAll more than once
hgs
parents:
diff changeset
  4724
	
hgs
parents:
diff changeset
  4725
	test.Next(_L("---- DetachAll\n"));
hgs
parents:
diff changeset
  4726
	test(iServSession.DetachAll() == KErrNone);
hgs
parents:
diff changeset
  4727
	test.Next(_L("---- AttachAll again\n"));
hgs
parents:
diff changeset
  4728
	test(iServSession.AttachAll() == KErrNone);
hgs
parents:
diff changeset
  4729
	
hgs
parents:
diff changeset
  4730
	test.Next(_L("---- Suspend thread\n"));
hgs
parents:
diff changeset
  4731
	test( iServSession.SuspendThread(iThreadID) == KErrNone);
hgs
parents:
diff changeset
  4732
hgs
parents:
diff changeset
  4733
	// Check that AttachAll picks up thread crashes without needing to be explicitly attached
hgs
parents:
diff changeset
  4734
	test.Next(_L("---- Attach all SetEventAction\n"));
hgs
parents:
diff changeset
  4735
	TInt err = iServSession.SetEventAction(EEventsKillThread, EActionSuspend);
hgs
parents:
diff changeset
  4736
	test(err == KErrNone);
hgs
parents:
diff changeset
  4737
hgs
parents:
diff changeset
  4738
	test.Next(_L("---- Create DebugThread2\n"));
hgs
parents:
diff changeset
  4739
	// Set up the thread
hgs
parents:
diff changeset
  4740
	RThread threadToPanic;
hgs
parents:
diff changeset
  4741
	err = threadToPanic.Create(_L("DebugThread2"), &PanicFn, 8192, NULL, NULL);
hgs
parents:
diff changeset
  4742
	test(err == KErrNone);
hgs
parents:
diff changeset
  4743
	TRequestStatus undertakerStat;
hgs
parents:
diff changeset
  4744
	threadToPanic.Logon(undertakerStat);
hgs
parents:
diff changeset
  4745
	test(undertakerStat.Int() == KRequestPending);
hgs
parents:
diff changeset
  4746
hgs
parents:
diff changeset
  4747
	// Start listening for events
hgs
parents:
diff changeset
  4748
	TRequestStatus stat;
hgs
parents:
diff changeset
  4749
	TEventInfo info;
hgs
parents:
diff changeset
  4750
	TPckg<TEventInfo> infoPkg(info);
hgs
parents:
diff changeset
  4751
	test.Next(_L("Attach all get event and then resume thread DebugThread2\n"));
hgs
parents:
diff changeset
  4752
	
hgs
parents:
diff changeset
  4753
	iServSession.GetEvent(stat, infoPkg);
hgs
parents:
diff changeset
  4754
	
hgs
parents:
diff changeset
  4755
	threadToPanic.Resume();
hgs
parents:
diff changeset
  4756
	
hgs
parents:
diff changeset
  4757
	test.Printf(_L("Waiting for DebugThread2 panic event to be picked up by AttachToAll\n"));
hgs
parents:
diff changeset
  4758
	User::WaitForRequest(stat);
hgs
parents:
diff changeset
  4759
	test(stat.Int() == KErrNone);
hgs
parents:
diff changeset
  4760
	test(info.iThreadId == threadToPanic.Id());
hgs
parents:
diff changeset
  4761
	test(info.iEventType == EEventsKillThread);
hgs
parents:
diff changeset
  4762
	test(info.iThreadKillInfo.iExitType == EExitPanic);
hgs
parents:
diff changeset
  4763
hgs
parents:
diff changeset
  4764
	test(undertakerStat.Int() == KRequestPending); // This shouldn't get completed until after we call iServSession.ResumeThread below
hgs
parents:
diff changeset
  4765
hgs
parents:
diff changeset
  4766
	// Now resume the thread and wait for the Logon to complete
hgs
parents:
diff changeset
  4767
	test.Next(_L("---- Attach all resume panic thread and then wait for event after DSS has handled it\n"));
hgs
parents:
diff changeset
  4768
	err = iServSession.ResumeThread(threadToPanic.Id());
hgs
parents:
diff changeset
  4769
	test(err == KErrNone);
hgs
parents:
diff changeset
  4770
	User::WaitForRequest(undertakerStat);
hgs
parents:
diff changeset
  4771
	test(undertakerStat.Int() == 123); // The panic reason set in PanicFn is 123
hgs
parents:
diff changeset
  4772
hgs
parents:
diff changeset
  4773
	// And clean up, 
hgs
parents:
diff changeset
  4774
	ResetAttachToAll(threadToPanic);
hgs
parents:
diff changeset
  4775
	//still attached to all
hgs
parents:
diff changeset
  4776
	
hgs
parents:
diff changeset
  4777
	// Test that an explicit attach eclipses an AttachAll, and the AttachAll session 
hgs
parents:
diff changeset
  4778
	// doesn't see the events for specifically attached executables
hgs
parents:
diff changeset
  4779
	test.Next(_L(" ---- ExplicitAttachBeatsAttachAll\n"));
hgs
parents:
diff changeset
  4780
hgs
parents:
diff changeset
  4781
	// We shouldn't see this event because of sess2
hgs
parents:
diff changeset
  4782
	err = iServSession.SetEventAction(EEventsStartThread, EActionContinue); 
hgs
parents:
diff changeset
  4783
	test(err == KErrNone);
hgs
parents:
diff changeset
  4784
	iServSession.GetEvent(stat, infoPkg);
hgs
parents:
diff changeset
  4785
	test(stat.Int() == KRequestPending);
hgs
parents:
diff changeset
  4786
hgs
parents:
diff changeset
  4787
	test.Next(_L("---- New sec session\n"));
hgs
parents:
diff changeset
  4788
	RSecuritySvrSession sess2;
hgs
parents:
diff changeset
  4789
	test(sess2.Connect(securityServerVersion) == KErrNone);
hgs
parents:
diff changeset
  4790
	test.Next(_L("---- New sec session Attach executable \n"));
hgs
parents:
diff changeset
  4791
	test(sess2.AttachExecutable(iFileName, EFalse) == KErrNone);
hgs
parents:
diff changeset
  4792
	err = sess2.SetEventAction(iFileName, EEventsKillThread, EActionSuspend);
hgs
parents:
diff changeset
  4793
	test(err == KErrNone);
hgs
parents:
diff changeset
  4794
	// The EActionSuspend above should trump this EActionContinue
hgs
parents:
diff changeset
  4795
	err = iServSession.SetEventAction(EEventsKillThread, EActionContinue); 
hgs
parents:
diff changeset
  4796
	test(err == KErrNone);
hgs
parents:
diff changeset
  4797
hgs
parents:
diff changeset
  4798
	test.Next(_L("---- New sec session create DebugThread3\n"));
hgs
parents:
diff changeset
  4799
	err = threadToPanic.Create(_L("DebugThread3"), &PanicFn, 8192, NULL, NULL);
hgs
parents:
diff changeset
  4800
	test(err == KErrNone);
hgs
parents:
diff changeset
  4801
	
hgs
parents:
diff changeset
  4802
	// The attach executable above leads the DSS to launch the token, which results 
hgs
parents:
diff changeset
  4803
	// in a start thread event, and since we have done an attach all and a get event, 
hgs
parents:
diff changeset
  4804
	// the TReqStat will be completed accordingly for this token start event. 
hgs
parents:
diff changeset
  4805
	
hgs
parents:
diff changeset
  4806
	threadToPanic.Logon(undertakerStat);
hgs
parents:
diff changeset
  4807
	test(undertakerStat.Int() == KRequestPending); 
hgs
parents:
diff changeset
  4808
hgs
parents:
diff changeset
  4809
	TRequestStatus sess2stat;
hgs
parents:
diff changeset
  4810
	TEventInfo sess2event;
hgs
parents:
diff changeset
  4811
	TPckg<TEventInfo> sess2eventPkg(sess2event);
hgs
parents:
diff changeset
  4812
	test.Next(_L("---- New sec session get event, TReqStat\n") );
hgs
parents:
diff changeset
  4813
	RDebug::Printf(" undertakerStat=0x%x, sess2stat = 0x%x, Pkg=0x%x", 
hgs
parents:
diff changeset
  4814
			&undertakerStat, &sess2stat, &sess2eventPkg);
hgs
parents:
diff changeset
  4815
	
hgs
parents:
diff changeset
  4816
	sess2.GetEvent(iFileName, sess2stat, sess2eventPkg);
hgs
parents:
diff changeset
  4817
	// sess2 didn't ask for EEventsStartThread so we should still be pending at this point	
hgs
parents:
diff changeset
  4818
	test(sess2stat == KRequestPending); 
hgs
parents:
diff changeset
  4819
hgs
parents:
diff changeset
  4820
	test.Next(_L("---- New sec session resume thread and wait for kill event\n"));
hgs
parents:
diff changeset
  4821
	threadToPanic.Resume();
hgs
parents:
diff changeset
  4822
	User::WaitForRequest(sess2stat);
hgs
parents:
diff changeset
  4823
hgs
parents:
diff changeset
  4824
	test(sess2stat.Int() == KErrNone);
hgs
parents:
diff changeset
  4825
	test(sess2event.iThreadId == threadToPanic.Id());
hgs
parents:
diff changeset
  4826
	test(sess2event.iEventType == EEventsKillThread);
hgs
parents:
diff changeset
  4827
	test(sess2event.iThreadKillInfo.iExitType == EExitPanic);
hgs
parents:
diff changeset
  4828
hgs
parents:
diff changeset
  4829
	// the EActionSuspend that sess2 specified should ensure this doesn't get completed
hgs
parents:
diff changeset
  4830
	test(undertakerStat == KRequestPending);
hgs
parents:
diff changeset
  4831
hgs
parents:
diff changeset
  4832
	// Now resume the thread and wait for the Logon to complete
hgs
parents:
diff changeset
  4833
	test.Next(_L("---- ExplicitAttachBeatsAttachAll resume thread 3 after kill\n"));
hgs
parents:
diff changeset
  4834
	err = sess2.ResumeThread(threadToPanic.Id());
hgs
parents:
diff changeset
  4835
	test(err == KErrNone);
hgs
parents:
diff changeset
  4836
	User::WaitForRequest(undertakerStat);
hgs
parents:
diff changeset
  4837
	test(undertakerStat.Int() == 123); // The panic reason set in PanicFn is 123
hgs
parents:
diff changeset
  4838
hgs
parents:
diff changeset
  4839
	// And clean up
hgs
parents:
diff changeset
  4840
	ResetAttachToAll(threadToPanic, &stat, &sess2);
hgs
parents:
diff changeset
  4841
	test.Next(_L("---- Finishing ExplicitAttachBeatsAttachAll > sess2.Close\n"));
hgs
parents:
diff changeset
  4842
	
hgs
parents:
diff changeset
  4843
	sess2.Close();
hgs
parents:
diff changeset
  4844
#if 0
hgs
parents:
diff changeset
  4845
	//TODO allow this by changing from agent pid to session ids in DSS.
hgs
parents:
diff changeset
  4846
	// This will allow a client to have more than one session and call attachall
hgs
parents:
diff changeset
  4847
	
hgs
parents:
diff changeset
  4848
	// Test that a second AttachAll eclipses the first
hgs
parents:
diff changeset
  4849
	// Commented out since not sure we require this
hgs
parents:
diff changeset
  4850
hgs
parents:
diff changeset
  4851
	test.Next(_L("SecondAttachAllBeatsAttachAll"));
hgs
parents:
diff changeset
  4852
	
hgs
parents:
diff changeset
  4853
	//TODO fix detachall in ResetAttachToAll
hgs
parents:
diff changeset
  4854
	test(iServSession.AttachAll() == KErrNone);
hgs
parents:
diff changeset
  4855
	test(sess2.AttachAll() == KErrNone);
hgs
parents:
diff changeset
  4856
	err = iServSession.SetEventAction(EEventsKillThread, EActionSuspend);
hgs
parents:
diff changeset
  4857
	test(err == KErrNone);
hgs
parents:
diff changeset
  4858
	err = sess2.SetEventAction(EEventsKillThread, EActionSuspend);
hgs
parents:
diff changeset
  4859
	test(err == KErrNone);
hgs
parents:
diff changeset
  4860
	err = threadToPanic.Create(_L("DebugThread4"), &PanicFn, 8192, NULL, NULL);
hgs
parents:
diff changeset
  4861
	test(err == KErrNone);
hgs
parents:
diff changeset
  4862
	iServSession.GetEvent(stat, infoPkg);
hgs
parents:
diff changeset
  4863
	test(stat.Int() == KRequestPending);
hgs
parents:
diff changeset
  4864
	sess2.GetEvent(sess2stat, sess2eventPkg);
hgs
parents:
diff changeset
  4865
	test(sess2stat.Int() == KRequestPending);
hgs
parents:
diff changeset
  4866
hgs
parents:
diff changeset
  4867
	threadToPanic.Resume();
hgs
parents:
diff changeset
  4868
	User::WaitForRequest(sess2stat);
hgs
parents:
diff changeset
  4869
	test(sess2event.iThreadId == threadToPanic.Id());
hgs
parents:
diff changeset
  4870
	test(sess2event.iEventType == EEventsKillThread);
hgs
parents:
diff changeset
  4871
	test(sess2event.iThreadKillInfo.iExitType == EExitPanic);
hgs
parents:
diff changeset
  4872
	test(stat.Int() == KRequestPending); // Shouldn't see the killthread event because of sess2
hgs
parents:
diff changeset
  4873
hgs
parents:
diff changeset
  4874
	// And cleanup
hgs
parents:
diff changeset
  4875
	ResetAttachToAll(threadToPanic, &stat, &sess2);
hgs
parents:
diff changeset
  4876
	//TODO fixme test(sess2.DetachAll() == KErrNone);
hgs
parents:
diff changeset
  4877
#endif
hgs
parents:
diff changeset
  4878
hgs
parents:
diff changeset
  4879
#else
hgs
parents:
diff changeset
  4880
	test(iServSession.AttachAll() == KErrPermissionDenied);
hgs
parents:
diff changeset
  4881
#endif
hgs
parents:
diff changeset
  4882
	}
hgs
parents:
diff changeset
  4883
hgs
parents:
diff changeset
  4884
void CRunModeAgent::ResetAttachToAll(RThread& aTestThread, TRequestStatus* aFirstSessionStat, RSecuritySvrSession* aSecondSession)
hgs
parents:
diff changeset
  4885
	{
hgs
parents:
diff changeset
  4886
	
hgs
parents:
diff changeset
  4887
	aTestThread.Close();
hgs
parents:
diff changeset
  4888
hgs
parents:
diff changeset
  4889
	RDebug::Printf("---- ResetAttachToAll : > iServSession.SetEventAction Ignore for Kill and StartThread");
hgs
parents:
diff changeset
  4890
	TInt err = iServSession.SetEventAction(EEventsKillThread, EActionIgnore);
hgs
parents:
diff changeset
  4891
	test(err == KErrNone);
hgs
parents:
diff changeset
  4892
	err = iServSession.SetEventAction(EEventsStartThread, EActionIgnore);
hgs
parents:
diff changeset
  4893
	test(err == KErrNone);
hgs
parents:
diff changeset
  4894
hgs
parents:
diff changeset
  4895
hgs
parents:
diff changeset
  4896
	if (aFirstSessionStat)
hgs
parents:
diff changeset
  4897
		{
hgs
parents:
diff changeset
  4898
		RDebug::Printf("---- ResetAttachToAll : > iServSession.CancelGetEvent");
hgs
parents:
diff changeset
  4899
		iServSession.CancelGetEvent();
hgs
parents:
diff changeset
  4900
		
hgs
parents:
diff changeset
  4901
		RDebug::Printf("---- ResetAttachToAll : > User::WaitForRequest(*aFirstSessionStat);");
hgs
parents:
diff changeset
  4902
		User::WaitForRequest(*aFirstSessionStat);
hgs
parents:
diff changeset
  4903
		
hgs
parents:
diff changeset
  4904
		User::After(1000000);
hgs
parents:
diff changeset
  4905
		RDebug::Printf("---- ResetAttachToAll : > iServSession.DetachAll");
hgs
parents:
diff changeset
  4906
		test(iServSession.DetachAll() == KErrNone);
hgs
parents:
diff changeset
  4907
		}
hgs
parents:
diff changeset
  4908
hgs
parents:
diff changeset
  4909
	if (aSecondSession != NULL)
hgs
parents:
diff changeset
  4910
		{
hgs
parents:
diff changeset
  4911
		User::After(1000000);
hgs
parents:
diff changeset
  4912
		RDebug::Printf("---- ResetAttachToAll : > aSecondSession.SetEventAction kill ignore");
hgs
parents:
diff changeset
  4913
		err = aSecondSession->SetEventAction(iFileName, EEventsKillThread, EActionIgnore);
hgs
parents:
diff changeset
  4914
		User::After(1000000);
hgs
parents:
diff changeset
  4915
		test(err == KErrNone);
hgs
parents:
diff changeset
  4916
		RDebug::Printf("---- ResetAttachToAll : > aSecondSession.SetEventAction start thrd ignore");
hgs
parents:
diff changeset
  4917
		err = aSecondSession->SetEventAction(iFileName, EEventsStartThread, EActionIgnore);
hgs
parents:
diff changeset
  4918
		User::After(1000000);
hgs
parents:
diff changeset
  4919
		test(err == KErrNone);
hgs
parents:
diff changeset
  4920
		RDebug::Printf("---- ResetAttachToAll : > aSecondSession.DetachExecutable");
hgs
parents:
diff changeset
  4921
		err = aSecondSession->DetachExecutable(iFileName);
hgs
parents:
diff changeset
  4922
		User::After(1000000);
hgs
parents:
diff changeset
  4923
		test( err == KErrNone);
hgs
parents:
diff changeset
  4924
		}
hgs
parents:
diff changeset
  4925
	}
hgs
parents:
diff changeset
  4926
hgs
parents:
diff changeset
  4927
void CRunModeAgent::TestResumeBreakpointsRepeatedly()
hgs
parents:
diff changeset
  4928
	{
hgs
parents:
diff changeset
  4929
	test.Next(_L("TestResumeBreakpointsRepeatedly\n"));
hgs
parents:
diff changeset
  4930
	test(iServSession.AttachExecutable(KRMDebugTestApplication, EFalse/*  Active */) == KErrNone);
hgs
parents:
diff changeset
  4931
hgs
parents:
diff changeset
  4932
	RProcess debugProcess;
hgs
parents:
diff changeset
  4933
	TThreadId debugThreadId;
hgs
parents:
diff changeset
  4934
	LaunchDebugProcessAndSetBreakpoint(debugProcess, debugThreadId);
hgs
parents:
diff changeset
  4935
	test(iServSession.ResumeThread(debugThreadId) == KErrNone);
hgs
parents:
diff changeset
  4936
	
hgs
parents:
diff changeset
  4937
	// Let the thread die naturally (at least from DSS's point of view)
hgs
parents:
diff changeset
  4938
	debugProcess.Kill(0);
hgs
parents:
diff changeset
  4939
	debugProcess.Close();
hgs
parents:
diff changeset
  4940
hgs
parents:
diff changeset
  4941
	test.Printf(_L("Closing iServSession\n"));
hgs
parents:
diff changeset
  4942
	iServSession.Close();
hgs
parents:
diff changeset
  4943
	//User::After(1000000); // I hate myself...
hgs
parents:
diff changeset
  4944
	test(iServSession.Connect(securityServerVersion) == KErrNone);
hgs
parents:
diff changeset
  4945
	test(iServSession.AttachExecutable(KRMDebugTestApplication, EFalse/*  Active */) == KErrNone);
hgs
parents:
diff changeset
  4946
hgs
parents:
diff changeset
  4947
	test.Printf(_L("Launching process for second time\n"));
hgs
parents:
diff changeset
  4948
hgs
parents:
diff changeset
  4949
	LaunchDebugProcessAndSetBreakpoint(debugProcess, debugThreadId);
hgs
parents:
diff changeset
  4950
	test(iServSession.ResumeThread(debugThreadId) == KErrNone);
hgs
parents:
diff changeset
  4951
	debugProcess.Kill(0);
hgs
parents:
diff changeset
  4952
	debugProcess.Close();
hgs
parents:
diff changeset
  4953
hgs
parents:
diff changeset
  4954
	/*test.Printf(_L("Launching process for third time\n"));
hgs
parents:
diff changeset
  4955
	debugProcess.Kill(0);
hgs
parents:
diff changeset
  4956
	debugProcess.Close();
hgs
parents:
diff changeset
  4957
	iServSession.Close();
hgs
parents:
diff changeset
  4958
	User::After(1000000); // I hate myself...
hgs
parents:
diff changeset
  4959
	test(iServSession.Connect(securityServerVersion) == KErrNone);
hgs
parents:
diff changeset
  4960
	test(iServSession.AttachExecutable(KRMDebugTestApplication, EFalse/ *  Active * /) == KErrNone);
hgs
parents:
diff changeset
  4961
	*/
hgs
parents:
diff changeset
  4962
hgs
parents:
diff changeset
  4963
	test(KErrNone == iServSession.DetachExecutable(KRMDebugTestApplication));
hgs
parents:
diff changeset
  4964
	}
hgs
parents:
diff changeset
  4965
hgs
parents:
diff changeset
  4966
void CRunModeAgent::TimedWait(TRequestStatus& aStatus, TInt aTimeoutInMs, TInt aLineNumber)
hgs
parents:
diff changeset
  4967
	{
hgs
parents:
diff changeset
  4968
	RTimer timer;
hgs
parents:
diff changeset
  4969
	TInt err = timer.CreateLocal();
hgs
parents:
diff changeset
  4970
	test(err == KErrNone);
hgs
parents:
diff changeset
  4971
hgs
parents:
diff changeset
  4972
	TRequestStatus timerstat;
hgs
parents:
diff changeset
  4973
	timer.After(timerstat, aTimeoutInMs*1000);
hgs
parents:
diff changeset
  4974
	User::WaitForRequest(aStatus, timerstat);
hgs
parents:
diff changeset
  4975
	if (timerstat != KRequestPending)
hgs
parents:
diff changeset
  4976
		{
hgs
parents:
diff changeset
  4977
		test.Panic(_L("Timed out at line %d\n"), aLineNumber);
hgs
parents:
diff changeset
  4978
		}
hgs
parents:
diff changeset
  4979
	else
hgs
parents:
diff changeset
  4980
		{
hgs
parents:
diff changeset
  4981
		timer.Cancel();
hgs
parents:
diff changeset
  4982
		User::WaitForRequest(timerstat);
hgs
parents:
diff changeset
  4983
		}
hgs
parents:
diff changeset
  4984
	timer.Close();
hgs
parents:
diff changeset
  4985
	}