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. Modified: trunk/reactos/ntoskrnl/ke/i386/ctxswitch.S _____
Modified: trunk/reactos/ntoskrnl/ke/i386/ctxswitch.S --- trunk/reactos/ntoskrnl/ke/i386/ctxswitch.S 2005-05-08 15:57:51 UTC (rev 15128) +++ trunk/reactos/ntoskrnl/ke/i386/ctxswitch.S 2005-05-08 15:59:07 UTC (rev 15129) @@ -152,26 +152,27 @@
/* 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] + + jz NoAddressSpaceSwitch + + /* Switch address space */ + mov cr3, eax
- /* - * 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 - +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