imgtools/romtools/rombuild/r_obey.h
changeset 0 044383f39525
child 590 360bd6b35136
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/romtools/rombuild/r_obey.h	Tue Oct 27 16:36:35 2009 +0000
@@ -0,0 +1,366 @@
+/*
+* 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: 
+*
+*/
+
+
+#ifndef __R_OBEY_H__
+#define __R_OBEY_H__
+
+#define __REFERENCE_CAPABILITY_NAMES__
+
+#if defined(__MSVCDOTNET__) || defined(__TOOLS2__)
+#include <fstream>
+#else //!__MSVCDOTNET__
+#include <fstream.h>
+#endif //__MSVCDOTNET__
+
+#include "r_rom.h"
+#include "r_areaset.h"
+#include <e32capability.h>
+
+#ifdef _L
+#undef _L
+#endif
+
+#include <vector>
+
+const TUint32 KNumWords=16;
+//
+const TInt KDefaultRomSize=0x400000;
+const TInt KDefaultRomLinearBase=0x50000000;
+const TInt KDefaultRomAlign=0x1000;
+const TUint32 KDefaultDataRunAddress = 0x400000;
+//
+
+typedef std::string String;
+typedef std::vector<String> StringVector;
+
+enum EFileAttribute
+	{
+	EAttributeStackReserve,
+	EAttributeStack,
+	EAttributeReloc,
+	EAttributeCodeAlign,
+	EAttributeDataAlign,
+	EAttributeFixed,
+	EAttributeAtt,
+	EAttributePriority,
+	EAttributePatched,
+	EAttributeUid1,
+	EAttributeUid2,
+	EAttributeUid3,
+	EAttributeHeapMin,
+	EAttributeHeapMax,
+	EAttributeHidden,
+	EAttributeKeepIAT,
+	EAttributeArea,
+	EAttributeProcessSpecific,
+	EAttributeCapability,
+	EAttributePreferred,
+	EAttributeUnpaged,
+	EAttributePaged,
+	EAttributeUnpagedCode,
+	EAttributePagedCode,
+	EAttributeUnpagedData,
+	EAttributePagedData,
+	};
+enum EKeyword 
+	{
+	EKeywordNone=0,	// backwards compatibility, but now ignored
+	EKeywordFile,
+	EKeywordData,
+	EKeywordPrimary,
+	EKeywordSecondary,
+	EKeywordVariant,
+	EKeywordExtension,
+	EKeywordDevice,
+	EKeywordDll,
+	EKeywordFileCompress,
+	EKeywordFileUncompress,
+	EKeywordArea,
+	EKeywordAlign,
+	EKeywordUnicode,
+	EKeywordAscii,
+	EKeywordSingleKernel,
+	EKeywordMultiKernel,
+	EKeywordBootBinary,
+	EKeywordRomName,
+	EKeywordRomSize,
+	EKeywordRomLinearBase,
+	EKeywordRomAlign,
+	EKeywordRomChecksum,
+	EKeywordKernelDataAddress,
+	EKeywordKernelHeapMin,
+	EKeywordKernelHeapMax,
+	EKeywordDataAddress,
+	EKeywordDllDataTop,
+	EKeywordDefaultStackReserve,
+	EKeywordVersion,
+	EKeywordLanguages,
+	EKeywordHardware,
+	EKeywordRomNameOdd,
+	EKeywordRomNameEven,
+	EKeywordSRecordFileName,
+	EKeywordSRecordBase,
+	EKeywordTrace,
+	EKeywordKernelTrace,
+	EKeywordBTrace,
+	EKeywordBTraceMode,
+	EKeywordBTraceBuffer,
+	EKeywordCollapse,
+	EKeywordTime,
+	EKeywordSection,
+	EKeywordExtensionRom,
+	EKeywordKernelRomName,
+	EKeywordAlias,
+	EKeywordHide,
+	EKeywordRename,
+	EKeywordDebugPort,
+	EKeywordCompress,
+	EKeywordMemModel,
+	EKeywordNoWrapper,
+	EKeywordEpocWrapper,
+	EKeywordCoffWrapper,
+	EKeywordPlatSecEnforcement,
+	EKeywordPlatSecDiagnostics,
+	EKeywordPlatSecProcessIsolation,
+	EKeywordPlatSecEnforceSysBin,
+	EKeywordPlatSecDisabledCaps,
+	EKeywordPagingPolicy,
+	EKeywordCodePagingPolicy,
+	EKeywordDataPagingPolicy,
+	EKeywordPagingOverride,
+	EKeywordCodePagingOverride,
+	EKeywordDataPagingOverride,
+	EKeywordDemandPagingConfig,
+	EKeywordPagedRom,
+	EKeywordPatchDllData,
+	EKeywordExecutableCompressionMethodNone,
+	EKeywordExecutableCompressionMethodInflate,
+	EKeywordExecutableCompressionMethodBytePair,
+	EKeywordCoreImage,
+	EKeywordKernelConfig,
+	EKeywordMaxUnpagedMemSize,
+	EKeywordHardwareConfigRepositoryData ,
+	};
+enum TCollapseMode
+	{
+	ECollapseNone=0,
+	ECollapseImportThunksOnly=1,
+	ECollapseImportThunksAndVtables=2,
+	ECollapseAllChainBranches=3,
+	};
+
+struct ObeyFileKeyword
+	{
+	const char* iKeyword;
+	size_t iKeywordLength;
+	TInt iPass;
+	TInt iNumArgs;		// -ve means >= number
+	enum EKeyword iKeywordEnum;
+	const char* iHelpText;
+	};
+
+struct FileAttributeKeyword
+	{
+	const char* iKeyword;
+	size_t iKeywordLength;
+	TInt iIsFileAttribute;
+	TInt iNumArgs;
+	enum EFileAttribute iAttributeEnum;
+	const char* iHelpText;
+	};
+
+class ObeyFileReader
+	{
+public:
+	ObeyFileReader(TText *aFileName);
+	~ObeyFileReader();
+
+	static void KeywordHelp();
+
+	TBool Open();
+	void Mark();
+	void MarkNext();
+	void Rewind();
+
+	TInt NextLine(TInt aPass, enum EKeyword& aKeyword);
+	TInt NextAttribute(TInt& aIndex, TInt aHasFile, enum EFileAttribute& aKeyword, TText*& aArg);
+
+	void CopyWord(TInt aIndex, TText*& aString);				// allocate copy of nth word
+	TInt Count() { return iNumWords;}				// number of words on current line
+	char* Word(TInt aIndex) { return (char*)iWord[aIndex]; }	// return nth word as char*
+	TText* Text(TInt aIndex) { return iWord[aIndex]; }			// return nth word as TText*
+	char* Suffix() { return (char*)iSuffix; }			// return unmatched suffix of word[0]
+	TInt CurrentLine() { return iCurrentLine;}				// number of words on current line
+
+	TInt ProcessAlign(TInt& aAlign);
+	void ProcessLanguages(TInt64& aLanguageMask);
+	void ProcessTime(TInt64& aTime);
+
+	static void TimeNow(TInt64& aTime);
+private:
+	TInt ReadAndParseLine();
+	TInt SetLineLengthBuffer();
+	TInt Parse();
+	inline TBool IsGap(char ch); 
+
+	static const ObeyFileKeyword iKeywords[];
+	static const FileAttributeKeyword iAttributeKeywords[];
+	static TInt64 iTimeNow;
+
+private:
+	FILE* iObeyFile;
+	long iMark;
+	TInt iMarkLine;
+	long iCurrentMark;
+	TInt iCurrentLine;
+	TInt imaxLength;
+	TText* iFileName;
+	TInt iNumWords;
+	TText* iWord[KNumWords];
+	TText* iSuffix;
+	TText* iLine;
+	};
+
+class CPatchDataProcessor;
+class DllDataEntry;
+
+class CObeyFile
+	{
+public:
+	TText *iRomFileName;
+	TText *iRomOddFileName;
+	TText *iRomEvenFileName;
+	TText *iSRecordFileName;
+	TText *iBootFileName;
+	TText *iKernelRomName;
+	TInt iRomSize;
+	TUint32 iRomLinearBase;
+	TUint32 iRomAlign;
+	TUint32 iKernDataRunAddress;
+	TUint32 iDataRunAddress;
+	TUint32 iKernelLimit;
+	TUint32 iKernHeapMin;
+	TUint32 iKernHeapMax;
+	TUint32 iSectionStart;
+	TInt iSectionPosition;
+	TVersion iVersion;
+	TUint32 iCheckSum;
+	TInt iNumberOfPeFiles;
+	TInt iNumberOfDataFiles;
+	TInt iNumberOfPrimaries;
+	TInt iNumberOfExtensions;
+	TInt iNumberOfVariants;
+	TInt iNumberOfDevices;
+	TInt iNumberOfHCRDataFiles ;
+	TUint iAllVariantsMask[256];
+	TRomBuilderEntry** iPrimaries;
+	TRomBuilderEntry** iVariants;
+	TRomBuilderEntry** iExtensions;
+	TRomBuilderEntry** iDevices;
+	TInt64 iLanguage;
+	TUint32 iHardware;
+	TInt64 iTime;
+	TMemModel iMemModel;
+	TInt iPageSize;
+	TInt iChunkSize;
+	TInt iVirtualAllocSize;
+	TKernelModel iKernelModel;
+	TInt iCollapseMode;
+	TUint32 iSRecordBase;
+	TInt iCurrentSectionNumber;
+	TInt iDefaultStackReserve;
+	TUint32 iTraceMask[KNumTraceMaskWords];			// Pass through to the kernel tracemask
+	TUint32 iInitialBTraceFilter[8];
+	TInt iInitialBTraceBuffer;
+	TInt iInitialBTraceMode;
+	TUint32 iDebugPort;
+	TBool iDebugPortParsed;
+	TRomNode* iRootDirectory;
+	TUint32 iDllDataTop;
+	TUint32 iKernelConfigFlags;
+	TBool iPagingPolicyParsed;
+	TBool iCodePagingPolicyParsed;
+	TBool iDataPagingPolicyParsed;
+	TBool iPagingOverrideParsed;
+	TBool iCodePagingOverrideParsed;
+	TBool iDataPagingOverrideParsed;
+	SCapabilitySet iPlatSecDisabledCaps;
+	TBool iPlatSecDisabledCapsParsed;
+	TInt iMaxUnpagedMemSize;		// Max unpaged memory size, 0 = no limits
+private:
+	ObeyFileReader& iReader;
+	TInt iMissingFiles;
+	TRomNode* iLastExecutable;
+	AreaSet iAreaSet;
+
+	TRomBuilderEntry* iFirstFile;
+	TRomBuilderEntry** iNextFilePtrPtr;
+	TRomBuilderEntry* iCurrentFile;
+	TRomBuilderEntry* iLastVariantFile;
+	DllDataEntry* iFirstDllDataEntry;
+	TBool iUpdatedMaxUnpagedMemSize;		// ETure = iMaxUnpagedMemSize has been set
+
+public:
+	CObeyFile(ObeyFileReader& aReader);
+	~CObeyFile();
+	void Release();
+	TInt ProcessKernelRom();
+	TInt ProcessExtensionRom(MRomImage*& aKernelRom);
+	TRomBuilderEntry *FirstFile();
+	TRomBuilderEntry *NextFile();
+	const AreaSet& SetArea() const ; 
+ 	DllDataEntry* GetFirstDllDataEntry() const;
+	void SetFirstDllDataEntry(DllDataEntry* aDllDataEntry);
+
+	int SkipToExtension();
+	TText* ProcessCoreImage();
+
+private:
+	TBool CheckHardwareVariants();
+	TBool ProcessFile(TInt aAlign, enum EKeyword aKeyword);
+	TBool ProcessRenaming(enum EKeyword aKeyword);
+	TBool ProcessKeyword(enum EKeyword aKeyword);
+	TBool ParsePatchDllData();
+	void ProcessExtensionKeyword(enum EKeyword aKeyword);
+	TInt ParseFileAttributes(TRomNode* aNode, TRomBuilderEntry* aFile);
+	TInt ParseSection();
+	TUint32 ParseVariant();
+	TBool GotKeyVariables();
+	TBool GotExtensionVariables(MRomImage*& aRom);
+	TBool GetNextBitOfFileName(TText **epocEndPtr);
+	TText *IsValidFilePath(TText *aPath);
+	void AddFile(TRomBuilderEntry* aFile);
+
+	// Area-related methods
+	TBool CreateDefaultArea();
+	TBool ParseAreaKeyword();
+	TBool ParseAreaAttribute(const TText* aArg, TInt aLineNumber, const Area*& aArea);
+	TBool AddAreaAndHandleError(const char* aName, TLinAddr aDestBaseAddr, TUint aLength, TInt aLineNumber = -1);
+
+public:
+	CPatchDataProcessor* iPatchData;	
+	void SplitPatchDataStatement(StringVector& aPatchDataTokens);	
+	};
+
+
+inline const AreaSet& CObeyFile::SetArea() const
+	{
+	return iAreaSet;
+	}
+
+#endif