kernel/eka/include/e32ldr_private.h
author Tom Cosgrove <tom.cosgrove@nokia.com>
Fri, 28 May 2010 16:29:07 +0100
changeset 30 8aab599e3476
parent 6 0173bcd7697c
permissions -rw-r--r--
Fix for bug 2283 (RVCT 4.0 support is missing from PDK 3.0.h) Have multiple extension sections in the bld.inf, one for each version of the compiler. The RVCT version building the tools will build the runtime libraries for its version, but make sure we extract all the other versions from zip archives. Also add the archive for RVCT4.

// Copyright (c) 1995-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:
// e32\include\e32ldr_private.h
// 

/**
 @file
 @internalTechnology
*/

#ifndef __E32LDR_PRIVATE_H__
#define __E32LDR_PRIVATE_H__

#include <e32ldr.h>
#include <e32cmn.h>


const TInt KMaxLibraryEntryPoints=0x100;

//
// Loader version number.
//
const TInt KLoaderMajorVersionNumber=1;
const TInt KLoaderMinorVersionNumber=0;

//
// IPC messages to the loader
//
enum TLoaderMsg
	{
	ELoadProcess=1,
	ELoadLibrary=2,
	ELoadLogicalDevice=3,
	ELoadPhysicalDevice=4,
	ELoadLocale=5,
	ELoadFileSystem=6,
	EGetInfo=7,
	ELoaderDebugFunction=8,
	ELoadFSExtension=9,
	EGetInfoFromHeader=10,
	ELoadFSPlugin=11,
	ELoaderCancelLazyDllUnload=12,
	ELdrDelete=13,
	ECheckLibraryHash=14, 
	ELoadFSProxyDrive=15,
    ELoadCodePage=16,
    EMaxLoaderMsg
	};
//
// Loader message arguments:
//		0 = TLdrInfo
//		1 = Filename
//		2 = Command line (process) or path (library)
//
class TLdrInfo
	{
public:
	IMPORT_C TLdrInfo();		// for BC
public:
	TUidType iRequestedUids;
	TOwnerType iOwnerType;
	TInt iHandle;
	TUint32 iSecureId;
	TUint32 iRequestedVersion;
	TInt iMinStackSize;			// Size of new process stack 
	};
	

#ifndef __KERNEL_MODE__
#include <e32std.h>
//
// Loader client class
//
class RLoader : public RSessionBase
	{
public:
	IMPORT_C TInt Connect();
	TVersion Version() const;
	TInt LoadProcess(TInt& aHandle, const TDesC& aFileName, const TDesC& aCommand, const TUidType& aUidType, TOwnerType aType);
	IMPORT_C TInt LoadLibrary(TInt& aHandle, const TDesC& aFileName, const TDesC& aPath, const TUidType& aType, TUint32 aModuleVersion);
	IMPORT_C TInt GetInfo(const TDesC& aFileName, TDes8& aInfoBuf);
	TInt LoadDeviceDriver(const TDesC& aFileName, TInt aDeviceType);
	IMPORT_C TInt DebugFunction(TInt aFunction, TInt a1, TInt a2, TInt a3);
	TInt LoadLocale(const TDesC& aLocaleDllName, TLibraryFunction* aExportList);
	TInt GetInfoFromHeader(const TDesC8& aHeader, TDes8& aInfoBuf);
	IMPORT_C TInt CancelLazyDllUnload();
	IMPORT_C TInt Delete(const TDesC& aFileName);
    IMPORT_C TInt CheckLibraryHash(const TDesC& aFileName, TBool aValidateHash=EFalse);
	TInt LoadProcess(TInt& aHandle, const TDesC& aFileName, const TDesC& aCommand, const TUidType& aUidType, TInt aMinStackSize, TOwnerType aType);
public:
#ifdef __ARMCC__
	// workaround for possible EDG bug (!!)
	inline TInt SendReceive(TInt aFunction,const TIpcArgs& aArgs) const
	  { return RSessionBase::SendReceive(aFunction, aArgs); }
#else
	using RSessionBase::SendReceive;
#endif
	};
#endif

//
// Information required to create a new code segment
//
enum TCodeSegAttributes
	{
	ECodeSegAttKernel			=0x00000001,
	ECodeSegAttGlobal			=0x00000002,
	ECodeSegAttFixed			=0x00000004,
	ECodeSegAttABIMask			=0x00000018,	  // same values as in image header
	ECodeSegAttCodePaged		=0x00000200,	  // the code seg is demand paged
	ECodeSegAttDataPaged		=0x00002000,	  // the code seg static data is demand paged
	ECodeSegAttHDll				=(TInt)0x80000000,// Emulator host file type: 1=DLL, 0=EXE
	ECodeSegAttExpVer			=0x40000000,	  // Filename is explicitly versioned
	ECodeSegAttNmdExpData		=0x20000000,	  // Named symbol export data in code seg
	ECodeSegAttSMPSafe			=0x10000000,	  // code seg and its static dependencies are SMP safe
	ECodeSegAttAddrNotUnique	=0x08000000,	  // run address not globally unique (may overlap other codesegs)
	};

