From a27e2fd423743696f901891bbe295ba40bce3bb9 Mon Sep 17 00:00:00 2001 From: Stefan Ginsberg Date: Mon, 25 Aug 2008 18:42:40 +0000 Subject: [PATCH] - Use MiSyncForProcessAttach and MiSyncForContextSwitch instead of MiSyncThreadProcessViews to avoid some unneeded mm hack-syncing svn path=/trunk/; revision=35635 --- reactos/ntoskrnl/include/internal/mm.h | 10 +++++++-- reactos/ntoskrnl/ke/i386/ctxswitch.S | 3 +-- reactos/ntoskrnl/ke/procobj.c | 4 ++-- reactos/ntoskrnl/ke/thrdobj.c | 2 +- reactos/ntoskrnl/ke/thrdschd.c | 4 ++-- reactos/ntoskrnl/mm/mm.c | 28 +++++++++++++++++++------- 6 files changed, 35 insertions(+), 16 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/mm.h b/reactos/ntoskrnl/include/internal/mm.h index 6ef55cb4277..0b53676950a 100644 --- a/reactos/ntoskrnl/include/internal/mm.h +++ b/reactos/ntoskrnl/include/internal/mm.h @@ -1554,14 +1554,20 @@ MmCallDllInitialize( IN PLIST_ENTRY ListHead ); -/* ReactOS Mm Hack */ +/* ReactOS Mm Hacks */ VOID FASTCALL -MiSyncThreadProcessViews( +MiSyncForProcessAttach( IN PKTHREAD NextThread, IN PEPROCESS Process ); +VOID +FASTCALL +MiSyncForContextSwitch( + IN PKTHREAD Thread +); + extern PMM_AVL_TABLE MmKernelAddressSpace; FORCEINLINE diff --git a/reactos/ntoskrnl/ke/i386/ctxswitch.S b/reactos/ntoskrnl/ke/i386/ctxswitch.S index dbbebd66527..73fe48388ee 100644 --- a/reactos/ntoskrnl/ke/i386/ctxswitch.S +++ b/reactos/ntoskrnl/ke/i386/ctxswitch.S @@ -738,8 +738,7 @@ CheckNext: SwapContext: /* ReactOS Mm Hack */ mov ecx, esi - mov edx, [edi+KTHREAD_APCSTATE_PROCESS] - call @MiSyncThreadProcessViews@8 + call @MiSyncForContextSwitch@4 /* Swap context at APC_LEVEL */ mov ecx, APC_LEVEL diff --git a/reactos/ntoskrnl/ke/procobj.c b/reactos/ntoskrnl/ke/procobj.c index a2bd61401cb..49a61da4f13 100644 --- a/reactos/ntoskrnl/ke/procobj.c +++ b/reactos/ntoskrnl/ke/procobj.c @@ -448,7 +448,7 @@ KeAttachProcess(IN PKPROCESS Process) ASSERT_IRQL_LESS_OR_EQUAL(DISPATCH_LEVEL); /* Make sure that we are in the right page directory (ReactOS Mm Hack) */ - MiSyncThreadProcessViews(Thread, (PEPROCESS)Process); + MiSyncForProcessAttach(Thread, (PEPROCESS)Process); /* Check if we're already in that process */ if (Thread->ApcState.Process == Process) return; @@ -574,7 +574,7 @@ KeStackAttachProcess(IN PKPROCESS Process, ASSERT_IRQL_LESS_OR_EQUAL(DISPATCH_LEVEL); /* Make sure that we are in the right page directory (ReactOS Mm Hack) */ - MiSyncThreadProcessViews(Thread, (PEPROCESS)Process); + MiSyncForProcessAttach(Thread, (PEPROCESS)Process); /* Crash system if DPC is being executed! */ if (KeIsExecutingDpc()) diff --git a/reactos/ntoskrnl/ke/thrdobj.c b/reactos/ntoskrnl/ke/thrdobj.c index 500ffd05fbc..cd930222008 100644 --- a/reactos/ntoskrnl/ke/thrdobj.c +++ b/reactos/ntoskrnl/ke/thrdobj.c @@ -811,7 +811,7 @@ KeInitThread(IN OUT PKTHREAD Thread, Thread->KernelStackResident = TRUE; /* Make sure that we are in the right page directory (ReactOS Mm Hack) */ - MiSyncThreadProcessViews(Thread, (PEPROCESS)Process); + MiSyncForProcessAttach(Thread, (PEPROCESS)Process); /* 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 8f1f52570ee..ff64d40cf5b 100644 --- a/reactos/ntoskrnl/ke/thrdschd.c +++ b/reactos/ntoskrnl/ke/thrdschd.c @@ -344,7 +344,7 @@ KiSwapThread(IN PKTHREAD CurrentThread, WaitIrql = CurrentThread->WaitIrql; /* REACTOS Mm Hack of Doom */ - MiSyncThreadProcessViews(NextThread, PsGetCurrentProcess()); + MiSyncForContextSwitch(NextThread); /* Swap contexts */ ApcState = KiSwapContext(CurrentThread, NextThread); @@ -714,7 +714,7 @@ NtYieldExecution(VOID) ASSERT(OldIrql <= DISPATCH_LEVEL); /* REACTOS Mm Hack of Doom */ - MiSyncThreadProcessViews(NextThread, PsGetCurrentProcess()); + MiSyncForContextSwitch(NextThread); /* Swap to new thread */ KiSwapContext(Thread, NextThread); diff --git a/reactos/ntoskrnl/mm/mm.c b/reactos/ntoskrnl/mm/mm.c index 4bced911cc0..7f0bd5ae3da 100644 --- a/reactos/ntoskrnl/mm/mm.c +++ b/reactos/ntoskrnl/mm/mm.c @@ -26,17 +26,31 @@ MM_STATS MmStats; VOID FASTCALL -MiSyncThreadProcessViews(IN PKTHREAD NextThread, - IN PEPROCESS Process) +MiSyncForProcessAttach(IN PKTHREAD Thread, + IN PEPROCESS Process) { - PETHREAD Thread = CONTAINING_RECORD(NextThread, ETHREAD, Tcb); + PETHREAD Ethread = CONTAINING_RECORD(Thread, ETHREAD, Tcb); /* Hack Sync because Mm is broken */ - MmUpdatePageDir(Process, Thread, sizeof(ETHREAD)); - MmUpdatePageDir(Process, Thread->ThreadsProcess, sizeof(EPROCESS)); + MmUpdatePageDir(Process, Ethread->ThreadsProcess, sizeof(EPROCESS)); MmUpdatePageDir(Process, - (PVOID)Thread->Tcb.StackLimit, - NextThread->LargeStack ? + (PVOID)Thread->StackLimit, + Thread->LargeStack ? + KERNEL_LARGE_STACK_SIZE : KERNEL_STACK_SIZE); +} + +VOID +FASTCALL +MiSyncForContextSwitch(IN PKTHREAD Thread) +{ + PVOID Process = PsGetCurrentProcess(); + PETHREAD Ethread = CONTAINING_RECORD(Thread, ETHREAD, Tcb); + + /* Hack Sync because Mm is broken */ + MmUpdatePageDir(Process, Ethread->ThreadsProcess, sizeof(EPROCESS)); + MmUpdatePageDir(Process, + (PVOID)Thread->StackLimit, + Thread->LargeStack ? KERNEL_LARGE_STACK_SIZE : KERNEL_STACK_SIZE); }