os/kernelhwsrv/kernel/eka/include/memmodel/epoc/multiple/memmodel.h
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
sl@0
     1
// Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     2
// All rights reserved.
sl@0
     3
// This component and the accompanying materials are made available
sl@0
     4
// under the terms of the License "Eclipse Public License v1.0"
sl@0
     5
// which accompanies this distribution, and is available
sl@0
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     7
//
sl@0
     8
// Initial Contributors:
sl@0
     9
// Nokia Corporation - initial contribution.
sl@0
    10
//
sl@0
    11
// Contributors:
sl@0
    12
//
sl@0
    13
// Description:
sl@0
    14
// e32\include\memmodel\epoc\multiple\memmodel.h
sl@0
    15
// 
sl@0
    16
// WARNING: This file contains some APIs which are internal and are subject
sl@0
    17
//          to change without notice. Such APIs should therefore not be used
sl@0
    18
//          outside the Kernel and Hardware Services package.
sl@0
    19
//
sl@0
    20
sl@0
    21
#ifndef __MEMMODEL_H__
sl@0
    22
#define __MEMMODEL_H__
sl@0
    23
#include <memmodel/epoc/mmubase/mmubase.h>
sl@0
    24
sl@0
    25
#ifdef __SMP__
sl@0
    26
// SubScheduler fields for each processor
sl@0
    27
#define	i_AliasLinAddr			iExtras[0]
sl@0
    28
#define	i_AliasPdePtr			iExtras[1]
sl@0
    29
#endif
sl@0
    30
sl@0
    31
/********************************************
sl@0
    32
 * Dynamic Branch Predictor Support
sl@0
    33
 ********************************************/
sl@0
    34
sl@0
    35
/**
sl@0
    36
@internalComponent
sl@0
    37
*/
sl@0
    38
#ifdef __SMP__
sl@0
    39
//#define LastUserSelfMod                   ((DProcess*&)SubScheduler().iExtras[0])
sl@0
    40
#else
sl@0
    41
#define LastUserSelfMod                   ((DProcess*&)TheScheduler.iExtras[0])
sl@0
    42
#endif
sl@0
    43
sl@0
    44
/********************************************
sl@0
    45
 * RAM Defrag Page Table Moving Support
sl@0
    46
 ********************************************/
sl@0
    47
sl@0
    48
/**
sl@0
    49
@internalComponent
sl@0
    50
*/
sl@0
    51
#define AliasRemapOld					((TPhysAddr&)TheScheduler.iExtras[1])
sl@0
    52
sl@0
    53
/**
sl@0
    54
@internalComponent
sl@0
    55
*/
sl@0
    56
#define AliasRemapNew					((TPhysAddr&)TheScheduler.iExtras[2])
sl@0
    57
sl@0
    58
/********************************************
sl@0
    59
 * Thread Control Block
sl@0
    60
 ********************************************/
sl@0
    61
sl@0
    62
class DMemModelProcess;
sl@0
    63
sl@0
    64
/**
sl@0
    65
@internalComponent
sl@0
    66
*/
sl@0
    67
class DMemModelThread : public DThread
sl@0
    68
	{
sl@0
    69
public:
sl@0
    70
	TInt Alias(TLinAddr aAddr, DMemModelProcess* aProcess, TInt aSize, TInt aPerm, TLinAddr& aAliasAddr, TInt& aAliasSize);
sl@0
    71
	void RemoveAlias();
sl@0
    72
	virtual void DoExit1();
sl@0
    73
	static void RestoreAddressSpace();
sl@0
    74
public:
sl@0
    75
	TLinAddr iAliasLinAddr;	// linear address to access aliased memory (0 means no alias is present).
sl@0
    76
	TPde* iAliasPdePtr;		// Address of PDE which has been modified to make aliased memory accessible.
sl@0
    77
	TPde iAliasPde;			// PDE to store at iAliasPdePtr.
sl@0
    78
	TInt iAliasOsAsid;		// asid for the process whoes memory is aliased.
sl@0
    79
	SDblQueLink iAliasLink;	// link to make TheMmu.iAliasList.
sl@0
    80
	TLinAddr iAliasTarget;	// linear address of the memory which has been aliased
sl@0
    81
#ifdef __SMP__
sl@0
    82
	TInt iCpuRestoreCookie;
sl@0
    83
#endif
sl@0
    84
	};
sl@0
    85
sl@0
    86
sl@0
    87
/********************************************
sl@0
    88
 * Process Control Block
sl@0
    89
 ********************************************/
sl@0
    90
sl@0
    91
class DMemModelChunk;
sl@0
    92
class DMemModelCodeSegMemory;
sl@0
    93
sl@0
    94
/**
sl@0
    95
@internalComponent
sl@0
    96
*/
sl@0
    97
