Sync with trunk head (part 1 of 2)
[reactos.git] / ntoskrnl / mm / ARM3 / miarm.h
1 /*
2 * PROJECT: ReactOS Kernel
3 * LICENSE: BSD - See COPYING.ARM in the top level directory
4 * FILE: ntoskrnl/mm/ARM3/miarm.h
5 * PURPOSE: ARM Memory Manager Header
6 * PROGRAMMERS: ReactOS Portable Systems Group
7 */
8
9 #define MI_MIN_PAGES_FOR_NONPAGED_POOL_TUNING ((255*1024*1024) >> PAGE_SHIFT)
10 #define MI_MIN_PAGES_FOR_SYSPTE_TUNING ((19*1024*1024) >> PAGE_SHIFT)
11 #define MI_MIN_PAGES_FOR_SYSPTE_BOOST ((32*1024*1024) >> PAGE_SHIFT)
12 #define MI_MAX_INIT_NONPAGED_POOL_SIZE (128 * 1024 * 1024)
13 #define MI_MAX_NONPAGED_POOL_SIZE (128 * 1024 * 1024)
14 #define MI_MAX_FREE_PAGE_LISTS 4
15
16 #define MI_MIN_INIT_PAGED_POOLSIZE (32 * 1024 * 1024)
17
18 #define MI_SESSION_VIEW_SIZE (20 * 1024 * 1024)
19 #define MI_SESSION_POOL_SIZE (16 * 1024 * 1024)
20 #define MI_SESSION_IMAGE_SIZE (8 * 1024 * 1024)
21 #define MI_SESSION_WORKING_SET_SIZE (4 * 1024 * 1024)
22 #define MI_SESSION_SIZE (MI_SESSION_VIEW_SIZE + \
23 MI_SESSION_POOL_SIZE + \
24 MI_SESSION_IMAGE_SIZE + \
25 MI_SESSION_WORKING_SET_SIZE)
26
27 #define MI_SYSTEM_VIEW_SIZE (16 * 1024 * 1024)
28
29 #define MI_SYSTEM_CACHE_WS_START (PVOID)0xC0C00000
30 #define MI_PAGED_POOL_START (PVOID)0xE1000000
31 #define MI_NONPAGED_POOL_END (PVOID)0xFFBE0000
32 #define MI_DEBUG_MAPPING (PVOID)0xFFBFF000
33
34 #define MI_MIN_SECONDARY_COLORS 8
35 #define MI_SECONDARY_COLORS 64
36 #define MI_MAX_SECONDARY_COLORS 1024
37
38 #define MM_HIGHEST_VAD_ADDRESS \
39 (PVOID)((ULONG_PTR)MM_HIGHEST_USER_ADDRESS - (16 * PAGE_SIZE))
40
41 /* Make the code cleaner with some definitions for size multiples */
42 #define _1KB (1024)
43 #define _1MB (1024 * _1KB)
44
45 /* Are mapped by a PDE */
46 #define PDE_MAPPED_VA (PTE_COUNT * PAGE_SIZE)
47
48 /* Size of a PDE directory, and size of a page table */
49 #define PDE_SIZE (PDE_COUNT * sizeof(MMPDE))
50 #define PT_SIZE (PTE_COUNT * sizeof(MMPTE))
51
52 /* Architecture specific count of PDEs in a directory, and count of PTEs in a PT */
53 #ifdef _M_IX86
54 #define PD_COUNT 1
55 #define PDE_COUNT 1024
56 #define PTE_COUNT 1024
57 #elif _M_ARM
58 #define PD_COUNT 1
59 #define PDE_COUNT 4096
60 #define PTE_COUNT 256
61 #else
62 #error Define these please!
63 #endif
64
65 #ifdef _M_IX86
66 #define IMAGE_FILE_MACHINE_NATIVE IMAGE_FILE_MACHINE_I386
67 #elif _M_ARM
68 #define IMAGE_FILE_MACHINE_NATIVE IMAGE_FILE_MACHINE_ARM
69 #elif _M_AMD64
70 #define IMAGE_FILE_MACHINE_NATIVE IMAGE_FILE_MACHINE_AMD64
71 #else
72 #error Define these please!
73 #endif
74
75 //
76 // Protection Bits part of the internal memory manager Protection Mask
77 // Taken from http://www.reactos.org/wiki/Techwiki:Memory_management_in_the_Windows_XP_kernel
78 // and public assertions.
79 //
80 #define MM_ZERO_ACCESS 0
81 #define MM_READONLY 1
82 #define MM_EXECUTE 2
83 #define MM_EXECUTE_READ 3
84 #define MM_READWRITE 4
85 #define MM_WRITECOPY 5
86 #define MM_EXECUTE_READWRITE 6
87 #define MM_EXECUTE_WRITECOPY 7
88 #define MM_NOCACHE 8
89 #define MM_DECOMMIT 0x10
90 #define MM_NOACCESS (MM_DECOMMIT | MM_NOCACHE)
91
92 //
93 // Special values for LoadedImports
94 //
95 #define MM_SYSLDR_NO_IMPORTS (PVOID)0xFFFFFFFE
96 #define MM_SYSLDR_BOOT_LOADED (PVOID)0xFFFFFFFF
97 #define MM_SYSLDR_SINGLE_ENTRY 0x1
98
99 //
100 // PFN List Sentinel
101 //
102 #define LIST_HEAD 0xFFFFFFFF
103
104 //
105 // FIXFIX: These should go in ex.h after the pool merge
106 //
107 #define POOL_LISTS_PER_PAGE (PAGE_SIZE / sizeof(LIST_ENTRY))
108 #define BASE_POOL_TYPE_MASK 1
109 #define POOL_MAX_ALLOC (PAGE_SIZE - (sizeof(POOL_HEADER) + sizeof(LIST_ENTRY)))
110
111 typedef struct _POOL_DESCRIPTOR
112 {
113 POOL_TYPE PoolType;
114 ULONG PoolIndex;
115 ULONG RunningAllocs;
116 ULONG RunningDeAllocs;
117 ULONG TotalPages;
118 ULONG TotalBigPages;
119 ULONG Threshold;
120 PVOID LockAddress;
121 PVOID PendingFrees;
122 LONG PendingFreeDepth;
123 SIZE_T TotalBytes;
124 SIZE_T Spare0;
125 LIST_ENTRY ListHeads[POOL_LISTS_PER_PAGE];
126 } POOL_DESCRIPTOR, *PPOOL_DESCRIPTOR;
127
128 typedef struct _POOL_HEADER
129 {
130 union
131 {
132 struct
133 {
134 USHORT PreviousSize:9;
135 USHORT PoolIndex:7;
136 USHORT BlockSize:9;
137 USHORT PoolType:7;
138 };
139 ULONG Ulong1;
140 };
141 union
142 {
143 ULONG PoolTag;
144 struct
145 {
146 USHORT AllocatorBackTraceIndex;
147 USHORT PoolTagHash;
148 };
149 };
150 } POOL_HEADER, *PPOOL_HEADER;
151
152 //
153 // Everything depends on this
154 //
155 C_ASSERT(sizeof(POOL_HEADER) == 8);
156 C_ASSERT(sizeof(POOL_HEADER) == sizeof(LIST_ENTRY));
157
158 extern ULONG ExpNumberOfPagedPools;
159 extern POOL_DESCRIPTOR NonPagedPoolDescriptor;
160 extern PPOOL_DESCRIPTOR ExpPagedPoolDescriptor[16 + 1];
161 extern PVOID PoolTrackTable;
162
163 //
164 // END FIXFIX
165 //
166
167 typedef struct _MI_LARGE_PAGE_DRIVER_ENTRY
168 {
169 LIST_ENTRY Links;
170 UNICODE_STRING BaseName;
171 } MI_LARGE_PAGE_DRIVER_ENTRY, *PMI_LARGE_PAGE_DRIVER_ENTRY;
172
173 typedef enum _MMSYSTEM_PTE_POOL_TYPE
174 {
175 SystemPteSpace,
176 NonPagedPoolExpansion,
177 MaximumPtePoolTypes
178 } MMSYSTEM_PTE_POOL_TYPE;
179
180 typedef enum _MI_PFN_CACHE_ATTRIBUTE
181 {
182 MiNonCached,
183 MiCached,
184 MiWriteCombined,
185 MiNotMapped
186 } MI_PFN_CACHE_ATTRIBUTE, *PMI_PFN_CACHE_ATTRIBUTE;
187
188 typedef struct _PHYSICAL_MEMORY_RUN
189 {
190 ULONG BasePage;
191 ULONG PageCount;
192 } PHYSICAL_MEMORY_RUN, *PPHYSICAL_MEMORY_RUN;
193
194 typedef struct _PHYSICAL_MEMORY_DESCRIPTOR
195 {
196 ULONG NumberOfRuns;
197 ULONG NumberOfPages;
198 PHYSICAL_MEMORY_RUN Run[1];
199 } PHYSICAL_MEMORY_DESCRIPTOR, *PPHYSICAL_MEMORY_DESCRIPTOR;
200
201 typedef struct _MMCOLOR_TABLES
202 {
203 PFN_NUMBER Flink;
204 PVOID Blink;
205 PFN_NUMBER Count;
206 } MMCOLOR_TABLES, *PMMCOLOR_TABLES;
207
208 typedef struct _MI_LARGE_PAGE_RANGES
209 {
210 PFN_NUMBER StartFrame;
211 PFN_NUMBER LastFrame;
212 } MI_LARGE_PAGE_RANGES, *PMI_LARGE_PAGE_RANGES;
213
214 extern MMPTE HyperTemplatePte;
215 extern MMPTE ValidKernelPde;
216 extern MMPTE ValidKernelPte;
217 extern BOOLEAN MmLargeSystemCache;
218 extern BOOLEAN MmZeroPageFile;
219 extern BOOLEAN MmProtectFreedNonPagedPool;
220 extern BOOLEAN MmTrackLockedPages;
221 extern BOOLEAN MmTrackPtes;
222 extern BOOLEAN MmDynamicPfn;
223 extern BOOLEAN MmMirroring;
224 extern BOOLEAN MmMakeLowMemory;
225 extern BOOLEAN MmEnforceWriteProtection;
226 extern ULONG MmAllocationFragment;
227 extern ULONG MmConsumedPoolPercentage;
228 extern ULONG MmVerifyDriverBufferType;
229 extern ULONG MmVerifyDriverLevel;
230 extern WCHAR MmVerifyDriverBuffer[512];
231 extern WCHAR MmLargePageDriverBuffer[512];
232 extern LIST_ENTRY MiLargePageDriverList;
233 extern BOOLEAN MiLargePageAllDrivers;
234 extern ULONG MmVerifyDriverBufferLength;
235 extern ULONG MmLargePageDriverBufferLength;
236 extern ULONG MmSizeOfNonPagedPoolInBytes;
237 extern ULONG MmMaximumNonPagedPoolInBytes;
238 extern PFN_NUMBER MmMaximumNonPagedPoolInPages;
239 extern PFN_NUMBER MmSizeOfPagedPoolInPages;
240 extern PVOID MmNonPagedSystemStart;
241 extern PVOID MmNonPagedPoolStart;
242 extern PVOID MmNonPagedPoolExpansionStart;
243 extern PVOID MmNonPagedPoolEnd;
244 extern ULONG MmSizeOfPagedPoolInBytes;
245 extern PVOID MmPagedPoolStart;
246 extern PVOID MmPagedPoolEnd;
247 extern PVOID MmSessionBase;
248 extern ULONG MmSessionSize;
249 extern PMMPTE MmFirstReservedMappingPte, MmLastReservedMappingPte;
250 extern PMMPTE MiFirstReservedZeroingPte;
251 extern MI_PFN_CACHE_ATTRIBUTE MiPlatformCacheAttributes[2][MmMaximumCacheType];
252 extern PPHYSICAL_MEMORY_DESCRIPTOR MmPhysicalMemoryBlock;
253 extern ULONG MmBootImageSize;
254 extern PMMPTE MmSystemPtesStart[MaximumPtePoolTypes];
255 extern PMMPTE MmSystemPtesEnd[MaximumPtePoolTypes];
256 extern PMEMORY_ALLOCATION_DESCRIPTOR MxFreeDescriptor;
257 extern MEMORY_ALLOCATION_DESCRIPTOR MxOldFreeDescriptor;
258 extern ULONG MxPfnAllocation;
259 extern MM_PAGED_POOL_INFO MmPagedPoolInfo;
260 extern RTL_BITMAP MiPfnBitMap;
261 extern KGUARDED_MUTEX MmPagedPoolMutex;
262 extern PVOID MmPagedPoolStart;
263 extern PVOID MmPagedPoolEnd;
264 extern PVOID MmNonPagedSystemStart;
265 extern PVOID MiSystemViewStart;
266 extern ULONG MmSystemViewSize;
267 extern PVOID MmSessionBase;
268 extern PVOID MiSessionSpaceEnd;
269 extern ULONG MmSizeOfPagedPoolInBytes;
270 extern PMMPTE MmSystemPagePtes;
271 extern PVOID MmSystemCacheStart;
272 extern PVOID MmSystemCacheEnd;
273 extern MMSUPPORT MmSystemCacheWs;
274 extern SIZE_T MmAllocatedNonPagedPool;
275 extern ULONG_PTR MmSubsectionBase;
276 extern ULONG MmSpecialPoolTag;
277 extern PVOID MmHyperSpaceEnd;
278 extern PMMWSL MmSystemCacheWorkingSetList;
279 extern ULONG MmMinimumNonPagedPoolSize;
280 extern ULONG MmMinAdditionNonPagedPoolPerMb;
281 extern ULONG MmDefaultMaximumNonPagedPool;
282 extern ULONG MmMaxAdditionNonPagedPoolPerMb;
283 extern ULONG MmSecondaryColors;
284 extern ULONG MmSecondaryColorMask;
285 extern ULONG MmNumberOfSystemPtes;
286 extern ULONG MmMaximumNonPagedPoolPercent;
287 extern ULONG MmLargeStackSize;
288 extern PMMCOLOR_TABLES MmFreePagesByColor[FreePageList + 1];
289 extern ULONG MmProductType;
290 extern MM_SYSTEMSIZE MmSystemSize;
291 extern PKEVENT MiLowMemoryEvent;
292 extern PKEVENT MiHighMemoryEvent;
293 extern PKEVENT MiLowPagedPoolEvent;
294 extern PKEVENT MiHighPagedPoolEvent;
295 extern PKEVENT MiLowNonPagedPoolEvent;
296 extern PKEVENT MiHighNonPagedPoolEvent;
297 extern PFN_NUMBER MmLowMemoryThreshold;
298 extern PFN_NUMBER MmHighMemoryThreshold;
299 extern PFN_NUMBER MiLowPagedPoolThreshold;
300 extern PFN_NUMBER MiHighPagedPoolThreshold;
301 extern PFN_NUMBER MiLowNonPagedPoolThreshold;
302 extern PFN_NUMBER MiHighNonPagedPoolThreshold;
303 extern PFN_NUMBER MmMinimumFreePages;
304 extern PFN_NUMBER MmPlentyFreePages;
305 extern PFN_NUMBER MiExpansionPoolPagesInitialCharge;
306 extern PFN_NUMBER MmResidentAvailablePages;
307 extern PFN_NUMBER MmResidentAvailableAtInit;
308 extern ULONG MmTotalFreeSystemPtes[MaximumPtePoolTypes];
309 extern PFN_NUMBER MmTotalSystemDriverPages;
310 extern PVOID MiSessionImageStart;
311 extern PVOID MiSessionImageEnd;
312
313 #define MI_PFN_TO_PFNENTRY(x) (&MmPfnDatabase[1][x])
314 #define MI_PFNENTRY_TO_PFN(x) (x - MmPfnDatabase[1])
315
316 #define MI_IS_SESSION_IMAGE_ADDRESS(Address) \
317 (((Address) >= MiSessionImageStart) && ((Address) < MiSessionImageEnd))
318
319 #define MI_IS_SESSION_ADDRESS(Address) \
320 (((Address) >= MmSessionBase) && ((Address) < MiSessionSpaceEnd))
321
322 FORCEINLINE
323 BOOLEAN
324 MI_IS_PHYSICAL_ADDRESS(IN PVOID Address)
325 {
326 PMMPDE PointerPde;
327
328 /* Large pages are never paged out, always physically resident */
329 PointerPde = MiAddressToPde(Address);
330 return ((PointerPde->u.Hard.LargePage) && (PointerPde->u.Hard.Valid));
331 }
332
333 NTSTATUS
334 NTAPI
335 MmArmInitSystem(
336 IN ULONG Phase,
337 IN PLOADER_PARAMETER_BLOCK LoaderBlock
338 );
339
340 NTSTATUS
341 NTAPI
342 MiInitMachineDependent(
343 IN PLOADER_PARAMETER_BLOCK LoaderBlock
344 );
345
346 VOID
347 NTAPI
348 MiComputeColorInformation(
349 VOID
350 );
351
352 VOID
353 NTAPI
354 MiMapPfnDatabase(
355 IN PLOADER_PARAMETER_BLOCK LoaderBlock
356 );
357
358 VOID
359 NTAPI
360 MiInitializeColorTables(
361 VOID
362 );
363
364 VOID
365 NTAPI
366 MiInitializePfnDatabase(
367 IN PLOADER_PARAMETER_BLOCK LoaderBlock
368 );
369
370 BOOLEAN
371 NTAPI
372 MiInitializeMemoryEvents(
373 VOID
374 );
375
376 PFN_NUMBER
377 NTAPI
378 MxGetNextPage(
379 IN PFN_NUMBER PageCount
380 );
381
382 PPHYSICAL_MEMORY_DESCRIPTOR
383 NTAPI
384 MmInitializeMemoryLimits(
385 IN PLOADER_PARAMETER_BLOCK LoaderBlock,
386 IN PBOOLEAN IncludeType
387 );
388
389 PFN_NUMBER
390 NTAPI
391 MiPagesInLoaderBlock(
392 IN PLOADER_PARAMETER_BLOCK LoaderBlock,
393 IN PBOOLEAN IncludeType
394 );
395
396 VOID
397 FASTCALL
398 MiSyncARM3WithROS(
399 IN PVOID AddressStart,
400 IN PVOID AddressEnd
401 );
402
403 NTSTATUS
404 NTAPI
405 MmArmAccessFault(
406 IN BOOLEAN StoreInstruction,
407 IN PVOID Address,
408 IN KPROCESSOR_MODE Mode,
409 IN PVOID TrapInformation
410 );
411
412 VOID
413 NTAPI
414 MiInitializeNonPagedPool(
415 VOID
416 );
417
418 VOID
419 NTAPI
420 MiInitializeNonPagedPoolThresholds(
421 VOID
422 );
423
424 VOID
425 NTAPI
426 MiInitializePoolEvents(
427 VOID
428 );
429
430 VOID //
431 NTAPI //
432 InitializePool( //
433 IN POOL_TYPE PoolType,// FIXFIX: This should go in ex.h after the pool merge
434 IN ULONG Threshold //
435 ); //
436
437 VOID
438 NTAPI
439 MiInitializeSystemPtes(
440 IN PMMPTE StartingPte,
441 IN ULONG NumberOfPtes,
442 IN MMSYSTEM_PTE_POOL_TYPE PoolType
443 );
444
445 PMMPTE
446 NTAPI
447 MiReserveSystemPtes(
448 IN ULONG NumberOfPtes,
449 IN MMSYSTEM_PTE_POOL_TYPE SystemPtePoolType
450 );
451
452 VOID
453 NTAPI
454 MiReleaseSystemPtes(
455 IN PMMPTE StartingPte,
456 IN ULONG NumberOfPtes,
457 IN MMSYSTEM_PTE_POOL_TYPE SystemPtePoolType
458 );
459
460
461 PFN_NUMBER
462 NTAPI
463 MiFindContiguousPages(
464 IN PFN_NUMBER LowestPfn,
465 IN PFN_NUMBER HighestPfn,
466 IN PFN_NUMBER BoundaryPfn,
467 IN PFN_NUMBER SizeInPages,
468 IN MEMORY_CACHING_TYPE CacheType
469 );
470
471 PVOID
472 NTAPI
473 MiCheckForContiguousMemory(
474 IN PVOID BaseAddress,
475 IN PFN_NUMBER BaseAddressPages,
476 IN PFN_NUMBER SizeInPages,
477 IN PFN_NUMBER LowestPfn,
478 IN PFN_NUMBER HighestPfn,
479 IN PFN_NUMBER BoundaryPfn,
480 IN MI_PFN_CACHE_ATTRIBUTE CacheAttribute
481 );
482
483 PMDL
484 NTAPI
485 MiAllocatePagesForMdl(
486 IN PHYSICAL_ADDRESS LowAddress,
487 IN PHYSICAL_ADDRESS HighAddress,
488 IN PHYSICAL_ADDRESS SkipBytes,
489 IN SIZE_T TotalBytes,
490 IN MI_PFN_CACHE_ATTRIBUTE CacheAttribute,
491 IN ULONG Flags
492 );
493
494 PVOID
495 NTAPI
496 MiMapLockedPagesInUserSpace(
497 IN PMDL Mdl,
498 IN PVOID BaseVa,
499 IN MEMORY_CACHING_TYPE CacheType,
500 IN PVOID BaseAddress
501 );
502
503 VOID
504 NTAPI
505 MiUnmapLockedPagesInUserSpace(
506 IN PVOID BaseAddress,
507 IN PMDL Mdl
508 );
509
510 VOID
511 NTAPI
512 MiInsertInListTail(
513 IN PMMPFNLIST ListHead,
514 IN PMMPFN Entry
515 );
516
517 VOID
518 NTAPI
519 MiInsertZeroListAtBack(
520 IN PFN_NUMBER PageIndex
521 );
522
523 VOID
524 NTAPI
525 MiUnlinkFreeOrZeroedPage(
526 IN PMMPFN Entry
527 );
528
529 PMMPFN
530 NTAPI
531 MiRemoveHeadList(
532 IN PMMPFNLIST ListHead
533 );
534
535
536 VOID
537 NTAPI
538 MiInsertPageInFreeList(
539 IN PFN_NUMBER PageFrameIndex
540 );
541
542 PLDR_DATA_TABLE_ENTRY
543 NTAPI
544 MiLookupDataTableEntry(
545 IN PVOID Address
546 );
547
548 VOID
549 NTAPI
550 MiInitializeDriverLargePageList(
551 VOID
552 );
553
554 VOID
555 NTAPI
556 MiInitializeLargePageSupport(
557 VOID
558 );
559
560 VOID
561 NTAPI
562 MiSyncCachedRanges(
563 VOID
564 );
565
566 /* EOF */