Sync to trunk (r44933)
[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 #define MM_HIGHEST_VAD_ADDRESS \
37 (PVOID)((ULONG_PTR)MM_HIGHEST_USER_ADDRESS - (16 * PAGE_SIZE))
38
39
40 //
41 // FIXFIX: These should go in ex.h after the pool merge
42 //
43 #define POOL_LISTS_PER_PAGE (PAGE_SIZE / sizeof(LIST_ENTRY))
44 #define BASE_POOL_TYPE_MASK 1
45 #define POOL_MAX_ALLOC (PAGE_SIZE - (sizeof(POOL_HEADER) + sizeof(LIST_ENTRY)))
46
47 #endif
48
49 typedef struct _POOL_DESCRIPTOR
50 {
51 POOL_TYPE PoolType;
52 ULONG PoolIndex;
53 ULONG RunningAllocs;
54 ULONG RunningDeAllocs;
55 ULONG TotalPages;
56 ULONG TotalBigPages;
57 ULONG Threshold;
58 PVOID LockAddress;
59 PVOID PendingFrees;
60 LONG PendingFreeDepth;
61 SIZE_T TotalBytes;
62 SIZE_T Spare0;
63 LIST_ENTRY ListHeads[POOL_LISTS_PER_PAGE];
64 } POOL_DESCRIPTOR, *PPOOL_DESCRIPTOR;
65
66 #ifndef _WIN64
67 typedef struct _POOL_HEADER
68 {
69 union
70 {
71 struct
72 {
73 USHORT PreviousSize:9;
74 USHORT PoolIndex:7;
75 USHORT BlockSize:9;
76 USHORT PoolType:7;
77 };
78 ULONG Ulong1;
79 };
80 union
81 {
82 ULONG PoolTag;
83 struct
84 {
85 USHORT AllocatorBackTraceIndex;
86 USHORT PoolTagHash;
87 };
88 };
89 } POOL_HEADER, *PPOOL_HEADER;
90 #else
91 typedef struct _POOL_HEADER
92 {
93 union
94 {
95 struct
96 {
97 ULONG PreviousSize : 8;
98 ULONG PoolIndex : 8;
99 ULONG BlockSize : 8;
100 ULONG PoolType : 8;
101 };
102 ULONG Ulong1;
103 };
104 ULONG PoolTag;
105 union
106 {
107 PEPROCESS* ProcessBilled;
108 struct
109 {
110 USHORT AllocatorBackTraceIndex;
111 USHORT PoolTagHash;
112 };
113 };
114 } POOL_HEADER, *PPOOL_HEADER;
115 #endif
116
117 //
118 // Everything depends on this
119 //
120 C_ASSERT(sizeof(POOL_HEADER) == sizeof(LIST_ENTRY));
121
122 extern ULONG ExpNumberOfPagedPools;
123 extern POOL_DESCRIPTOR NonPagedPoolDescriptor;
124 extern PPOOL_DESCRIPTOR ExpPagedPoolDescriptor[16 + 1];
125 extern PVOID PoolTrackTable;
126
127 //
128 // END FIXFIX
129 //
130
131 typedef enum _MMSYSTEM_PTE_POOL_TYPE
132 {
133 SystemPteSpace,
134 NonPagedPoolExpansion,
135 MaximumPtePoolTypes
136 } MMSYSTEM_PTE_POOL_TYPE;
137
138 typedef enum _MI_PFN_CACHE_ATTRIBUTE
139 {
140 MiNonCached,
141 MiCached,
142 MiWriteCombined,
143 MiNotMapped
144 } MI_PFN_CACHE_ATTRIBUTE, *PMI_PFN_CACHE_ATTRIBUTE;
145
146 typedef struct _PHYSICAL_MEMORY_RUN
147 {
148 ULONG BasePage;
149 ULONG PageCount;
150 } PHYSICAL_MEMORY_RUN, *PPHYSICAL_MEMORY_RUN;
151
152 typedef struct _PHYSICAL_MEMORY_DESCRIPTOR
153 {
154 ULONG NumberOfRuns;
155 ULONG NumberOfPages;
156 PHYSICAL_MEMORY_RUN Run[1];
157 } PHYSICAL_MEMORY_DESCRIPTOR, *PPHYSICAL_MEMORY_DESCRIPTOR;
158
159 extern MMPTE HyperTemplatePte;
160
161 extern ULONG_PTR MmSizeOfNonPagedPoolInBytes;
162 extern ULONG_PTR MmMaximumNonPagedPoolInBytes;
163 extern PVOID MmNonPagedSystemStart;
164 extern PVOID MmNonPagedPoolStart;
165 extern PVOID MmNonPagedPoolExpansionStart;
166 extern PVOID MmNonPagedPoolEnd;
167 extern ULONG_PTR MmSizeOfPagedPoolInBytes;
168 extern PVOID MmPagedPoolStart;
169 extern PVOID MmPagedPoolEnd;
170 extern PVOID MmSessionBase;
171 extern ULONG_PTR MmSessionSize;
172 extern PMMPTE MmFirstReservedMappingPte, MmLastReservedMappingPte;
173 extern PMMPTE MiFirstReservedZeroingPte;
174 extern MI_PFN_CACHE_ATTRIBUTE MiPlatformCacheAttributes[2][MmMaximumCacheType];
175 extern PPHYSICAL_MEMORY_DESCRIPTOR MmPhysicalMemoryBlock;
176 extern ULONG_PTR MmBootImageSize;
177 extern PMMPTE MmSystemPtesStart[MaximumPtePoolTypes];
178 extern PMMPTE MmSystemPtesEnd[MaximumPtePoolTypes];
179 extern PMEMORY_ALLOCATION_DESCRIPTOR MxFreeDescriptor;
180 extern MEMORY_ALLOCATION_DESCRIPTOR MxOldFreeDescriptor;
181 extern ULONG_PTR MxPfnAllocation;
182 extern MM_PAGED_POOL_INFO MmPagedPoolInfo;
183 extern RTL_BITMAP MiPfnBitMap;
184 extern KGUARDED_MUTEX MmPagedPoolMutex;
185 extern PVOID MmPagedPoolStart;
186 extern PVOID MmPagedPoolEnd;
187 extern PVOID MmNonPagedSystemStart;
188 extern PVOID MiSystemViewStart;
189 extern ULONG_PTR MmSystemViewSize;
190 extern PVOID MmSessionBase;
191 extern PVOID MiSessionSpaceEnd;
192 extern ULONG_PTR MmSizeOfPagedPoolInBytes;
193 extern PMMPTE MmSystemPagePtes;
194 extern PVOID MmSystemCacheStart;
195 extern PVOID MmSystemCacheEnd;
196 extern MMSUPPORT MmSystemCacheWs;
197 extern SIZE_T MmAllocatedNonPagedPool;
198 extern ULONG_PTR MmSubsectionBase;
199 extern ULONG MmSpecialPoolTag;
200 extern PVOID MmHyperSpaceEnd;
201
202 NTSTATUS
203 NTAPI
204 MmArmInitSystem(
205 IN ULONG Phase,
206 IN PLOADER_PARAMETER_BLOCK LoaderBlock
207 );
208
209 NTSTATUS
210 NTAPI
211 MmArmAccessFault(
212 IN BOOLEAN StoreInstruction,
213 IN PVOID Address,
214 IN KPROCESSOR_MODE Mode,
215 IN PVOID TrapInformation
216 );
217
218 VOID
219 NTAPI
220 MiInitializeArmPool(
221 VOID
222 );
223
224 VOID //
225 NTAPI //
226 InitializePool( //
227 IN POOL_TYPE PoolType,// FIXFIX: This should go in ex.h after the pool merge
228 IN ULONG Threshold //
229 ); //
230
231 VOID
232 NTAPI
233 MiInitializeSystemPtes(
234 IN PMMPTE StartingPte,
235 IN ULONG NumberOfPtes,
236 IN MMSYSTEM_PTE_POOL_TYPE PoolType
237 );
238
239 PMMPTE
240 NTAPI
241 MiReserveSystemPtes(
242 IN ULONG NumberOfPtes,
243 IN MMSYSTEM_PTE_POOL_TYPE SystemPtePoolType
244 );
245
246 VOID
247 NTAPI
248 MiReleaseSystemPtes(
249 IN PMMPTE StartingPte,
250 IN ULONG NumberOfPtes,
251 IN MMSYSTEM_PTE_POOL_TYPE SystemPtePoolType
252 );
253
254
255 PFN_NUMBER
256 NTAPI
257 MiFindContiguousPages(
258 IN PFN_NUMBER LowestPfn,
259 IN PFN_NUMBER HighestPfn,
260 IN PFN_NUMBER BoundaryPfn,
261 IN PFN_NUMBER SizeInPages,
262 IN MEMORY_CACHING_TYPE CacheType
263 );
264
265 PVOID
266 NTAPI
267 MiCheckForContiguousMemory(
268 IN PVOID BaseAddress,
269 IN PFN_NUMBER BaseAddressPages,
270 IN PFN_NUMBER SizeInPages,
271 IN PFN_NUMBER LowestPfn,
272 IN PFN_NUMBER HighestPfn,
273 IN PFN_NUMBER BoundaryPfn,
274 IN MI_PFN_CACHE_ATTRIBUTE CacheAttribute
275 );
276
277 PMDL
278 NTAPI
279 MiAllocatePagesForMdl(
280 IN PHYSICAL_ADDRESS LowAddress,
281 IN PHYSICAL_ADDRESS HighAddress,
282 IN PHYSICAL_ADDRESS SkipBytes,
283 IN SIZE_T TotalBytes,
284 IN MI_PFN_CACHE_ATTRIBUTE CacheAttribute,
285 IN ULONG Flags
286 );
287
288 PVOID
289 NTAPI
290 MiMapLockedPagesInUserSpace(
291 IN PMDL Mdl,
292 IN PVOID BaseVa,
293 IN MEMORY_CACHING_TYPE CacheType,
294 IN PVOID BaseAddress
295 );
296
297 VOID
298 NTAPI
299 MiUnmapLockedPagesInUserSpace(
300 IN PVOID BaseAddress,
301 IN PMDL Mdl
302 );
303
304 /* EOF */