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