// forward declarations from file server
class RFile;
class RFs;

/**
A Handle used to identify a file on storage media.
@internalTechnology
*/
class RFileClamp
	{
public:
	inline RFileClamp()
		{
		iCookie[0] = 0;
		iCookie[1] = 0;
		}
	IMPORT_C TInt Clamp(RFile& aFile);
	IMPORT_C TInt Close(RFs& aFs);

public:
	TInt64 iCookie[2];
	};


class TCodeSegCreateInfo
	{
public:
	TBuf8<KMaxFileName> iFileName;		// not including {MMMMmmmm} version info
	TUidType iUids;				// uid1 indicates EXE or DLL
	TUint32 iAttr;
	TInt iCodeSize;
	TInt iTextSize;
	TInt iDataSize;
	TInt iBssSize;
	TInt iTotalDataSize;
	TUint32 iEntryPtVeneer;		// address of first instruction to be called
	TUint32 iFileEntryPoint;	// address of entry point within this code segment
	TInt iDepCount;
	TUint32 iExportDir;
	TInt iExportDirCount;
	TUint32 iCodeLoadAddress;	// 0 for RAM loaded code, else pointer to TRomImageHeader
	TUint32 iCodeRunAddress;
	TUint32 iDataLoadAddress;
	TUint32 iDataRunAddress;
	TUint32 iExceptionDescriptor;
	TInt iRootNameOffset;
	TInt iRootNameLength;
	TInt iExtOffset;
	TUint32 iModuleVersion;
	SSecurityInfo iS;
	TAny* iHandle;				// pointer to kernel-side DCodeSeg object
	TInt iClientProcessHandle;	// handle to client process for user DLL loads
	/** Code relocation information stored on loader heap. */
	TUint32* iCodeRelocTable;
	/** Size of code relocation table in bytes. */
	TInt iCodeRelocTableSize;
	/** Import fixup information stored on loader heap. */
	TUint32* iImportFixupTable;
	/** Size of import fixup table in bytes. */
	TInt iImportFixupTableSize;
	/** Offset to apply to each code address in the image when it is fixed up. */
	TUint32 iCodeDelta;
	/** Offset to apply to each data address in the image when it is fixed up. */
	TUint32 iDataDelta;
	/**
		Whether the code is paged.  If this is set, then
		TCodeSegCreateInfo::iCodeRelocTable[Size] and
		TCodeSegCreateInfo::iImportFixupTable[Size] contain fixup information
		which the kernel uses to fix up each page.
		(They may be null if the binary has no imports or no code section.)
	 */
	TBool iUseCodePaging;
	/** The UID of the compression scheme in use. */
	TUint32 iCompressionType;
	/**
		Start of compressed pages within the file.  The kernel uses
		this to load compressed pages from byte-pair files when demand
		paging.
	 */
	TInt32* iCodePageOffsets;
	/** Where (possibly compressed) object code starts in iFile. */
	TInt iCodeStartInFile;
	/** Length of (possibly compressed) object code in iFile. */
	TInt iCodeLengthInFile;
	/** Information about block map entries in iCodeBlockMapEntries. */
	SBlockMapInfoBase iCodeBlockMapCommon;
	/** Where object code is located on the media. */
	TBlockMapEntryBase* iCodeBlockMapEntries;
	/** Size of block map entry array in bytes. */
	TInt iCodeBlockMapEntriesSize;
	/**
		File clamp cookie, used to delete the file when the
		codeseg is destroyed.
	 */
	RFileClamp iFileClamp;
public:
	IMPORT_C TPtrC8 RootName() const;
	};

//
// Information required to create a new process
//
class TProcessCreateInfo : public TCodeSegCreateInfo
	{
public:
	enum TDebugAttributes	// must be the same as RLibrary::TInfoV2::TDebugAttributes
		{
		EDebugAllowed = 1<<0, ///< Flags set if executable may be debugged.
		ETraceAllowed = 1<<1 ///< Flags set if executable may be traced.
		};
	/**
	The flags for process's creation.  Will be set by the loader from the images
	header flags ready for the kernel to use.
	*/
	enum TProcessCreateFlags
		{
		EDataPagingUnspecified	= 0x00000000,	///< Use the global data paging default.
		EDataPaged				= 0x00000001,	///< Page the process's data by default.
		EDataUnpaged			= 0x00000002,	///< Don't page the process's data by default.
		EDataPagingMask			= 0x00000003,	///< Bit mask ofr data paging flags.
		};

	/** Default constructor that ensures flags are clear. */
	TProcessCreateInfo() : iFlags(0) {};

	TInt iHeapSizeMin;
	TInt iHeapSizeMax;
	TInt iStackSize;
	TInt iClientHandle;			// handle to loader's client
	TInt iProcessHandle;		// handle to new DProcess
	TInt iFinalHandle;			// handle from loader client to new process
	TOwnerType iOwnerType;
	TProcessPriority iPriority;
	TUint iSecurityZone;
	TUint iDebugAttributes;	///< Set with values from TDebugAttributes.
	TRequestStatus* iDestructStat;
	TUint iFlags;	///< Flags for process creation, should set from TProcessCreateFlags.
	};

