kernel/eka/memmodel/epoc/multiple/arm/xmmu.cpp
changeset 31 56f325a607ea
parent 0 a41df078684a
child 87 2f92ad2dc5db
equal deleted inserted replaced
15:4122176ea935 31:56f325a607ea
   147 	SP_PTE(KArmV6PermRWNO, KArmV6MemAttWBWAWBWA, 0, 1),		// ESharedKernelMirror
   147 	SP_PTE(KArmV6PermRWNO, KArmV6MemAttWBWAWBWA, 0, 1),		// ESharedKernelMirror
   148 	SP_PTE(KArmV6PermRWNO, KArmV6MemAttWBWAWBWA, 0, 1),		// EKernelMessage
   148 	SP_PTE(KArmV6PermRWNO, KArmV6MemAttWBWAWBWA, 0, 1),		// EKernelMessage
   149 #endif
   149 #endif
   150 	};
   150 	};
   151 
   151 
   152 #ifdef __USER_MEMORY_GUARDS_ENABLED__
   152 // The domain for each chunk is selected according to its type.
   153 #define USER_DOMAIN 15
   153 // The RamDrive lives in a separate domain, to minimise the risk
   154 #else
   154 // of accidental access and corruption. User chunks may also be
   155 #define USER_DOMAIN 0
   155 // located in a separate domain (15) in DEBUG builds.
   156 #endif
       
   157 
       
   158 LOCAL_D const TPde ChunkPdePermissions[ENumChunkTypes] =
   156 LOCAL_D const TPde ChunkPdePermissions[ENumChunkTypes] =
   159 	{
   157 	{
   160 	PT_PDE(0),				// EKernelData
   158 	PT_PDE(0),						// EKernelData
   161 	PT_PDE(0),				// EKernelStack
   159 	PT_PDE(0),						// EKernelStack
   162 	PT_PDE(0),				// EKernelCode
   160 	PT_PDE(0),						// EKernelCode
   163 	PT_PDE(0),				// EDll
   161 	PT_PDE(0),						// EDll
   164 	PT_PDE(USER_DOMAIN),	// EUserCode
   162 	PT_PDE(USER_MEMORY_DOMAIN),		// EUserCode
   165 	PT_PDE(1),				// ERamDrive
   163 	PT_PDE(1),						// ERamDrive
   166 	PT_PDE(USER_DOMAIN),	// EUserData
   164 	PT_PDE(USER_MEMORY_DOMAIN),		// EUserData
   167 	PT_PDE(USER_DOMAIN),	// EDllData
   165 	PT_PDE(USER_MEMORY_DOMAIN),		// EDllData
   168 	PT_PDE(USER_DOMAIN),	// EUserSelfModCode
   166 	PT_PDE(USER_MEMORY_DOMAIN),		// EUserSelfModCode
   169 	PT_PDE(USER_DOMAIN),	// ESharedKernelSingle
   167 	PT_PDE(USER_MEMORY_DOMAIN),		// ESharedKernelSingle
   170 	PT_PDE(USER_DOMAIN),	// ESharedKernelMultiple
   168 	PT_PDE(USER_MEMORY_DOMAIN),		// ESharedKernelMultiple
   171 	PT_PDE(0),				// ESharedIo
   169 	PT_PDE(0),						// ESharedIo
   172 	PT_PDE(0),				// ESharedKernelMirror
   170 	PT_PDE(0),						// ESharedKernelMirror
   173 	PT_PDE(0),				// EKernelMessage
   171 	PT_PDE(0),						// EKernelMessage
   174 	};
   172 	};
   175 
   173 
   176 // Inline functions for simple transformations
   174 // Inline functions for simple transformations
   177 inline TLinAddr PageTableLinAddr(TInt aId)
   175 inline TLinAddr PageTableLinAddr(TInt aId)
   178 	{
   176 	{
  2598 	TInt asid = aProcess->iOsAsid;
  2596 	TInt asid = aProcess->iOsAsid;
  2599 	TPde* pd = PageDirectory(asid);
  2597 	TPde* pd = PageDirectory(asid);
  2600 	TPde pde = pd[pdeIndex];
  2598 	TPde pde = pd[pdeIndex];
  2601 	if ((TPhysAddr)(pde&~KPageMask) == AliasRemapOld)
  2599 	if ((TPhysAddr)(pde&~KPageMask) == AliasRemapOld)
  2602 		pde = AliasRemapNew|(pde&KPageMask);
  2600 		pde = AliasRemapNew|(pde&KPageMask);
  2603 	pde = (pde&~(0xf<<5))|(KIPCAliasDomain<<5); // change domain for PDE
  2601 	pde = PDE_IN_DOMAIN(pde, KIPCAliasDomain);
  2604 	TLinAddr aliasAddr = KIPCAlias+(aAddr&(KChunkMask & ~KPageMask));
  2602 	TLinAddr aliasAddr = KIPCAlias+(aAddr&(KChunkMask & ~KPageMask));
  2605 	if(pde==iAliasPde && iAliasLinAddr)
  2603 	if(pde==iAliasPde && iAliasLinAddr)
  2606 		{
  2604 		{
  2607 		// pde already aliased, so just update linear address...
  2605 		// pde already aliased, so just update linear address...
  2608 		iAliasLinAddr = aliasAddr;
  2606 		iAliasLinAddr = aliasAddr;