--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/kernel/eka/include/memmodel/epoc/multiple/memmodel.h Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,554 @@
+// 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\epoc\multiple\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.
+//
+
+#ifndef __MEMMODEL_H__
+#define __MEMMODEL_H__
+#include <memmodel/epoc/mmubase/mmubase.h>
+
+#ifdef __SMP__
+// SubScheduler fields for each processor
+#define i_AliasLinAddr iExtras[0]
+#define i_AliasPdePtr iExtras[1]
+#endif
+
+/********************************************
+ * Dynamic Branch Predictor Support
+ ********************************************/
+
+/**
+@internalComponent
+*/
+#ifdef __SMP__
+//#define LastUserSelfMod ((DProcess*&)SubScheduler().iExtras[0])
+#else
+#define LastUserSelfMod ((DProcess*&)TheScheduler.iExtras[0])
+#endif
+
+/********************************************
+ * RAM Defrag Page Table Moving Support
+ ********************************************/
+
+/**
+@internalComponent
+*/
+#define AliasRemapOld ((TPhysAddr&)TheScheduler.iExtras[1])
+
+/**
+@internalComponent
+*/
+#define AliasRemapNew ((TPhysAddr&)TheScheduler.iExtras[2])
+
+/********************************************
+ * Thread Control Block
+ ********************************************/
+
+class DMemModelProcess;
+
+/**
+@internalComponent
+*/
+class DMemModelThread : public DThread
+ {
+public:
+ TInt Alias(TLinAddr aAddr, DMemModelProcess* aProcess, TInt aSize, TInt aPerm, TLinAddr& aAliasAddr, TInt& aAliasSize);
+ void RemoveAlias();
+ virtual void DoExit1();
+ static void RestoreAddressSpace();
+public:
+ TLinAddr iAliasLinAddr; // linear address to access aliased memory (0 means no alias is present).
+ TPde* iAliasPdePtr; // Address of PDE which has been modified to make aliased memory accessible.
+ TPde iAliasPde; // PDE to store at iAliasPdePtr.
+ TInt iAliasOsAsid; // asid for the process whoes memory is aliased.
+ SDblQueLink iAliasLink; // link to make TheMmu.iAliasList.
+ TLinAddr iAliasTarget; // linear address of the memory which has been aliased
+#ifdef __SMP__
+ TInt iCpuRestoreCookie;
+#endif
+ };
+
+
+/********************************************
+ * Process Control Block
+ ********************************************/
+
+class DMemModelChunk;
+class DMemModelCodeSegMemory;
+
+/**
+@internalComponent
+*/
+class DMemModelProcess : public DEpocProcess
+ {
+public:
+ void Destruct();
+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 MapCodeSeg(DCodeSeg* aCodeSeg);
+ virtual void UnmapCodeSeg(DCodeSeg* aCodeSeg);
+ virtual void RemoveDllData();
+ virtual void FinalRelease();
+public:
+ virtual TInt GetNewChunk(DMemModelChunk*& aChunk, SChunkCreateInfo& aInfo)=0;
+public:
+ TInt AddChunk(DMemModelChunk* aChunk, TLinAddr& aDataSectionBase, TBool isReadOnly);
+ TInt AllocateDataSectionBase(DMemModelChunk& aChunk, TUint& aBase);
+ TUint8* DataSectionBase(DMemModelChunk* aChunk);
+ void RemoveChunk(DMemModelChunk *aChunk);
+ void DoRemoveChunk(TInt aIndex);
+ TInt ChunkIndex(DMemModelChunk* aChunk,TInt& aPos);
+ TInt CreateCodeChunk();
+ void FreeCodeChunk();
+ TInt CreateDllDataChunk();
+ void FreeDllDataChunk();
+ TInt CommitDllData(TLinAddr aBase, TInt aSize);
+ void DecommitDllData(TLinAddr aBase, TInt aSize);
+ TInt MapUserRamCode(DMemModelCodeSegMemory* aMemory, TBool aLoading);
+ void UnmapUserRamCode(DMemModelCodeSegMemory* aMemory, TBool aLoading);
+public:
+ enum TMemModelProcessAttributes
+ {
+ ESeparateGlobalSpace=0x40000000,
+ EMMProcessAttributesMask = ESeparateGlobalSpace,
+ };
+
+ struct SChunkInfo
+ {
+ DMemModelChunk* iChunk;
+ TInt16 iAccessCount;
+ TInt16 isReadOnly;
+ };
+
+ TInt iChunkCount;
+ TInt iChunkAlloc;
+ SChunkInfo* iChunks;
+ TLinearSection* iLocalSection;
+ TInt iOsAsid;
+ TPhysAddr iLocalPageDir;
+ TPhysAddr iGlobalPageDir;
+ TUint32 iAddressCheckMaskR;
+ TUint32 iAddressCheckMaskW;
+ DMemModelChunk* iCodeChunk;
+ DMemModelChunk* iDllDataChunk;
+ TInt iSelfModChunks;
+public:
+ friend class Monitor;
+ };
+
+
+/********************************************
+ * Chunk Control Block
+ ********************************************/
+
+/**
+@internalComponent
+*/
+class DMemModelChunk : public DChunk
+ {
+public:
+ /**
+ @see DChunk::TChunkAttributes for generic attribute flags
+ */
+ enum TMemModelChunkAttributes
+ {
+ EPrivate =0x80000000,
+ ECode =0x40000000,
+ EAddressAllocDown =0x20000000,
+
+ EAddressRangeMask =0x0f000000,
+ EAddressRangeShift =24,
+ EAddressLocal =0x00000000,
+ EAddressShared =0x01000000,
+ EAddressUserGlobal =0x02000000,
+ EAddressKernel =0x03000000,
+ EAddressFixed =0x04000000,
+
+ EMapTypeMask =0x00c00000,
+ EMapTypeLocal =0x00000000,
+ EMapTypeGlobal =0x00400000,
+ EMapTypeShared =0x00800000,
+
+ EMMChunkAttributesMask = EPrivate|ECode|EAddressAllocDown|EAddressRangeMask|EMapTypeMask,
+ };
+
+public:
+ DMemModelChunk();
+ void Destruct();
+public:
+ virtual TInt Close(TAny* aPtr);
+ virtual TInt DoCreate(SChunkCreateInfo& aInfo);
+ virtual TInt Adjust(TInt aNewSize);
+ virtual TInt AdjustDoubleEnded(TInt aBottom, TInt aTop);
+ virtual TInt CheckAccess();
+ virtual TInt Commit(TInt aOffset, TInt aSize, TCommitType aCommitType=DChunk::ECommitDiscontiguous, TUint32* aExtraArg=0);
+ virtual TInt Allocate(TInt aSize, TInt aGuard=0, TInt aAlign=0);
+ virtual TInt Decommit(TInt aOffset, 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(); }
+public:
+ TInt Decommit(TInt aOffset, TInt aSize, TDecommitType aDecommitType);
+ void ClaimInitialPages();
+ void SetFixedAddress(TLinAddr aAddr, TInt aInitialSize);
+ TInt Reserve(TInt aInitialSize);
+ TInt DoCommit(TInt aOffset, TInt aSize, TCommitType aCommitType=DChunk::ECommitDiscontiguous, TUint32* aExtraArg=0);
+ void DoDecommit(TInt aOffset, TInt aSize, TDecommitType aDecommitType=EDecommitNormal);
+ TInt AllocateAddress();
+ void ApplyPermissions(TInt aOffset, TInt aSize, TPte aPtePerm);
+ TLinearSection* LinearSection();
+ TZonePageType GetPageType();
+
+public:
+ virtual TInt SetupPermissions()=0;
+
+public:
+ TBitMapAllocator* iOsAsids; // NULL for local or fully global else list of OS ASIDs
+ TPte iPtePermissions;
+ TPde iPdePermissions;
+ TUint16* iPageTables;
+ TBitMapAllocator* iPageBitMap; // NULL if not disconnected chunk
+ TBitMapAllocator* iPermanentPageBitMap;
+ DMemModelChunk* iKernelMirror;
+public:
+ friend class Monitor;
+ };
+
+
+/********************************************
+ * Code segment
+ ********************************************/
+
+/**
+@internalComponent
+*/
+class DMemModelCodeSegMemory : public DMmuCodeSegMemory
+ {
+public:
+ DMemModelCodeSegMemory(DEpocCodeSeg* aCodeSeg);
+ ~DMemModelCodeSegMemory();
+ TInt Create(TCodeSegCreateInfo& aInfo);
+ TInt Loaded(TCodeSegCreateInfo& aInfo);
+ void Substitute(TInt aOffset, TPhysAddr aOld, TPhysAddr aNew);
+ void Destroy();
+public:
+ DMemModelProcess* iCreator; // process loading this code segment
+
+ TPhysAddr* iPages; // list of physical pages (iPageCount+iDataPageCount)
+
+ /**
+ List of OS ASIDs this code segment is mapped into.
+ Protected by RamAllocMutex and System Lock.
+ */
+ TBitMapAllocator* iOsAsids;
+
+ TLinAddr* iCopyOfExportDir; // kernel side copy of export directory or NULL
+ };
+
+/**
+@internalComponent
+*/
+class DMemModelCodeSeg: public DEpocCodeSeg
+ {
+public:
+ DMemModelCodeSeg();
+ virtual ~DMemModelCodeSeg();
+ virtual TInt DoCreateRam(TCodeSegCreateInfo& aInfo, DProcess* aProcess);
+ virtual TInt DoCreateXIP(DProcess* aProcess);
+ virtual TInt Loaded(TCodeSegCreateInfo& aInfo);
+ virtual void ReadExportDir(TUint32* aDest);
+ virtual TBool FindCheck(DProcess* aProcess);
+ virtual TBool OpenCheck(DProcess* aProcess);
+ virtual void BTracePrime(TInt aCategory);
+ inline DMemModelCodeSegMemory* Memory()
+ { return (DMemModelCodeSegMemory*)iMemory; }
+ inline TPhysAddr* Pages()
+ { return iMemory!=0 ? Memory()->iPages : (TPhysAddr*)0; }
+public:
+ TInt iCodeAllocBase;
+ TInt iDataAllocBase;
+ TAny* iKernelData; // only for kernel modules
+ };
+
+
+/********************************************
+ * MMU stuff
+ ********************************************/
+
+/**
+@internalComponent
+Indicates that corresponding linear address applies to unknown address space.
+Common for EMemTypeShared types of chunks with no owning process.
+*/
+#define UNKNOWN_MAPPING ((TInt)-2)
+
+/**
+@internalComponent
+Indicates that corresponding linear address applies to global address space.
+*/
+#define GLOBAL_MAPPING ((const TAny*)-1)
+
+ /**
+@internalComponent
+Indicates that corresponding linear address applies to kernel process (either global or Kernel's local space).
+*/
+#define KERNEL_MAPPING ((TInt)0)
+
+
+/**
+@internalComponent
+*/
+class Mmu : public MmuBase
+ {
+public:
+ enum TFlushFlags {
+ EFlushDTLB=0x01,
+ EFlushDCache=0x02,
+ EFlushITLB=0x04,
+ EFlushICache=0x08,
+ EFlushDDecommit=0x80000000,
+ EFlushDPermChg=0x20000000,
+ EFlushDMove=0x40000000,
+ EFlushIPermChg=0x04000000,
+ EFlushIMove=0x10000000,
+ EFlushInheritMask=EFlushDPermChg|EFlushDMove|EFlushIPermChg|EFlushIMove,
+ };
+
+ enum TPanic
+ {
+ ELocalPageDirBadAsid,
+ EGlobalPageDirBadAsid,
+ EPDEBadAsid,
+ EFreeOsAsidBadAsid,
+ EOsAsidAllocCreateFailed,
+ EBadInitialPageAddr,
+ EAssignPageTableInvalidUsage,
+ EUserCodeAllocatorCreateFailed,
+ EDllDataAllocatorCreateFailed,
+ ERomUserDataAddressInvalid,
+ ERomUserDataSizeInvalid,
+ ECreateSharedSectionFailed,
+ ECreateUserGlobalSectionFailed,
+ ERemapPageFailed,
+ ERemapPageTableFailed,
+ EFixupXPTFailed,
+ ETempMappingFailed,
+ EDefragDisablePageFailed,
+ EDefragFaultWhilstFMHeld,
+ };
+
+public:
+ TPde* LocalPageDir(TInt aOsAsid);
+ TPde* GlobalPageDir(TInt aOsAsid);
+ TPde& PDE(TLinAddr aAddr, TInt aOsAsid);
+ TInt NewOsAsid(TBool aSeparateGlobal);
+ void FreeOsAsid(TInt aOsAsid);
+ void CreateUserGlobalSection(TLinAddr aBase, TLinAddr aEnd);
+ TInt CreateGlobalCodeChunk();
+
+ // virtual - inherited/overridden from MmuBase
+ virtual void Init1();
+// virtual void Init2();
+ virtual void DoInit2();
+// virtual TBool PteIsPresent(TPte aPte)=0;
+// virtual TPhysAddr PtePhysAddr(TPte aPte, TInt aPteIndex)=0;
+// virtual TPhysAddr PdePhysAddr(TLinAddr aAddr)=0;
+ virtual void SetupInitialPageInfo(SPageInfo* aPageInfo, TLinAddr aChunkAddr, TInt aPdeIndex);
+ virtual void SetupInitialPageTableInfo(TInt aId, TLinAddr aChunkAddr, TInt aNumPtes);
+ virtual void AssignPageTable(TInt aId, TInt aUsage, TAny* aObject, TLinAddr aAddr, TPde aPdePerm);
+ virtual TInt UnassignPageTable(TLinAddr aAddr);
+// virtual void BootstrapPageTable(TInt aXptId, TPhysAddr aXptPhys, TInt aId, TPhysAddr aPhysAddr)=0;
+ virtual TInt PageTableId(TLinAddr aAddr);
+// virtual TInt BootPageTableId(TLinAddr aAddr, TPhysAddr& aPtPhys)=0;
+// virtual void ClearPageTable(TInt aId, TInt aFirstIndex=0)=0;
+ virtual TPhysAddr LinearToPhysical(TLinAddr aAddr);
+ virtual TInt LinearToPhysical(TLinAddr aAddr, TInt aSize, TPhysAddr& aPhysicalAddress, TPhysAddr* aPhysicalPageList=NULL);
+// virtual void MapRamPages(TInt aId, SPageInfo::TType aType, TAny* aPtr, TUint32 aOffset, const TPhysAddr* aPageList, TInt aNumPages, TPte aPtePerm)=0;
+// virtual void MapPhysicalPages(TInt aId, SPageInfo::TType aType, TAny* aPtr, TUint32 aOffset, TPhysAddr aPhysAddr, TInt aNumPages, TPte aPtePerm)=0;
+// virtual TInt UnmapPages(TInt aId, TUint32 aAddr, TInt aNumPages, TPhysAddr* aPageList, TBool aSetPagesFree, TInt& aNumPtes, TInt& aNumFree, DProcess* aProcess)=0;
+// virtual void ClearRamDrive(TLinAddr aStart)=0;
+// virtual TInt PdePtePermissions(TUint& aMapAttr, TPde& aPde, TPte& aPte)=0;
+// virtual void Map(TLinAddr aLinAddr, TPhysAddr aPhysAddr, TInt aSize, TPde aPdePerm, TPte aPtePerm, TInt aMapShift)=0;
+// virtual void Unmap(TLinAddr aLinAddr, TInt aSize)=0;
+// virtual void InitShadowPageTable(TInt aId, TLinAddr aRomAddr, TPhysAddr aOrigPhys)=0;
+// virtual void InitShadowPage(TPhysAddr aShadowPhys, TLinAddr aRomAddr)=0;
+// virtual void DoUnmapShadowPage(TInt aId, TLinAddr aRomAddr, TPhysAddr aOrigPhys)=0;
+// virtual TInt UnassignShadowPageTable(TLinAddr aRomAddr, TPhysAddr aOrigPhys)=0;
+// virtual void DoFreezeShadowPage(TInt aId, TLinAddr aRomAddr)=0;
+// virtual void FlushShadow(TLinAddr aRomAddr)=0;
+// virtual void AssignShadowPageTable(TInt aId, TLinAddr aRomAddr)=0;
+// virtual void ClearPages(TInt aNumPages, TPhysAddr* aPageList)=0;
+ virtual TPte PtePermissions(TChunkType aChunkType)=0;
+ virtual TInt MoveKernelPage(DChunk* aChunk, TUint32 aOffset, TPhysAddr aOld, TPhysAddr& aNew, TUint aBlockZoneId, TBool aBlockRest);
+ virtual TInt MoveCodeSegMemoryPage(DMemModelCodeSegMemory* aCodeSegMemory, TUint32 aOffset, TPhysAddr aOld, TPhysAddr& aNew, TUint aBlockZoneId, TBool aBlockRest);
+ virtual TInt MoveCodeChunkPage(DChunk* aChunk, TUint32 aOffset, TPhysAddr aOld, TPhysAddr& aNew, TUint aBlockZoneId, TBool aBlockRest);
+ virtual TInt MoveDataChunkPage(DChunk* aChunk, TUint32 aOffset, TPhysAddr aOld, TPhysAddr& aNew, TUint aBlockZoneId, TBool aBlockRest);
+
+ // pure virtual - new in Mmu
+ virtual TInt NewPageDirectory(TInt aOsAsid, TBool aSeparateGlobal, TPhysAddr& aPhysAddr, TInt& aNumPages)=0;
+ virtual void InitPageDirectory(TInt aOsAsid, TBool aGlobal)=0;
+ virtual TInt PageTableId(TLinAddr aAddr, TInt aOsAsid)=0;
+ virtual TPhysAddr LinearToPhysical(TLinAddr aAddr, TInt aOsAsid)=0;
+ virtual TInt LinearToPhysical(TLinAddr aAddr, TInt aSize, TPhysAddr& aPhysicalAddress, TPhysAddr* aPhysicalPageList, TInt aOsAsid)=0;
+ virtual TInt PreparePagesForDMA(TLinAddr aAddr, TInt aSize, TInt aOsAsid, TPhysAddr* aPhysicalPageList)=0;
+ virtual TInt ReleasePagesFromDMA(TPhysAddr* aPhysicalPageList, TInt aPageCount)=0;
+ virtual void DoAssignPageTable(TInt aId, TLinAddr aAddr, TPde aPdePerm, const TAny* aOsAsids)=0;
+ virtual void RemapPageTableSingle(TPhysAddr aOld, TPhysAddr aNew, TLinAddr aAddr, TInt aOsAsid)=0;
+ virtual void RemapPageTableMultiple(TPhysAddr aOld, TPhysAddr aNew, TLinAddr aAddr, const TAny* aOsAsids)=0;
+ virtual void RemapPageTableGlobal(TPhysAddr aOld, TPhysAddr aNew, TLinAddr aAddr)=0;
+ virtual void RemapPageTableAliases(TPhysAddr aOld, TPhysAddr aNew)=0;
+ virtual void DoUnassignPageTable(TLinAddr aAddr, const TAny* aOsAsids)=0;
+ virtual TPde PdePermissions(TChunkType aChunkType, TBool aRO)=0;
+ virtual void ApplyTopLevelPermissions(TLinAddr aAddr, TInt aOsAsid, TInt aNumPdes, TPde aPdePerm)=0;
+ virtual void ApplyPagePermissions(TInt aId, TInt aPageOffset, TInt aNumPages, TPte aPtePerm)=0;
+ virtual void GenericFlush(TUint32 aMask)=0;
+ virtual TLinAddr MapTemp(TPhysAddr aPage,TLinAddr aLinAddr, TInt aPages=1)=0;
+ virtual TLinAddr MapTemp(TPhysAddr aPage,TLinAddr aLinAddr,TInt aPages, TMemoryType aMemType)=0;
+ virtual TLinAddr MapSecondTemp(TPhysAddr aPage,TLinAddr aLinAddr, TInt aPages=1)=0;
+ virtual void UnmapTemp()=0;
+ virtual void UnmapSecondTemp()=0;
+ virtual TBool ValidateLocalIpcAddress(TLinAddr aAddr,TInt aSize,TBool aWrite)=0;
+ virtual TInt UnlockRamCachePages(TLinAddr aLinAddr, TInt aNumPages, DProcess* aProcess)=0;
+ virtual TInt LockRamCachePages(TLinAddr aLinAddr, TInt aNumPages, DProcess* aProcess)=0;
+ virtual void MapVirtual(TInt aId, TInt aNumPages)=0;
+ virtual TInt UnmapUnownedPages(TInt aId, TUint32 aAddr, TInt aNumPages, TPhysAddr* aPageList, TLinAddr* aLAPageList, TInt& aNumPtes, TInt& aNumFree, DProcess* aProcess)=0;
+ virtual TInt UnmapVirtual(TInt aId, TUint32 aAddr, TInt aNumPages, TPhysAddr* aPageList, TBool aSetPagesFree, TInt& aNumPtes, TInt& aNumFree, DProcess* aProcess)=0;
+ virtual TInt UnmapUnownedVirtual(TInt aId, TUint32 aAddr, TInt aNumPages, TPhysAddr* aPageList, TLinAddr* aLAPageList, TInt& aNumPtes, TInt& aNumFree, DProcess* aProcess)=0;
+ virtual void RemapPageByAsid(TBitMapAllocator* aOsAsids, TLinAddr aLinAddr, TPhysAddr aOldAddr, TPhysAddr aNewAddr, TPte aPtePerm)=0;
+ virtual void CacheMaintenanceOnDecommit(const TPhysAddr* aPhysAddr, TInt aPageCount)=0;
+ virtual void CacheMaintenanceOnDecommit(const TPhysAddr aPhysAddr)=0; // Maintains physical (VIPT & PIPT) cache for pages to be reused.
+ virtual void CacheMaintenanceOnPreserve(const TPhysAddr* aPhysAddr, TInt aPageCount, TUint iMapAttr)=0;
+ virtual void CacheMaintenanceOnPreserve(const TPhysAddr aPhysAddr, TUint iMapAttr)=0;
+ virtual void CacheMaintenanceOnPreserve(TPhysAddr aPhysAddr, TInt aSize, TLinAddr aLinAddr, TUint iMapAttr)=0;
+
+public:
+ inline static Mmu& Get()
+ {return *(Mmu*)TheMmu;}
+ static void Panic(TPanic aPanic);
+public:
+ TInt iNumOsAsids;
+ TInt iNumGlobalPageDirs;
+ TBitMapAllocator* iOsAsidAllocator;
+ TInt iGlobalPdSize;
+ TInt iGlobalPdShift;
+ TInt iLocalPdSize;
+ TInt iLocalPdShift;
+ TInt iAsidGroupSize; // number of global page directories mapped by a page table
+ TInt iAsidGroupMask; // number of global page directories mapped by a page table - 1
+ TInt iAsidGroupShift; // log2(number of global page directories mapped by a page table)
+ TInt iAliasSize; // minimum allowed spacing between synonyms of any physical address
+ TInt iAliasMask;
+ TInt iAliasShift;
+ TLinAddr iUserLocalBase; // lowest local data address
+ TLinAddr iUserLocalEnd; // 1+highest local data address (lowest DLL data address)
+ TLinAddr iUserSharedBase; // lowest shared data address (1+highest DLL data address)
+ TLinAddr iUserSharedEnd; // 1+highest shared data address (=local PD size)
+ TLinAddr iDllDataBase;
+ TInt iMaxDllDataSize;
+ TLinAddr iUserCodeBase;
+ TInt iMaxUserCodeSize;
+ TUint32* iAsidInfo;
+ TLinAddr iPdeBase;
+ TPte iPdPtePerm;
+ TPde iPdPdePerm;
+ TPte iUserCodeLoadPtePerm;
+ TPte iKernelCodePtePerm;
+ TPte iGlobalCodePtePerm;
+ TUint32 iRamDriveMask;
+ TLinearSection* iSharedSection;
+ TLinearSection* iUserGlobalSection;
+ DMemModelChunk* iGlobalCode;
+ SDblQue iAliasList;
+ TInt iTempMapCount;
+ TInt iSecondTempMapCount;
+ TPte* iSecondTempPte; // second PTE used for temporary mappings
+ TLinAddr iSecondTempAddr; // address corresponding to iSecondTempPte
+ TInt iCacheMaintenanceTempMapAttr; // holds SP_PTE's attr. entry for cache maintenance
+ // temporary mapping.
+public:
+ friend class Monitor;
+ friend TPte& PageTableEntry(TLinAddr aLinAddr);
+ };
+
+
+/********************************************
+ * Functions/Data defined in memory model
+ ********************************************/
+
+/**
+@internalComponent
+*/
+class MM
+ {
+public:
+ enum TMemModelPanic
+ {
+ EChunkTransferBadOwner=0,
+ EChunkDecommitNoPageTable=1,
+ EChunkTransferAllocAddrFailed=2,
+ EFsRegisterThread=3,
+ EClaimInitialPagesBadPageTable=4,
+ EChunkNotDisconnected1=5,
+ EChunkNotDisconnected2=6,
+ EChunkCommitNoPageTable=7,
+ EProcessDestructChunksRemaining=8,
+ ECommitInvalidDllDataAddress=9,
+ EDecommitInvalidDllDataAddress=10,
+ EChunkApplyPermissions1=11,
+ EChunkApplyPermissions2=12,
+ ECodeSegLoadedNotCreator=13,
+ EChunkBadAddressRange=14,
+ EPdeAlreadyInUse=15,
+ EPteAlreadyInUse=16,
+ EMmuMapNoPageTable=17,
+ EUnmapBadAlignment=18,
+ EBootstrapPageTableBadAddr=19,
+ ETempMappingAlreadyInUse=20,
+ EDecommitFailed=21,
+ EPageTableNotFound=22,
+ EUnexpectedPageType=23,
+ EOperationNotSupported=24,
+ EChunkRemapNoPageTable=25,
+ EChunkRemapUnsupported=26,
+ ECodeSegRemapWrongPage=27,
+ EChunkRemapWrongPageTable=28,
+ ETempMappingNoRoom=29,
+ };
+
+ static void Panic(TMemModelPanic aPanic);
+public:
+ static void Init1();
+ static void StartCrashDebugger();
+public:
+ static TInt MaxPagesInOneGo;
+ static DMemModelChunk* SvStackChunk;
+ static DMemModelChunk* TheRamDriveChunk;
+ static TBitMapAllocator* UserCodeAllocator;
+ static TBitMapAllocator* DllDataAllocator;
+ };
+
+#endif