- Use MiSyncForProcessAttach and MiSyncForContextSwitch instead of MiSyncThreadProcessViews to avoid some unneeded mm hack-syncing

svn path=/trunk/; revision=35635
This commit is contained in:
Stefan Ginsberg
2008-08-25 18:42:40 +00:00
parent f3b92fa090
commit a27e2fd423
6 changed files with 35 additions and 16 deletions
+8 -2
View File
@@ -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
+1 -2
View File
@@ -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
+2 -2
View File
@@ -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())
+1 -1
View File
@@ -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;
+2 -2
View File
@@ -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);
+21 -7
View File
@@ -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);
}