winedos / Fix instruction emulation regression
Jukka Heinonen
jhei at iki.fi
Wed Sep 17 05:50:25 CDT 2003
Recent instruction emulation changes broke DOS protected mode.
This is a quick and dirty fix for that problem.
STI is now emulated in two places. I don't think it is safe to
remove STI emulation from generic instruction
emulation code because Win16 programs may use that instruction.
Interface of the INSTR_EmulateInstruction function has changed so
its description before the function is no longer correct.
Changelog:
Make STI work again in DOS protected mode.
Index: dlls/kernel/instr.c
===================================================================
RCS file: /home/wine/wine/dlls/kernel/instr.c,v
retrieving revision 1.1
diff -u -r1.1 instr.c
--- dlls/kernel/instr.c 17 Sep 2003 04:34:31 -0000 1.1
+++ dlls/kernel/instr.c 17 Sep 2003 10:41:35 -0000
@@ -773,13 +773,10 @@
return 0;
case 0xfb: /* sti */
+ if (NtCurrentTeb()->vm86_pending)
+ break; /* Unable to emulate sti if there are any pending events */
NtCurrentTeb()->dpmi_vif = 1;
context->Eip += prefixlen + 1;
- if (NtCurrentTeb()->vm86_pending)
- {
- NtCurrentTeb()->vm86_pending = 0;
- return EXCEPTION_VM86_STI;
- }
return 0;
}
return ret; /* Unable to emulate it */
Index: dlls/winedos/int31.c
===================================================================
RCS file: /home/wine/wine/dlls/winedos/int31.c,v
retrieving revision 1.34
diff -u -r1.34 int31.c
--- dlls/winedos/int31.c 5 Sep 2003 23:08:28 -0000 1.34
+++ dlls/winedos/int31.c 17 Sep 2003 10:41:41 -0000
@@ -88,8 +88,7 @@
/**********************************************************************
* dpmi_exception_handler
*
- * Handle EXCEPTION_VM86_STI exceptions generated
- * when there are pending asynchronous events.
+ * Handle exceptions generated in DOS protected mode.
*/
static WINE_EXCEPTION_FILTER(dpmi_exception_handler)
{
@@ -99,6 +98,9 @@
if (rec->ExceptionCode == EXCEPTION_VM86_STI)
{
+ /*
+ * Pending asynchronous event has been queued.
+ */
if (ISV86(context))
ERR( "Real mode STI caught by protected mode handler!\n" );
DOSVM_SendQueuedEvents(context);
@@ -106,10 +108,30 @@
}
else if (rec->ExceptionCode == EXCEPTION_VM86_INTx)
{
+ /*
+ * Exit from protected mode due to int21 subfunction 0x4c.
+ * Return back to StartPM function.
+ */
if (ISV86(context))
ERR( "Real mode INTx caught by protected mode handler!\n" );
DPMI_retval = (BYTE)rec->ExceptionInformation[0];
return EXCEPTION_EXECUTE_HANDLER;
+ }
+ else if (rec->ExceptionCode == EXCEPTION_PRIV_INSTRUCTION)
+ {
+ BYTE *ptr = CTX_SEG_OFF_TO_LIN(context, context->SegCs, context->Eip);
+
+ if(*ptr == 0xfb)
+ {
+ /*
+ * Emulate sti instruction.
+ */
+ NtCurrentTeb()->dpmi_vif = 1;
+ NtCurrentTeb()->vm86_pending = 0;
+ context->Eip += 1;
+ DOSVM_SendQueuedEvents(context);
+ return EXCEPTION_CONTINUE_EXECUTION;
+ }
}
#endif
--
Jukka Heinonen <http://www.iki.fi/jhei/>
More information about the wine-patches
mailing list