Sync with trunk r63637.
[reactos.git] / ntoskrnl / cache / section / newmm.h
1 #pragma once
2
3 #include <internal/arch/mm.h>
4
5 /* TYPES *********************************************************************/
6
7 #define PFN_FROM_SSE(E) ((PFN_NUMBER)((E) >> PAGE_SHIFT))
8 #define IS_SWAP_FROM_SSE(E) ((E) & 0x00000001)
9 #define MM_IS_WAIT_PTE(E) \
10 (IS_SWAP_FROM_SSE(E) && SWAPENTRY_FROM_SSE(E) == MM_WAIT_ENTRY)
11 #define MAKE_PFN_SSE(P) ((ULONG_PTR)((P) << PAGE_SHIFT))
12 #define SWAPENTRY_FROM_SSE(E) ((E) >> 1)
13 #define MAKE_SWAP_SSE(S) (((ULONG_PTR)(S) << 1) | 0x1)
14 #define DIRTY_SSE(E) ((E) | 2)
15 #define CLEAN_SSE(E) ((E) & ~2)
16 #define IS_DIRTY_SSE(E) ((E) & 2)
17 #define PAGE_FROM_SSE(E) ((E) & 0xFFFFF000)
18 #define SHARE_COUNT_FROM_SSE(E) (((E) & 0x00000FFC) >> 2)
19 #define MAX_SHARE_COUNT 0x3FF
20 #define MAKE_SSE(P, C) ((ULONG_PTR)((P) | ((C) << 2)))
21
22 #define MM_SEGMENT_FINALIZE (0x40000000)
23
24 #define RMAP_SEGMENT_MASK ~((ULONG_PTR)0xff)
25 #define RMAP_IS_SEGMENT(x) (((ULONG_PTR)(x) & RMAP_SEGMENT_MASK) == RMAP_SEGMENT_MASK)
26
27 #define MIN(x,y) (((x)<(y))?(x):(y))
28 #define MAX(x,y) (((x)>(y))?(x):(y))
29
30 /* Determine what's needed to make paged pool fit in this category.
31 * it seems that something more is required to satisfy arm3. */
32 #define BALANCER_CAN_EVICT(Consumer) \
33 (((Consumer) == MC_USER) || \
34 ((Consumer) == MC_CACHE))
35
36 #define SEC_CACHE (0x20000000)
37
38 #define MiWaitForPageEvent(Process,Address) do { \
39 DPRINT("MiWaitForPageEvent %p:%p #\n", Process, Address); \
40 KeWaitForSingleObject(&MmWaitPageEvent, 0, KernelMode, FALSE, NULL); \
41 } while(0)
42
43 #define MiSetPageEvent(Process,Address) do { \
44 DPRINT("MiSetPageEvent %p:%p #\n",Process, (PVOID)(Address)); \
45 KeSetEvent(&MmWaitPageEvent, IO_NO_INCREMENT, FALSE); \
46 } while(0)
47
48 /* We store 8 bits of location with a page association */
49 #define ENTRIES_PER_ELEMENT 256
50
51 extern KEVENT MmWaitPageEvent;
52
53 typedef struct _CACHE_SECTION_PAGE_TABLE
54 {
55 LARGE_INTEGER FileOffset;
56 PMM_SECTION_SEGMENT Segment;
57 ULONG Refcount;
58 ULONG_PTR PageEntries[ENTRIES_PER_ELEMENT];
59 } CACHE_SECTION_PAGE_TABLE, *PCACHE_SECTION_PAGE_TABLE;
60
61 struct _MM_REQUIRED_RESOURCES;
62
63 typedef NTSTATUS (NTAPI * AcquireResource)(
64 PMMSUPPORT AddressSpace,
65 struct _MEMORY_AREA *MemoryArea,
66 struct _MM_REQUIRED_RESOURCES *Required);
67
68 typedef NTSTATUS (NTAPI * NotPresentFaultHandler)(
69 PMMSUPPORT AddressSpace,
70 struct _MEMORY_AREA *MemoryArea,
71 PVOID Address,
72 BOOLEAN Locked,
73 struct _MM_REQUIRED_RESOURCES *Required);
74
75 typedef NTSTATUS (NTAPI * FaultHandler)(
76 PMMSUPPORT AddressSpace,
77 struct _MEMORY_AREA *MemoryArea,
78 PVOID Address,
79 struct _MM_REQUIRED_RESOURCES *Required);
80
81 typedef struct _MM_REQUIRED_RESOURCES
82 {
83 ULONG Consumer;
84 ULONG Amount;
85 ULONG Offset;
86 ULONG State;
87 PVOID Context;
88 LARGE_INTEGER FileOffset;
89 AcquireResource DoAcquisition;
90 PFN_NUMBER Page[2];
91 PVOID Buffer[2];
92 SWAPENTRY SwapEntry;
93 const char *File;
94 int Line;
95 } MM_REQUIRED_RESOURCES, *PMM_REQUIRED_RESOURCES;
96
97 NTSTATUS
98 NTAPI
99 MmCreateCacheSection(PROS_SECTION_OBJECT *SectionObject,
100 ACCESS_MASK DesiredAccess,
101 POBJECT_ATTRIBUTES ObjectAttributes,
102 PLARGE_INTEGER UMaximumSize,
103 ULONG SectionPageProtection,
104 ULONG AllocationAttributes,
105 PFILE_OBJECT FileObject);
106
107 PFN_NUMBER
108 NTAPI
109 MmWithdrawSectionPage(PMM_SECTION_SEGMENT Segment,
110 PLARGE_INTEGER FileOffset,
111 BOOLEAN *Dirty);
112
113 NTSTATUS
114 NTAPI
115 MmFinalizeSectionPageOut(PMM_SECTION_SEGMENT Segment,
116 PLARGE_INTEGER FileOffset,
117 PFN_NUMBER Page,
118 BOOLEAN Dirty);
119
120 /* sptab.c *******************************************************************/
121
122 VOID
123 NTAPI
124 MiInitializeSectionPageTable(PMM_SECTION_SEGMENT Segment);
125
126 NTSTATUS
127 NTAPI
128 _MmSetPageEntrySectionSegment(PMM_SECTION_SEGMENT Segment,
129 PLARGE_INTEGER Offset,
130 ULONG_PTR Entry,
131 const char *file,
132 int line);
133
134 ULONG_PTR
135 NTAPI
136 _MmGetPageEntrySectionSegment(PMM_SECTION_SEGMENT Segment,
137 PLARGE_INTEGER Offset,
138 const char *file,
139 int line);
140
141 #define MmSetPageEntrySectionSegment(S,O,E) _MmSetPageEntrySectionSegment(S,O,E,__FILE__,__LINE__)
142
143 #define MmGetPageEntrySectionSegment(S,O) _MmGetPageEntrySectionSegment(S,O,__FILE__,__LINE__)
144
145 typedef VOID (NTAPI *FREE_SECTION_PAGE_FUN)(
146 PMM_SECTION_SEGMENT Segment,
147 PLARGE_INTEGER Offset);
148
149 VOID
150 NTAPI
151 MmFreePageTablesSectionSegment(PMM_SECTION_SEGMENT Segment,
152 FREE_SECTION_PAGE_FUN FreePage);
153
154 /* Yields a lock */
155 PMM_SECTION_SEGMENT
156 NTAPI
157 MmGetSectionAssociation(PFN_NUMBER Page,
158 PLARGE_INTEGER Offset);
159
160 NTSTATUS
161 NTAPI
162 MmSetSectionAssociation(PFN_NUMBER Page,
163 PMM_SECTION_SEGMENT Segment,
164 PLARGE_INTEGER Offset);
165
166 VOID
167 NTAPI
168 MmDeleteSectionAssociation(PFN_NUMBER Page);
169
170 NTSTATUS
171 NTAPI
172 MmpPageOutPhysicalAddress(PFN_NUMBER Page);
173
174 /* io.c **********************************************************************/
175
176 NTSTATUS
177 MmspWaitForFileLock(PFILE_OBJECT File);
178
179 NTSTATUS
180 NTAPI
181 MiSimpleRead(PFILE_OBJECT FileObject,
182 PLARGE_INTEGER FileOffset,
183 PVOID Buffer,
184 ULONG Length,
185 BOOLEAN Paging,
186 PIO_STATUS_BLOCK ReadStatus);
187
188 NTSTATUS
189 NTAPI
190 _MiSimpleWrite(PFILE_OBJECT FileObject,
191 PLARGE_INTEGER FileOffset,
192 PVOID Buffer,
193 ULONG Length,
194 PIO_STATUS_BLOCK ReadStatus,
195 const char *file,
196 int line);
197
198 #define MiSimpleWrite(F,O,B,L,R) _MiSimpleWrite(F,O,B,L,R,__FILE__,__LINE__)
199
200 NTSTATUS
201 NTAPI
202 _MiWriteBackPage(PFILE_OBJECT FileObject,
203 PLARGE_INTEGER Offset,
204 ULONG Length,
205 PFN_NUMBER Page,
206 const char *File,
207 int Line);
208
209 #define MiWriteBackPage(F,O,L,P) _MiWriteBackPage(F,O,L,P,__FILE__,__LINE__)
210
211 /* section.c *****************************************************************/
212
213 NTSTATUS
214 NTAPI
215 MmAccessFaultCacheSection(KPROCESSOR_MODE Mode,
216 ULONG_PTR Address,
217 BOOLEAN FromMdl);
218
219 NTSTATUS
220 NTAPI
221 MiReadFilePage(PMMSUPPORT AddressSpace,
222 PMEMORY_AREA MemoryArea,
223 PMM_REQUIRED_RESOURCES RequiredResources);
224
225 NTSTATUS
226 NTAPI
227 MiGetOnePage(PMMSUPPORT AddressSpace,
228 PMEMORY_AREA MemoryArea,
229 PMM_REQUIRED_RESOURCES RequiredResources);
230
231 NTSTATUS
232 NTAPI
233 MiSwapInPage(PMMSUPPORT AddressSpace,
234 PMEMORY_AREA MemoryArea,
235 PMM_REQUIRED_RESOURCES RequiredResources);
236
237 NTSTATUS
238 NTAPI
239 MiWriteSwapPage(PMMSUPPORT AddressSpace,
240 PMEMORY_AREA MemoryArea,
241 PMM_REQUIRED_RESOURCES Resources);
242
243 NTSTATUS
244 NTAPI
245 MiWriteFilePage(PMMSUPPORT AddressSpace,
246 PMEMORY_AREA MemoryArea,
247 PMM_REQUIRED_RESOURCES Resources);
248
249 VOID
250 NTAPI
251 MiFreeSegmentPage(PMM_SECTION_SEGMENT Segment,
252 PLARGE_INTEGER FileOffset);
253
254 _Success_(1)
255 _When_(return==STATUS_MORE_PROCESSING_REQUIRED, _At_(Required->DoAcquisition, _Post_notnull_))
256 NTSTATUS
257 NTAPI
258 MiCowCacheSectionPage (
259 _In_ PMMSUPPORT AddressSpace,
260 _In_ PMEMORY_AREA MemoryArea,
261 _In_ PVOID Address,
262 _In_ BOOLEAN Locked,
263 _Inout_ PMM_REQUIRED_RESOURCES Required);
264
265 NTSTATUS
266 NTAPI
267 MiZeroFillSection(PVOID Address,
268 PLARGE_INTEGER FileOffsetPtr,
269 ULONG Length);
270
271 VOID
272 MmPageOutDeleteMapping(PVOID Context,
273 PEPROCESS Process,
274 PVOID Address);
275
276 VOID
277 NTAPI
278 _MmLockSectionSegment(PMM_SECTION_SEGMENT Segment,
279 const char *file,
280 int line);
281
282 #define MmLockSectionSegment(x) _MmLockSectionSegment(x,__FILE__,__LINE__)
283
284 VOID
285 NTAPI
286 _MmUnlockSectionSegment(PMM_SECTION_SEGMENT Segment,
287 const char *file,
288 int line);
289
290 #define MmUnlockSectionSegment(x) _MmUnlockSectionSegment(x,__FILE__,__LINE__)
291
292 VOID
293 MmFreeCacheSectionPage(PVOID Context,
294 MEMORY_AREA* MemoryArea,
295 PVOID Address,
296 PFN_NUMBER Page,
297 SWAPENTRY SwapEntry,
298 BOOLEAN Dirty);
299
300 NTSTATUS
301 NTAPI
302 _MiFlushMappedSection(PVOID BaseAddress,
303 PLARGE_INTEGER BaseOffset,
304 PLARGE_INTEGER FileSize,
305 BOOLEAN Dirty,
306 const char *File,
307 int Line);
308
309 #define MiFlushMappedSection(A,O,S,D) _MiFlushMappedSection(A,O,S,D,__FILE__,__LINE__)
310
311 VOID
312 NTAPI
313 MmFinalizeSegment(PMM_SECTION_SEGMENT Segment);
314
315 VOID
316 NTAPI
317 MmFreeSectionSegments(PFILE_OBJECT FileObject);
318
319 NTSTATUS
320 NTAPI
321 MmMapCacheViewInSystemSpaceAtOffset(IN PMM_SECTION_SEGMENT Segment,
322 OUT PVOID* MappedBase,
323 IN PLARGE_INTEGER ViewOffset,
324 IN OUT PULONG ViewSize);
325
326 NTSTATUS
327 NTAPI
328 _MiMapViewOfSegment(PMMSUPPORT AddressSpace,
329 PMM_SECTION_SEGMENT Segment,
330 PVOID* BaseAddress,
331 SIZE_T ViewSize,
332 ULONG Protect,
333 PLARGE_INTEGER ViewOffset,
334 ULONG AllocationType,
335 const char *file,
336 int line);
337
338 #define MiMapViewOfSegment(AddressSpace,Segment,BaseAddress,ViewSize,Protect,ViewOffset,AllocationType) \
339 _MiMapViewOfSegment(AddressSpace,Segment,BaseAddress,ViewSize,Protect,ViewOffset,AllocationType,__FILE__,__LINE__)
340
341 NTSTATUS
342 NTAPI
343 MmUnmapViewOfCacheSegment(PMMSUPPORT AddressSpace,
344 PVOID BaseAddress);
345
346 NTSTATUS
347 NTAPI
348 MmUnmapCacheViewInSystemSpace(PVOID Address);
349
350 _Success_(1)
351 _When_(return==STATUS_MORE_PROCESSING_REQUIRED, _At_(Required->DoAcquisition, _Post_notnull_))
352 NTSTATUS
353 NTAPI
354 MmNotPresentFaultCachePage (
355 _In_ PMMSUPPORT AddressSpace,
356 _In_ MEMORY_AREA* MemoryArea,
357 _In_ PVOID Address,
358 _In_ BOOLEAN Locked,
359 _Inout_ PMM_REQUIRED_RESOURCES Required);
360
361 NTSTATUS
362 NTAPI
363 MmPageOutPageFileView(PMMSUPPORT AddressSpace,
364 PMEMORY_AREA MemoryArea,
365 PVOID Address,
366 PMM_REQUIRED_RESOURCES Required);
367
368 FORCEINLINE
369 BOOLEAN
370 _MmTryToLockAddressSpace(IN PMMSUPPORT AddressSpace,
371 const char *file,
372 int line)
373 {
374 BOOLEAN Result = KeTryToAcquireGuardedMutex(&CONTAINING_RECORD(AddressSpace, EPROCESS, Vm)->AddressCreationLock);
375 //DbgPrint("(%s:%d) Try Lock Address Space %x -> %s\n", file, line, AddressSpace, Result ? "true" : "false");
376 return Result;
377 }
378
379 #define MmTryToLockAddressSpace(x) _MmTryToLockAddressSpace(x,__FILE__,__LINE__)
380
381 NTSTATUS
382 NTAPI
383 MiWidenSegment(PMMSUPPORT AddressSpace,
384 PMEMORY_AREA MemoryArea,
385 PMM_REQUIRED_RESOURCES RequiredResources);
386
387 NTSTATUS
388 NTAPI
389 MiSwapInSectionPage(PMMSUPPORT AddressSpace,
390 PMEMORY_AREA MemoryArea,
391 PMM_REQUIRED_RESOURCES RequiredResources);
392
393 NTSTATUS
394 NTAPI
395 MmExtendCacheSection(PROS_SECTION_OBJECT Section,
396 PLARGE_INTEGER NewSize,
397 BOOLEAN ExtendFile);
398
399 NTSTATUS
400 NTAPI
401 _MiFlushMappedSection(PVOID BaseAddress,
402 PLARGE_INTEGER BaseOffset,
403 PLARGE_INTEGER FileSize,
404 BOOLEAN Dirty,
405 const char *File,
406 int Line);
407
408 #define MiFlushMappedSection(A,O,S,D) _MiFlushMappedSection(A,O,S,D,__FILE__,__LINE__)
409
410 PVOID
411 NTAPI
412 MmGetSegmentRmap(PFN_NUMBER Page,
413 PULONG RawOffset);
414
415 NTSTATUS
416 NTAPI
417 MmNotPresentFaultCacheSection(KPROCESSOR_MODE Mode,
418 ULONG_PTR Address,
419 BOOLEAN FromMdl);
420
421 ULONG
422 NTAPI
423 MiCacheEvictPages(PMM_SECTION_SEGMENT Segment,
424 ULONG Target);
425
426 NTSTATUS
427 MiRosTrimCache(ULONG Target,
428 ULONG Priority,
429 PULONG NrFreed);