const TUint KSecurityZoneUnique = 0u;
const TUint KSecurityZoneLegacyCode = ~0u;

//
// Information required to attach a code segment to a process
// in the form of a library.
//
class TLibraryCreateInfo
	{
public:
	TAny* iCodeSegHandle;		// pointer to kernel-side DCodeSeg object
	TInt iClientHandle;			// handle to loader's client
	TInt iLibraryHandle;		// handle to new DLibrary
	TOwnerType iOwnerType;
	};

//
// Information required to find an existing code segment
//
class TFindCodeSeg
	{
public:
	TUidType iUids;				// required UIDs
	const TAny* iRomImgHdr;		// ROM image header if ROM code required, NULL otherwise
	TUint32 iAttrMask;			// mask for attributes
	TUint32 iAttrVal;			// required value for masked attributes
	TInt iProcess;				// handle to process in which code is required to operate
								// not used if kernel only specified
	SSecurityInfo iS;			// required capabilities/SID
	TUint32 iModuleVersion;		// required version
	TBuf8<KMaxLibraryName> iName;	// name to look for - zero length means any
	};

//
// Information required to by the reaper from the codeseg.
//
struct TCodeSegLoaderCookie
	{
	RFileClamp iFileClamp;
	TInt64 iStartAddress;
	TInt iDriveNumber;
	};

//
// Loader magic executive functions
//
class E32Loader
	{
public:
	// used by loader only
	IMPORT_C static TInt CodeSegCreate(TCodeSegCreateInfo& aInfo);
	IMPORT_C static TInt CodeSegLoaded(TCodeSegCreateInfo& aInfo);
	IMPORT_C static TInt LibraryCreate(TLibraryCreateInfo& aInfo);
	IMPORT_C static TInt CodeSegOpen(TAny* aHandle, TInt aClientProcessHandle);
	IMPORT_C static void CodeSegClose(TAny* aHandle);
	IMPORT_C static void CodeSegNext(TAny*& aHandle, const TFindCodeSeg& aFind);
	IMPORT_C static void CodeSegInfo(TAny* aHandle, TCodeSegCreateInfo& aInfo);
	IMPORT_C static TInt CodeSegAddDependency(TAny* aImporter, TAny* aExporter);
	IMPORT_C static void CodeSegDeferDeletes();
	IMPORT_C static void CodeSegEndDeferDeletes();
	IMPORT_C static TInt ProcessCreate(TProcessCreateInfo& aInfo, const TDesC8* aCommandLine);
	IMPORT_C static TInt ProcessLoaded(TProcessCreateInfo& aInfo);
	IMPORT_C static TInt CheckClientState(TInt aClientHandle);
	IMPORT_C static TInt DeviceLoad(TAny* aHandle, TInt aType);
	IMPORT_C static TAny* ThreadProcessCodeSeg(TInt aHandle);
	IMPORT_C static void ReadExportDir(TAny* aHandle, TUint32* aDest);
	IMPORT_C static TInt LocaleExports(TAny* aHandle, TLibraryFunction* aExportsList);

#ifdef __MARM__
	IMPORT_C static void GetV7StubAddresses(TLinAddr& aExe, TLinAddr& aDll);
	static TInt V7ExeEntryStub();
	static TInt V7DllEntryStub(TInt aReason);
#endif

	IMPORT_C static TUint32 PagingPolicy();
	
	IMPORT_C static TInt NotifyIfCodeSegDestroyed(TRequestStatus& aStatus);
	IMPORT_C static TInt GetDestroyedCodeSegInfo(TCodeSegLoaderCookie& aCookie);

public:
	// used by client side
	static TInt WaitDllLock();
	static TInt ReleaseDllLock();
	static TInt LibraryAttach(TInt aHandle, TInt& aNumEps, TLinAddr* aEpList);
	static TInt LibraryAttached(TInt aHandle);
	static TInt StaticCallList(TInt& aNumEps, TLinAddr* aEpList);
	static TInt LibraryDetach(TInt& aNumEps, TLinAddr* aEpList);
	static TInt LibraryDetached();
	};

typedef TInt (*TSupervisorFunction)(TAny*);

// Relocation types
/**
@internalTechnology
@released
*/
const TUint16 KReservedRelocType        = (TUint16)0x0000;
/**
@internalTechnology
@released
*/
const TUint16 KTextRelocType            = (TUint16)0x1000;
/**
@internalTechnology
@released
*/
const TUint16 KDataRelocType            = (TUint16)0x2000;
/**
@internalTechnology
@released
*/
const TUint16 KInferredRelocType        = (TUint16)0x3000;

// Compression types

/**
@internalTechnology
@released
*/
const TUint KFormatNotCompressed=0;
/**
@internalTechnology
@released
*/
const TUint KUidCompressionDeflate=0x101F7AFC;


const TUint KUidCompressionBytePair=0x102822AA;


#endif // __E32LDR_PRIVATE_H__