From 6e529ef56170ce78627ef7b6117cd6da78ffdb67 Mon Sep 17 00:00:00 2001 From: Hartmut Birr Date: Sun, 8 May 2005 15:59:07 +0000 Subject: [PATCH] Fixed the stack switching. It isn't possible to access memory between changing the stack and setting the cr3 register. A page fault needs a valid kmode stack which is possible not available. svn path=/trunk/; revision=15129 --- reactos/ntoskrnl/ke/i386/ctxswitch.S | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/reactos/ntoskrnl/ke/i386/ctxswitch.S b/reactos/ntoskrnl/ke/i386/ctxswitch.S index cfe369924c4..517f7a442b8 100644 --- a/reactos/ntoskrnl/ke/i386/ctxswitch.S +++ b/reactos/ntoskrnl/ke/i386/ctxswitch.S @@ -152,26 +152,27 @@ SaveTrapFrameForKDB_Return: /* Save the stack pointer in this processors TSS */ mov ebp, [ebx+KPCR_TSS] push ss:[ebp+KTSS_ESP0] + + /* Check if address space switch is needed */ + mov eax, [esi+KTHREAD_APCSTATE_PROCESS] + cmp eax, [edi+KTHREAD_APCSTATE_PROCESS] + mov eax, [eax+KPROCESS_DIRECTORY_TABLE_BASE] /* Switch stacks */ mov [edi+KTHREAD_KERNEL_STACK], esp mov esp, [esi+KTHREAD_KERNEL_STACK] - - /* - * Sadly, ROS memory management is screwed up, so - * we must change the address space here. - */ - mov eax, [esi+KTHREAD_APCSTATE_PROCESS] - mov eax, [eax+KPROCESS_DIRECTORY_TABLE_BASE] - mov cr3, eax + jz NoAddressSpaceSwitch + + /* Switch address space */ + mov cr3, eax + +NoAddressSpaceSwitch: + /* Stack is OK, safe to enable interrupts now */ sti - /* Check if address space switch is needed */ - mov eax, [edi+KTHREAD_APCSTATE_PROCESS] - cmp eax, [esi+KTHREAD_APCSTATE_PROCESS] - + /* Check if address space switch is needed (the result from above is valid) */ /* If they match, then use the fast-path and skip all this */ jz SameProcess