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; |