1 /* 2 * PROJECT: ReactOS Kernel 3 * LICENSE: BSD - See COPYING.ARM in the top level directory 4 * FILE: ntoskrnl/mm/arm/page.c 5 * PURPOSE: Old-school Page Management 6 * PROGRAMMERS: ReactOS Portable Systems Group 7 */ 8 9 /* INCLUDES *******************************************************************/ 10 11 #include <ntoskrnl.h> 12 #define NDEBUG 13 #include <debug.h> 14 15 #define MODULE_INVOLVED_IN_ARM3 16 #include <mm/ARM3/miarm.h> 17 18 /* GLOBALS ********************************************************************/ 19 20 const 21 ULONG 22 MmProtectToPteMask[32] = 23 { 24 // 25 // These are the base MM_ protection flags 26 // 27 0, 28 PTE_READONLY | PTE_ENABLE_CACHE, 29 PTE_EXECUTE | PTE_ENABLE_CACHE, 30 PTE_EXECUTE_READ | PTE_ENABLE_CACHE, 31 PTE_READWRITE | PTE_ENABLE_CACHE, 32 PTE_WRITECOPY | PTE_ENABLE_CACHE, 33 PTE_EXECUTE_READWRITE | PTE_ENABLE_CACHE, 34 PTE_EXECUTE_WRITECOPY | PTE_ENABLE_CACHE, 35 // 36 // These OR in the MM_NOCACHE flag 37 // 38 0, 39 PTE_READONLY | PTE_DISABLE_CACHE, 40 PTE_EXECUTE | PTE_DISABLE_CACHE, 41 PTE_EXECUTE_READ | PTE_DISABLE_CACHE, 42 PTE_READWRITE | PTE_DISABLE_CACHE, 43 PTE_WRITECOPY | PTE_DISABLE_CACHE, 44 PTE_EXECUTE_READWRITE | PTE_DISABLE_CACHE, 45 PTE_EXECUTE_WRITECOPY | PTE_DISABLE_CACHE, 46 // 47 // These OR in the MM_DECOMMIT flag, which doesn't seem supported on x86/64/ARM 48 // 49 0, 50 PTE_READONLY | PTE_ENABLE_CACHE, 51 PTE_EXECUTE | PTE_ENABLE_CACHE, 52 PTE_EXECUTE_READ | PTE_ENABLE_CACHE, 53 PTE_READWRITE | PTE_ENABLE_CACHE, 54 PTE_WRITECOPY | PTE_ENABLE_CACHE, 55 PTE_EXECUTE_READWRITE | PTE_ENABLE_CACHE, 56 PTE_EXECUTE_WRITECOPY | PTE_ENABLE_CACHE, 57 // 58 // These OR in the MM_NOACCESS flag, which seems to enable WriteCombining? 59 // 60 0, 61 PTE_READONLY | PTE_WRITECOMBINED_CACHE, 62 PTE_EXECUTE | PTE_WRITECOMBINED_CACHE, 63 PTE_EXECUTE_READ | PTE_WRITECOMBINED_CACHE, 64 PTE_READWRITE | PTE_WRITECOMBINED_CACHE, 65 PTE_WRITECOPY | PTE_WRITECOMBINED_CACHE, 66 PTE_EXECUTE_READWRITE | PTE_WRITECOMBINED_CACHE, 67 PTE_EXECUTE_WRITECOPY | PTE_WRITECOMBINED_CACHE, 68 }; 69 70 const 71 ULONG MmProtectToValue[32] = 72 { 73 PAGE_NOACCESS, 74 PAGE_READONLY, 75 PAGE_EXECUTE, 76 PAGE_EXECUTE_READ, 77 PAGE_READWRITE, 78 PAGE_WRITECOPY, 79 PAGE_EXECUTE_READWRITE, 80 PAGE_EXECUTE_WRITECOPY, 81 PAGE_NOACCESS, 82 PAGE_NOCACHE | PAGE_READONLY, 83 PAGE_NOCACHE | PAGE_EXECUTE, 84 PAGE_NOCACHE | PAGE_EXECUTE_READ, 85 PAGE_NOCACHE | PAGE_READWRITE, 86 PAGE_NOCACHE | PAGE_WRITECOPY, 87 PAGE_NOCACHE | PAGE_EXECUTE_READWRITE, 88 PAGE_NOCACHE | PAGE_EXECUTE_WRITECOPY, 89 PAGE_NOACCESS, 90 PAGE_GUARD | PAGE_READONLY, 91 PAGE_GUARD | PAGE_EXECUTE, 92 PAGE_GUARD | PAGE_EXECUTE_READ, 93 PAGE_GUARD | PAGE_READWRITE, 94 PAGE_GUARD | PAGE_WRITECOPY, 95 PAGE_GUARD | PAGE_EXECUTE_READWRITE, 96 PAGE_GUARD | PAGE_EXECUTE_WRITECOPY, 97 PAGE_NOACCESS, 98 PAGE_WRITECOMBINE | PAGE_READONLY, 99 PAGE_WRITECOMBINE | PAGE_EXECUTE, 100 PAGE_WRITECOMBINE | PAGE_EXECUTE_READ, 101 PAGE_WRITECOMBINE | PAGE_READWRITE, 102 PAGE_WRITECOMBINE | PAGE_WRITECOPY, 103 PAGE_WRITECOMBINE | PAGE_EXECUTE_READWRITE, 104 PAGE_WRITECOMBINE | PAGE_EXECUTE_WRITECOPY 105 }; 106 107 ULONG MmGlobalKernelPageDirectory[4096]; 108 109 /* Template PTE and PDE for a kernel page */ 110 MMPDE ValidKernelPde = {.u.Hard.Valid = 1}; 111 MMPTE ValidKernelPte = {.u.Hard.Valid = 1, .u.Hard.Sbo = 1}; 112 113 /* Template PDE for a demand-zero page */ 114 MMPDE DemandZeroPde = {.u.Long = (MM_READWRITE << MM_PTE_SOFTWARE_PROTECTION_BITS)}; 115 MMPTE DemandZeroPte = {.u.Long = (MM_READWRITE << MM_PTE_SOFTWARE_PROTECTION_BITS)}; 116 117 /* Template PTE for prototype page */ 118 MMPTE PrototypePte = {.u.Long = (MM_READWRITE << MM_PTE_SOFTWARE_PROTECTION_BITS) | PTE_PROTOTYPE | (MI_PTE_LOOKUP_NEEDED << PAGE_SHIFT)}; 119 120 MMPTE ValidKernelPteLocal = {{0}}; 121 MMPDE ValidKernelPdeLocal = {{0}}; 122 MMPTE MmDecommittedPte = {{0}}; 123 124 /* PRIVATE FUNCTIONS **********************************************************/ 125 126 VOID 127 NTAPI 128 MiFlushTlb(IN PMMPTE PointerPte, 129 IN PVOID Address) 130 { 131 UNIMPLEMENTED_DBGBREAK(); 132 } 133 134 BOOLEAN 135 NTAPI 136 MmCreateProcessAddressSpace(IN ULONG MinWs, 137 IN PEPROCESS Process, 138 IN PULONG DirectoryTableBase) 139 { 140 UNIMPLEMENTED_DBGBREAK(); 141 return FALSE; 142 } 143 144 NTSTATUS 145 NTAPI 146 MmCreateVirtualMappingUnsafe(IN PEPROCESS Process, 147 IN PVOID Address, 148 IN ULONG Protection, 149 IN PPFN_NUMBER Pages, 150 IN ULONG PageCount) 151 { 152 UNIMPLEMENTED_DBGBREAK(); 153 return STATUS_SUCCESS; 154 } 155 156 NTSTATUS 157 NTAPI 158 MmCreateVirtualMapping(IN PEPROCESS Process, 159 IN PVOID Address, 160 IN ULONG Protection, 161 IN PPFN_NUMBER Pages, 162 IN ULONG PageCount) 163 { 164 UNIMPLEMENTED_DBGBREAK(); 165 return STATUS_SUCCESS; 166 } 167 168 VOID 169 NTAPI 170 MmRawDeleteVirtualMapping(IN PVOID Address) 171 { 172 UNIMPLEMENTED_DBGBREAK(); 173 } 174 175 VOID 176 NTAPI 177 MmDeleteVirtualMapping(IN PEPROCESS Process, 178 IN PVOID Address, 179 OUT PBOOLEAN WasDirty, 180 OUT PPFN_NUMBER Page) 181 { 182 UNIMPLEMENTED_DBGBREAK(); 183 } 184 185 VOID 186 NTAPI 187 MmDeletePageFileMapping(IN PEPROCESS Process, 188 IN PVOID Address, 189 IN SWAPENTRY *SwapEntry) 190 { 191 UNIMPLEMENTED_DBGBREAK(); 192 } 193 194 NTSTATUS 195 NTAPI 196 MmCreatePageFileMapping(IN PEPROCESS Process, 197 IN PVOID Address, 198 IN SWAPENTRY SwapEntry) 199 { 200 UNIMPLEMENTED_DBGBREAK(); 201 return STATUS_NOT_IMPLEMENTED; 202 } 203 204 PFN_NUMBER 205 NTAPI 206 MmGetPfnForProcess(IN PEPROCESS Process, 207 IN PVOID Address) 208 { 209 UNIMPLEMENTED_DBGBREAK(); 210 return 0; 211 } 212 213 BOOLEAN 214 NTAPI 215 MmIsDirtyPage(IN PEPROCESS Process, 216 IN PVOID Address) 217 { 218 UNIMPLEMENTED_DBGBREAK(); 219 return FALSE; 220 } 221 222 VOID 223 NTAPI 224 MmSetCleanPage(IN PEPROCESS Process, 225 IN PVOID Address) 226 { 227 UNIMPLEMENTED_DBGBREAK(); 228 } 229 230 VOID 231 NTAPI 232 MmSetDirtyPage(IN PEPROCESS Process, 233 IN PVOID Address) 234 { 235 UNIMPLEMENTED_DBGBREAK(); 236 } 237 238 BOOLEAN 239 NTAPI 240 MmIsPagePresent(IN PEPROCESS Process, 241 IN PVOID Address) 242 { 243 UNIMPLEMENTED_DBGBREAK(); 244 return FALSE; 245 } 246 247 BOOLEAN 248 NTAPI 249 MmIsPageSwapEntry(IN PEPROCESS Process, 250 IN PVOID Address) 251 { 252 UNIMPLEMENTED_DBGBREAK(); 253 return FALSE; 254 } 255 256 ULONG 257 NTAPI 258 MmGetPageProtect(IN PEPROCESS Process, 259 IN PVOID Address) 260 { 261 /* We don't enforce any protection on the pages -- they are all RWX */ 262 return PAGE_READWRITE; 263 } 264 265 VOID 266 NTAPI 267 MmSetPageProtect(IN PEPROCESS Process, 268 IN PVOID Address, 269 IN ULONG Protection) 270 { 271 /* We don't enforce any protection on the pages -- they are all RWX */ 272 return; 273 } 274 275 VOID 276 NTAPI 277 MmInitGlobalKernelPageDirectory(VOID) 278 { 279 ULONG i; 280 PULONG CurrentPageDirectory = (PULONG)PDE_BASE; 281 282 /* Loop the 2GB of address space which belong to the kernel */ 283 for (i = MiGetPdeOffset(MmSystemRangeStart); i < 2048; i++) 284 { 285 /* Check if we have an entry for this already */ 286 if ((i != MiGetPdeOffset(PTE_BASE)) && 287 (i != MiGetPdeOffset(HYPER_SPACE)) && 288 (!MmGlobalKernelPageDirectory[i]) && 289 (CurrentPageDirectory[i])) 290 { 291 /* We don't, link it in our global page directory */ 292 MmGlobalKernelPageDirectory[i] = CurrentPageDirectory[i]; 293 } 294 } 295 } 296 297 VOID 298 NTAPI 299 MmGetPageFileMapping( 300 PEPROCESS Process, 301 PVOID Address, 302 SWAPENTRY* SwapEntry) 303 { 304 ASSERT(FALSE); 305 } 306 307 BOOLEAN 308 NTAPI 309 MmIsDisabledPage(PEPROCESS Process, PVOID Address) 310 { 311 ASSERT(FALSE); 312 return FALSE; 313 } 314 315 CODE_SEG("INIT") 316 VOID 317 NTAPI 318 MiInitializeSessionSpaceLayout(VOID) 319 { 320 ASSERT(FALSE); 321 } 322 323