ReactOS 0.4.16-dev-1151-g3842b59
mmfault.c
Go to the documentation of this file.
1/*
2 * COPYRIGHT: See COPYING in the top directory
3 * PROJECT: ReactOS kernel
4 * FILE: ntoskrnl/mm/mmfault.c
5 * PURPOSE: Kernel memory management functions
6 * PROGRAMMERS: David Welch (welch@cwcom.net)
7 */
8
9/* INCLUDES *******************************************************************/
10
11#include <ntoskrnl.h>
12#include <cache/section/newmm.h>
13#define NDEBUG
14#include <debug.h>
15
16#define MODULE_INVOLVED_IN_ARM3
17#include "ARM3/miarm.h"
18
20
21/* PRIVATE FUNCTIONS **********************************************************/
22
27 BOOLEAN FromMdl,
28 ULONG FaultCode)
29{
33
34 DPRINT("MmAccessFault(Mode %d, Address %x)\n", Mode, Address);
35
37 {
38 DPRINT1("Page fault at high IRQL was %u\n", KeGetCurrentIrql());
39 return(STATUS_UNSUCCESSFUL);
40 }
41
42 /* Instruction fetch and the page is present.
43 This means the page is NX and we cannot do anything to "fix" it. */
44 if (MI_IS_INSTRUCTION_FETCH(FaultCode))
45 {
46 DPRINT1("Page fault instruction fetch at %p\n", Address);
48 }
49
50 /*
51 * Find the memory area for the faulting address
52 */
54 {
55 /*
56 * Check permissions
57 */
58 if (Mode != KernelMode)
59 {
60 DPRINT1("MmAccessFault(Mode %d, Address %x)\n", Mode, Address);
62 }
64 }
65 else
66 {
68 }
69
70 if (!FromMdl)
71 {
73 }
74 do
75 {
78 {
79 if (!FromMdl)
80 {
82 }
84 }
85
86 switch (MemoryArea->Type)
87 {
92 !FromMdl);
93 break;
94#ifdef NEWCC
95 case MEMORY_AREA_CACHE:
96 // This code locks for itself to keep from having to break a lock
97 // passed in.
98 if (!FromMdl)
101 if (!FromMdl)
103 break;
104#endif
105 default:
107 break;
108 }
109 }
111
112 DPRINT("Completed page fault handling\n");
113 if (!FromMdl)
114 {
116 }
117 return(Status);
118}
119
121NTAPI
124 BOOLEAN FromMdl)
125{
129
130 DPRINT("MmNotPresentFault(Mode %d, Address %x)\n", Mode, Address);
131
133 {
134 DPRINT1("Page fault at high IRQL was %u, address %x\n", KeGetCurrentIrql(), Address);
135 return(STATUS_UNSUCCESSFUL);
136 }
137
138 /*
139 * Find the memory area for the faulting address
140 */
142 {
143 /*
144 * Check permissions
145 */
146 if (Mode != KernelMode)
147 {
148 DPRINT1("Address: %x\n", Address);
150 }
152 }
153 else
154 {
156 }
157
158 if (!FromMdl)
159 {
161 }
162
163 /*
164 * Call the memory area specific fault handler
165 */
166 do
167 {
170 {
171 if (!FromMdl)
172 {
174 }
176 }
177
178 switch (MemoryArea->Type)
179 {
183 (PVOID)Address,
184 !FromMdl);
185 break;
186#ifdef NEWCC
187 case MEMORY_AREA_CACHE:
188 // This code locks for itself to keep from having to break a lock
189 // passed in.
190 if (!FromMdl)
193 if (!FromMdl)
195 break;
196#endif
197 default:
199 break;
200 }
201 }
203
204 DPRINT("Completed page fault handling\n");
205 if (!FromMdl)
206 {
208 }
209 return(Status);
210}
211
213
214VOID
215NTAPI
217
219NTAPI
223 IN PVOID TrapInformation)
224{
225 PMMVAD Vad = NULL;
227 BOOLEAN IsArm3Fault = FALSE;
228
229 /* Cute little hack for ROS */
231 {
232#ifdef _M_IX86
233 /* Check for an invalid page directory in kernel mode */
235 {
236 /* All is well with the world */
237 return STATUS_SUCCESS;
238 }
239#endif
240 }
241
242 /* Handle shared user page / page table, which don't have a VAD / MemoryArea */
245 {
246 /* This is an ARM3 fault */
247 DPRINT("ARM3 fault %p\n", Address);
248 return MmArmAccessFault(FaultCode, Address, Mode, TrapInformation);
249 }
250
251 /* Is there a ReactOS address space yet? */
253 {
255 {
256 /* Check if this is an ARM3 memory area */
259
260 if ((Vad != NULL) && !MI_IS_ROSMM_VAD(Vad))
261 {
262 IsArm3Fault = TRUE;
263 }
264
266 }
267 else
268 {
269 /* Could this be a VAD fault from user-mode? */
271 Vad = MiLocateVad(&PsGetCurrentProcess()->VadRoot, Address);
272
273 if ((Vad != NULL) && !MI_IS_ROSMM_VAD(Vad))
274 {
275 IsArm3Fault = TRUE;
276 }
277
279 }
280 }
281
282 /* Is this an ARM3 VAD, or is there no address space yet? */
283 if (IsArm3Fault ||
284 ((Vad == NULL) &&
288 {
289 /* This is an ARM3 fault */
290 DPRINT("ARM3 fault %p\n", Vad);
291 return MmArmAccessFault(FaultCode, Address, Mode, TrapInformation);
292 }
293
294Retry:
295 /* Keep same old ReactOS Behaviour */
296 if (!MI_IS_NOT_PRESENT_FAULT(FaultCode))
297 {
298 /* Call access fault */
299 Status = MmpAccessFault(Mode, (ULONG_PTR)Address, TrapInformation ? FALSE : TRUE, FaultCode);
300 }
301 else
302 {
303 /* Call not present */
304 Status = MmNotPresentFault(Mode, (ULONG_PTR)Address, TrapInformation ? FALSE : TRUE);
305 }
306
308 {
310 goto Retry;
311 }
312
313 return Status;
314}
315
unsigned char BOOLEAN
#define MM_HIGHEST_USER_ADDRESS
Definition: armddk.h:17
LONG NTSTATUS
Definition: precomp.h:26
#define DPRINT1
Definition: precomp.h:8
_In_ PSCSI_REQUEST_BLOCK _Out_ NTSTATUS _Inout_ BOOLEAN * Retry
Definition: classpnp.h:312
#define STATUS_NO_MEMORY
Definition: d3dkmdt.h:51
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define PsGetCurrentThread()
Definition: env_spec_w32.h:81
#define KeGetCurrentIrql()
Definition: env_spec_w32.h:706
#define DISPATCH_LEVEL
Definition: env_spec_w32.h:696
Status
Definition: gdiplustypes.h:25
_In_ ULONG Mode
Definition: hubbusif.h:303
FORCEINLINE VOID MiLockProcessWorkingSetShared(IN PEPROCESS Process, IN PETHREAD Thread)
Definition: miarm.h:1149
PVOID MmPagedPoolStart
Definition: miarm.h:578
PMMVAD NTAPI MiLocateVad(_In_ PMM_AVL_TABLE Table, _In_ PVOID VirtualAddress)
Definition: vadnode.c:116
FORCEINLINE VOID MiUnlockProcessWorkingSetShared(IN PEPROCESS Process, IN PETHREAD Thread)
Definition: miarm.h:1218
#define MI_IS_PAGE_TABLE_ADDRESS(Address)
Definition: miarm.h:191
NTSTATUS NTAPI MmArmAccessFault(IN ULONG FaultCode, IN PVOID Address, IN KPROCESSOR_MODE Mode, IN PVOID TrapInformation)
Definition: pagfault.c:1698
FORCEINLINE VOID MiLockWorkingSetShared(_In_ PETHREAD Thread, _In_ PMMSUPPORT WorkingSet)
Definition: miarm.h:1309
FORCEINLINE VOID MiUnlockWorkingSetShared(_In_ PETHREAD Thread, _In_ PMMSUPPORT WorkingSet)
Definition: miarm.h:1392
MM_AVL_TABLE MiRosKernelVadRoot
Definition: marea.c:54
BOOLEAN Mmi386MakeKernelPageTableGlobal(PVOID Address)
Definition: pagepae.c:844
VOID NTAPI MmRebalanceMemoryConsumersAndWait(VOID)
Definition: balance.c:300
NTSTATUS NTAPI MmNotPresentFault(KPROCESSOR_MODE Mode, ULONG_PTR Address, BOOLEAN FromMdl)
Definition: mmfault.c:122
NTSTATUS NTAPI MmAccessFault(IN ULONG FaultCode, IN PVOID Address, IN KPROCESSOR_MODE Mode, IN PVOID TrapInformation)
Definition: mmfault.c:220
NTSTATUS NTAPI MmpAccessFault(KPROCESSOR_MODE Mode, ULONG_PTR Address, BOOLEAN FromMdl, ULONG FaultCode)
Definition: mmfault.c:25
#define MM_SHARED_USER_DATA_VA
Definition: mmtypes.h:48
#define KernelMode
Definition: asm.h:38
NTSTATUS NTAPI MmAccessFaultCacheSection(KPROCESSOR_MODE Mode, ULONG_PTR Address, BOOLEAN FromMdl)
_In_ PMEMORY_AREA MemoryArea
Definition: newmm.h:207
NTSTATUS NTAPI MmNotPresentFaultCacheSection(KPROCESSOR_MODE Mode, ULONG_PTR Address, BOOLEAN FromMdl)
#define MI_IS_INSTRUCTION_FETCH(FaultCode)
Definition: mm.h:125
#define MI_IS_NOT_PRESENT_FAULT(FaultCode)
Definition: mm.h:121
#define MmSystemRangeStart
Definition: mm.h:32
FORCEINLINE VOID MmLockAddressSpace(PMMSUPPORT AddressSpace)
Definition: mm.h:1696
NTSTATUS NTAPI MmNotPresentFaultSectionView(PMMSUPPORT AddressSpace, MEMORY_AREA *MemoryArea, PVOID Address, BOOLEAN Locked)
Definition: section.c:1537
PMEMORY_AREA NTAPI MmLocateMemoryAreaByAddress(PMMSUPPORT AddressSpace, PVOID Address)
Definition: marea.c:61
NTSTATUS NTAPI MmAccessFaultSectionView(PMMSUPPORT AddressSpace, MEMORY_AREA *MemoryArea, PVOID Address, BOOLEAN Locked)
Definition: section.c:1915
FORCEINLINE VOID MmUnlockAddressSpace(PMMSUPPORT AddressSpace)
Definition: mm.h:1709
#define MI_IS_ROSMM_VAD(Vad)
Definition: mm.h:274
#define MEMORY_AREA_SECTION_VIEW
Definition: mm.h:93
FORCEINLINE PMMSUPPORT MmGetKernelAddressSpace(VOID)
Definition: mm.h:1731
#define STATUS_MM_RESTART_OPERATION
Definition: mm.h:104
MMSUPPORT MmSystemCacheWs
Definition: init.c:55
PVOID MmPagedPoolEnd
Definition: init.c:26
#define STATUS_ACCESS_VIOLATION
Definition: ntstatus.h:242
static WCHAR Address[46]
Definition: ping.c:68
#define STATUS_SUCCESS
Definition: shellext.h:65
#define DPRINT
Definition: sndvol32.h:73
BOOLEAN DeleteInProgress
Definition: mm.h:260
ULONG Type
Definition: mm.h:258
#define NTAPI
Definition: typedefs.h:36
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define IN
Definition: typedefs.h:39
uint32_t ULONG
Definition: typedefs.h:59
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
_In_ ULONG _In_ PHYSICAL_ADDRESS _Inout_ PULONG AddressSpace
Definition: iofuncs.h:2274
CCHAR KPROCESSOR_MODE
Definition: ketypes.h:7
#define PAGE_ALIGN(Va)
#define PsGetCurrentProcess
Definition: psfuncs.h:17