class DMemModelProcess : public DEpocProcess
sl@0
    98
	{
sl@0
    99
public:
sl@0
   100
	void Destruct();
sl@0
   101
public:
sl@0
   102
	virtual TInt DoCreate(TBool aKernelProcess, TProcessCreateInfo& aInfo);
sl@0
   103
	virtual TInt NewChunk(DChunk*& aChunk, SChunkCreateInfo& aInfo, TLinAddr& aRunAddr);
sl@0
   104
	virtual TInt AddChunk(DChunk* aChunk,TBool isReadOnly);
sl@0
   105
	virtual TInt NewShPool(DShPool*& aPool, TShPoolCreateInfo& aInfo);
sl@0
   106
	virtual TInt CreateDataBssStackArea(TProcessCreateInfo& aInfo);
sl@0
   107
	virtual TInt MapCodeSeg(DCodeSeg* aCodeSeg);
sl@0
   108
	virtual void UnmapCodeSeg(DCodeSeg* aCodeSeg);
sl@0
   109
	virtual void RemoveDllData();
sl@0
   110
	virtual void FinalRelease();
sl@0
   111
public:
sl@0
   112
	virtual TInt GetNewChunk(DMemModelChunk*& aChunk, SChunkCreateInfo& aInfo)=0;
sl@0
   113
public:
sl@0
   114
	TInt AddChunk(DMemModelChunk* aChunk, TLinAddr& aDataSectionBase, TBool isReadOnly);
sl@0
   115
	TInt AllocateDataSectionBase(DMemModelChunk& aChunk, TUint& aBase);
sl@0
   116
	TUint8* DataSectionBase(DMemModelChunk* aChunk);
sl@0
   117
	void RemoveChunk(DMemModelChunk *aChunk);
sl@0
   118
	void DoRemoveChunk(TInt aIndex);
sl@0
   119
	TInt ChunkIndex(DMemModelChunk* aChunk,TInt& aPos);
sl@0
   120
	TInt CreateCodeChunk();
sl@0
   121
	void FreeCodeChunk();
sl@0
   122
	TInt CreateDllDataChunk();
sl@0
   123
	void FreeDllDataChunk();
sl@0
   124
	TInt CommitDllData(TLinAddr aBase, TInt aSize);
sl@0
   125
	void DecommitDllData(TLinAddr aBase, TInt aSize);
sl@0
   126
	TInt MapUserRamCode(DMemModelCodeSegMemory* aMemory, TBool aLoading);
sl@0
   127
	void UnmapUserRamCode(DMemModelCodeSegMemory* aMemory, TBool aLoading);
sl@0
   128
public:
sl@0
   129
	enum TMemModelProcessAttributes
sl@0
   130
		{
sl@0
   131
		ESeparateGlobalSpace=0x40000000,
sl@0
   132
		EMMProcessAttributesMask = ESeparateGlobalSpace,
sl@0
   133
		};
sl@0
   134
sl@0
   135
	struct SChunkInfo
sl@0
   136
		{
sl@0
   137
		DMemModelChunk* iChunk;
sl@0
   138
		TInt16 iAccessCount;
sl@0
   139
		TInt16 isReadOnly;
sl@0
   140
		};
sl@0
   141
sl@0
   142
	TInt iChunkCount;
sl@0
   143
	TInt iChunkAlloc;
sl@0
   144
	SChunkInfo* iChunks;
sl@0
   145
	TLinearSection* iLocalSection;
sl@0
   146
	TInt iOsAsid;
sl@0
   147
	TPhysAddr iLocalPageDir;
sl@0
   148
	TPhysAddr iGlobalPageDir;
sl@0
   149
	TUint32 iAddressCheckMaskR;
sl@0
   150
	TUint32 iAddressCheckMaskW;
sl@0
   151
	DMemModelChunk* iCodeChunk;
sl@0
   152
	DMemModelChunk* iDllDataChunk;
sl@0
   153
	TInt iSelfModChunks;
sl@0
   154
public:
sl@0
   155
	friend class Monitor;
sl@0
   156
	};
sl@0
   157
sl@0
   158
sl@0
   159
/********************************************
sl@0
   160
 * Chunk Control Block
sl@0
   161
 ********************************************/
sl@0
   162
sl@0
   163
/**
sl@0
   164
@internalComponent
sl@0
   165
*/
sl@0
   166
