Disable correct usage of ESP0 since it seems the V86 code is still not
ready to handle that. This should fix the V86 exceptions some people
have been having.
Modified: trunk/reactos/ntoskrnl/ke/i386/ctxswitch.S
Modified: trunk/reactos/ntoskrnl/ke/i386/thread.c
_____
Modified: trunk/reactos/ntoskrnl/ke/i386/ctxswitch.S
--- trunk/reactos/ntoskrnl/ke/i386/ctxswitch.S 2006-01-16 16:45:27 UTC
(rev 20913)
+++ trunk/reactos/ntoskrnl/ke/i386/ctxswitch.S 2006-01-16 17:05:50 UTC
(rev 20914)
@@ -171,8 +171,11 @@
NoAdjust:
/* Set new ESP0 */
- mov [ebp+KTSS_ESP0], eax
+ //mov [ebp+KTSS_ESP0], eax
+ /* Save it */
+ push [ebp+KTSS_ESP0]
+
/* Set TEB pointer */
mov eax, [esi+KTHREAD_TEB]
mov [ebx+KPCR_TEB], eax
@@ -257,6 +260,9 @@
mov cr0, eax
4:
+ /* Restore ESP0 */
+ pop [ebp+KTSS_ESP0]
+
/* Restore exception list */
pop [ebx+KPCR_EXCEPTION_LIST]
_____
Modified: trunk/reactos/ntoskrnl/ke/i386/thread.c
--- trunk/reactos/ntoskrnl/ke/i386/thread.c 2006-01-16 16:45:27 UTC
(rev 20913)
+++ trunk/reactos/ntoskrnl/ke/i386/thread.c 2006-01-16 17:05:50 UTC
(rev 20914)
@@ -14,6 +14,7 @@
typedef struct _KSHARED_CTXSWITCH_FRAME
{
+ ULONG Esp0;
PVOID ExceptionList;
PVOID RetEip;
} KSHARED_CTXSWITCH_FRAME, *PKSHARED_CTXSWITCH_FRAME;
@@ -231,6 +232,9 @@
/* And set up the Context Switch Frame */
CtxSwitchFrame->RetEip = KiThreadStartup;
+ CtxSwitchFrame->Esp0 = (ULONG_PTR)Thread->InitialStack -
+ sizeof(FX_SAVE_AREA) -
+ 0x10;
CtxSwitchFrame->ExceptionList = (PVOID)0xFFFFFFFF;
/* Save back the new value of the kernel stack. */