FPU patch for bug 586

admiral coeyman admiral at corner.net
Mon Jun 10 02:34:42 CDT 2002


I'm still unsure of my use of those memory handling functions, however, here is
the patch with everything in a single file.  This should be the preferred
layout from what I've heard.
	This patch adds the self-modifying code part of the FPU interrupts 34->3b and
moves int 3d into the winedos section.
	God Bless,
		--Robert 'Admiral' Coeyman
[ You do not need both of these patches. This one is a better layout. ]

-- 
---
May you live as long as you wish and age but a single day.
http://www.dotguy.net/                 admiral at corner.net
Webmaster/ Linux Administrator         Computer Co-Op/CornerNet
-------------- next part --------------
Index: dlls/kernel/wprocs.spec
===================================================================
RCS file: /home/wine/wine/dlls/kernel/wprocs.spec,v
retrieving revision 1.7
diff -u -u -r1.7 wprocs.spec
--- dlls/kernel/wprocs.spec	14 Dec 2001 23:14:23 -0000	1.7
+++ dlls/kernel/wprocs.spec	10 Jun 2002 07:21:14 -0000
@@ -17,7 +17,6 @@
 142 pascal -interrupt INT_Int2aHandler() INT_Int2aHandler
 147 pascal -interrupt INT_Int2fHandler() INT_Int2fHandler
 149 pascal -interrupt INT_Int31Handler() INT_Int31Handler
-161 pascal -interrupt INT_Int3dHandler() INT_Int3dHandler
 165 pascal -interrupt INT_Int41Handler() INT_Int41Handler
 175 pascal -interrupt INT_Int4bHandler() INT_Int4bHandler
 192 pascal -interrupt INT_Int5cHandler() NetBIOSCall16
Index: dlls/ntdll/Makefile.in
===================================================================
RCS file: /home/wine/wine/dlls/ntdll/Makefile.in,v
retrieving revision 1.27
diff -u -u -r1.27 Makefile.in
--- dlls/ntdll/Makefile.in	14 May 2002 20:55:01 -0000	1.27
+++ dlls/ntdll/Makefile.in	10 Jun 2002 07:21:14 -0000
@@ -62,7 +62,6 @@
 	$(TOPOBJDIR)/msdos/int26.c \
 	$(TOPOBJDIR)/msdos/int2a.c \
 	$(TOPOBJDIR)/msdos/int2f.c \
-	$(TOPOBJDIR)/msdos/int3d.c \
 	$(TOPOBJDIR)/msdos/int41.c \
 	$(TOPOBJDIR)/msdos/int4b.c \
 	$(TOPOBJDIR)/msdos/int5c.c \
@@ -115,6 +114,9 @@
 	sync.c \
 	time.c \
 	wcstring.c
+
+###	$(TOPOBJDIR)/msdos/int3d.c \
+
 
 GEN_ASM_SRCS = \
 	relay16.s \
Index: dlls/winedos/Makefile.in
===================================================================
RCS file: /home/wine/wine/dlls/winedos/Makefile.in,v
retrieving revision 1.13
diff -u -u -r1.13 Makefile.in
--- dlls/winedos/Makefile.in	23 May 2002 02:46:10 -0000	1.13
+++ dlls/winedos/Makefile.in	10 Jun 2002 07:21:14 -0000
@@ -22,6 +22,7 @@
 	int31.c \
 	int33.c \
 	int67.c \
+	fpu.c \
 	ioports.c \
 	module.c \
 	soundblaster.c \
Index: dlls/winedos/dosexe.h
===================================================================
RCS file: /home/wine/wine/dlls/winedos/dosexe.h,v
retrieving revision 1.7
diff -u -u -r1.7 dosexe.h
--- dlls/winedos/dosexe.h	16 May 2002 18:34:48 -0000	1.7
+++ dlls/winedos/dosexe.h	10 Jun 2002 07:21:15 -0000
@@ -114,6 +114,19 @@
 extern void WINAPI DOSVM_Int33Message(UINT,WPARAM,LPARAM);
 extern void WINAPI DOSVM_Int33Console(MOUSE_EVENT_RECORD*);
 