class DMemModelChunk : public DChunk
sl@0
   167
	{
sl@0
   168
public:
sl@0
   169
	/**
sl@0
   170
	@see DChunk::TChunkAttributes for generic attribute flags
sl@0
   171
	*/
sl@0
   172
	enum TMemModelChunkAttributes
sl@0
   173
		{
sl@0
   174
		EPrivate			=0x80000000,
sl@0
   175
		ECode				=0x40000000,
sl@0
   176
		EAddressAllocDown	=0x20000000,
sl@0
   177
sl@0
   178
		EAddressRangeMask	=0x0f000000,
sl@0
   179
		EAddressRangeShift	=24,
sl@0
   180
		EAddressLocal		=0x00000000,
sl@0
   181
		EAddressShared		=0x01000000,
sl@0
   182
		EAddressUserGlobal	=0x02000000,
sl@0
   183
		EAddressKernel		=0x03000000,
sl@0
   184
		EAddressFixed		=0x04000000,
sl@0
   185
sl@0
   186
		EMapTypeMask		=0x00c00000,
sl@0
   187
		EMapTypeLocal		=0x00000000,
sl@0
   188
		EMapTypeGlobal		=0x00400000,
sl@0
   189
		EMapTypeShared		=0x00800000,
sl@0
   190
sl@0
   191
		EMMChunkAttributesMask = EPrivate|ECode|EAddressAllocDown|EAddressRangeMask|EMapTypeMask,
sl@0
   192
		};
sl@0
   193
	
sl@0
   194
public:
sl@0
   195
	DMemModelChunk();
sl@0
   196
	void Destruct();
sl@0
   197
public:
sl@0
   198
	virtual TInt Close(TAny* aPtr);
sl@0
   199
	virtual TInt DoCreate(SChunkCreateInfo& aInfo);
sl@0
   200
	virtual TInt Adjust(TInt aNewSize);
sl@0
   201
	virtual TInt AdjustDoubleEnded(TInt aBottom, TInt aTop);
sl@0
   202
	virtual TInt CheckAccess();
sl@0
   203
	virtual TInt Commit(TInt aOffset, TInt aSize, TCommitType aCommitType=DChunk::ECommitDiscontiguous, TUint32* aExtraArg=0);
sl@0
   204
	virtual TInt Allocate(TInt aSize, TInt aGuard=0, TInt aAlign=0);
sl@0
   205
	virtual TInt Decommit(TInt aOffset, TInt aSize);
sl@0
   206
	virtual TInt Lock(TInt anOffset, TInt aSize);
sl@0
   207
	virtual TInt Unlock(TInt anOffset, TInt aSize);
sl@0
   208
	virtual TInt Address(TInt aOffset, TInt aSize, TLinAddr& aKernelAddress);
sl@0
   209
	virtual TInt PhysicalAddress(TInt aOffset, TInt aSize, TLinAddr& aKernelAddress, TUint32& aPhysicalAddress, TUint32* aPhysicalPageList=NULL);
sl@0
   210
	virtual void BTracePrime(TInt aCategory);
sl@0
   211
	virtual void Substitute(TInt aOffset, TPhysAddr aOldAddr, TPhysAddr aNewAddr);
sl@0
   212
	virtual TUint8* Base(DProcess* aProcess);
sl@0
   213
	inline TUint8* Base() const { return DChunk::Base(); }
sl@0
   214
public:
sl@0
   215
	TInt Decommit(TInt aOffset, TInt aSize, TDecommitType aDecommitType);
sl@0
   216
	void ClaimInitialPages();
sl@0
   217
	void SetFixedAddress(TLinAddr aAddr, TInt aInitialSize);
sl@0
   218
	TInt Reserve(TInt aInitialSize);
sl@0
   219
	TInt DoCommit(TInt aOffset, TInt aSize, TCommitType aCommitType=DChunk::ECommitDiscontiguous, TUint32* aExtraArg=0);
sl@0
   220
	void DoDecommit(TInt aOffset, TInt aSize, TDecommitType aDecommitType=EDecommitNormal);
sl@0
   221
	TInt AllocateAddress();
sl@0
   222
	void ApplyPermissions(TInt aOffset, TInt aSize, TPte aPtePerm);
sl@0
   223
	TLinearSection* LinearSection();
sl@0
   224
	TZonePageType GetPageType();
sl@0
   225
sl@0
   226
public:
sl@0
   227
	virtual TInt SetupPermissions()=0;
sl@0
   228
sl@0
   229
public:
sl@0
   230
	TBitMapAllocator* iOsAsids;			// NULL for local or fully global else list of OS ASIDs
sl@0
   231
	TPte iPtePermissions;
sl@0
   232
	TPde iPdePermissions;
sl@0
   233
	TUint16* iPageTables;
sl@0
   234
	TBitMapAllocator* iPageBitMap;		// NULL if not disconnected chunk
sl@0
   235
	TBitMapAllocator* iPermanentPageBitMap;
sl@0
   236
	DMemModelChunk* iKernelMirror;
sl@0
   237
public:
sl@0
   238
	friend class Monitor;
sl@0
   239
	};
sl@0
   240
sl@0
   241
sl@0
   242
/********************************************
sl@0
   243
 * Code segment
sl@0
   244
 ********************************************/
sl@0
   245
sl@0
   246
/**
sl@0
   247
@internalComponent
sl@0
   248
*/
sl@0
   249
