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]