ReactOS  r75907
mmsup.c
Go to the documentation of this file.
1 /*
2  * PROJECT: ReactOS Kernel
3  * LICENSE: BSD - See COPYING.ARM in the top level directory
4  * FILE: ntoskrnl/mm/ARM3/mmsup.c
5  * PURPOSE: ARM Memory Manager Support Routines
6  * PROGRAMMERS: ReactOS Portable Systems Group
7  */
8 
9 /* INCLUDES *******************************************************************/
10 
11 #include <ntoskrnl.h>
12 #define NDEBUG
13 #include <debug.h>
14 
15 #define MODULE_INVOLVED_IN_ARM3
16 #include <mm/ARM3/miarm.h>
17 
18 /* GLOBALS ********************************************************************/
19 
23 
24 /* PUBLIC FUNCTIONS ***********************************************************/
25 
26 /*
27  * @unimplemented
28  */
30 NTAPI
34 {
37 }
38 
39 /*
40  * @unimplemented
41  */
43 NTAPI
44 MmAdjustWorkingSetSize(IN SIZE_T WorkingSetMinimumInBytes,
45  IN SIZE_T WorkingSetMaximumInBytes,
46  IN ULONG SystemCache,
47  IN BOOLEAN IncreaseOkay)
48 {
49  SIZE_T MinimumWorkingSetSize, MaximumWorkingSetSize;
50  SSIZE_T Delta;
51  PMMSUPPORT Ws;
53 
54  /* Check for special case: empty the working set */
55  if ((WorkingSetMinimumInBytes == -1) &&
56  (WorkingSetMaximumInBytes == -1))
57  {
60  }
61 
62  /* Assume success */
63  Status = STATUS_SUCCESS;
64 
65  /* Get the working set and lock it */
66  Ws = &PsGetCurrentProcess()->Vm;
68 
69  /* Calculate the actual minimum and maximum working set size to set */
70  MinimumWorkingSetSize = (WorkingSetMinimumInBytes != 0) ?
71  (WorkingSetMinimumInBytes / PAGE_SIZE) : Ws->MinimumWorkingSetSize;
72  MaximumWorkingSetSize = (WorkingSetMaximumInBytes != 0) ?
73  (WorkingSetMaximumInBytes / PAGE_SIZE) : Ws->MaximumWorkingSetSize;
74 
75  /* Check if the new maximum exceeds the global maximum */
76  if (MaximumWorkingSetSize > MmMaximumWorkingSetSize)
77  {
78  MaximumWorkingSetSize = MmMaximumWorkingSetSize;
80  }
81 
82  /* Check if the new minimum is below the global minimum */
83  if (MinimumWorkingSetSize < MmMinimumWorkingSetSize)
84  {
85  MinimumWorkingSetSize = MmMinimumWorkingSetSize;
87  }
88 
89  /* Check if the new minimum exceeds the new maximum */
90  if (MinimumWorkingSetSize > MaximumWorkingSetSize)
91  {
92  DPRINT1("MinimumWorkingSetSize (%lu) > MaximumWorkingSetSize (%lu)\n",
93  MinimumWorkingSetSize, MaximumWorkingSetSize);
95  goto Cleanup;
96  }
97 
98  /* Calculate the minimum WS size adjustment and check if we increase */
99  Delta = MinimumWorkingSetSize - Ws->MinimumWorkingSetSize;
100  if (Delta > 0)
101  {
102  /* Is increasing ok? */
103  if (!IncreaseOkay)
104  {
105  DPRINT1("Privilege for WS size increase not held\n");
106  Status = STATUS_PRIVILEGE_NOT_HELD;
107  goto Cleanup;
108  }
109 
110  /* Check if the number of available pages is large enough */
111  if (((SIZE_T)Delta / 1024) > (MmAvailablePages - 128))
112  {
113  DPRINT1("Not enough available pages\n");
115  goto Cleanup;
116  }
117 
118  /* Check if there are enough resident available pages */
119  if ((SIZE_T)Delta >
121  {
122  DPRINT1("Not enough resident pages\n");
124  goto Cleanup;
125  }
126  }
127 
128  /* Update resident available pages */
129  if (Delta != 0)
130  {
132  }
133 
134  /* Calculate new pages above minimum WS size */
135  Delta += max((SSIZE_T)Ws->WorkingSetSize - MinimumWorkingSetSize, 0);
136 
137  /* Subtract old pages above minimum WS size */
138  Delta -= max((SSIZE_T)Ws->WorkingSetSize - Ws->MinimumWorkingSetSize, 0);
139 
140  /* If it changed, add it to the global variable */
141  if (Delta != 0)
142  {
144  }
145 
146  /* Set the new working set size */
147  Ws->MinimumWorkingSetSize = MinimumWorkingSetSize;
148  Ws->MaximumWorkingSetSize = MaximumWorkingSetSize;
149 
150 Cleanup:
151 
152  /* Unlock the working set and return the status */
154  return Status;
155 }
156 
157 /*
158  * @unimplemented
159  */
160 BOOLEAN
161 NTAPI
163  IN SIZE_T Length)
164 {
166  return FALSE;
167 }
168 
169 /*
170  * @implemented
171  */
172 BOOLEAN
173 NTAPI
175 {
176 #if _MI_PAGING_LEVELS >= 4
177  /* Check if the PXE is valid */
178  if (MiAddressToPxe(VirtualAddress)->u.Hard.Valid == 0) return FALSE;
179 #endif
180 
181 #if _MI_PAGING_LEVELS >= 3
182  /* Check if the PPE is valid */
183  if (MiAddressToPpe(VirtualAddress)->u.Hard.Valid == 0) return FALSE;
184 #endif
185 
186 #if _MI_PAGING_LEVELS >= 2
187  /* Check if the PDE is valid */
188  if (MiAddressToPde(VirtualAddress)->u.Hard.Valid == 0) return FALSE;
189 #endif
190 
191  /* Check if the PTE is valid */
192  if (MiAddressToPte(VirtualAddress)->u.Hard.Valid == 0) return FALSE;
193 
194  /* This address is valid now, but it will only stay so if the caller holds
195  * the PFN lock */
196  return TRUE;
197 }
198 
199 /*
200  * @unimplemented
201  */
202 BOOLEAN
203 NTAPI
205 {
206  DPRINT1("WARNING: %s returns bogus result\n", __FUNCTION__);
207  return MmIsAddressValid(VirtualAddress);
208 }
209 
210 /*
211  * @unimplemented
212  */
213 NTSTATUS
214 NTAPI
217  IN ULONG BankLength,
218  IN BOOLEAN ReadWriteBank,
219  IN PVOID BankRoutine,
220  IN PVOID Context)
221 {
223  return STATUS_NOT_IMPLEMENTED;
224 }
225 
226 /*
227  * @implemented
228  */
229 BOOLEAN
230 NTAPI
232 {
234 
235  //
236  // If any of these is true, this is a recursive fault
237  //
238  return ((Thread->DisablePageFaultClustering) | (Thread->ForwardClusterOnly));
239 }
240 
241 /*
242  * @implemented
243  */
244 BOOLEAN
245 NTAPI
247 {
248  /* Return if this is a server system */
249  return MmProductType & 0xFF;
250 }
251 
252 /*
253  * @implemented
254  */
256 NTAPI
258 {
259  /* Return the low, medium or high memory system type */
260  return MmSystemSize;
261 }
262 
263 NTSTATUS
264 NTAPI
266 {
268  return STATUS_NOT_IMPLEMENTED;
269 }
270 
271 /* EOF */
SIZE_T MmPagesAboveWsMinimum
Definition: mmsup.c:22
DWORD *typedef PVOID
Definition: winlogon.h:52
PFN_NUMBER MmResidentAvailablePages
Definition: freelist.c:27
#define IN
Definition: typedefs.h:39
#define STATUS_PRIVILEGE_NOT_HELD
Definition: DriverTester.h:9
#define max(a, b)
Definition: svc.c:63
BOOLEAN NTAPI MmSetAddressRangeModified(IN PVOID Address, IN SIZE_T Length)
Definition: mmsup.c:162
#define TRUE
Definition: types.h:120
PVOID ULONG Address
Definition: oprghdlr.h:14
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
#define MiAddressToPde(x)
Definition: mmx86.c:20
#define PsGetCurrentThread()
Definition: env_spec_w32.h:81
#define STATUS_NOT_IMPLEMENTED
Definition: ntstatus.h:225
return STATUS_SUCCESS
Definition: btrfs.c:2664
SIZE_T MmSystemLockPagesCount
Definition: mdlsup.c:22
LONG_PTR SSIZE_T
Definition: basetsd.h:182
GLenum GLclampf GLint GLenum GLuint GLenum GLenum GLsizei GLenum const GLvoid GLfloat GLfloat GLfloat GLfloat GLclampd GLint GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean GLboolean GLboolean GLboolean GLint GLenum GLsizei const GLvoid GLenum GLint GLenum GLint GLint GLsizei GLint GLenum GLint GLint GLint GLint GLsizei GLenum GLsizei const GLuint GLboolean GLenum GLenum GLint GLsizei GLenum GLsizei GLenum const GLvoid GLboolean const GLboolean GLenum const GLdouble * u
Definition: glfuncs.h:88
ULONG MmProductType
Definition: mminit.c:324
PMMPTE FORCEINLINE MiAddressToPpe(PVOID Address)
Definition: mm.h:138
ULONG MinimumWorkingSetSize
Definition: mmtypes.h:915
PFN_NUMBER MmAvailablePages
Definition: freelist.c:26
#define STATUS_BAD_WORKING_SET_LIMIT
Definition: ntstatus.h:298
_Must_inspect_result_ _In_ SIZE_T _In_ PVOID PageAddress
Definition: mmfuncs.h:472
enum _MM_SYSTEM_SIZE MM_SYSTEMSIZE
#define MiAddressToPte(x)
Definition: mmx86.c:19
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
Definition: IoEaTest.cpp:117
#define FALSE
Definition: types.h:117
#define PsGetCurrentProcess
Definition: psfuncs.h:17
FORCEINLINE VOID MiUnlockWorkingSet(IN PETHREAD Thread, IN PMMSUPPORT WorkingSet)
Definition: miarm.h:1247
SIZE_T MmMinimumWorkingSetSize
Definition: mmsup.c:20
BOOLEAN NTAPI MmIsRecursiveIoFault(VOID)
Definition: mmsup.c:231
BOOLEAN NTAPI MmIsNonPagedSystemAddressValid(IN PVOID VirtualAddress)
Definition: mmsup.c:204
unsigned char BOOLEAN
_In_ HANDLE _Outptr_result_bytebuffer_ ViewSize PVOID * BaseAddress
Definition: mmfuncs.h:404
BOOLEAN NTAPI MmIsThisAnNtAsSystem(VOID)
Definition: mmsup.c:246
#define STATUS_WORKING_SET_LIMIT_RANGE
Definition: ntstatus.h:116
MM_SYSTEMSIZE NTAPI MmQuerySystemSize(VOID)
Definition: mmsup.c:257
_In_opt_ PFILE_OBJECT _In_opt_ PETHREAD Thread
Definition: fltkernel.h:2653
BOOLEAN NTAPI MmIsAddressValid(IN PVOID VirtualAddress)
Definition: mmsup.c:174
#define InterlockedExchangeAddSizeT(a, b)
Definition: interlocked.h:196
NTSTATUS NTAPI MmCreateMirror(VOID)
Definition: mmsup.c:265
VOID UINTN Length
Definition: acefiex.h:744
IN SIZE_T NumberOfBytes
Definition: ndis.h:3914
PMMPTE FORCEINLINE MiAddressToPxe(PVOID Address)
Definition: mm.h:148
#define PAGE_SIZE
Definition: env_spec_w32.h:49
_In_ ULONG _In_ BOOLEAN _Must_inspect_result_ PVOID * VirtualAddress
Definition: ndis.h:3772
static const WCHAR Cleanup[]
Definition: register.c:65
MM_SYSTEMSIZE MmSystemSize
Definition: mminit.c:325
Status
Definition: gdiplustypes.h:24
ULONG_PTR SIZE_T
Definition: typedefs.h:79
NTSTATUS NTAPI MmSetBankedSection(IN HANDLE ProcessHandle, IN PVOID VirtualAddress, IN ULONG BankLength, IN BOOLEAN ReadWriteBank, IN PVOID BankRoutine, IN PVOID Context)
Definition: mmsup.c:215
DWORD *typedef HANDLE
Definition: winlogon.h:52
LONG NTSTATUS
Definition: DriverTester.h:11
static ULONG Delta
Definition: xboxvideo.c:28
#define DPRINT1
Definition: precomp.h:8
NTSTATUS NTAPI MmMapUserAddressesToPage(IN PVOID BaseAddress, IN SIZE_T NumberOfBytes, IN PVOID PageAddress)
Definition: mmsup.c:31
unsigned int ULONG
Definition: retypes.h:1
#define UNIMPLEMENTED
Definition: debug.h:114
NTSTATUS NTAPI MmAdjustWorkingSetSize(IN SIZE_T WorkingSetMinimumInBytes, IN SIZE_T WorkingSetMaximumInBytes, IN ULONG SystemCache, IN BOOLEAN IncreaseOkay)
Definition: mmsup.c:44
#define __FUNCTION__
Definition: compiler.h:205
SIZE_T MmMaximumWorkingSetSize
Definition: mmsup.c:21
UCHAR DisablePageFaultClustering
Definition: pstypes.h:1174
FORCEINLINE VOID MiLockWorkingSet(IN PETHREAD Thread, IN PMMSUPPORT WorkingSet)
Definition: miarm.h:1203
ULONG MaximumWorkingSetSize
Definition: mmtypes.h:916
_In_ HANDLE ProcessHandle
Definition: mmfuncs.h:403
ULONG WorkingSetSize
Definition: mmtypes.h:931