class DMemModelCodeSegMemory : public DMmuCodeSegMemory
sl@0
   250
	{
sl@0
   251
public:
sl@0
   252
	DMemModelCodeSegMemory(DEpocCodeSeg* aCodeSeg);
sl@0
   253
	~DMemModelCodeSegMemory();
sl@0
   254
	TInt Create(TCodeSegCreateInfo& aInfo);
sl@0
   255
	TInt Loaded(TCodeSegCreateInfo& aInfo);
sl@0
   256
	void Substitute(TInt aOffset, TPhysAddr aOld, TPhysAddr aNew);
sl@0
   257
	void Destroy();
sl@0
   258
public:
sl@0
   259
	DMemModelProcess* iCreator;	// process loading this code segment
sl@0
   260
sl@0
   261
	TPhysAddr* iPages;			// list of physical pages (iPageCount+iDataPageCount)
sl@0
   262
sl@0
   263
	/**
sl@0
   264
	List of OS ASIDs this code segment is mapped into.
sl@0
   265
	Protected by RamAllocMutex and System Lock.
sl@0
   266
	*/
sl@0
   267
	TBitMapAllocator* iOsAsids;
sl@0
   268
sl@0
   269
	TLinAddr* iCopyOfExportDir;	// kernel side copy of export directory or NULL
sl@0
   270
	};
sl@0
   271
sl@0
   272
/**
sl@0
   273
@internalComponent
sl@0
   274
*/
sl@0
   275
class DMemModelCodeSeg: public DEpocCodeSeg
sl@0
   276
	{
sl@0
   277
public:
sl@0
   278
	DMemModelCodeSeg();
sl@0
   279
	virtual ~DMemModelCodeSeg();
sl@0
   280
	virtual TInt DoCreateRam(TCodeSegCreateInfo& aInfo, DProcess* aProcess);
sl@0
   281
	virtual TInt DoCreateXIP(DProcess* aProcess);
sl@0
   282
	virtual TInt Loaded(TCodeSegCreateInfo& aInfo);
sl@0
   283
	virtual void ReadExportDir(TUint32* aDest);
sl@0
   284
	virtual TBool FindCheck(DProcess* aProcess);
sl@0
   285
	virtual TBool OpenCheck(DProcess* aProcess);
sl@0
   286
	virtual void BTracePrime(TInt aCategory);
sl@0
   287
	inline DMemModelCodeSegMemory* Memory()
sl@0
   288
		{ return (DMemModelCodeSegMemory*)iMemory; }
sl@0
   289
	inline TPhysAddr* Pages()
sl@0
   290
		{ return iMemory!=0 ? Memory()->iPages : (TPhysAddr*)0; }
sl@0
   291
public:
sl@0
   292
	TInt iCodeAllocBase;
sl@0
   293
	TInt iDataAllocBase;
sl@0
   294
	TAny* iKernelData;			// only for kernel modules
sl@0
   295
	};
sl@0
   296
sl@0
   297
sl@0
   298
/********************************************
sl@0
   299
 * MMU stuff
sl@0
   300
 ********************************************/
sl@0
   301
sl@0
   302
/**
sl@0
   303
@internalComponent
sl@0
   304
Indicates that corresponding linear address applies to unknown address space.
sl@0
   305
Common for EMemTypeShared types of chunks with no owning process.
sl@0
   306
*/
sl@0
   307
#define	UNKNOWN_MAPPING	((TInt)-2)
sl@0
   308
sl@0
   309
/**
sl@0
   310
@internalComponent
sl@0
   311
Indicates that corresponding linear address applies to global address space.
sl@0
   312
*/
sl@0
   313
#define	GLOBAL_MAPPING	((const TAny*)-1)
sl@0
   314
sl@0
   315
	/**
sl@0
   316
@internalComponent
sl@0
   317
Indicates that corresponding linear address applies to kernel process (either global or Kernel's local space).
sl@0
   318
*/
sl@0
   319
#define	KERNEL_MAPPING	((TInt)0)
sl@0
   320
	
sl@0
   321
	
sl@0
   322
/**
sl@0
   323
@internalComponent
sl@0
   324
*/
sl@0
   325
