Merge trunk head (46467)
[reactos.git] / reactos / 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 #ifndef _M_AMD64
10
11 #define MI_MIN_PAGES_FOR_NONPAGED_POOL_TUNING ((255*1024*1024) >> PAGE_SHIFT)
12 #define MI_MIN_PAGES_FOR_SYSPTE_TUNING ((19*1024*1024) >> PAGE_SHIFT)
13 #define MI_MIN_PAGES_FOR_SYSPTE_BOOST ((32*1024*1024) >> PAGE_SHIFT)
14 #define MI_MAX_INIT_NONPAGED_POOL_SIZE (128 * 1024 * 1024)
15 #define MI_MAX_NONPAGED_POOL_SIZE (128 * 1024 * 1024)
16 #define MI_MAX_FREE_PAGE_LISTS 4
17
18 #define MI_MIN_INIT_PAGED_POOLSIZE (32 * 1024 * 1024)
19
20 #define MI_SESSION_VIEW_SIZE (20 * 1024 * 1024)
21 #define MI_SESSION_POOL_SIZE (16 * 1024 * 1024)
22 #define MI_SESSION_IMAGE_SIZE (8 * 1024 * 1024)
23 #define MI_SESSION_WORKING_SET_SIZE (4 * 1024 * 1024)
24 #define MI_SESSION_SIZE (MI_SESSION_VIEW_SIZE + \
25 MI_SESSION_POOL_SIZE + \
26 MI_SESSION_IMAGE_SIZE + \
27 MI_SESSION_WORKING_SET_SIZE)
28
29 #define MI_SYSTEM_VIEW_SIZE (16 * 1024 * 1024)
30
31 #define MI_SYSTEM_CACHE_WS_START (PVOID)0xC0C00000
32 #define MI_PAGED_POOL_START (PVOID)0xE1000000
33 #define MI_NONPAGED_POOL_END (PVOID)0xFFBE0000
34 #define MI_DEBUG_MAPPING (PVOID)0xFFBFF000
35
36 #endif /* !_M_AMD64 */
37
38 #define MI_MIN_SECONDARY_COLORS 8
39 #define MI_SECONDARY_COLORS 64
40 #define MI_MAX_SECONDARY_COLORS 1024
41
42 #define MM_HIGHEST_VAD_ADDRESS \
43 (PVOID)((ULONG_PTR)MM_HIGHEST_USER_ADDRESS - (16 * PAGE_SIZE))
44
45 /* Make the code cleaner with some definitions for size multiples */
46 #define _1KB (1024)
47 #define _1MB (1024 * _1KB)
48
49 /* Size of a page directory, and size of a page table */
50 #define PD_SIZE (PDE_COUNT * sizeof(MMPDE))
51 #define PT_SIZE (PTE_COUNT * sizeof(MMPTE))
52
53 /* Architecture specific count of PDEs in a directory, and count of PTEs in a PT */
54 #ifdef _M_IX86
55 #define PD_COUNT 1
56 #define PDE_COUNT 1024
57 #define PTE_COUNT 1024
58 #elif defined(_M_AMD64)
59 #define PD_COUNT (512 * 512)
60 #define PDE_COUNT 512
61 #define PTE_COUNT 512
62 #elif defined(_M_ARM)
63 #define PD_COUNT 1
64 #define PDE_COUNT 4096
65 #define PTE_COUNT 256
66 #else
67 #error Define these please!
68 #endif
69
70 //
71 // PFN List Sentinel
72 //
73 #define LIST_HEAD 0xFFFFFFFF
74
75 //
76 // FIXFIX: These should go in ex.h after the pool merge
77 //
78 #define POOL_LISTS_PER_PAGE (PAGE_SIZE / sizeof(LIST_ENTRY))
79 #define BASE_POOL_TYPE_MASK 1
80 #define POOL_MAX_ALLOC (PAGE_SIZE - (sizeof(POOL_HEADER) + sizeof(LIST_ENTRY)))
81
82 typedef struct _POOL_DESCRIPTOR
83 {
84 POOL_TYPE PoolType;
85 ULONG PoolIndex;
86 ULONG RunningAllocs;
87 ULONG RunningDeAllocs;
88 ULONG TotalPages;
89 ULONG TotalBigPages;
90 ULONG Threshold;
91 PVOID LockAddress;
92 PVOID PendingFrees;
93 LONG PendingFreeDepth;
94 SIZE_T TotalBytes;
95 SIZE_T Spare0;
96 LIST_ENTRY ListHeads[POOL_LISTS_PER_PAGE];
97 } POOL_DESCRIPTOR, *PPOOL_DESCRIPTOR;
98
99 #ifndef _WIN64
100 typedef struct _POOL_HEADER
101 {
102 union
103 {
104 struct
105 {
106 USHORT PreviousSize:9;
107 USHORT PoolIndex:7;
108 USHORT BlockSize:9;
109 USHORT PoolType:7;
110 };
111 ULONG Ulong1;
112 };
113 union
114 {
115 ULONG PoolTag;
116 struct
117 {
118 USHORT AllocatorBackTraceIndex;
119 USHORT PoolTagHash;
120 };
121 };
122 } POOL_HEADER, *PPOOL_HEADER;
123 #else
124 typedef struct _POOL_HEADER
125 {
126 union
127 {
128 struct
129 {
130 ULONG PreviousSize : 8;
131 ULONG PoolIndex : 8;
132 ULONG BlockSize : 8;
133 ULONG PoolType : 8;
134 };
135 ULONG Ulong1;
136 };
137 ULONG PoolTag;
138 union
139 {
140 PEPROCESS* ProcessBilled;
141 struct
142 {
143 USHORT AllocatorBackTraceIndex;
144 USHORT PoolTagHash;
145 };
146 };
147 } POOL_HEADER, *PPOOL_HEADER;
148 #endif
149
150 //
151 // Everything depends on this
152 //
153 C_ASSERT(sizeof(POOL_HEADER) == sizeof(LIST_ENTRY));
154
155 extern ULONG ExpNumberOfPagedPools;
156 extern POOL_DESCRIPTOR NonPagedPoolDescriptor;
157 extern PPOOL_DESCRIPTOR ExpPagedPoolDescriptor[16 + 1];
158 extern PVOID PoolTrackTable;
159
160 //
161 // END FIXFIX
162 //
163
164 typedef enum _MMSYSTEM_PTE_POOL_TYPE
165 {
166 SystemPteSpace,
167 NonPagedPoolExpansion,
168 MaximumPtePoolTypes
169 } MMSYSTEM_PTE_POOL_TYPE;
170
171 typedef enum _MI_PFN_CACHE_ATTRIBUTE
172 {
173 MiNonCached,
174 MiCached,
175 MiWriteCombined,
176 MiNotMapped
177 } MI_PFN_CACHE_ATTRIBUTE, *PMI_PFN_CACHE_ATTRIBUTE;
178
179 typedef struct _PHYSICAL_MEMORY_RUN
180 {
181 ULONG BasePage;
182 ULONG PageCount;
183 } PHYSICAL_MEMORY_RUN, *PPHYSICAL_MEMORY_RUN;
184
185 typedef struct _PHYSICAL_MEMORY_DESCRIPTOR
186 {
187 ULONG NumberOfRuns;
188 ULONG NumberOfPages;
189 PHYSICAL_MEMORY_RUN Run[1];
190 } PHYSICAL_MEMORY_DESCRIPTOR, *PPHYSICAL_MEMORY_DESCRIPTOR;
191
192 typedef struct _MMCOLOR_TABLES
193 {
194 PFN_NUMBER Flink;
195 PVOID Blink;
196 PFN_NUMBER Count;
197 } MMCOLOR_TABLES, *PMMCOLOR_TABLES;
198
199 extern MMPTE HyperTemplatePte;
200 extern MMPTE ValidKernelPde;
201 extern MMPTE ValidKernelPte;
202
203 extern SIZE_T MmSizeOfNonPagedPoolInBytes;
204 extern SIZE_T MmMaximumNonPagedPoolInBytes;
205 extern PFN_NUMBER MmMaximumNonPagedPoolInPages;
206 extern PFN_NUMBER MmSizeOfPagedPoolInPages;
207 extern PVOID MmNonPagedSystemStart;
208 extern PVOID MmNonPagedPoolStart;
209 extern PVOID MmNonPagedPoolExpansionStart;
210 extern PVOID MmNonPagedPoolEnd;
211 extern SIZE_T MmSizeOfPagedPoolInBytes;
212 extern PVOID MmPagedPoolStart;
213 extern PVOID MmPagedPoolEnd;
214 extern PVOID MmSessionBase;
215 extern SIZE_T MmSessionSize;
216 extern PMMPTE MmFirstReservedMappingPte, MmLastReservedMappingPte;
217 extern PMMPTE MiFirstReservedZeroingPte;
218 extern MI_PFN_CACHE_ATTRIBUTE MiPlatformCacheAttributes[2][MmMaximumCacheType];
219 extern PPHYSICAL_MEMORY_DESCRIPTOR MmPhysicalMemoryBlock;
220 extern SIZE_T MmBootImageSize;
221 extern PMMPTE MmSystemPtesStart[MaximumPtePoolTypes];
222 extern PMMPTE MmSystemPtesEnd[MaximumPtePoolTypes];
223 extern PMEMORY_ALLOCATION_DESCRIPTOR MxFreeDescriptor;
224 extern MEMORY_ALLOCATION_DESCRIPTOR MxOldFreeDescriptor;
225 extern ULONG_PTR MxPfnAllocation;
226 extern MM_PAGED_POOL_INFO MmPagedPoolInfo;
227 extern RTL_BITMAP MiPfnBitMap;
228 extern KGUARDED_MUTEX MmPagedPoolMutex;
229 extern PVOID MmPagedPoolStart;
230 extern PVOID MmPagedPoolEnd;
231 extern PVOID MmNonPagedSystemStart;
232 extern PVOID MiSystemViewStart;
233 extern SIZE_T MmSystemViewSize;
234 extern PVOID MmSessionBase;
235 extern PVOID MiSessionSpaceEnd;
236 extern PMMPTE MmSystemPagePtes;
237 extern PVOID MmSystemCacheStart;
238 extern PVOID MmSystemCacheEnd;
239 extern MMSUPPORT MmSystemCacheWs;
240 extern SIZE_T MmAllocatedNonPagedPool;
241 extern ULONG_PTR MmSubsectionBase;
242 extern ULONG MmSpecialPoolTag;
243 extern PVOID MmHyperSpaceEnd;
244 extern PMMWSL MmSystemCacheWorkingSetList;
245 extern SIZE_T MmMinimumNonPagedPoolSize;
246 extern ULONG MmMinAdditionNonPagedPoolPerMb;
247 extern SIZE_T MmDefaultMaximumNonPagedPool;
248 extern ULONG MmMaxAdditionNonPagedPoolPerMb;
249 extern ULONG MmSecondaryColors;
250 extern ULONG MmSecondaryColorMask;
251 extern ULONG MmMaximumNonPagedPoolPercent;
252 extern ULONG MmLargeStackSize;
253 extern PMMCOLOR_TABLES MmFreePagesByColor[FreePageList + 1];
254 extern ULONG MmProductType;
255 extern MM_SYSTEMSIZE MmSystemSize;
256 extern PKEVENT MiLowMemoryEvent;
257 extern PKEVENT MiHighMemoryEvent;
258 extern PKEVENT MiLowPagedPoolEvent;
259 extern PKEVENT MiHighPagedPoolEvent;
260 extern PKEVENT MiLowNonPagedPoolEvent;
261 extern PKEVENT MiHighNonPagedPoolEvent;
262 extern PFN_NUMBER MmLowMemoryThreshold;
263 extern PFN_NUMBER MmHighMemoryThreshold;
264 extern PFN_NUMBER MiLowPagedPoolThreshold;
265 extern PFN_NUMBER MiHighPagedPoolThreshold;
266 extern PFN_NUMBER MiLowNonPagedPoolThreshold;
267 extern PFN_NUMBER MiHighNonPagedPoolThreshold;
268 extern PFN_NUMBER MmMinimumFreePages;
269 extern PFN_NUMBER MmPlentyFreePages;
270
271 #define MI_PFN_TO_PFNENTRY(x) (&MmPfnDatabase[1][x])
272 #define MI_PFNENTRY_TO_PFN(x) (x - MmPfnDatabase[1])
273
274 NTSTATUS
275 NTAPI
276 MmArmInitSystem(
277 IN ULONG Phase,
278 IN PLOADER_PARAMETER_BLOCK LoaderBlock
279 );
280
281 NTSTATUS
282 NTAPI
283 MiInitMachineDependent(
284 IN PLOADER_PARAMETER_BLOCK LoaderBlock
285 );
286
287 VOID
288 NTAPI
289 MiComputeColorInformation(
290 VOID
291 );
292
293 VOID
294 NTAPI
295 MiMapPfnDatabase(
296 IN PLOADER_PARAMETER_BLOCK LoaderBlock
297 );
298
299 VOID
300 NTAPI
301 MiInitializeColorTables(
302 VOID
303 );
304
305 VOID
306 NTAPI
307 MiInitializePfnDatabase(
308 IN PLOADER_PARAMETER_BLOCK LoaderBlock
309 );
310
311 BOOLEAN
312 NTAPI
313 MiInitializeMemoryEvents(
314 VOID
315 );
316
317 PFN_NUMBER
318 NTAPI
319 MxGetNextPage(
320 IN PFN_NUMBER PageCount
321 );
322
323 PPHYSICAL_MEMORY_DESCRIPTOR
324 NTAPI
325 MmInitializeMemoryLimits(
326 IN PLOADER_PARAMETER_BLOCK LoaderBlock,
327 IN PBOOLEAN IncludeType
328 );
329
330 PFN_NUMBER
331 NTAPI
332 MiPagesInLoaderBlock(
333 IN PLOADER_PARAMETER_BLOCK LoaderBlock,
334 IN PBOOLEAN IncludeType
335 );
336
337 VOID
338 FASTCALL
339 MiSyncARM3WithROS(
340 IN PVOID AddressStart,
341 IN PVOID AddressEnd
342 );
343
344 NTSTATUS
345 NTAPI
346 MmArmAccessFault(
347 IN BOOLEAN StoreInstruction,
348 IN PVOID Address,
349 IN KPROCESSOR_MODE Mode,
350 IN PVOID TrapInformation
351 );
352
353 VOID
354 NTAPI
355 MiInitializeNonPagedPool(
356 VOID
357 );
358
359 VOID
360 NTAPI
361 MiInitializeNonPagedPoolThresholds(
362 VOID
363 );
364
365 VOID
366 NTAPI
367 MiInitializePoolEvents(
368 VOID
369 );
370
371 VOID //
372 NTAPI //
373 InitializePool( //
374 IN POOL_TYPE PoolType,// FIXFIX: This should go in ex.h after the pool merge
375 IN ULONG Threshold //
376 ); //
377
378 VOID
379 NTAPI
380 MiInitializeSystemPtes(
381 IN PMMPTE StartingPte,
382 IN ULONG NumberOfPtes,
383 IN MMSYSTEM_PTE_POOL_TYPE PoolType
384 );
385
386 PMMPTE
387 NTAPI
388 MiReserveSystemPtes(
389 IN ULONG NumberOfPtes,
390 IN MMSYSTEM_PTE_POOL_TYPE SystemPtePoolType
391 );
392
393 VOID
394 NTAPI
395 MiReleaseSystemPtes(
396 IN PMMPTE StartingPte,
397 IN ULONG NumberOfPtes,
398 IN MMSYSTEM_PTE_POOL_TYPE SystemPtePoolType
399 );
400
401
402 PFN_NUMBER
403 NTAPI
404 MiFindContiguousPages(
405 IN PFN_NUMBER LowestPfn,
406 IN PFN_NUMBER HighestPfn,
407 IN PFN_NUMBER BoundaryPfn,
408 IN PFN_NUMBER SizeInPages,
409 IN MEMORY_CACHING_TYPE CacheType
410 );
411
412 PVOID
413 NTAPI
414 MiCheckForContiguousMemory(
415 IN PVOID BaseAddress,
416 IN PFN_NUMBER BaseAddressPages,
417 IN PFN_NUMBER SizeInPages,
418 IN PFN_NUMBER LowestPfn,
419 IN PFN_NUMBER HighestPfn,
420 IN PFN_NUMBER BoundaryPfn,
421 IN MI_PFN_CACHE_ATTRIBUTE CacheAttribute
422 );
423
424 PMDL
425 NTAPI
426 MiAllocatePagesForMdl(
427 IN PHYSICAL_ADDRESS LowAddress,
428 IN PHYSICAL_ADDRESS HighAddress,
429 IN PHYSICAL_ADDRESS SkipBytes,
430 IN SIZE_T TotalBytes,
431 IN MI_PFN_CACHE_ATTRIBUTE CacheAttribute,
432 IN ULONG Flags
433 );
434
435 PVOID
436 NTAPI
437 MiMapLockedPagesInUserSpace(
438 IN PMDL Mdl,
439 IN PVOID BaseVa,
440 IN MEMORY_CACHING_TYPE CacheType,
441 IN PVOID BaseAddress
442 );
443
444 VOID
445 NTAPI
446 MiUnmapLockedPagesInUserSpace(
447 IN PVOID BaseAddress,
448 IN PMDL Mdl
449 );
450
451 VOID
452 NTAPI
453 MiInsertInListTail(
454 IN PMMPFNLIST ListHead,
455 IN PMMPFN Entry
456 );
457
458 VOID
459 NTAPI
460 MiInsertZeroListAtBack(
461 IN PFN_NUMBER PageIndex
462 );
463
464 VOID
465 NTAPI
466 MiUnlinkFreeOrZeroedPage(
467 IN PMMPFN Entry
468 );
469
470 PMMPFN
471 NTAPI
472 MiRemoveHeadList(
473 IN PMMPFNLIST ListHead
474 );
475
476
477 VOID
478 NTAPI
479 MiInsertPageInFreeList(
480 IN PFN_NUMBER PageFrameIndex
481 );
482
483 /* EOF */