diff -r 000000000000 -r bde4ae8d615e os/kernelhwsrv/kernel/eka/include/memmodel/emul/win32/memmodel.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/os/kernelhwsrv/kernel/eka/include/memmodel/emul/win32/memmodel.h Fri Jun 15 03:10:57 2012 +0200 @@ -0,0 +1,313 @@ +// 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: +// e32\include\memmodel\emul\win32\memmodel.h +// +// WARNING: This file contains some APIs which are internal and are subject +// to change without notice. Such APIs should therefore not be used +// outside the Kernel and Hardware Services package. +// + +/** + @file + @internalComponent +*/ + +#ifndef __WIN32_MEM_H__ +#define __WIN32_MEM_H__ +#include +#include +#include + +const TInt KRamChunkSize=0x10000; +const TInt KRamChunkShift=16; +const TInt KRamPageSize=0x1000; +const TInt KRamPageShift=12; + +/******************************************** + * Thread Control Block + ********************************************/ + +class DWin32Thread : public DThread + { +public: + ~DWin32Thread(); + virtual TInt Context(TDes8& aDes); + virtual TInt SetupContext(SThreadCreateInfo& anInfo); + virtual void DoExit2(); + }; + +/******************************************** + * Process Control Block + ********************************************/ +class DWin32CodeSeg; +class DWin32Chunk; +struct SProcessDllDataBlock; +class DWin32Process : public DProcess + { +public: + DWin32Process(); + ~DWin32Process(); +public: + virtual TInt DoCreate(TBool aKernelProcess, TProcessCreateInfo& aInfo); + virtual TInt NewChunk(DChunk*& aChunk, SChunkCreateInfo& aInfo, TLinAddr& aRunAddr); + virtual TInt AddChunk(DChunk* aChunk,TBool isReadOnly); + virtual TInt NewShPool(DShPool*& aPool, TShPoolCreateInfo& aInfo); + virtual TInt CreateDataBssStackArea(TProcessCreateInfo& aInfo); + virtual TInt GetNewThread(DThread*& aThread, SThreadCreateInfo& anInfo); + virtual TInt AttachExistingCodeSeg(TProcessCreateInfo& aInfo); + virtual TInt MapCodeSeg(DCodeSeg* aCodeSeg); + virtual void UnmapCodeSeg(DCodeSeg* aCodeSeg); + virtual void RemoveDllData(); + virtual void FinalRelease(); + virtual void Release(); + void CallRuntimeHook(TWin32RuntimeReason aReason); +public: + TWin32RuntimeHook iWin32RuntimeHook; + RArray iDllData; + }; + +/****************************************************************** + * structure to keep static data in code segments within a process + ******************************************************************/ +struct SProcessDllDataBlock + { + DWin32CodeSeg* iCodeSeg; + TAny* iDataCopy; // copy of .data + TAny* iBssCopy; // copy of .bss + }; + +/******************************************** + * Chunk Control Block + ********************************************/ +class DWin32Chunk : public DChunk + { +public: + enum TMemModelChunkAttributes + { + EPrivate=0x10000000, + + EMMChunkAttributesMask = EPrivate, + }; + +public: + ~DWin32Chunk(); +public: + virtual TInt DoCreate(SChunkCreateInfo& aInfo); + virtual TInt Adjust(TInt aNewSize); + virtual TInt AdjustDoubleEnded(TInt aBottom, TInt aTop); + virtual TInt CheckAccess(); + virtual TInt Commit(TInt anOffset, TInt aSize, TCommitType aCommitType=DChunk::ECommitDiscontiguous, TUint32* aExtraArg=0); + virtual TInt Allocate(TInt aSize, TInt aGuard=0, TInt aAlign=0); + virtual TInt Decommit(TInt anOffset, TInt aSize); + virtual TInt Lock(TInt anOffset, TInt aSize); + virtual TInt Unlock(TInt anOffset, TInt aSize); + virtual TInt Address(TInt aOffset, TInt aSize, TLinAddr& aKernelAddress); + virtual TInt PhysicalAddress(TInt aOffset, TInt aSize, TLinAddr& aKernelAddress, TUint32& aPhysicalAddress, TUint32* aPhysicalPageList=NULL); + virtual void BTracePrime(TInt aCategory); + virtual void Substitute(TInt aOffset, TPhysAddr aOldAddr, TPhysAddr aNewAddr); + virtual TUint8* Base(DProcess* aProcess); + inline TUint8* Base() const { return DChunk::Base(); } +private: + TInt DoCommit(TInt aOffset, TInt aSize); + void DoDecommit(TInt aOffset, TInt aSize); +public: + TBitMapAllocator* iPageBitMap; + TBitMapAllocator* iUnlockedPageBitMap; + TBitMapAllocator* iPermanentPageBitMap; + }; + +/******************************************** + * Code segment + ********************************************/ +class DModuleList; +class DWin32CodeSeg: public DCodeSeg + { +public: + DWin32CodeSeg(); + virtual ~DWin32CodeSeg(); + TInt ProcessImports(DProcess* aProcess); + TInt CreateAlreadyLoaded(HMODULE aModule, TInt aDepCount); + TInt RegisterCodeSeg(HMODULE aModule); + TInt CopyDataBss(); +public: + virtual TLibraryFunction Lookup(TInt aOrdinal); + virtual TInt GetMemoryInfo(TModuleMemoryInfo& aInfo, DProcess* aProcess); + virtual TInt DoCreate(TCodeSegCreateInfo& aInfo, DProcess* aProcess); + virtual TInt Loaded(TCodeSegCreateInfo& aInfo); + virtual void InitData(); + virtual void ReadExportDir(TUint32* aDest); + virtual TBool FindCheck(DProcess* aProcess); + virtual TBool OpenCheck(DProcess* aProcess); + virtual void Info(TCodeSegCreateInfo& aInfo); +public: + HINSTANCE iWinInstance; + HMODULE iModuleHandle; + wchar_t* iModuleFile; + TBool iAlwaysLoaded; // TRUE for variant or extension + DModuleList* iModuleList; + TAny* iDataCopy; // copy of .data + TInt iRealDataSize; + TInt iRealBssSize; + TLinAddr iDataDest; // load address of .data + TLinAddr iBssDest; // load address of .bss + TInt iCodeSegId; // unique ID, incremented each time a code segment is loaded + DWin32Process* iLiveProcess;// process who's static data is currently loaded in the codeseg + }; + +struct SWin32Module + { + TLinAddr iWin32ModuleHandle; + DWin32CodeSeg* iCodeSeg; + }; + + +/******************************************** + * Functions/Data defined in memory model + ********************************************/ + +class MM + { +public: + enum TMemModelPanic + { + EKernelHeapReserveFailed = 0, + EKernelHeapCommitFailed = 1, + ERamAllocMutexCreateFailed = 2, + EInvalidChunkCreate = 3, + EInvalidSharedModule = 4, + ECompileDepLists=5, + EWin32RuntimeError=6, + ENotSupportedOnEmulator=7, + EWsdBadReserve=8, + EWsdDllNotInProcess=9, + }; + + static void Panic(TMemModelPanic aPanic); +public: + static void Init1(); + static void Wait(); + static void Signal(); + static TUint32 RoundToPageSize(TUint32 aSize); + static TUint32 RoundToChunkSize(TUint32 aSize); + static TInt RegisterModule(HMODULE aModule); + static TInt Commit(TLinAddr aBase, TInt aSize, TInt aClearByte, TBool aExecute); + static TInt Decommit(TLinAddr aBase, TInt aSize); + static void CheckMemoryCounters(); + static void DoProcessSwitch(TAny* aAddressSpace); + static TAny* CurrentAddress(DThread* aThread, const TAny* aPtr, TInt aSize, TBool aWrite, TBool& aLocked); +public: + static TAny* KernelHeapAddress; + static DMutex* RamAllocatorMutex; + static TInt RamChunkSize; + static TInt RamChunkShift; + static TInt RamPageSize; + static TInt RamPageShift; + static TInt FreeMemory; // number of bytes in the system free memory + static TInt CacheMemory; // number of bytes of memory being used for cache chunks (RChunk::Unlock) + static TInt ReclaimedCacheMemory; // number of bytes of memory removed from CacheMemory in order to satisfy memory allocation + static TInt InitialFreeMemory; + static TBool AllocFailed; + static RArray Win32Modules; + static TInt NextCodeSegId; + }; + + +/******************************************** + * Shared buffers and pools + ********************************************/ + +class DWin32ShBuf : public DShBuf + { +public: + DWin32ShBuf(DShPool* aPool, TLinAddr aRelAddr); + ~DWin32ShBuf(); + + TInt AddToProcess(DProcess* aProcess, TUint aAttr); + + TInt Close(TAny* aPtr); + +protected: + virtual TInt Map(TUint, DProcess*, TLinAddr&); + virtual TInt UnMap(DProcess*); + virtual TUint8* Base(DProcess* aProcess); + virtual TUint8* Base(); + +private: + TBool iMapped; + }; + + +class DWin32ShPool : public DShPool + { +public: + DWin32ShPool(); + virtual ~DWin32ShPool(); + + TInt Close(TAny* aPtr); + TInt AddToProcess(DProcess* aProcess, TUint aAttr); + TInt Alloc(DShBuf*&); + +protected: + TInt DoCreate(TShPoolCreateInfo& aInfo); + TInt AddToFreeList(TInt aOffset); + TInt CreateInitialBuffers(); + TInt DeleteInitialBuffers(); + TInt DestroyHandles(DProcess* aProcess); + void DestroyClientResources(DProcess* aProcess); + + void Free(DShBuf* aBuf); + TInt UpdateFreeList(); + + TUint8* Base(); + TUint8* Base(DProcess* aProcess); + TBool IsOpen(DProcess* aProcess); + + TBitMapAllocator* iBufMap; + DWin32ShBuf* iInitialBuffersArray; + TUint8* iWin32MemoryBase; + TInt iWin32MemorySize; + friend class DWin32ShBuf; + }; + + +class DWin32AlignedShPool : public DWin32ShPool + { +public: + DWin32AlignedShPool(); + virtual ~DWin32AlignedShPool(); + TInt SetBufferWindow(DProcess* aProcess, TInt aWindowSize); + +private: + TInt DoCreate(TShPoolCreateInfo& aInfo); + TInt GrowPool(); + TInt ShrinkPool(); + }; + + +class DWin32NonAlignedShPool : public DWin32ShPool + { +public: + DWin32NonAlignedShPool(); + virtual ~DWin32NonAlignedShPool(); + +private: + TInt DoCreate(TShPoolCreateInfo& aInfo); + void FreeBufferPages(TUint aOffset); + TInt GrowPool(); + TInt ShrinkPool(); + + TBitMapAllocator* iPagesMap; + }; + +#endif // __WIN32_MEM_H__