ReactOS  0.4.14-dev-52-g6116262
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 */
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");
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 */
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__);
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
GLsizei GLenum const GLvoid GLsizei GLenum 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 const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble * u
Definition: glfuncs.h:240
PFN_NUMBER MmResidentAvailablePages
Definition: freelist.c:27
#define IN
Definition: typedefs.h:38
#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
#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
SIZE_T MmSystemLockPagesCount
Definition: mdlsup.c:22
LONG NTSTATUS
Definition: precomp.h:26
LONG_PTR SSIZE_T
Definition: basetsd.h:183
ULONG MmProductType
Definition: mminit.c:325
PMMPTE FORCEINLINE MiAddressToPpe(PVOID Address)
Definition: mm.h:151
ULONG MinimumWorkingSetSize
Definition: mmtypes.h:914
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 PsGetCurrentProcess
Definition: psfuncs.h:17
unsigned char BOOLEAN
static WCHAR Address[46]
Definition: ping.c:68
FORCEINLINE VOID MiUnlockWorkingSet(IN PETHREAD Thread, IN PMMSUPPORT WorkingSet)
Definition: miarm.h:1284
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
_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
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:101
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
PMMPTE FORCEINLINE MiAddressToPxe(PVOID Address)
Definition: mm.h:161
#define PAGE_SIZE
Definition: env_spec_w32.h:49
_In_ ULONG _In_ BOOLEAN _Must_inspect_result_ PVOID * VirtualAddress
Definition: ndis.h:3791
static const WCHAR Cleanup[]
Definition: register.c:80
MM_SYSTEMSIZE MmSystemSize
Definition: mminit.c:326
Status
Definition: gdiplustypes.h:24
ULONG_PTR SIZE_T
Definition: typedefs.h:78
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
static ULONG Delta
Definition: xboxvideo.c:32
#define DPRINT1
Definition: precomp.h:8
NTSTATUS NTAPI MmMapUserAddressesToPage(IN PVOID BaseAddress, IN SIZE_T NumberOfBytes, IN PVOID PageAddress)
Definition: mmsup.c:31
_Must_inspect_result_ typedef _In_ PHYSICAL_ADDRESS _Inout_ PLARGE_INTEGER NumberOfBytes
Definition: iotypes.h:998
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
SIZE_T MmMaximumWorkingSetSize
Definition: mmsup.c:21
UCHAR DisablePageFaultClustering
Definition: pstypes.h:1173
FORCEINLINE VOID MiLockWorkingSet(IN PETHREAD Thread, IN PMMSUPPORT WorkingSet)
Definition: miarm.h:1240
ULONG MaximumWorkingSetSize
Definition: mmtypes.h:915
_In_ HANDLE ProcessHandle
Definition: mmfuncs.h:403
return STATUS_SUCCESS
Definition: btrfs.c:2966
ULONG WorkingSetSize
Definition: mmtypes.h:930
#define __FUNCTION__
Definition: types.h:112