Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenpage.c
Go to the documentation of this file.
00001 /* 00002 * PROJECT: ReactOS Kernel 00003 * LICENSE: BSD - See COPYING.ARM in the top level directory 00004 * FILE: ntoskrnl/mm/arm/page.c 00005 * PURPOSE: Old-school Page Management 00006 * PROGRAMMERS: ReactOS Portable Systems Group 00007 */ 00008 00009 /* INCLUDES *******************************************************************/ 00010 00011 #include <ntoskrnl.h> 00012 #define NDEBUG 00013 #include <debug.h> 00014 00015 #define MODULE_INVOLVED_IN_ARM3 00016 #include "../ARM3/miarm.h" 00017 00018 /* GLOBALS ********************************************************************/ 00019 00020 const 00021 ULONG 00022 MmProtectToPteMask[32] = 00023 { 00024 // 00025 // These are the base MM_ protection flags 00026 // 00027 0, 00028 PTE_READONLY | PTE_ENABLE_CACHE, 00029 PTE_EXECUTE | PTE_ENABLE_CACHE, 00030 PTE_EXECUTE_READ | PTE_ENABLE_CACHE, 00031 PTE_READWRITE | PTE_ENABLE_CACHE, 00032 PTE_WRITECOPY | PTE_ENABLE_CACHE, 00033 PTE_EXECUTE_READWRITE | PTE_ENABLE_CACHE, 00034 PTE_EXECUTE_WRITECOPY | PTE_ENABLE_CACHE, 00035 // 00036 // These OR in the MM_NOCACHE flag 00037 // 00038 0, 00039 PTE_READONLY | PTE_DISABLE_CACHE, 00040 PTE_EXECUTE | PTE_DISABLE_CACHE, 00041 PTE_EXECUTE_READ | PTE_DISABLE_CACHE, 00042 PTE_READWRITE | PTE_DISABLE_CACHE, 00043 PTE_WRITECOPY | PTE_DISABLE_CACHE, 00044 PTE_EXECUTE_READWRITE | PTE_DISABLE_CACHE, 00045 PTE_EXECUTE_WRITECOPY | PTE_DISABLE_CACHE, 00046 // 00047 // These OR in the MM_DECOMMIT flag, which doesn't seem supported on x86/64/ARM 00048 // 00049 0, 00050 PTE_READONLY | PTE_ENABLE_CACHE, 00051 PTE_EXECUTE | PTE_ENABLE_CACHE, 00052 PTE_EXECUTE_READ | PTE_ENABLE_CACHE, 00053 PTE_READWRITE | PTE_ENABLE_CACHE, 00054 PTE_WRITECOPY | PTE_ENABLE_CACHE, 00055 PTE_EXECUTE_READWRITE | PTE_ENABLE_CACHE, 00056 PTE_EXECUTE_WRITECOPY | PTE_ENABLE_CACHE, 00057 // 00058 // These OR in the MM_NOACCESS flag, which seems to enable WriteCombining? 00059 // 00060 0, 00061 PTE_READONLY | PTE_WRITECOMBINED_CACHE, 00062 PTE_EXECUTE | PTE_WRITECOMBINED_CACHE, 00063 PTE_EXECUTE_READ | PTE_WRITECOMBINED_CACHE, 00064 PTE_READWRITE | PTE_WRITECOMBINED_CACHE, 00065 PTE_WRITECOPY | PTE_WRITECOMBINED_CACHE, 00066 PTE_EXECUTE_READWRITE | PTE_WRITECOMBINED_CACHE, 00067 PTE_EXECUTE_WRITECOPY | PTE_WRITECOMBINED_CACHE, 00068 }; 00069 00070 const 00071 ULONG MmProtectToValue[32] = 00072 { 00073 PAGE_NOACCESS, 00074 PAGE_READONLY, 00075 PAGE_EXECUTE, 00076 PAGE_EXECUTE_READ, 00077 PAGE_READWRITE, 00078 PAGE_WRITECOPY, 00079 PAGE_EXECUTE_READWRITE, 00080 PAGE_EXECUTE_WRITECOPY, 00081 PAGE_NOACCESS, 00082 PAGE_NOCACHE | PAGE_READONLY, 00083 PAGE_NOCACHE | PAGE_EXECUTE, 00084 PAGE_NOCACHE | PAGE_EXECUTE_READ, 00085 PAGE_NOCACHE | PAGE_READWRITE, 00086 PAGE_NOCACHE | PAGE_WRITECOPY, 00087 PAGE_NOCACHE | PAGE_EXECUTE_READWRITE, 00088 PAGE_NOCACHE | PAGE_EXECUTE_WRITECOPY, 00089 PAGE_NOACCESS, 00090 PAGE_GUARD | PAGE_READONLY, 00091 PAGE_GUARD | PAGE_EXECUTE, 00092 PAGE_GUARD | PAGE_EXECUTE_READ, 00093 PAGE_GUARD | PAGE_READWRITE, 00094 PAGE_GUARD | PAGE_WRITECOPY, 00095 PAGE_GUARD | PAGE_EXECUTE_READWRITE, 00096 PAGE_GUARD | PAGE_EXECUTE_WRITECOPY, 00097 PAGE_NOACCESS, 00098 PAGE_WRITECOMBINE | PAGE_READONLY, 00099 PAGE_WRITECOMBINE | PAGE_EXECUTE, 00100 PAGE_WRITECOMBINE | PAGE_EXECUTE_READ, 00101 PAGE_WRITECOMBINE | PAGE_READWRITE, 00102 PAGE_WRITECOMBINE | PAGE_WRITECOPY, 00103 PAGE_WRITECOMBINE | PAGE_EXECUTE_READWRITE, 00104 PAGE_WRITECOMBINE | PAGE_EXECUTE_WRITECOPY 00105 }; 00106 00107 ULONG MmGlobalKernelPageDirectory[4096]; 00108 00109 /* Template PTE and PDE for a kernel page */ 00110 MMPDE ValidKernelPde = {.u.Hard.Valid = 1}; 00111 MMPTE ValidKernelPte = {.u.Hard.Valid = 1, .u.Hard.Sbo = 1}; 00112 00113 /* Template PDE for a demand-zero page */ 00114 MMPDE DemandZeroPde = {.u.Long = (MM_READWRITE << MM_PTE_SOFTWARE_PROTECTION_BITS)}; 00115 MMPTE DemandZeroPte = {.u.Long = (MM_READWRITE << MM_PTE_SOFTWARE_PROTECTION_BITS)}; 00116 00117 /* Template PTE for prototype page */ 00118 MMPTE PrototypePte = {.u.Long = (MM_READWRITE << MM_PTE_SOFTWARE_PROTECTION_BITS) | PTE_PROTOTYPE | (MI_PTE_LOOKUP_NEEDED << PAGE_SHIFT)}; 00119 00120 /* PRIVATE FUNCTIONS **********************************************************/ 00121 00122 VOID 00123 NTAPI 00124 MiFlushTlb(IN PMMPTE PointerPte, 00125 IN PVOID Address) 00126 { 00127 UNIMPLEMENTED; 00128 while (TRUE); 00129 } 00130 00131 BOOLEAN 00132 NTAPI 00133 MmCreateProcessAddressSpace(IN ULONG MinWs, 00134 IN PEPROCESS Process, 00135 IN PULONG DirectoryTableBase) 00136 { 00137 UNIMPLEMENTED; 00138 while (TRUE); 00139 return FALSE; 00140 } 00141 00142 VOID 00143 NTAPI 00144 MmUpdatePageDir(IN PEPROCESS Process, 00145 IN PVOID Address, 00146 IN ULONG Size) 00147 { 00148 /* Nothing to do */ 00149 return; 00150 } 00151 00152 PULONG 00153 NTAPI 00154 MmGetPageDirectory(VOID) 00155 { 00156 /* Return the TTB */ 00157 return (PULONG)KeArmTranslationTableRegisterGet().AsUlong; 00158 } 00159 00160 VOID 00161 NTAPI 00162 MmDisableVirtualMapping(IN PEPROCESS Process, 00163 IN PVOID Address, 00164 OUT PBOOLEAN WasDirty, 00165 OUT PPFN_NUMBER Page) 00166 { 00167 UNIMPLEMENTED; 00168 while (TRUE); 00169 } 00170 00171 VOID 00172 NTAPI 00173 MmEnableVirtualMapping(IN PEPROCESS Process, 00174 IN PVOID Address) 00175 { 00176 UNIMPLEMENTED; 00177 while (TRUE); 00178 } 00179 00180 NTSTATUS 00181 NTAPI 00182 MmCreateVirtualMappingUnsafe(IN PEPROCESS Process, 00183 IN PVOID Address, 00184 IN ULONG Protection, 00185 IN PPFN_NUMBER Pages, 00186 IN ULONG PageCount) 00187 { 00188 UNIMPLEMENTED; 00189 while (TRUE); 00190 return STATUS_SUCCESS; 00191 } 00192 00193 NTSTATUS 00194 NTAPI 00195 MmCreateVirtualMapping(IN PEPROCESS Process, 00196 IN PVOID Address, 00197 IN ULONG Protection, 00198 IN PPFN_NUMBER Pages, 00199 IN ULONG PageCount) 00200 { 00201 UNIMPLEMENTED; 00202 while (TRUE); 00203 return STATUS_SUCCESS; 00204 } 00205 00206 VOID 00207 NTAPI 00208 MmRawDeleteVirtualMapping(IN PVOID Address) 00209 { 00210 UNIMPLEMENTED; 00211 while (TRUE); 00212 } 00213 00214 VOID 00215 NTAPI 00216 MmDeleteVirtualMapping(IN PEPROCESS Process, 00217 IN PVOID Address, 00218 IN BOOLEAN FreePage, 00219 OUT PBOOLEAN WasDirty, 00220 OUT PPFN_NUMBER Page) 00221 { 00222 UNIMPLEMENTED; 00223 while (TRUE); 00224 } 00225 00226 VOID 00227 NTAPI 00228 MmDeletePageFileMapping(IN PEPROCESS Process, 00229 IN PVOID Address, 00230 IN SWAPENTRY *SwapEntry) 00231 { 00232 UNIMPLEMENTED; 00233 while (TRUE); 00234 } 00235 00236 NTSTATUS 00237 NTAPI 00238 MmCreatePageFileMapping(IN PEPROCESS Process, 00239 IN PVOID Address, 00240 IN SWAPENTRY SwapEntry) 00241 { 00242 UNIMPLEMENTED; 00243 while (TRUE); 00244 return 0; 00245 } 00246 00247 PFN_NUMBER 00248 NTAPI 00249 MmGetPfnForProcess(IN PEPROCESS Process, 00250 IN PVOID Address) 00251 { 00252 UNIMPLEMENTED; 00253 while (TRUE); 00254 return 0; 00255 } 00256 00257 BOOLEAN 00258 NTAPI 00259 MmIsDirtyPage(IN PEPROCESS Process, 00260 IN PVOID Address) 00261 { 00262 UNIMPLEMENTED; 00263 while (TRUE); 00264 return 0; 00265 } 00266 00267 VOID 00268 NTAPI 00269 MmSetCleanPage(IN PEPROCESS Process, 00270 IN PVOID Address) 00271 { 00272 UNIMPLEMENTED; 00273 while (TRUE); 00274 } 00275 00276 VOID 00277 NTAPI 00278 MmSetDirtyPage(IN PEPROCESS Process, 00279 IN PVOID Address) 00280 { 00281 UNIMPLEMENTED; 00282 while (TRUE); 00283 } 00284 00285 BOOLEAN 00286 NTAPI 00287 MmIsPagePresent(IN PEPROCESS Process, 00288 IN PVOID Address) 00289 { 00290 UNIMPLEMENTED; 00291 while (TRUE); 00292 return FALSE; 00293 } 00294 00295 BOOLEAN 00296 NTAPI 00297 MmIsPageSwapEntry(IN PEPROCESS Process, 00298 IN PVOID Address) 00299 { 00300 UNIMPLEMENTED; 00301 while (TRUE); 00302 return FALSE; 00303 } 00304 00305 ULONG 00306 NTAPI 00307 MmGetPageProtect(IN PEPROCESS Process, 00308 IN PVOID Address) 00309 { 00310 /* We don't enforce any protection on the pages -- they are all RWX */ 00311 return PAGE_READWRITE; 00312 } 00313 00314 VOID 00315 NTAPI 00316 MmSetPageProtect(IN PEPROCESS Process, 00317 IN PVOID Address, 00318 IN ULONG Protection) 00319 { 00320 /* We don't enforce any protection on the pages -- they are all RWX */ 00321 return; 00322 } 00323 00324 VOID 00325 NTAPI 00326 MmInitGlobalKernelPageDirectory(VOID) 00327 { 00328 ULONG i; 00329 PULONG CurrentPageDirectory = (PULONG)PDE_BASE; 00330 00331 00332 /* Loop the 2GB of address space which belong to the kernel */ 00333 for (i = MiGetPdeOffset(MmSystemRangeStart); i < 2048; i++) 00334 { 00335 /* Check if we have an entry for this already */ 00336 if ((i != MiGetPdeOffset(PTE_BASE)) && 00337 (i != MiGetPdeOffset(HYPER_SPACE)) && 00338 (!MmGlobalKernelPageDirectory[i]) && 00339 (CurrentPageDirectory[i])) 00340 { 00341 /* We don't, link it in our global page directory */ 00342 MmGlobalKernelPageDirectory[i] = CurrentPageDirectory[i]; 00343 } 00344 } 00345 } 00346 00347 /* PUBLIC FUNCTIONS ***********************************************************/ 00348 00349 /* 00350 * @implemented 00351 */ 00352 PHYSICAL_ADDRESS 00353 NTAPI 00354 MmGetPhysicalAddress(IN PVOID Address) 00355 { 00356 PHYSICAL_ADDRESS PhysicalAddress; 00357 PhysicalAddress.QuadPart = 0; 00358 00359 UNIMPLEMENTED; 00360 while (TRUE); 00361 00362 return PhysicalAddress; 00363 } Generated on Sun May 27 2012 04:27:04 for ReactOS by
1.7.6.1
|