+/* fpu.c */
+extern void WINAPI INT_Int34Handler(CONTEXT86*);
+extern void WINAPI INT_Int35Handler(CONTEXT86*);
+extern void WINAPI INT_Int36Handler(CONTEXT86*);
+extern void WINAPI INT_Int37Handler(CONTEXT86*);
+extern void WINAPI INT_Int38Handler(CONTEXT86*);
+extern void WINAPI INT_Int39Handler(CONTEXT86*);
+extern void WINAPI INT_Int3aHandler(CONTEXT86*);
+extern void WINAPI INT_Int3bHandler(CONTEXT86*);
+extern void WINAPI INT_Int3cHandler(CONTEXT86*);
+extern void WINAPI INT_Int3dHandler(CONTEXT86*); 
+extern void WINAPI INT_Int3eHandler(CONTEXT86*);
+
 /* int67.c */
 extern void WINAPI DOSVM_Int67Handler(CONTEXT86*);
 extern void WINAPI EMS_Ioctl_Handler(CONTEXT86*);
Index: dlls/winedos/dosvm.c
===================================================================
RCS file: /home/wine/wine/dlls/winedos/dosvm.c,v
retrieving revision 1.19
diff -u -u -r1.19 dosvm.c
--- dlls/winedos/dosvm.c	31 May 2002 23:40:54 -0000	1.19
+++ dlls/winedos/dosvm.c	10 Jun 2002 07:21:15 -0000
@@ -652,8 +652,8 @@
     /* 18 */ 0, 0, INT_Int1aHandler, 0, 0, 0, 0, 0,
     /* 20 */ DOSVM_Int20Handler, DOSVM_Int21Handler, 0, 0, 0, INT_Int25Handler, 0, 0,
     /* 28 */ 0, DOSVM_Int29Handler, INT_Int2aHandler, 0, 0, 0, 0, INT_Int2fHandler,
-    /* 30 */ 0, DOSVM_Int31Handler, 0, DOSVM_Int33Handler, 0, 0, 0, 0,
-    /* 38 */ 0, 0, 0, 0, 0, 0, 0, 0,
+    /* 30 */ 0, DOSVM_Int31Handler, 0, DOSVM_Int33Handler, INT_Int34Handler, INT_Int35Handler, INT_Int36Handler, INT_Int37Handler,
+    /* 38 */ INT_Int38Handler, INT_Int39Handler, INT_Int3aHandler, INT_Int3bHandler, INT_Int3cHandler, INT_Int3dHandler, INT_Int3eHandler, 0,
     /* 40 */ 0, 0, 0, 0, 0, 0, 0, 0,
     /* 48 */ 0, 0, 0, 0, 0, 0, 0, 0,
     /* 50 */ 0, 0, 0, 0, 0, 0, 0, 0,
Index: msdos/int3d.c
===================================================================
RCS file: /home/wine/wine/msdos/int3d.c,v
retrieving revision 1.6
diff -u -u -r1.6 int3d.c
--- msdos/int3d.c	10 Mar 2002 00:18:35 -0000	1.6
+++ msdos/int3d.c	10 Jun 2002 07:21:16 -0000
@@ -28,11 +28,37 @@
  *          INT_Int3dHandler (WPROCS.161)
  *
  * Handler for int 3d (FLOATING POINT EMULATION - STANDALONE FWAIT).
