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