winedos / Simplify raw mode switch

Jukka Heinonen jhei at iki.fi
Wed Aug 20 11:49:34 CDT 2003


The last relay patch made it possible to simplify
raw mode switch handling. Some rather complex code
can now be deleted.



Changelog:
  Remove unnecessary __wine_call_from_16_regs call frame
  management code from raw mode switch handler.




Index: dlls/winedos/dosexe.h
===================================================================
RCS file: /home/wine/wine/dlls/winedos/dosexe.h,v
retrieving revision 1.28
diff -u -r1.28 dosexe.h
--- dlls/winedos/dosexe.h	30 Jun 2003 02:03:48 -0000	1.28
+++ dlls/winedos/dosexe.h	20 Aug 2003 16:47:56 -0000
@@ -28,7 +28,6 @@
 #include "miscemu.h"
 
 struct _DOSEVENT;
-struct _STACK16FRAME;
 
 /* amount of space reserved for relay stack */
 #define DOSVM_RELAY_DATA_SIZE 4096
@@ -256,8 +255,6 @@
 
 /* relay.c */
 void DOSVM_RelayHandler( CONTEXT86 * );
-void DOSVM_SaveCallFrame( CONTEXT86 *, struct _STACK16FRAME * );
-void DOSVM_RestoreCallFrame( CONTEXT86 *, struct _STACK16FRAME * );
 void DOSVM_BuildCallFrame( CONTEXT86 *, DOSRELAY, LPVOID );
 
 /* soundblaster.c */




Index: dlls/winedos/relay.c
===================================================================
RCS file: /home/wine/wine/dlls/winedos/relay.c,v
retrieving revision 1.3
diff -u -r1.3 relay.c
--- dlls/winedos/relay.c	19 Aug 2003 00:59:23 -0000	1.3
+++ dlls/winedos/relay.c	20 Aug 2003 16:37:31 -0000
@@ -172,81 +172,6 @@
 
 
 /**********************************************************************
- *          DOSVM_SaveCallFrame
- *
- * Save current call frame. This routine must be called from DOSRELAY
- * called using DOSVM_BuildCallFrame before the relay modifies stack 
- * pointer. This routine makes sure that the relay can return safely
- * to application context and that no memory is leaked.
- *
- * Note: If DOSVM_BuildCallFrame was called using 32-bit CS or SS,
- *       old values of CS and SS will be lost. This does not matter
- *       since this routine is only used by Raw Mode Switch.
- */
-void DOSVM_SaveCallFrame( CONTEXT86 *context, STACK16FRAME *frame )
-{
-    *frame = *CURRENT_STACK16;
-
-    /*
-     * If context is using allocated stack, release it.
-     */
-    if (context->SegSs == DOSVM_dpmi_segments->relay_data_sel)
-    {
-        RELAY_Stack16 *stack = RELAY_GetPointer( context->Esp );
-
-        if (!stack->inuse || 
-            stack->stack_bottom != RELAY_MAGIC ||
-            stack->stack_top != RELAY_MAGIC)
-            ERR( "Stack corrupted!\n" );
-
-        stack->inuse = 0;
-    }
-}
-
-
-/**********************************************************************
- *          DOSVM_RestoreCallFrame
- *
- * Restore saved call frame to currect stack. This routine must always
- * be called after DOSVM_SaveCallFrame has been called and before returning
- * from DOSRELAY.
- */
-void DOSVM_RestoreCallFrame( CONTEXT86 *context, STACK16FRAME *frame )
-{
-    /*
-     * Allocate separate stack for relay call.
-     */
-    RELAY_MakeShortContext( context );
-
-    /*
-     * After this function returns to relay code, protected mode
-     * 16 bit stack will contain STACK16FRAME and single WORD
-     * (EFlags, see next comment).
-     */
-    NtCurrentTeb()->cur_stack =
-        MAKESEGPTR( context->SegSs,
-                    context->Esp - sizeof(STACK16FRAME) - sizeof(WORD) );
-    
-    /*
-     * After relay code returns to glue function, protected
-     * mode 16 bit stack will contain interrupt return record:
-     * IP, CS and EFlags. Since EFlags is ignored, it won't
-     * need to be initialized.
-     */
-    context->Esp -= 3 * sizeof(WORD);
-
-    /*
-     * Restore stack frame so that relay code won't be confused.
-     * It should be noted that relay code overwrites IP and CS
-     * in STACK16FRAME with values taken from current CONTEXT86.
-     * These values are what is returned to glue function
-     * (see previous comment).
-     */
-    *CURRENT_STACK16 = *frame;
-}
-
-
-/**********************************************************************
  *          DOSVM_BuildCallFrame
  *
  * Modifies the context so that return to context calls DOSRELAY and 




Index: dlls/winedos/int31.c
===================================================================
RCS file: /home/wine/wine/dlls/winedos/int31.c,v
retrieving revision 1.27
diff -u -r1.27 int31.c
--- dlls/winedos/int31.c	8 Jul 2003 21:11:52 -0000	1.27
+++ dlls/winedos/int31.c	20 Aug 2003 16:37:39 -0000
@@ -675,11 +675,11 @@
 
 
 /**********************************************************************
- *	    RawModeSwitch   (WINEDOS.@)
+ *	    DOSVM_RawModeSwitchHandler
  *
  * DPMI Raw Mode Switch handler
  */
-void WINAPI DOSVM_RawModeSwitch( CONTEXT86 *context )
+void WINAPI DOSVM_RawModeSwitchHandler( CONTEXT86 *context )
 {
   CONTEXT86 rm_ctx;
   int ret;
@@ -764,23 +764,6 @@
 	SET_AX( context, 0x8024 ); /* invalid callback address */
 	SET_CFLAG(context);
     }
-}
-
-
-/**********************************************************************
- *          DOSVM_RawModeSwitchHandler
- *
- * DPMI Raw Mode Switch handler.
- * This routine does all the stack manipulation tricks needed
- * to return from protected mode interrupt using modified 
- * code and stack pointers.
- */
-void WINAPI DOSVM_RawModeSwitchHandler( CONTEXT86 *context )
-{
-    STACK16FRAME frame;
-    DOSVM_SaveCallFrame( context, &frame );
-    DOSVM_RawModeSwitch( context );
-    DOSVM_RestoreCallFrame( context, &frame );
 }




-- 
Jukka Heinonen <http://www.iki.fi/jhei/>



More information about the wine-patches mailing list