https://git.reactos.org/?p=reactos.git;a=commitdiff;h=84d0586ca40c21ae4d2b3…
commit 84d0586ca40c21ae4d2b3a68137bc3e88423d463
Author: Timo Kreuzer <timo.kreuzer(a)reactos.org>
AuthorDate: Tue Oct 10 22:37:21 2023 +0300
Commit: Timo Kreuzer <timo.kreuzer(a)reactos.org>
CommitDate: Tue Oct 24 21:45:27 2023 +0300
[NTOS:MM] Handle page table faults in MmArmAccessFault
These faults are handled by ARM³ and we don't need to check for a memory area.
They can be recursive faults (e.g. from MiDeleteSystemPageableVm), so we might be holding
the WS lock already. Passing it straight to ARM³ allows to acquire the WS lock below to
look up the memory area.
---
ntoskrnl/mm/mmfault.c | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/ntoskrnl/mm/mmfault.c b/ntoskrnl/mm/mmfault.c
index 7937f7b5e5b..68e31ba1281 100644
--- a/ntoskrnl/mm/mmfault.c
+++ b/ntoskrnl/mm/mmfault.c
@@ -227,11 +227,12 @@ MmAccessFault(IN ULONG FaultCode,
#endif
}
- /* Handle shared user page, which doesn't have a VAD / MemoryArea */
- if (PAGE_ALIGN(Address) == (PVOID)MM_SHARED_USER_DATA_VA)
+ /* Handle shared user page / page table, which don't have a VAD / MemoryArea */
+ if ((PAGE_ALIGN(Address) == (PVOID)MM_SHARED_USER_DATA_VA) ||
+ MI_IS_PAGE_TABLE_ADDRESS(Address))
{
/* This is an ARM3 fault */
- DPRINT("ARM3 fault %p\n", MemoryArea);
+ DPRINT("ARM3 fault %p\n", Address);
return MmArmAccessFault(FaultCode, Address, Mode, TrapInformation);
}