kerneltest/e32test/system/t_xprot.cpp
changeset 0 a41df078684a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/e32test/system/t_xprot.cpp	Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,575 @@
+// Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32test\system\t_xprot.cpp
+// 
+//
+
+#include <e32test.h>
+#include "execinfo.h"
+#include <u32arm.h>
+
+const TInt KSupervisorAddress=0x80000000;
+const TInt KGarbageAddress=0xeeddbbcc;
+
+TInt Handles[MAX_HANDLE];
+TInt DataArea[1024];
+TBuf8<1024> Buf8;
+TBuf<1024> Buf;
+TPtrC8 PtrC8(Buf8.Ptr(),10);
+TPtrC8 PtrC(Buf.Ptr(),10);
+TPtrC8 Ptr8(Buf8.Ptr(),10,1024);
+TPtrC8 Ptr(Buf.Ptr(),10,1024);
+TPtrC8 Ptr8N(NULL,10,1024);
+TPtrC8 PtrN(NULL,10,1024);
+TPtrC8 Ptr8I((TUint8*)KGarbageAddress,10,1024);
+TPtrC8 PtrI((TText*)KGarbageAddress,10,1024);
+TPtrC8 Ptr8S((TUint8*)KSupervisorAddress,10,1024);
+TPtrC8 PtrS((TText*)KSupervisorAddress,10,1024);
+TInt MessageHandle;
+
+TInt Args[4];
+
+TInt GetHandle(TInt& aState, TInt aHandleType)
+	{
+	TInt r;
+	TInt t=aHandleType?aHandleType-1:ELibrary;
+	switch(aState)
+		{
+		case 0: r=0; break;
+		case 1: r=0xdeaddead; break;
+		case 2: r=Handles[EThread]; break;
+		case 3: r=Handles[t]; break;
+		case 4: aState=0; return 0;
+		}
+	++aState;
+	return r;
+	}
+
+TInt GetAnyInt(TInt& aState)
+	{
+	TInt r;
+	switch(aState)
+		{
+		case 0: r=0; break;
+		case 1: r=1; break;
+		case 2: r=2; break;
+		case 3: r=-1; break;
+		case 4: r=299792458; break;
+		case 5: aState=0; return 0;
+		}
+	++aState;
+	return r;
+	}
+
+TInt GetAnyPtr(TInt& aState)
+	{
+	TInt r;
+	switch(aState)
+		{
+		case 0: r=0; break;
+		case 1: r=KGarbageAddress; break;
+		case 2: r=KSupervisorAddress; break;
+		case 3: r=(TInt)DataArea; break;
+		case 4: aState=0; return 0;
+		}
+	++aState;
+	return r;
+	}
+
+TInt GetIntPtr(TInt& aState)
+	{
+	TInt r;
+	switch(aState)
+		{
+		case 0: r=0; break;
+		case 1: r=KGarbageAddress; break;
+		case 2: r=((TInt)DataArea)+1; break;
+		case 3: r=KSupervisorAddress; break;
+		case 4: r=(TInt)DataArea; break;
+		case 5: aState=0; return 0;
+		}
+	++aState;
+	return r;
+	}
+
+TInt GetDes8(TInt& aState)
+	{
+	TInt r;
+	switch(aState)
+		{
+		case 0: r=0; break;
+		case 1: r=KGarbageAddress; break;
+		case 2: r=KSupervisorAddress; break;
+		case 3: r=(TInt)&Ptr8N; break;
+		case 4: r=(TInt)&Ptr8I; break;
+		case 5: r=(TInt)&Ptr8S; break;
+		case 6: r=(TInt)&Ptr8; break;
+		case 7: aState=0; return 0;
+		}
+	++aState;
+	return r;
+	}
+
+TInt GetWDes8(TInt& aState)
+	{
+	TInt r;
+	switch(aState)
+		{
+		case 0: r=0; break;
+		case 1: r=KGarbageAddress; break;
+		case 2: r=KSupervisorAddress; break;
+		case 3: r=(TInt)&Ptr8N; break;
+		case 4: r=(TInt)&Ptr8I; break;
+		case 5: r=(TInt)&Ptr8S; break;
+		case 6: r=(TInt)&PtrC8; break;
+		case 7: r=(TInt)&Ptr8; break;
+		case 8: aState=0; return 0;
+		}
+	++aState;
+	return r;
+	}
+
+TInt GetDes(TInt& aState)
+	{
+	TInt r;
+	switch(aState)
+		{
+		case 0: r=0; break;
+		case 1: r=KGarbageAddress; break;
+		case 2: r=KSupervisorAddress; break;
+		case 3: r=(TInt)&PtrN; break;
+		case 4: r=(TInt)&PtrI; break;
+		case 5: r=(TInt)&PtrS; break;
+		case 6: r=(TInt)&Ptr; break;
+		case 7: aState=0; return 0;
+		}
+	++aState;
+	return r;
+	}
+
+TInt GetWDes(TInt& aState)
+	{
+	TInt r;
+	switch(aState)
+		{
+		case 0: r=0; break;
+		case 1: r=KGarbageAddress; break;
+		case 2: r=KSupervisorAddress; break;
+		case 3: r=(TInt)&PtrN; break;
+		case 4: r=(TInt)&PtrI; break;
+		case 5: r=(TInt)&PtrS; break;
+		case 6: r=(TInt)&PtrC; break;
+		case 7: r=(TInt)&Ptr; break;
+		case 8: aState=0; return 0;
+		}
+	++aState;
+	return r;
+	}
+
+TInt GetBool(TInt& aState)
+	{
+	TInt r;
+	switch(aState)
+		{
+		case 0: r=0; break;
+		case 1: r=1; break;
+		case 2: r=299792458; break;
+		case 3: aState=0; return 0;
+		}
+	++aState;
+	return r;
+	}
+
+TInt GetObjectType(TInt& aState)
+	{
+	TInt r;
+	switch(aState)
+		{
+		case 0: r=EThread; break;
+		case 1: r=ELibrary; break;
+		case 2: r=ENumObjectType; break;
+		case 3: r=20000; break;
+		case 4: aState=0; return 0;
+		}
+	++aState;
+	return r;
+	}
+
+TInt GetDevUnit(TInt& aState)
+	{
+	TInt r;
+	switch(aState)
+		{
+		case 0: r=0; break;
+		case 1: r=1; break;
+		case 2: r=20000; break;
+		case 3: aState=0; return 0;
+		}
+	++aState;
+	return r;
+	}
+
+TInt GetMsgHandle(TInt& aState)
+	{
+	TInt r;
+	switch(aState)
+		{
+		case 0: r=0; break;
+		case 1: r=KGarbageAddress; break;
+		case 2: r=(TInt)DataArea; break;
+		case 3: r=KSupervisorAddress; break;
+		case 4: r=MessageHandle; break;
+		case 5: aState=0; return 0;
+		}
+	++aState;
+	return r;
+	}
+
+TInt GetModuleHandle(TInt& aState)
+	{
+	TInt r;
+	switch(aState)
+		{
+		case 0: r=0; break;
+		case 1: r=KGarbageAddress; break;
+		case 2: r=ModuleHandle; break;
+		case 3: aState=0; return 0;
+		}
+	++aState;
+	return r;
+	}
+
+TInt GetSessionHandlePtr(TInt& aState)
+	{
+	TInt r;
+	switch(aState)
+		{
+		case 0: r=0; break;
+		case 1: r=KGarbageAddress; break;
+		case 2: r=KSupervisorAddress; break;
+		case 3: r=(TInt)&Handles[ESession]; break;
+		case 4: aState=0; return 0;
+		}
+	++aState;
+	return r;
+	}
+
+TInt GetArgument(TInt& aState, TInt aArgType)
+	{
+	if (aArgType==NO_PAR)
+		return 0;
+	if (aArgType<MAX_HANDLE)
+		return GetHandle(aState,aArgType);
+	switch (aArgType)
+		{
+		case ANY_INT: return GetAnyInt(aState);
+		case ANY_PTR: return GetAnyPtr(aState);
+		case INT_PTR: return GetIntPtr(aState);
+		case DES8: return GetDes8(aState);
+		case WDES8: return GetWDes8(aState);
+		case DES: return GetDes(aState);
+		case WDES: return GetWDes(aState);
+		case BOOL: return GetBool(aState);
+		case OBJECT_TYPE: return GetObjectType(aState);
+		case DEV_UNIT: return GetDevUnit(aState);
+		case MSG_HANDLE: return GetMsgHandle(aState);
+		case MODULE_HANDLE: return GetModuleHandle(aState);
+		case SESSION_HANDLE_PTR: return GetSessionHandlePtr(aState);
+		}
+	User::Panic(_L("UNKNOWN ARG TYPE"),aArgType);
+	}
+
+#define FAST_EXEC(n)	asm("swi %a0" : : "i" (n|EXECUTIVE_FAST))
+__NAKED__ void DoFastExecCall(TInt /*aExecNum*/)
+	{
+	asm("ldr r1, __Args ");
+	asm("mov ip, lr ");
+	asm("ldmfd r1, {r0-r3} ");
+	asm("add pc, pc, r0, lsl #2 ");
+	asm("nop )";
+
+	FAST_EXEC(EFastExecWaitForAnyRequest);
+	FAST_EXEC(EFastExecLanguage);
+	FAST_EXEC(EFastExecHeap);
+	FAST_EXEC(EFastExecHeapSwitch);
+	FAST_EXEC(EFastExecPushTrapFrame);
+	FAST_EXEC(EFastExecPopTrapFrame);
+	FAST_EXEC(EFastExecActiveScheduler);
+	FAST_EXEC(EFastExecSetActiveScheduler);
+	FAST_EXEC(EFastExecLockPeriod);
+	FAST_EXEC(EFastExecTrapHandler);
+	FAST_EXEC(EFastExecSetTrapHandler);
+	FAST_EXEC(EFastExecLockedInc);
+	FAST_EXEC(EFastExecLockedDec);
+	FAST_EXEC(EFastExecDebugMask);
+	FAST_EXEC(EFastExecSetDebugMask);
+	FAST_EXEC(EFastExecFastCounter);
+	FAST_EXEC(EFastExecGetLocaleCharSet);
+	FAST_EXEC(EFastExecLockRamDrive);
+	FAST_EXEC(EFastExecUnlockRamDrive);
+	FAST_EXEC(EFastExecRomHeaderAddress);
+	FAST_EXEC(EFastExecRomRootDirAddress);
+	FAST_EXEC(EFastExecJustInTime);
+	FAST_EXEC(EFastExecSetJustInTime);
+	FAST_EXEC(EFastExecBlockThreads);
+	FAST_EXEC(EFastExecKernelStartup);
+	FAST_EXEC(EFastExecFatUtilityFunctions);
+	FAST_EXEC(EFastExecSafeInc);
+	FAST_EXEC(EFastExecSafeDec);
+
+	asm("__Args: ");
+	asm(".word Args ");
+	}
+
+#define SLOW_EXEC(n)	asm("swi %a0" : : "i" (n))
+__NAKED__ void DoSlowExecCall(TInt /*aExecNum*/)
+	{
+	asm("ldr r1, __Args ");
+	asm("mov ip, lr ");
+	asm("ldmfd r1, {r0-r3} ");
+	asm("add pc, pc, r0, lsl #2 ");
+	asm("nop )";
+
+	SLOW_EXEC(EExecObjectNext);
+	SLOW_EXEC(EExecChunkBase);
+	SLOW_EXEC(EExecChunkSize);
+	SLOW_EXEC(EExecChunkMaxSize);
+	SLOW_EXEC(EExecHandleAttributes);
+	SLOW_EXEC(EExecTickCount);
+	SLOW_EXEC(EExecLogicalDeviceGetCaps);
+	SLOW_EXEC(EExecLogicalDeviceQueryVersionSupported);
+	SLOW_EXEC(EExecLogicalDeviceIsAvailable);
+	SLOW_EXEC(EExecDllGlobalAlloc);
+	SLOW_EXEC(EExecChangeLocale);
+	SLOW_EXEC(EExecChannelRequest);
+	SLOW_EXEC(EExecMathRandom);
+	SLOW_EXEC(EExecChannelControl);
+	SLOW_EXEC(EExecResetMachine);
+	SLOW_EXEC(EExecLibraryLookup);
+	SLOW_EXEC(EExecLibraryEntryPoint);
+	SLOW_EXEC(EExecLibraryDllRefTable);
+	SLOW_EXEC(EExecStaticCallList);
+	SLOW_EXEC(EExecDynamicCallList);
+	SLOW_EXEC(EExecLibraryCallList);
+	SLOW_EXEC(EExecLibraryFileName);
+	SLOW_EXEC(EExecExecuteInSupervisorMode);
+	SLOW_EXEC(EExecMutexCount);
+	SLOW_EXEC(EExecMutexWait);
+	SLOW_EXEC(EExecMutexSignal);
+	SLOW_EXEC(EExecProcessId);
+	SLOW_EXEC(EExecDllFileName);
+	SLOW_EXEC(EExecProcessResume);
+	SLOW_EXEC(EExecProcessFileName);
+	SLOW_EXEC(EExecProcessCommandLine);
+	SLOW_EXEC(EExecProcessExitType);
+	SLOW_EXEC(EExecProcessExitReason);
+	SLOW_EXEC(EExecProcessExitCategory);
+	SLOW_EXEC(EExecProcessPriority);
+	SLOW_EXEC(EExecProcessSetPriority);
+	SLOW_EXEC(EExecProcessFlags);
+	SLOW_EXEC(EExecProcessSetFlags);
+	SLOW_EXEC(EExecProcessSetOwner);
+	SLOW_EXEC(EExecDllInitialiseData);
+	SLOW_EXEC(EExecSemaphoreCount);
+	SLOW_EXEC(EExecSemaphoreWait);
+	SLOW_EXEC(EExecSemaphoreSignal1);
+	SLOW_EXEC(EExecSemaphoreSignalN);
+	SLOW_EXEC(EExecDllFreeData);
+	SLOW_EXEC(EExecServerReceive);
+	SLOW_EXEC(EExecServerCancel);
+	SLOW_EXEC(EExecSetSessionPtr);
+	SLOW_EXEC(EExecSessionSend);
+	SLOW_EXEC(EExecThreadId);
+	SLOW_EXEC(EExecSessionShare);
+	SLOW_EXEC(EExecThreadResume);
+	SLOW_EXEC(EExecThreadSuspend);
+	SLOW_EXEC(EExecThreadPriority);
+	SLOW_EXEC(EExecThreadSetPriority);
+	SLOW_EXEC(EExecThreadProcessPriority);
+	SLOW_EXEC(EExecThreadSetProcessPriority);
+	SLOW_EXEC(EExecThreadFlags);
+	SLOW_EXEC(EExecThreadSetFlags);
+	SLOW_EXEC(EExecThreadRequestCount);
+	SLOW_EXEC(EExecThreadExitType);
+	SLOW_EXEC(EExecThreadExitReason);
+	SLOW_EXEC(EExecThreadExitCategory);
+	SLOW_EXEC(EExecThreadGetDesLength);
+	SLOW_EXEC(EExecThreadGetDesMaxLength);
+	SLOW_EXEC(EExecThreadRead8);
+	SLOW_EXEC(EExecThreadRead16);
+	SLOW_EXEC(EExecThreadWrite8);
+	SLOW_EXEC(EExecThreadWrite16);
+	SLOW_EXEC(EExecTimerCancel);
+	SLOW_EXEC(EExecTimerAfter);
+	SLOW_EXEC(EExecTimerAt);
+	SLOW_EXEC(EExecTimerLock);
+	SLOW_EXEC(EExecChangeNotifierLogon);
+	SLOW_EXEC(EExecChangeNotifierLogoff);
+	SLOW_EXEC(EExecRequestSignal);
+	SLOW_EXEC(EExecMatch8);
+	SLOW_EXEC(EExecMatch16);
+	SLOW_EXEC(EExecFind8);
+	SLOW_EXEC(EExecFind16);
+	SLOW_EXEC(EExecLocateF8);
+	SLOW_EXEC(EExecLocateF16);
+	SLOW_EXEC(EExecHandleName);
+	SLOW_EXEC(EExecHandleFullName);
+	SLOW_EXEC(EExecHandleInfo);
+	SLOW_EXEC(EExecHandleCount);
+	SLOW_EXEC(EExecAfter);
+	SLOW_EXEC(EExecAt);
+	SLOW_EXEC(EExecDayName);
+	SLOW_EXEC(EExecDayNameAbb);
+	SLOW_EXEC(EExecMonthName);
+	SLOW_EXEC(EExecMonthNameAbb);
+	SLOW_EXEC(EExecSuffix);
+	SLOW_EXEC(EExecAmPmName);
+	SLOW_EXEC(EExecCurrencySymbol);
+	SLOW_EXEC(EExecLocale);
+	SLOW_EXEC(EExecLocaleSet);
+	SLOW_EXEC(EExecLocaleMessageText);
+	SLOW_EXEC(EExecMessageComplete);
+	SLOW_EXEC(EExecTimeNow);
+	SLOW_EXEC(EExecSetHomeTime);
+	SLOW_EXEC(EExecSetMachineConfiguration);
+	SLOW_EXEC(EExecCaptureEventHook);
+	SLOW_EXEC(EExecReleaseEventHook);
+	SLOW_EXEC(EExecRequestEvent);
+	SLOW_EXEC(EExecRequestEventCancel);
+	SLOW_EXEC(EExecAddEvent);
+	SLOW_EXEC(EExecSessionSendSync);
+	SLOW_EXEC(EExecDllGlobalAllocated);
+	SLOW_EXEC(EExecDllGlobalRead);
+	SLOW_EXEC(EExecDllGlobalWrite);
+	SLOW_EXEC(EExecDllTls);
+	SLOW_EXEC(EExecHalFunction);
+	SLOW_EXEC(EExecSessionAttach);
+	SLOW_EXEC(EExecWsRegisterThread);
+	SLOW_EXEC(EExecFsRegisterThread);
+	SLOW_EXEC(EExecProcessCommandLineLength);
+	SLOW_EXEC(EExecTimerInactivity);
+	SLOW_EXEC(EExecUserInactivityTime);
+	SLOW_EXEC(EExecShortDateFormatSpec);
+	SLOW_EXEC(EExecLongDateFormatSpec);
+	SLOW_EXEC(EExecTimeFormatSpec);
+	SLOW_EXEC(EExecResetInactivityTime);
+	SLOW_EXEC(EExecDebugFunction);
+	SLOW_EXEC(EExecBreakPoint);
+	SLOW_EXEC(EExecProfileStart);
+	SLOW_EXEC(EExecProfileEnd);
+	SLOW_EXEC(EExecPasswordIsEnabled);
+	SLOW_EXEC(EExecPasswordIsValid);
+	SLOW_EXEC(EExecExceptionHandler);
+	SLOW_EXEC(EExecSetExceptionHandler);
+	SLOW_EXEC(EExecModifyExceptionMask);
+	SLOW_EXEC(EExecRaiseException);
+	SLOW_EXEC(EExecIsExceptionHandled);
+	SLOW_EXEC(EExecThreadGetRamSizes);
+	SLOW_EXEC(EExecProcessGetRamSizes);
+	SLOW_EXEC(EExecLibraryGetRamSizes);
+	SLOW_EXEC(EExecMachineConfiguration);
+	SLOW_EXEC(EExecWasChunkSetHeapInfo);
+	SLOW_EXEC(EExecLibraryType);
+	SLOW_EXEC(EExecProcessType);
+	SLOW_EXEC(EExecPasswordSetEnabled);
+	SLOW_EXEC(EExecPasswordSet);
+	SLOW_EXEC(EExecSetCurrencySymbol);
+	SLOW_EXEC(EExecProcessSetType);
+	SLOW_EXEC(EExecChunkBottom);
+	SLOW_EXEC(EExecChunkTop);
+	SLOW_EXEC(EExecThreadContext);
+	SLOW_EXEC(EExecDllDataInfo);
+	SLOW_EXEC(EExecThreadCreate);
+	SLOW_EXEC(EExecProcessCreate);
+	SLOW_EXEC(EExecProcessLoaded);
+	SLOW_EXEC(EExecFindHandleOpen);
+	SLOW_EXEC(EExecHandleClose);
+	SLOW_EXEC(EExecChunkCreate);
+	SLOW_EXEC(EExecChunkAdjust);
+	SLOW_EXEC(EExecOpenNamedObject);
+	SLOW_EXEC(EExecHandleDuplicate);
+	SLOW_EXEC(EExecMutexCreate);
+	SLOW_EXEC(EExecSemaphoreCreate);
+	SLOW_EXEC(EExecThreadOpenById);
+	SLOW_EXEC(EExecProcessOpenById);
+	SLOW_EXEC(EExecThreadKill);
+	SLOW_EXEC(EExecThreadLogon);
+	SLOW_EXEC(EExecThreadLogonCancel);
+	SLOW_EXEC(EExecDllSetTls);
+	SLOW_EXEC(EExecDllFreeTls);
+	SLOW_EXEC(EExecThreadRename);
+	SLOW_EXEC(EExecProcessRename);
+	SLOW_EXEC(EExecProcessKill);
+	SLOW_EXEC(EExecProcessOwner);
+	SLOW_EXEC(EExecProcessLogon);
+	SLOW_EXEC(EExecProcessLogonCancel);
+	SLOW_EXEC(EExecThreadSetInitialParameter);
+	SLOW_EXEC(EExecThreadProcess);
+	SLOW_EXEC(EExecThreadGetHeap);
+	SLOW_EXEC(EExecServerCreate);
+	SLOW_EXEC(EExecSessionCreate);
+	SLOW_EXEC(EExecLibraryLoadExact);
+	SLOW_EXEC(EExecLibraryLoaded);
+	SLOW_EXEC(EExecDeviceLoad);
+	SLOW_EXEC(EExecDeviceFree);
+	SLOW_EXEC(EExecChannelCreate);
+	SLOW_EXEC(EExecTimerCreate);
+	SLOW_EXEC(EExecDllAddDependency);
+	SLOW_EXEC(EExecTimerHighRes);
+	SLOW_EXEC(EExecAfterHighRes);
+	SLOW_EXEC(EExecChangeNotifierCreate);
+	SLOW_EXEC(EExecUndertakerCreate);
+	SLOW_EXEC(EExecUndertakerLogon);
+	SLOW_EXEC(EExecUndertakerLogonCancel);
+	SLOW_EXEC(EExecKernelHeapDebug);
+	SLOW_EXEC(EExecThreadGetCpuTime);
+	}
+
+
+void TestExec(const SExecInfo& aInfo, TBool aFast)
+	{
+	TInt xn=aInfo.iExecNum;
+	TInt np=aInfo.iNumParams;
+	if (np==0)
+		return;		// no parameters
+	if (!aFast)
+		{
+		// don't do some slow execs
+		switch (xn)
+			{
+			// loader group (could be restricted to F32)
+			case EExecProcessCreate:
+			case EExecProcessLoaded:
+			case EExecLibraryLoadExact:
+			case EExecLibraryLoaded:
+			case EExecDllAddDependency:
+				return;
+			// descriptor processing (could be moved user side)
+			case EExecMatch8:
+			case EExecMatch16:
+			case EExecLocateF8:
+			case EExecLocateF16:
+			case EExecFind8:
+			case EExecFind16:
+				return;
+
+			// we don't want to do this
+			case EExecResetMachine:
+				return;
+			}
+		}
+
+	TInt state[4];
+	Mem::FillZ(state,sizeof(state));
+	}