kerneltest/e32test/mmu/d_shadow.cpp
branchRCL_3
changeset 80 597aaf25e343
parent 31 56f325a607ea
child 291 206a6eaaeb71
equal deleted inserted replaced
62:4a8fed1c0ef6 80:597aaf25e343
    25 const TInt KMinorVersionNumber=1;
    25 const TInt KMinorVersionNumber=1;
    26 const TInt KBuildVersionNumber=1;
    26 const TInt KBuildVersionNumber=1;
    27 
    27 
    28 _LIT(KLddName,"Shadow");
    28 _LIT(KLddName,"Shadow");
    29 
    29 
       
    30 #ifdef __CPU_X86
       
    31 const TUint KPageDirectorySize = 1024;
       
    32 const TUint KMaxNumberOfPageDirectories = 1024;
       
    33 const TUint KPsudoX86TTBCR = 512;
       
    34 #else 
       
    35 const TUint KPageDirectorySize = 4096;  // Full size (ttbr0+ttbr1)
       
    36 const TUint KMaxNumberOfPageDirectories = 256;
       
    37 #endif
       
    38 
    30 class DShadow;
    39 class DShadow;
    31 
    40 
    32 class DShadowFactory : public DLogicalDevice
    41 class DShadowFactory : public DLogicalDevice
    33 //
    42 //
    34 // Shadow ROM LDD factory
    43 // Shadow ROM LDD factory
    50 	DShadow();
    59 	DShadow();
    51 	~DShadow();
    60 	~DShadow();
    52 protected:
    61 protected:
    53 	virtual TInt DoCreate(TInt aUnit, const TDesC8* anInfo, const TVersion& aVer);
    62 	virtual TInt DoCreate(TInt aUnit, const TDesC8* anInfo, const TVersion& aVer);
    54 	virtual TInt Request(TInt aFunction, TAny* a1, TAny* a2);
    63 	virtual TInt Request(TInt aFunction, TAny* a1, TAny* a2);
       
    64 
       
    65 	// Memory model specific values will be initialised when the channel is created.
       
    66 	TUint iPageDirectoryBase;
       
    67 	TUint iPageTableBase;
       
    68 	TMemModel  iMemoryModel;
    55 	};
    69 	};
    56 
    70 
    57 DECLARE_STANDARD_LDD()
    71 DECLARE_STANDARD_LDD()
    58 	{
    72 	{
    59     return new DShadowFactory;
    73     return new DShadowFactory;
   109 //
   123 //
   110     {
   124     {
   111 
   125 
   112     if (!Kern::QueryVersionSupported(TVersion(KMajorVersionNumber,KMinorVersionNumber,KBuildVersionNumber),aVer))
   126     if (!Kern::QueryVersionSupported(TVersion(KMajorVersionNumber,KMinorVersionNumber,KBuildVersionNumber),aVer))
   113     	return KErrNotSupported;
   127     	return KErrNotSupported;
       
   128 	// Set memory model specific values.
       
   129 	TUint32 memoryModelAttrib = (TUint32)Kern::HalFunction(EHalGroupKernel,EKernelHalMemModelInfo,0,0);    
       
   130 	switch (memoryModelAttrib & EMemModelTypeMask)
       
   131 		{
       
   132 		case EMemModelTypeMoving:
       
   133 			iPageDirectoryBase = 0x61000000;
       
   134 			iPageTableBase = 0x62000000;
       
   135 			iMemoryModel = EMemModelMoving;
       
   136 			break;
       
   137 		case EMemModelTypeMultiple:
       
   138 			iPageDirectoryBase = 0xC1000000;
       
   139 			iPageTableBase = 0xC2000000;
       
   140 			iMemoryModel = EMemModelMultiple;
       
   141 			break;
       
   142 		case EMemModelTypeFlexible:
       
   143 			iPageDirectoryBase = 0xF4000000u;
       
   144 			iPageTableBase = 0xF8000000u;
       
   145 			iMemoryModel = EMemModelFlexible;
       
   146 			break;
       
   147 		default:
       
   148 			iPageDirectoryBase = 0x00000000;
       
   149 			iPageTableBase = 0x00000000;
       
   150 			iMemoryModel = EMemModelOther;
       
   151 		}
   114 	return KErrNone;
   152 	return KErrNone;
   115 	}
   153 	}
   116 
   154 
   117 DShadow::~DShadow()
   155 DShadow::~DShadow()
   118 //
   156 //
   289 			TUint pageTable;
   327 			TUint pageTable;
   290 			TUint numPds;
   328 			TUint numPds;
   291 						 
   329 						 
   292 #ifdef __EPOC32__
   330 #ifdef __EPOC32__
   293 
   331 
   294 #if defined(__MEMMODEL_MULTIPLE__) || defined(__MEMMODEL_FLEXIBLE__)
   332 			if (iMemoryModel == EMemModelFlexible || iMemoryModel == EMemModelMultiple)
   295 			numPds = KMaxNumberOfPageDirectories;
   333 				numPds = KMaxNumberOfPageDirectories;
   296 #else
   334 			else
   297 			numPds = 0;								
   335 				numPds = 0;	
   298 #endif			
   336 			r = iMemoryModel;
   299 			r = KMemoryModel;
   337 #endif
   300 #endif
   338 			pageTable = iPageTableBase;			
   301 			pageTable = KPageTableBase;			
       
   302 
   339 
   303 			kumemput(a1, &pageTable, sizeof(TUint));
   340 			kumemput(a1, &pageTable, sizeof(TUint));
   304 			kumemput(a2, &numPds, sizeof(TUint));
   341 			kumemput(a2, &numPds, sizeof(TUint));
   305 			break;
   342 			break;
   306 			}
   343 			}
   315 			TUint pdSize;
   352 			TUint pdSize;
   316 			TUint pdBase;
   353 			TUint pdBase;
   317 
   354 
   318 			r=KErrNoPageTable;
   355 			r=KErrNoPageTable;
   319 
   356 
   320 #if defined(__MEMMODEL_MOVING__)
   357 			if (iMemoryModel == EMemModelMoving)
   321 
       
   322 			if (pd==KGlobalPageDirectory)
       
   323 				{
   358 				{
   324 				pdSize=KPageDirectorySize;
   359 				if (pd==KGlobalPageDirectory)
   325 				pdBase=KPageDirectoryBase;
   360 					{
   326 				r = KErrNone;
   361 					pdSize=KPageDirectorySize;
       
   362 					pdBase=iPageDirectoryBase;
       
   363 					r = KErrNone;
       
   364 					}
   327 				}
   365 				}
   328 
   366 			else if(iMemoryModel == EMemModelFlexible || iMemoryModel == EMemModelMultiple)
   329 #elif defined(__MEMMODEL_MULTIPLE__) || defined(__MEMMODEL_FLEXIBLE__)
   367 				{
   330 
       
   331 #ifdef __CPU_X86
   368 #ifdef __CPU_X86
   332 			TUint ttbcr = KPsudoX86TTBCR;
   369 				TUint ttbcr = KPsudoX86TTBCR;
   333 #else
   370 #else
   334 			TUint ttbcr = KPageDirectorySize >> GetTTBCR();
   371 				TUint ttbcr = KPageDirectorySize >> GetTTBCR();
   335 #endif
   372 #endif // __CPU_X86
   336 
   373 
   337 			if (pd==KGlobalPageDirectory)
   374 				if (pd==KGlobalPageDirectory)
   338 				{
   375 					{
   339 				pdSize=KPageDirectorySize - ttbcr;
   376 					pdSize=KPageDirectorySize - ttbcr;
   340 				pdBase=KPageDirectoryBase + ttbcr*4;
   377 					pdBase=iPageDirectoryBase + ttbcr*4;
   341 				r = ttbcr & KPageOffsetMask;
   378 					r = ttbcr & KPageOffsetMask;
       
   379 					}
       
   380 				else
       
   381 					{
       
   382 					pdSize = ttbcr;
       
   383 					pdBase=iPageDirectoryBase + pd * KPageDirectorySize * 4;
       
   384 
       
   385 					TPhysAddr phys=Epoc::LinearToPhysical((TLinAddr)pdBase);				
       
   386 					r = (phys==KPhysAddrInvalid) ? KErrNoPageTable : KErrNone;
       
   387 					}
   342 				}
   388 				}
   343 			else
       
   344 				{
       
   345 				pdSize = ttbcr;
       
   346 				pdBase=KPageDirectoryBase + pd * KPageDirectorySize * 4;
       
   347 
       
   348 				TPhysAddr phys=Epoc::LinearToPhysical((TLinAddr)pdBase);				
       
   349 				r = (phys==KPhysAddrInvalid) ? KErrNoPageTable : KErrNone;
       
   350 				}
       
   351 			
       
   352 #endif  //memmodel
       
   353 
   389 
   354 			if ((r & KErrNoPageTable) == 0)
   390 			if ((r & KErrNoPageTable) == 0)
   355 				{
   391 				{
   356 				kumemput(a1, &pdSize, sizeof(TUint));
   392 				kumemput(a1, &pdSize, sizeof(TUint));
   357 				kumemput(a2, &pdBase, sizeof(TUint));
   393 				kumemput(a2, &pdBase, sizeof(TUint));