class Mmu : public MmuBase
sl@0
   326
	{
sl@0
   327
public:
sl@0
   328
	enum TFlushFlags	{
sl@0
   329
						EFlushDTLB=0x01,
sl@0
   330
						EFlushDCache=0x02,
sl@0
   331
						EFlushITLB=0x04,
sl@0
   332
						EFlushICache=0x08,
sl@0
   333
						EFlushDDecommit=0x80000000,
sl@0
   334
						EFlushDPermChg=0x20000000,
sl@0
   335
						EFlushDMove=0x40000000,
sl@0
   336
						EFlushIPermChg=0x04000000,
sl@0
   337
						EFlushIMove=0x10000000,
sl@0
   338
						EFlushInheritMask=EFlushDPermChg|EFlushDMove|EFlushIPermChg|EFlushIMove,
sl@0
   339
						};
sl@0
   340
sl@0
   341
	enum TPanic
sl@0
   342
		{
sl@0
   343
		ELocalPageDirBadAsid,
sl@0
   344
		EGlobalPageDirBadAsid,
sl@0
   345
		EPDEBadAsid,
sl@0
   346
		EFreeOsAsidBadAsid,
sl@0
   347
		EOsAsidAllocCreateFailed,
sl@0
   348
		EBadInitialPageAddr,
sl@0
   349
		EAssignPageTableInvalidUsage,
sl@0
   350
		EUserCodeAllocatorCreateFailed,
sl@0
   351
		EDllDataAllocatorCreateFailed,
sl@0
   352
		ERomUserDataAddressInvalid,
sl@0
   353
		ERomUserDataSizeInvalid,
sl@0
   354
		ECreateSharedSectionFailed,
sl@0
   355
		ECreateUserGlobalSectionFailed,
sl@0
   356
		ERemapPageFailed,
sl@0
   357
		ERemapPageTableFailed,
sl@0
   358
		EFixupXPTFailed,
sl@0
   359
		ETempMappingFailed,		
sl@0
   360
		EDefragDisablePageFailed,
sl@0
   361
		EDefragFaultWhilstFMHeld,
sl@0
   362
		};
sl@0
   363
sl@0
   364
public:
sl@0
   365
	TPde* LocalPageDir(TInt aOsAsid);
sl@0
   366
	TPde* GlobalPageDir(TInt aOsAsid);
sl@0
   367
	TPde& PDE(TLinAddr aAddr, TInt aOsAsid);
sl@0
   368
	TInt NewOsAsid(TBool aSeparateGlobal);
sl@0
   369
	void FreeOsAsid(TInt aOsAsid);
sl@0
   370
	void CreateUserGlobalSection(TLinAddr aBase, TLinAddr aEnd);
sl@0
   371
	TInt CreateGlobalCodeChunk();
sl@0
   372
sl@0
   373
	// virtual - inherited/overridden from MmuBase
sl@0
   374
	virtual void Init1();
sl@0
   375
//	virtual void Init2();
sl@0
   376
	virtual void DoInit2();
sl@0
   377
//	virtual TBool PteIsPresent(TPte aPte)=0;
sl@0
   378
//	virtual TPhysAddr PtePhysAddr(TPte aPte, TInt aPteIndex)=0;
sl@0
   379
//	virtual TPhysAddr PdePhysAddr(TLinAddr aAddr)=0;
sl@0
   380
	virtual void SetupInitialPageInfo(SPageInfo* aPageInfo, TLinAddr aChunkAddr, TInt aPdeIndex);
sl@0
   381
	virtual void SetupInitialPageTableInfo(TInt aId, TLinAddr aChunkAddr, TInt aNumPtes);
sl@0
   382
	virtual void AssignPageTable(TInt aId, TInt aUsage, TAny* aObject, TLinAddr aAddr, TPde aPdePerm);
sl@0
   383
	virtual TInt UnassignPageTable(TLinAddr aAddr);
sl@0
   384
//	virtual void BootstrapPageTable(TInt aXptId, TPhysAddr aXptPhys, TInt aId, TPhysAddr aPhysAddr)=0;
sl@0
   385
	virtual TInt PageTableId(TLinAddr aAddr);
sl@0
   386
//	virtual TInt BootPageTableId(TLinAddr aAddr, TPhysAddr& aPtPhys)=0;
sl@0
   387
//	virtual void ClearPageTable(TInt aId, TInt aFirstIndex=0)=0;
sl@0
   388
	virtual TPhysAddr LinearToPhysical(TLinAddr aAddr);
sl@0
   389
	virtual TInt LinearToPhysical(TLinAddr aAddr, TInt aSize, TPhysAddr& aPhysicalAddress, TPhysAddr* aPhysicalPageList=NULL);
sl@0
   390
//	virtual void MapRamPages(TInt aId, SPageInfo::TType aType, TAny* aPtr, TUint32 aOffset, const TPhysAddr* aPageList, TInt aNumPages, TPte aPtePerm)=0;
sl@0
   391
//	virtual void MapPhysicalPages(TInt aId, SPageInfo::TType aType, TAny* aPtr, TUint32 aOffset, TPhysAddr aPhysAddr, TInt aNumPages, TPte aPtePerm)=0;
sl@0
   392
//	virtual TInt UnmapPages(TInt aId, TUint32 aAddr, TInt aNumPages, TPhysAddr* aPageList, TBool aSetPagesFree, TInt& aNumPtes, TInt& aNumFree, DProcess* aProcess)=0;
sl@0
   393
//	virtual void ClearRamDrive(TLinAddr aStart)=0;
sl@0
   394
//	virtual TInt PdePtePermissions(TUint& aMapAttr, TPde& aPde, TPte& aPte)=0;
sl@0
   395
//	virtual void Map(TLinAddr aLinAddr, TPhysAddr aPhysAddr, TInt aSize, TPde aPdePerm, TPte aPtePerm, TInt aMapShift)=0;
sl@0
   396
//	virtual void Unmap(TLinAddr aLinAddr, TInt aSize)=0;
sl@0
   397
//	virtual void InitShadowPageTable(TInt aId, TLinAddr aRomAddr, TPhysAddr aOrigPhys)=0;
sl@0
   398
//	virtual void InitShadowPage(TPhysAddr aShadowPhys, TLinAddr aRomAddr)=0;
sl@0
   399
//	virtual void DoUnmapShadowPage(TInt aId, TLinAddr aRomAddr, TPhysAddr aOrigPhys)=0;
sl@0
   400
//	virtual TInt UnassignShadowPageTable(TLinAddr aRomAddr, TPhysAddr aOrigPhys)=0;
sl@0
   401
//	virtual void DoFreezeShadowPage(TInt aId, TLinAddr aRomAddr)=0;
sl@0
   402
//	virtual void FlushShadow(TLinAddr aRomAddr)=0;
sl@0
   403
//	virtual void AssignShadowPageTable(TInt aId, TLinAddr aRomAddr)=0;
sl@0
   404
//	virtual void ClearPages(TInt aNumPages, TPhysAddr* aPageList)=0;
sl@0
   405
	virtual TPte PtePermissions(TChunkType aChunkType)=0;
sl@0
   406
	virtual TInt MoveKernelPage(DChunk* aChunk, TUint32 aOffset, TPhysAddr aOld, TPhysAddr& aNew, TUint aBlockZoneId, TBool aBlockRest);
sl@0
   407
	virtual TInt MoveCodeSegMemoryPage(DMemModelCodeSegMemory* aCodeSegMemory, TUint32 aOffset, TPhysAddr aOld, TPhysAddr& aNew, TUint aBlockZoneId, TBool aBlockRest);
sl@0
   408
	virtual TInt MoveCodeChunkPage(DChunk* aChunk, TUint32 aOffset, TPhysAddr aOld, TPhysAddr& aNew, TUint aBlockZoneId, TBool aBlockRest);
sl@0
   409
	virtual TInt MoveDataChunkPage(DChunk* aChunk, TUint32 aOffset, TPhysAddr aOld, TPhysAddr& aNew, TUint aBlockZoneId, TBool aBlockRest);
sl@0
   410
sl@0
   411
	// pure virtual - new in Mmu
sl@0
   412
	virtual TInt NewPageDirectory(TInt aOsAsid, TBool aSeparateGlobal, TPhysAddr& aPhysAddr, TInt& aNumPages)=0;
sl@0
   413
	virtual void InitPageDirectory(TInt aOsAsid, TBool aGlobal)=0;
sl@0
   414
	virtual TInt PageTableId(TLinAddr aAddr, TInt aOsAsid)=0;
sl@0
   415
	virtual TPhysAddr LinearToPhysical(TLinAddr aAddr, TInt aOsAsid)=0;
sl@0
   416
	virtual TInt LinearToPhysical(TLinAddr aAddr, TInt aSize, TPhysAddr& aPhysicalAddress, TPhysAddr* aPhysicalPageList, TInt aOsAsid)=0;
sl@0
   417
	virtual TInt PreparePagesForDMA(TLinAddr aAddr, TInt aSize, TInt aOsAsid, TPhysAddr* aPhysicalPageList)=0;
sl@0
   418
	virtual TInt ReleasePagesFromDMA(TPhysAddr* aPhysicalPageList, TInt aPageCount)=0;
sl@0
   419
	virtual void DoAssignPageTable(TInt aId, TLinAddr aAddr, TPde aPdePerm, const TAny* aOsAsids)=0;
sl@0
   420
	virtual void RemapPageTableSingle(TPhysAddr aOld, TPhysAddr aNew, TLinAddr aAddr, TInt aOsAsid)=0;
sl@0
   421
	virtual void RemapPageTableMultiple(TPhysAddr aOld, TPhysAddr aNew, TLinAddr aAddr, const TAny* aOsAsids)=0;
sl@0
   422
	virtual void RemapPageTableGlobal(TPhysAddr aOld, TPhysAddr aNew, TLinAddr aAddr)=0;
sl@0
   423
	virtual void RemapPageTableAliases(TPhysAddr aOld, TPhysAddr aNew)=0;
sl@0
   424
	virtual void DoUnassignPageTable(TLinAddr aAddr, const TAny* aOsAsids)=0;
sl@0
   425
	virtual TPde PdePermissions(TChunkType aChunkType, TBool aRO)=0;
sl@0
   426
	virtual void ApplyTopLevelPermissions(TLinAddr aAddr, TInt aOsAsid, TInt aNumPdes, TPde aPdePerm)=0;
sl@0
   427
	virtual void ApplyPagePermissions(TInt aId, TInt aPageOffset, TInt aNumPages, TPte aPtePerm)=0;
sl@0
   428
	virtual void GenericFlush(TUint32 aMask)=0;
sl@0
   429
	virtual TLinAddr MapTemp(TPhysAddr aPage,TLinAddr aLinAddr, TInt aPages=1)=0;
sl@0
   430
	virtual TLinAddr MapTemp(TPhysAddr aPage,TLinAddr aLinAddr,TInt aPages, TMemoryType aMemType)=0;
sl@0
   431
	virtual TLinAddr MapSecondTemp(TPhysAddr aPage,TLinAddr aLinAddr, TInt aPages=1)=0;
sl@0
   432
	virtual void UnmapTemp()=0;
sl@0
   433
	virtual void UnmapSecondTemp()=0;
sl@0
   434
	virtual TBool ValidateLocalIpcAddress(TLinAddr aAddr,TInt aSize,TBool aWrite)=0;
sl@0
   435
	virtual TInt UnlockRamCachePages(TLinAddr aLinAddr, TInt aNumPages, DProcess* aProcess)=0;
sl@0
   436
	virtual TInt LockRamCachePages(TLinAddr aLinAddr, TInt aNumPages, DProcess* aProcess)=0;
sl@0
   437
	virtual void MapVirtual(TInt aId, TInt aNumPages)=0;
sl@0
   438
	virtual TInt UnmapUnownedPages(TInt aId, TUint32 aAddr, TInt aNumPages, TPhysAddr* aPageList, TLinAddr* aLAPageList, TInt& aNumPtes, TInt& aNumFree, DProcess* aProcess)=0;
sl@0
   439
	virtual TInt UnmapVirtual(TInt aId, TUint32 aAddr, TInt aNumPages, TPhysAddr* aPageList, TBool aSetPagesFree, TInt& aNumPtes, TInt& aNumFree, DProcess* aProcess)=0;
sl@0
   440
	virtual TInt UnmapUnownedVirtual(TInt aId, TUint32 aAddr, TInt aNumPages, TPhysAddr* aPageList, TLinAddr* aLAPageList, TInt& aNumPtes, TInt& aNumFree, DProcess* aProcess)=0;
sl@0
   441
	virtual void RemapPageByAsid(TBitMapAllocator* aOsAsids, TLinAddr aLinAddr, TPhysAddr aOldAddr, TPhysAddr aNewAddr, TPte aPtePerm)=0;
sl@0
   442
	virtual void CacheMaintenanceOnDecommit(const TPhysAddr* aPhysAddr, TInt aPageCount)=0;
sl@0
   443
	virtual void CacheMaintenanceOnDecommit(const TPhysAddr aPhysAddr)=0; // Maintains physical (VIPT & PIPT) cache for pages to be reused. 
sl@0
   444
	virtual void CacheMaintenanceOnPreserve(const TPhysAddr* aPhysAddr, TInt aPageCount, TUint iMapAttr)=0;
sl@0
   445
	virtual void CacheMaintenanceOnPreserve(const TPhysAddr aPhysAddr, TUint iMapAttr)=0;
sl@0
   446
	virtual void CacheMaintenanceOnPreserve(TPhysAddr aPhysAddr, TInt aSize, TLinAddr aLinAddr, TUint iMapAttr)=0;
sl@0
   447
	
sl@0
   448
public:
sl@0
   449
	inline static Mmu& Get()
sl@0
   450
		{return *(Mmu*)TheMmu;}
sl@0
   451
	static void Panic(TPanic aPanic);
sl@0
   452
public:
sl@0
   453
	TInt iNumOsAsids;
sl@0
   454
	TInt iNumGlobalPageDirs;
sl@0
   455
	TBitMapAllocator* iOsAsidAllocator;
sl@0
   456
	TInt iGlobalPdSize;
sl@0
   457
	TInt iGlobalPdShift;
sl@0
   458
	TInt iLocalPdSize;
sl@0
   459
	TInt iLocalPdShift;
sl@0
   460
	TInt iAsidGroupSize;			// number of global page directories mapped by a page table
sl@0
   461
	TInt iAsidGroupMask;			// number of global page directories mapped by a page table - 1
sl@0
   462
	TInt iAsidGroupShift;			// log2(number of global page directories mapped by a page table)
sl@0
   463
	TInt iAliasSize;				// minimum allowed spacing between synonyms of any physical address
sl@0
   464
	TInt iAliasMask;
sl@0
   465
	TInt iAliasShift;
sl@0
   466
	TLinAddr iUserLocalBase;		// lowest local data address
sl@0
   467
	TLinAddr iUserLocalEnd;			// 1+highest local data address (lowest DLL data address)
sl@0
   468
	TLinAddr iUserSharedBase;		// lowest shared data address (1+highest DLL data address)
sl@0
   469
	TLinAddr iUserSharedEnd;		// 1+highest shared data address (=local PD size)
sl@0
   470
	TLinAddr iDllDataBase;
sl@0
   471
	TInt iMaxDllDataSize;
sl@0
   472
	TLinAddr iUserCodeBase;
sl@0
   473
	TInt iMaxUserCodeSize;
sl@0
   474
	TUint32* iAsidInfo;
sl@0
   475
	TLinAddr iPdeBase;
sl@0
   476
	TPte iPdPtePerm;
sl@0
   477
	TPde iPdPdePerm;
sl@0
   478
	TPte iUserCodeLoadPtePerm;
sl@0
   479
	TPte iKernelCodePtePerm;
sl@0
   480
	TPte iGlobalCodePtePerm;
sl@0
   481
	TUint32 iRamDriveMask;
sl@0
   482
	TLinearSection* iSharedSection;
sl@0
   483
	TLinearSection* iUserGlobalSection;
sl@0
   484
	DMemModelChunk* iGlobalCode;
sl@0
   485
	SDblQue iAliasList;
sl@0
   486
	TInt iTempMapCount;
sl@0
   487
	TInt iSecondTempMapCount;
sl@0
   488
	TPte* iSecondTempPte;		// second PTE used for temporary mappings
sl@0
   489
	TLinAddr iSecondTempAddr;	// address corresponding to iSecondTempPte
sl@0
   490
	TInt iCacheMaintenanceTempMapAttr;	// holds SP_PTE's attr. entry for cache maintenance
sl@0
   491
										// temporary mapping.
sl@0
   492
public:
sl@0
   493
	friend class Monitor;
sl@0
   494
	friend TPte& PageTableEntry(TLinAddr aLinAddr);
sl@0
   495
	};