+ *
+ * We'll work with the assertion that all systems have FPUs and
+ *  handle the exceptions as exceptions to the rule. This requires
+ *  getting the address in ss:sp, writing 9b 00	to that address-2
+ *  changing ss:sp to point to the address ss:sp -2 and returning.
+ *              --Robert 'Admiral' Coeyman
  */
 void WINAPI INT_Int3dHandler(CONTEXT86 *context)
 {
+    BYTE *codepointer;
+
+/* Are the addresses on the stack stored the right way around? */
+
+/* this section should only execute if you have an FPU */
+   /* first I have to get the return address. */
+    BYTE *retpointer=(BYTE *)CTX_SEG_OFF_TO_LIN(context,context->SegSs,context->Esp);
+/* now I have to convert THAT to a linear address. */
+   	codepointer=(BYTE *)DOSMEM_MapDosToLinear(DOSMEM_MapRealToLinear((DWORD)*retpointer));
+    /* so that I can change the code at that location to 0x9b, 0x90 */
+	codepointer--;     /* back up one byte  */
+	*codepointer=0x90; /* nop  */
+	codepointer--;     /* back up two bytes */
+	*codepointer=0x9b; /* fwait  */
+/* Finally, we have to save the new IP in ss:sp */
+	*retpointer=DOSMEM_MapLinearToDos((LPVOID *)codepointer);
+	return;                                 /* just return here */
+/* End of the section */        
+
     switch(AH_reg(context))
     {
+
     case 0x00:
         break;
 
--- /dev/null	Sun Jul 17 19:46:18 1994
+++ dlls/winedos/fpu.c	Mon Jun 10 02:45:06 2002
@@ -0,0 +1,264 @@
+/*
+ * DOS interrupt 34->3e handlers.  All FPU interrupt code should be
+ * moved into this file.
+ *  int 3d is not activated yet...
+ *
+ * Copyright 2002 Robert 'Admiral' Coeyman
+ *
+ * X11 Friendly.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#include <stdlib.h>
+#include "msdos.h"
+#include "miscemu.h"
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(int);
+
+/*
+ *  The actual work is done by a single routine.
+ */
+
+void FPU_ModifyCode(CONTEXT86 *context, BYTE Opcode);
+
+
+
+/**********************************************************************
+ *          INT_Int34Handler (WPROCS.152)
+ *
+ * Handler for int 34 (FLOATING POINT EMULATION - Opcode 0xd8).
+ *
+ *  The interrupt list isn't specific about what this interrupt
+ *  actually does. [ interrup.m ] 
+ */
+void WINAPI INT_Int34Handler(CONTEXT86 *context)
+{
+
+	TRACE("Int 0x34 called-- FP opcode 0xd8");
+	FPU_ModifyCode(context, 0xd8);
+
+}
+
+/**********************************************************************
+ *          INT_Int35Handler (WPROCS.153)
+ *
+ * Handler for int 35 (FLOATING POINT EMULATION - Opcode 0xd9).
+ *
+ *  The interrupt list isn't specific about what this interrupt
+ *  actually does. [ interrup.m ] 
+ */
+void WINAPI INT_Int35Handler(CONTEXT86 *context)
+{
+	TRACE("Int 0x35 called-- FP opcode 0xd9");
+	FPU_ModifyCode(context, 0xd9);
+
+}
+
+
+/**********************************************************************
+ *          INT_Int36Handler (WPROCS.154)
+ *
+ * Handler for int 36 (FLOATING POINT EMULATION - Opcode 0xda).
+ *
+ *  The interrupt list isn't specific about what this interrupt
+ *  actually does. [ interrup.m ] 
+ */
+void WINAPI INT_Int36Handler(CONTEXT86 *context)
+{
+	TRACE("Int 0x36 called-- FP opcode 0xda");
+	FPU_ModifyCode(context, 0xda);
+
+}
+
+/**********************************************************************
+ *          INT_Int37Handler (WPROCS.155)
+ *
+ * Handler for int 37 (FLOATING POINT EMULATION - Opcode 0xdb).
+ *
+ *  The interrupt list isn't specific about what this interrupt
+ *  actually does. [ interrup.m ] 
+ */
+void WINAPI INT_Int37Handler(CONTEXT86 *context)
+{
+	TRACE("Int 0x37 called-- FP opcode 0xdb");
+	FPU_ModifyCode(context, 0xdb);
+
+}
+
+/**********************************************************************
+ *          INT_Int38Handler (WPROCS.156)
+ *
+ * Handler for int 38 (FLOATING POINT EMULATION - Opcode 0xdc).
+ *
+ *  Between versions 3.0 and 5.01, the original PC-MOS API call that
+ *  was here was moved to int 0xd4.
+ *
+ *  The interrupt list isn't specific about what this interrupt
+ *  actually does. [ interrup.m ] 
+ */
+void WINAPI INT_Int38Handler(CONTEXT86 *context)
+{
+	TRACE("Int 0x38 called-- FP opcode 0xdc");
+	FPU_ModifyCode(context, 0xdc);
+
+}
+
+/**********************************************************************
+ *          INT_Int39Handler (WPROCS.157)
+ *
+ * Handler for int 39 (FLOATING POINT EMULATION - Opcode 0xdd).
+ *
+ *  The interrupt list isn't specific about what this interrupt
+ *  actually does. [ interrup.m ] 
+ */
+void WINAPI INT_Int39Handler(CONTEXT86 *context)
+{
+	TRACE("Int 0x39 called-- FP opcode 0xdd");
+	FPU_ModifyCode(context, 0xdd);
+
+}
+
+/**********************************************************************
+ *          INT_Int3aHandler (WPROCS.158)
+ *
+ * Handler for int 3a (FLOATING POINT EMULATION - Opcode 0xde).
+ *
+ *  The interrupt list isn't specific about what this interrupt
+ *  actually does. [ interrup.m ] 
+ */
+void WINAPI INT_Int3aHandler(CONTEXT86 *context)
+{
+	TRACE("Int 0x3a called-- FP opcode 0xde");
+	FPU_ModifyCode(context, 0xde);
+
+}
+
+/**********************************************************************
+ *          INT_Int3bHandler (WPROCS.159)
+ *
+ * Handler for int 3B (FLOATING POINT EMULATION - Opcode 0xdf).
+ *
+ *  The interrupt list isn't specific about what this interrupt
+ *  actually does. [ interrup.m ] 
+ */
+void WINAPI INT_Int3bHandler(CONTEXT86 *context)
+{
+	TRACE("Int 0x3b called-- FP opcode 0xdf");
+	FPU_ModifyCode(context, 0xdf);
+
+}
+
+
+
+/**********************************************************************
+ *          INT_Int3cHandler (WPROCS.160)
+ *
+ * Handler for int 3C (FLOATING POINT EMULATION - INSTRUCTIONS WITH SEGMENT OVERRIDE).
+ *
+ *  Generated code is CD 3C xy mm ... (CD = int | 3C = this interrupt)
+ *   xy is a modified ESC code and mm is the modR/M byte.
+ *   xy byte seems to be encoded as ss011xxx  or ss000xxx
+ *   ss= segment override.
+ *	00 -> DS
+ *	01 -> SS
+ *	10 -> CS
+ *	11 -> ES
+ *
+ *  11011xxx should be the opcode instruction.
+ */
+void WINAPI INT_Int3cHandler(CONTEXT86 *context)
+{
+	FIXME("Int 3C NOT Implemented");
+	INT_BARF(context, 0x3c);
+}
+
+/**********************************************************************
+ *          INT_Int3dHandler (WPROCS.161)
+ *
+ * Handler for int 3D (FLOATING POINT EMULATION - Standalone FWAIT).
+ *
+ *  Opcode 0x90 is a NOP.  It just fills space where the 3D was.
+ */
+void WINAPI INT_Int3dHandler(CONTEXT86 *context)
+{
+	TRACE("Int 0x3d called-- Standalone FWAIT");
+	FPU_ModifyCode(context, 0x90);
+
+}
+
+
+
+/**********************************************************************
+ *          INT_Int3eHandler (WPROCS.162)
+ *
+ * FLOATING POINT EMULATION -- Borland "Shortcut" call.
+ *  The two bytes following the int 3E instruction are
+ *  the subcode and a NOP ( 0x90 ), except for subcodes DC and DE
+ *  where the second byte is the register count.
+ *
+ *  Direct access 4.0 modifies and does not restore this vector.
+ *
+ */
+void WINAPI INT_Int3eHandler(CONTEXT86 *context)
+{
+	FIXME("Int 3E NOT Implemented");
+	INT_BARF(context, 0x3e);
+}
+
+/**********************************************************************
+ *          FPU_ModifyCode
+ *
+ *   This is the function that inserts the 0x9b fwait instruction
+ *   and the actual FPU opcode into the program.
+ *           -A.C.
+ *
+ */
+
+void FPU_ModifyCode(CONTEXT86 *context, BYTE Opcode)
+{
+   BYTE *codepointer;
+/* 
+ * All *NIX systems should have a real or kernel emulated FPU. 
+ */
+
+   /* 
+    * first I have to get the return address. 
+    */
+
+    BYTE *retpointer=(BYTE *)CTX_SEG_OFF_TO_LIN(context,context->SegSs,context->Esp);
+
+   /* 
+    * now I have to convert THAT to a linear address. 
+    */
+
+   	codepointer=(BYTE *)DOSMEM_MapDosToLinear((LPVOID *)DOSMEM_MapRealToLinear((DWORD)*retpointer));
+ 
+   /* 
+    * so that I can change the code at that location to 
+    *  fwait [ 0x9b ] followed by the Opcode byte. 
+    */
+
+	codepointer--;                         /* back up one byte  */
+	*codepointer=Opcode;                   /* The FPU opcode  */
+	codepointer--;                         /* back up two bytes */
+	*codepointer=0x9b;                     /* fwait prefix */
+                                /* 
+                                 * Finally, we have to save the new IP in 
+                                 * ss:sp 
+                                 */
+	*retpointer=DOSMEM_MapLinearToDos((LPVOID *)codepointer);
+}


More information about the wine-patches mailing list