- Rework MiSyncThreadProcessViews

- Perform the Mm hack-sync in KiIdleLoop before switching context (thanks to Aleksey for writing this!)

svn path=/trunk/; revision=35333
This commit is contained in:
Stefan Ginsberg 2008-08-14 12:42:57 +00:00
parent 0a4815bc46
commit ed3f476473
6 changed files with 31 additions and 41 deletions

View file

@ -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;

View file

@ -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

View file

@ -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())

View file

@ -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;

View file

@ -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);

View file

@ -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
*/