From ed3f4764733c5cb20b17b476b0c5baa1df4e3943 Mon Sep 17 00:00:00 2001 From: Stefan Ginsberg Date: Thu, 14 Aug 2008 12:42:57 +0000 Subject: [PATCH] - Rework MiSyncThreadProcessViews - Perform the Mm hack-sync in KiIdleLoop before switching context (thanks to Aleksey for writing this!) svn path=/trunk/; revision=35333 --- reactos/ntoskrnl/include/internal/mm.h | 14 +++++--------- reactos/ntoskrnl/ke/i386/ctxswitch.S | 4 ++++ reactos/ntoskrnl/ke/procobj.c | 16 ++++------------ reactos/ntoskrnl/ke/thrdobj.c | 8 ++------ reactos/ntoskrnl/ke/thrdschd.c | 16 ++-------------- reactos/ntoskrnl/mm/mm.c | 14 ++++++++++++++ 6 files changed, 31 insertions(+), 41 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/mm.h b/reactos/ntoskrnl/include/internal/mm.h index 49b336ca92c..502135124d8 100644 --- a/reactos/ntoskrnl/include/internal/mm.h +++ b/reactos/ntoskrnl/include/internal/mm.h @@ -1552,16 +1552,12 @@ MmCheckSystemImage( IN BOOLEAN PurgeSection ); -FORCEINLINE +/* ReactOS Mm Hack */ VOID -NTAPI -MiSyncThreadProcessViews(IN PVOID Process, - IN PVOID Address, - IN ULONG Size) -{ - MmUpdatePageDir((PEPROCESS)Process, Address, Size); -} - +FASTCALL +MiSyncThreadProcessViews( + IN PKTHREAD NextThread +); extern PMM_AVL_TABLE MmKernelAddressSpace; diff --git a/reactos/ntoskrnl/ke/i386/ctxswitch.S b/reactos/ntoskrnl/ke/i386/ctxswitch.S index 152122722a2..3cff2d27a1c 100644 --- a/reactos/ntoskrnl/ke/i386/ctxswitch.S +++ b/reactos/ntoskrnl/ke/i386/ctxswitch.S @@ -736,6 +736,10 @@ CheckNext: #endif SwapContext: + /* ReactOS Mm Hack */ + mov ecx, esi + call @MiSyncThreadProcessViews@4 + /* Swap context at APC_LEVEL */ mov ecx, APC_LEVEL call @KiSwapContextInternal@0 diff --git a/reactos/ntoskrnl/ke/procobj.c b/reactos/ntoskrnl/ke/procobj.c index 64a25d4a951..e456824d133 100644 --- a/reactos/ntoskrnl/ke/procobj.c +++ b/reactos/ntoskrnl/ke/procobj.c @@ -447,12 +447,8 @@ KeAttachProcess(IN PKPROCESS Process) ASSERT_PROCESS(Process); ASSERT_IRQL_LESS_OR_EQUAL(DISPATCH_LEVEL); - /* Make sure that we are in the right page directory */ - MiSyncThreadProcessViews(Process, - (PVOID)Thread->StackLimit, - Thread->LargeStack ? - KERNEL_LARGE_STACK_SIZE : KERNEL_STACK_SIZE); - MiSyncThreadProcessViews(Process, Thread, sizeof(ETHREAD)); + /* Make sure that we are in the right page directory (ReactOS Mm Hack) */ + MiSyncThreadProcessViews(Thread); /* Check if we're already in that process */ if (Thread->ApcState.Process == Process) return; @@ -577,12 +573,8 @@ KeStackAttachProcess(IN PKPROCESS Process, ASSERT_PROCESS(Process); ASSERT_IRQL_LESS_OR_EQUAL(DISPATCH_LEVEL); - /* Make sure that we are in the right page directory */ - MiSyncThreadProcessViews(Process, - (PVOID)Thread->StackLimit, - Thread->LargeStack ? - KERNEL_LARGE_STACK_SIZE : KERNEL_STACK_SIZE); - MiSyncThreadProcessViews(Process, Thread, sizeof(ETHREAD)); + /* Make sure that we are in the right page directory (ReactOS Mm Hack) */ + MiSyncThreadProcessViews(Thread); /* Crash system if DPC is being executed! */ if (KeIsExecutingDpc()) diff --git a/reactos/ntoskrnl/ke/thrdobj.c b/reactos/ntoskrnl/ke/thrdobj.c index ca0996069fc..dccfe9c4a80 100644 --- a/reactos/ntoskrnl/ke/thrdobj.c +++ b/reactos/ntoskrnl/ke/thrdobj.c @@ -810,12 +810,8 @@ KeInitThread(IN OUT PKTHREAD Thread, Thread->StackLimit = (ULONG_PTR)KernelStack - KERNEL_STACK_SIZE; Thread->KernelStackResident = TRUE; - /* Make sure that we are in the right page directory */ - MiSyncThreadProcessViews(Process, - (PVOID)Thread->StackLimit, - Thread->LargeStack ? - KERNEL_LARGE_STACK_SIZE : KERNEL_STACK_SIZE); - MiSyncThreadProcessViews(Process, Thread, sizeof(ETHREAD)); + /* Make sure that we are in the right page directory (ReactOS Mm Hack) */ + MiSyncThreadProcessViews(Thread); /* Enter SEH to avoid crashes due to user mode */ Status = STATUS_SUCCESS; diff --git a/reactos/ntoskrnl/ke/thrdschd.c b/reactos/ntoskrnl/ke/thrdschd.c index ad70de338f6..15a2d9f61a2 100644 --- a/reactos/ntoskrnl/ke/thrdschd.c +++ b/reactos/ntoskrnl/ke/thrdschd.c @@ -344,13 +344,7 @@ KiSwapThread(IN PKTHREAD CurrentThread, WaitIrql = CurrentThread->WaitIrql; /* REACTOS Mm Hack of Doom */ - MiSyncThreadProcessViews(PsGetCurrentProcess(), - ((PETHREAD)NextThread)->ThreadsProcess, - sizeof(EPROCESS)); - MiSyncThreadProcessViews(PsGetCurrentProcess(), - (PVOID)((PETHREAD)NextThread)->Tcb.StackLimit, - NextThread->LargeStack ? - KERNEL_LARGE_STACK_SIZE : KERNEL_STACK_SIZE); + MiSyncThreadProcessViews(NextThread); /* Swap contexts */ ApcState = KiSwapContext(CurrentThread, NextThread); @@ -720,13 +714,7 @@ NtYieldExecution(VOID) ASSERT(OldIrql <= DISPATCH_LEVEL); /* REACTOS Mm Hack of Doom */ - MiSyncThreadProcessViews(PsGetCurrentProcess(), - ((PETHREAD)NextThread)->ThreadsProcess, - sizeof(EPROCESS)); - MiSyncThreadProcessViews(PsGetCurrentProcess(), - (PVOID)((PETHREAD)NextThread)->Tcb.StackLimit, - NextThread->LargeStack ? - KERNEL_LARGE_STACK_SIZE : KERNEL_STACK_SIZE); + MiSyncThreadProcessViews(NextThread); /* Swap to new thread */ KiSwapContext(Thread, NextThread); diff --git a/reactos/ntoskrnl/mm/mm.c b/reactos/ntoskrnl/mm/mm.c index 1480c00d729..948d855eb70 100644 --- a/reactos/ntoskrnl/mm/mm.c +++ b/reactos/ntoskrnl/mm/mm.c @@ -24,6 +24,20 @@ MM_STATS MmStats; /* FUNCTIONS ****************************************************************/ +VOID +FASTCALL +MiSyncThreadProcessViews(IN PKTHREAD NextThread) +{ + /* Hack Sync because Mm is broken */ + MmUpdatePageDir(PsGetCurrentProcess(), + ((PETHREAD)NextThread)->ThreadsProcess, + sizeof(EPROCESS)); + MmUpdatePageDir(PsGetCurrentProcess(), + (PVOID)((PETHREAD)NextThread)->Tcb.StackLimit, + NextThread->LargeStack ? + KERNEL_LARGE_STACK_SIZE : KERNEL_STACK_SIZE); +} + /* * @implemented */