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