Filip doesn't like int3. Implemented Trap6 failure on bad stack and V86M
syscall return
Modified: trunk/reactos/ntoskrnl/ke/i386/syscall.S
_____
Modified: trunk/reactos/ntoskrnl/ke/i386/syscall.S
--- trunk/reactos/ntoskrnl/ke/i386/syscall.S 2005-09-13 20:13:05 UTC
(rev 17841)
+++ trunk/reactos/ntoskrnl/ke/i386/syscall.S 2005-09-13 20:26:57 UTC
(rev 17842)
@@ -93,13 +93,23 @@
BadStack:
/* Restore ESP0 stack */
- int 3
mov ecx, [fs:KPCR_TSS]
mov esp, ss:[ecx+KTSS_ESP0]
- /* FIXME: Generate Trap 6*/
- int 3
+ /* Generate V86M Stack for Trap 6 */
+ push 0
+ push 0
+ push 0
+ push 0
+ /* Generate interrupt stack for Trap 6 */
+ push USER_DS
+ push 0
+ push 0x20202
+ push USER_CS
+ push 0
+ jmp _KiTrap6
+
_KiFastCallEntry:
// ==================== UNIQUE SYSENTER STUB. DO NOT DUPLICATE
============//
@@ -417,6 +427,7 @@
jnz V86_Exit
/* Check if the frame was edited */
+V86_Exit_Return:
test word ptr [esp+KTRAP_FRAME_CS], FRAME_EDITED
jz EditedFrame
@@ -500,8 +511,17 @@
sti
sysexit
+V86_Exit:
+ /* Move to EDX position */
+ add esp, KTRAP_FRAME_EDX
+
+ /* Restore volatiles */
+ pop edx
+ pop ecx
+ pop eax
+ jmp V86_Exit_Return
+
AbiosExit:
-V86_Exit:
/* Not yet supported */
int 3
@@ -636,9 +656,10 @@
/* Check for V86 */
test dword ptr [esp+KTRAP_FRAME_EFLAGS], X86_EFLAGS_VM
- jnz V86_Exit
+ jnz V86_Exit2
/* Check if the frame was edited */
+V86_Exit_Return2:
test word ptr [esp+KTRAP_FRAME_CS], FRAME_EDITED
jz EditedFrame2
@@ -677,6 +698,16 @@
add esp, 4
iret
+V86_Exit2:
+ /* Move to EDX position */
+ add esp, KTRAP_FRAME_EDX
+
+ /* Restore volatiles */
+ pop edx
+ pop ecx
+ pop eax
+ jmp V86_Exit_Return
+
EditedFrame2:
/* Restore real CS value */
mov ebx, [esp+KTRAP_FRAME_TEMPCS]
@@ -838,9 +869,10 @@
/* Check for V86 */
test dword ptr [esp+KTRAP_FRAME_EFLAGS], X86_EFLAGS_VM
- jnz V86_Exit
+ jnz V86_Exit3
/* Check if the frame was edited */
+V86_Exit_Return3:
test word ptr [esp+KTRAP_FRAME_CS], FRAME_EDITED
jz EditedFrame3
@@ -879,6 +911,16 @@
add esp, 4
iret
+V86_Exit3:
+ /* Move to EDX position */
+ add esp, KTRAP_FRAME_EDX
+
+ /* Restore volatiles */
+ pop edx
+ pop ecx
+ pop eax
+ jmp V86_Exit_Return
+
EditedFrame3:
/* Restore real CS value */
mov ebx, [esp+KTRAP_FRAME_TEMPCS]