sl@0
   496
sl@0
   497
sl@0
   498
/********************************************
sl@0
   499
 * Functions/Data defined in memory model
sl@0
   500
 ********************************************/
sl@0
   501
sl@0
   502
/**
sl@0
   503
@internalComponent
sl@0
   504
*/
sl@0
   505
class MM
sl@0
   506
	{
sl@0
   507
public:
sl@0
   508
	enum TMemModelPanic
sl@0
   509
		{
sl@0
   510
		EChunkTransferBadOwner=0,
sl@0
   511
		EChunkDecommitNoPageTable=1,
sl@0
   512
		EChunkTransferAllocAddrFailed=2,
sl@0
   513
		EFsRegisterThread=3,
sl@0
   514
		EClaimInitialPagesBadPageTable=4,
sl@0
   515
		EChunkNotDisconnected1=5,
sl@0
   516
		EChunkNotDisconnected2=6,
sl@0
   517
		EChunkCommitNoPageTable=7,
sl@0
   518
		EProcessDestructChunksRemaining=8,
sl@0
   519
		ECommitInvalidDllDataAddress=9,
sl@0
   520
		EDecommitInvalidDllDataAddress=10,
sl@0
   521
		EChunkApplyPermissions1=11,
sl@0
   522
		EChunkApplyPermissions2=12,
sl@0
   523
		ECodeSegLoadedNotCreator=13,
sl@0
   524
		EChunkBadAddressRange=14,
sl@0
   525
		EPdeAlreadyInUse=15,
sl@0
   526
		EPteAlreadyInUse=16,
sl@0
   527
		EMmuMapNoPageTable=17,
sl@0
   528
		EUnmapBadAlignment=18,
sl@0
   529
		EBootstrapPageTableBadAddr=19,
sl@0
   530
		ETempMappingAlreadyInUse=20,
sl@0
   531
		EDecommitFailed=21,
sl@0
   532
		EPageTableNotFound=22,
sl@0
   533
		EUnexpectedPageType=23,
sl@0
   534
		EOperationNotSupported=24,
sl@0
   535
		EChunkRemapNoPageTable=25,
sl@0
   536
		EChunkRemapUnsupported=26,
sl@0
   537
		ECodeSegRemapWrongPage=27,
sl@0
   538
		EChunkRemapWrongPageTable=28,
sl@0
   539
		ETempMappingNoRoom=29,
sl@0
   540
		};
sl@0
   541
sl@0
   542
	static void Panic(TMemModelPanic aPanic);
sl@0
   543
public:
sl@0
   544
	static void Init1();
sl@0
   545
	static void StartCrashDebugger();
sl@0
   546
public:
sl@0
   547
	static TInt MaxPagesInOneGo;
sl@0
   548
	static DMemModelChunk* SvStackChunk;
sl@0
   549
	static DMemModelChunk* TheRamDriveChunk;
sl@0
   550
	static TBitMapAllocator* UserCodeAllocator;
sl@0
   551
	static TBitMapAllocator* DllDataAllocator;
sl@0
   552
	};
sl@0
   553
sl@0
   554
#endif