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