mirror of
https://github.com/reactos/reactos.git
synced 2024-08-30 23:28:58 +00:00
- Fix another V86 Mode exit bug which could cause non-volatiles to be incorrectly restored.
- Make traps use the shared EOI (End Of Interrupt) helper instead of their own custom trap exit code. svn path=/trunk/; revision=20919
This commit is contained in:
parent
4334f8a57f
commit
58964b9893
|
@ -458,7 +458,6 @@ KiRosTrapReturn:
|
||||||
jnz V86_Exit
|
jnz V86_Exit
|
||||||
|
|
||||||
/* Check if the frame was edited */
|
/* Check if the frame was edited */
|
||||||
V86_Exit_Return:
|
|
||||||
test word ptr [esp+KTRAP_FRAME_CS], FRAME_EDITED
|
test word ptr [esp+KTRAP_FRAME_CS], FRAME_EDITED
|
||||||
jz EditedFrame
|
jz EditedFrame
|
||||||
|
|
||||||
|
@ -480,12 +479,12 @@ V86_Exit_Return:
|
||||||
|
|
||||||
/* Restore FS */
|
/* Restore FS */
|
||||||
RestoreFs:
|
RestoreFs:
|
||||||
//lea esp, [ebp+KTRAP_FRAME_FS]
|
lea esp, [ebp+KTRAP_FRAME_FS]
|
||||||
pop fs
|
pop fs
|
||||||
|
|
||||||
CommonStackClean:
|
CommonStackClean:
|
||||||
/* Skip debug information and unsaved registers */
|
/* Skip debug information and unsaved registers */
|
||||||
//lea esp, [ebp+KTRAP_FRAME_EDI]
|
lea esp, [ebp+KTRAP_FRAME_EDI]
|
||||||
pop edi
|
pop edi
|
||||||
pop esi
|
pop esi
|
||||||
pop ebx
|
pop ebx
|
||||||
|
@ -551,7 +550,17 @@ V86_Exit:
|
||||||
pop edx
|
pop edx
|
||||||
pop ecx
|
pop ecx
|
||||||
pop eax
|
pop eax
|
||||||
jmp V86_Exit_Return
|
|
||||||
|
/* Move to non-volatiles */
|
||||||
|
lea esp, [ebp+KTRAP_FRAME_EDI]
|
||||||
|
pop edi
|
||||||
|
pop esi
|
||||||
|
pop ebx
|
||||||
|
pop ebp
|
||||||
|
|
||||||
|
/* Skip error code and return */
|
||||||
|
add esp, 4
|
||||||
|
iret
|
||||||
|
|
||||||
AbiosExit:
|
AbiosExit:
|
||||||
/* Not yet supported */
|
/* Not yet supported */
|
||||||
|
@ -692,10 +701,9 @@ KiRosTrapReturn2:
|
||||||
|
|
||||||
/* Check for V86 */
|
/* Check for V86 */
|
||||||
test dword ptr [esp+KTRAP_FRAME_EFLAGS], X86_EFLAGS_VM
|
test dword ptr [esp+KTRAP_FRAME_EFLAGS], X86_EFLAGS_VM
|
||||||
jnz V86_Exit2
|
jnz V86_Exit
|
||||||
|
|
||||||
/* Check if the frame was edited */
|
/* Check if the frame was edited */
|
||||||
V86_Exit_Return2:
|
|
||||||
test word ptr [esp+KTRAP_FRAME_CS], FRAME_EDITED
|
test word ptr [esp+KTRAP_FRAME_CS], FRAME_EDITED
|
||||||
jz EditedFrame2
|
jz EditedFrame2
|
||||||
|
|
||||||
|
@ -734,16 +742,6 @@ CommonStackClean2:
|
||||||
add esp, 4
|
add esp, 4
|
||||||
iret
|
iret
|
||||||
|
|
||||||
V86_Exit2:
|
|
||||||
/* Move to EDX position */
|
|
||||||
add esp, KTRAP_FRAME_EDX
|
|
||||||
|
|
||||||
/* Restore volatiles */
|
|
||||||
pop edx
|
|
||||||
pop ecx
|
|
||||||
pop eax
|
|
||||||
jmp V86_Exit_Return2
|
|
||||||
|
|
||||||
EditedFrame2:
|
EditedFrame2:
|
||||||
/* Restore real CS value */
|
/* Restore real CS value */
|
||||||
mov ebx, [esp+KTRAP_FRAME_TEMPCS]
|
mov ebx, [esp+KTRAP_FRAME_TEMPCS]
|
||||||
|
@ -943,10 +941,9 @@ KiRosTrapReturn3:
|
||||||
|
|
||||||
/* Check for V86 */
|
/* Check for V86 */
|
||||||
test dword ptr [esp+KTRAP_FRAME_EFLAGS], X86_EFLAGS_VM
|
test dword ptr [esp+KTRAP_FRAME_EFLAGS], X86_EFLAGS_VM
|
||||||
jnz V86_Exit3
|
jnz V86_Exit
|
||||||
|
|
||||||
/* Check if the frame was edited */
|
/* Check if the frame was edited */
|
||||||
V86_Exit_Return3:
|
|
||||||
test word ptr [esp+KTRAP_FRAME_CS], FRAME_EDITED
|
test word ptr [esp+KTRAP_FRAME_CS], FRAME_EDITED
|
||||||
jz EditedFrame3
|
jz EditedFrame3
|
||||||
|
|
||||||
|
@ -985,16 +982,6 @@ CommonStackClean3:
|
||||||
add esp, 4
|
add esp, 4
|
||||||
iret
|
iret
|
||||||
|
|
||||||
V86_Exit3:
|
|
||||||
/* Move to EDX position */
|
|
||||||
add esp, KTRAP_FRAME_EDX
|
|
||||||
|
|
||||||
/* Restore volatiles */
|
|
||||||
pop edx
|
|
||||||
pop ecx
|
|
||||||
pop eax
|
|
||||||
jmp V86_Exit_Return3
|
|
||||||
|
|
||||||
EditedFrame3:
|
EditedFrame3:
|
||||||
/* Restore real CS value */
|
/* Restore real CS value */
|
||||||
mov ebx, [esp+KTRAP_FRAME_TEMPCS]
|
mov ebx, [esp+KTRAP_FRAME_TEMPCS]
|
||||||
|
|
|
@ -1,22 +1,16 @@
|
||||||
/* $Id$
|
/*
|
||||||
*
|
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
* FILE: ntoskrnl/ke/i386/trap.s
|
* FILE: ntoskrnl/ke/i386/trap.s
|
||||||
* PURPOSE: Exception handlers
|
* PURPOSE: Exception handlers
|
||||||
* PROGRAMMER: David Welch <welch@cwcom.net>
|
* PROGRAMMERS: Alex Ionescu (alex@relsoft.net)
|
||||||
|
* David Welch <welch@cwcom.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* INCLUDES ******************************************************************/
|
/* INCLUDES ******************************************************************/
|
||||||
|
|
||||||
#include <roscfg.h>
|
|
||||||
#include <ndk/asm.h>
|
#include <ndk/asm.h>
|
||||||
#include <internal/i386/ke.h>
|
|
||||||
|
|
||||||
#define KernelMode 0
|
|
||||||
#define UserMode 1
|
|
||||||
|
|
||||||
/* NOTES:
|
/* NOTES:
|
||||||
* The epilog will be replaced by a call to Ki386EoiHelper when bugs are fixed.
|
|
||||||
* The prologue is currently a duplication of the trap enter code in KiDebugService.
|
* The prologue is currently a duplication of the trap enter code in KiDebugService.
|
||||||
* It will be made a macro and shared later.
|
* It will be made a macro and shared later.
|
||||||
*/
|
*/
|
||||||
|
@ -28,43 +22,8 @@
|
||||||
*/
|
*/
|
||||||
_KiTrapEpilog:
|
_KiTrapEpilog:
|
||||||
cmpl $1, %eax /* Check for v86 recovery */
|
cmpl $1, %eax /* Check for v86 recovery */
|
||||||
jne _KiTrapRet
|
jne Kei386EoiHelper@0
|
||||||
jmp _KiV86Complete
|
jmp _KiV86Complete
|
||||||
_KiTrapRet:
|
|
||||||
/* Skip debug information and unsaved registers */
|
|
||||||
addl $0x18, %esp
|
|
||||||
popl %eax /* Dr0 */
|
|
||||||
movl %eax, %dr0
|
|
||||||
popl %eax /* Dr1 */
|
|
||||||
movl %eax, %dr1
|
|
||||||
popl %eax /* Dr2 */
|
|
||||||
movl %eax, %dr2
|
|
||||||
popl %eax /* Dr3 */
|
|
||||||
movl %eax, %dr3
|
|
||||||
popl %eax /* Dr6 */
|
|
||||||
movl %eax, %dr6
|
|
||||||
popl %eax /* Dr7 */
|
|
||||||
movl %eax, %dr7
|
|
||||||
popl %gs
|
|
||||||
popl %es
|
|
||||||
popl %ds
|
|
||||||
popl %edx
|
|
||||||
popl %ecx
|
|
||||||
popl %eax
|
|
||||||
popl %ebx
|
|
||||||
|
|
||||||
/* Restore the old exception handler list */
|
|
||||||
popl %ebx
|
|
||||||
movl %ebx, %fs:KPCR_EXCEPTION_LIST
|
|
||||||
|
|
||||||
popl %fs
|
|
||||||
popl %edi
|
|
||||||
popl %esi
|
|
||||||
popl %ebx
|
|
||||||
popl %ebp
|
|
||||||
addl $0x4, %esp /* Ignore error code */
|
|
||||||
|
|
||||||
iret
|
|
||||||
|
|
||||||
.globl _KiTrapProlog
|
.globl _KiTrapProlog
|
||||||
_KiTrapProlog:
|
_KiTrapProlog:
|
||||||
|
@ -106,7 +65,7 @@ _KiTrapProlog2:
|
||||||
mov ebp, esp
|
mov ebp, esp
|
||||||
|
|
||||||
/* Check if this was from V86 Mode */
|
/* Check if this was from V86 Mode */
|
||||||
test dword ptr [ebp+KTRAP_FRAME_EFLAGS], X86_EFLAGS_VM
|
test dword ptr [ebp+KTRAP_FRAME_EFLAGS], EFLAGS_V86_MASK
|
||||||
//jnz V86_kids
|
//jnz V86_kids
|
||||||
|
|
||||||
/* Get current thread */
|
/* Get current thread */
|
||||||
|
@ -358,7 +317,7 @@ _Ki386AdjustEsp0@4:
|
||||||
mov eax, [eax+KTHREAD_INITIAL_STACK]
|
mov eax, [eax+KTHREAD_INITIAL_STACK]
|
||||||
|
|
||||||
/* Check if V86 */
|
/* Check if V86 */
|
||||||
test dword ptr [edx+KTRAP_FRAME_EFLAGS], X86_EFLAGS_VM
|
test dword ptr [edx+KTRAP_FRAME_EFLAGS], EFLAGS_V86_MASK
|
||||||
jnz NoAdjust
|
jnz NoAdjust
|
||||||
|
|
||||||
/* Bias the stack */
|
/* Bias the stack */
|
||||||
|
|
Loading…
Reference in a new issue