Subject: WINE
To: None <port-i386@NetBSD.ORG>
From: Charles M. Hannum <mycroft@gnu.ai.mit.edu>
List: port-i386
Date: 11/01/1994 15:51:55
Well, I grabbed Wine 941030 and made it work with GCC 2.4.5 under
NetBSD. It turns out that the main problem has to do with structure
packing; GCC 2.6.0 uses `__attribute__((packed))' on individual
structure members to indicate that they should be packed tightly
against the previous elements, but GCC 2.4.5 ignores that attribute.
I added appropriate `#pragma pack' directives to get the same effect.
While getting WINE to run, I made the following changes. Someone who
actually cares more about it than I do should decide what to do with
them.
BTW, I've noticed that Browser boxes don't work right, About boxes
crash the emulator, and Help menus generally fork another WINE process
which spins in an apparently infinite loop (after fixing a kernel bug
that caused forking with a local LDT to crash the machine, anyway).
-----8<-----snip-----8<-----snip-----8<-----snip-----8<-----snip-----8<-----
diff -rc2 t/wine941030/controls/edit.c wine941030/controls/edit.c
*** t/wine941030/controls/edit.c Sun Oct 30 11:26:21 1994
--- wine941030/controls/edit.c Tue Nov 1 00:22:01 1994
***************
*** 585,589 ****
/* set up text cursor for edit class */
CLASS_FindClassByName("EDIT", &classPtr);
! classPtr->wc.hCursor = LoadCursor(0, IDC_IBEAM);
/* paint background on first WM_PAINT */
--- 585,589 ----
/* set up text cursor for edit class */
CLASS_FindClassByName("EDIT", &classPtr);
! classPtr->wc.hCursor = LoadCursor((HANDLE)NULL, IDC_IBEAM);
/* paint background on first WM_PAINT */
diff -rc2 t/wine941030/controls/widgets.c wine941030/controls/widgets.c
*** t/wine941030/controls/widgets.c Sun Oct 16 09:53:33 1994
--- wine941030/controls/widgets.c Tue Nov 1 00:22:08 1994
***************
*** 63,67 ****
for (i = 0; i < NB_BUILTIN_CLASSES; i++, class++)
{
! class->hCursor = LoadCursor( 0, IDC_ARROW );
if (!RegisterClass( class )) return FALSE;
}
--- 63,67 ----
for (i = 0; i < NB_BUILTIN_CLASSES; i++, class++)
{
! class->hCursor = LoadCursor( (HANDLE)NULL, IDC_ARROW );
if (!RegisterClass( class )) return FALSE;
}
diff -rc2 t/wine941030/include/class.h wine941030/include/class.h
*** t/wine941030/include/class.h Tue Feb 22 23:49:51 1994
--- wine941030/include/class.h Tue Nov 1 00:45:49 1994
***************
*** 12,15 ****
--- 12,17 ----
#define CLASS_MAGIC 0x4b4e /* 'NK' */
+ #pragma pack(1)
+
/* !! Don't change this structure (see GetClassLong()) */
typedef struct tagCLASS
***************
*** 23,26 ****
--- 25,30 ----
WORD wExtra[1]; /* Class extra bytes */
} CLASS;
+
+ #pragma pack(4)
diff -rc2 t/wine941030/include/dialog.h wine941030/include/dialog.h
*** t/wine941030/include/dialog.h Sun Oct 16 14:34:13 1994
--- wine941030/include/dialog.h Tue Nov 1 00:45:52 1994
***************
*** 10,13 ****
--- 10,14 ----
#include "windows.h"
+ #pragma pack(1)
/* Dialog info structure.
***************
*** 65,68 ****
--- 66,70 ----
} DLGTEMPLATE;
+ #pragma pack(4)
#endif /* DIALOG_H */
diff -rc2 t/wine941030/include/gdi.h wine941030/include/gdi.h
*** t/wine941030/include/gdi.h Sun Oct 30 11:26:30 1994
--- wine941030/include/gdi.h Tue Nov 1 00:45:55 1994
***************
*** 28,31 ****
--- 28,32 ----
#define METAFILE_DC_MAGIC 0x4f51
+ #pragma pack(1)
typedef struct tagREGION
***************
*** 82,85 ****
--- 83,88 ----
REGION region;
} RGNOBJ;
+
+ #pragma pack(4)
typedef struct
diff -rc2 t/wine941030/include/registers.h wine941030/include/registers.h
*** t/wine941030/include/registers.h Mon Aug 15 17:54:44 1994
--- wine941030/include/registers.h Mon Oct 31 19:21:06 1994
***************
*** 34,38 ****
--- 34,42 ----
#define SI context->sc_esi
#define SP context->sc_esp
+ #ifndef __FreeBSD__
+ #define EFL context->sc_eflags
+ #else
#define EFL context->sc_efl
+ #endif
#define EIP context->sc_eip
diff -rc2 t/wine941030/include/windows.h wine941030/include/windows.h
*** t/wine941030/include/windows.h Sun Oct 30 11:26:33 1994
--- wine941030/include/windows.h Tue Nov 1 00:45:41 1994
***************
*** 123,126 ****
--- 123,128 ----
#endif
+ #pragma pack(1)
+
/* Window classes */
***************
*** 2341,2344 ****
--- 2343,2348 ----
#define META_CREATEBITMAP 0x06FE
#define META_CREATEREGION 0x06FF
+
+ #pragma pack(4)
diff -rc2 t/wine941030/include/wine.h wine941030/include/wine.h
*** t/wine941030/include/wine.h Wed Jun 8 00:11:14 1994
--- wine941030/include/wine.h Mon Oct 31 19:20:39 1994
***************
*** 26,30 ****
unsigned long sc_eip;
unsigned short sc_cs, __csh;
! unsigned long sc_efl;
unsigned long esp_at_signal;
unsigned short sc_ss, __ssh;
--- 26,30 ----
unsigned long sc_eip;
unsigned short sc_cs, __csh;
! unsigned long sc_eflags;
unsigned long esp_at_signal;
unsigned short sc_ss, __ssh;
diff -rc2 t/wine941030/loader/signal.c wine941030/loader/signal.c
*** t/wine941030/loader/signal.c Sun Oct 30 11:26:38 1994
--- wine941030/loader/signal.c Mon Oct 31 16:08:21 1994
***************
*** 309,313 ****
--- 309,317 ----
ret = TRUE;
}
+ #ifdef linux
wine_sigaction(SIGSEGV, &old_act, NULL);
+ #else
+ sigaction(SIGSEGV, &old_act, NULL);
+ #endif
return ret;
}
diff -rc2 t/wine941030/misc/dos_fs.c wine941030/misc/dos_fs.c
*** t/wine941030/misc/dos_fs.c Sun Oct 30 11:26:44 1994
--- wine941030/misc/dos_fs.c Mon Oct 31 15:37:51 1994
***************
*** 22,26 ****
#endif
#if defined(__NetBSD__) || defined(__FreeBSD__)
! #include <sys/types.h>
#include <sys/mount.h>
#endif
--- 22,26 ----
#endif
#if defined(__NetBSD__) || defined(__FreeBSD__)
! #include <sys/param.h>
#include <sys/mount.h>
#endif
diff -rc2 t/wine941030/objects/bitblt.c wine941030/objects/bitblt.c
*** t/wine941030/objects/bitblt.c Sun Oct 30 11:26:55 1994
--- wine941030/objects/bitblt.c Mon Oct 31 18:00:30 1994
***************
*** 381,387 ****
"imull %%edx\n\t"
"idivl %3\n\t"
! : "=a" (result) /* out */
! : "a" (m1), "d" (m2), "g" (d) /* in */
! : "ax", "dx" /* mod */
);
return result;
--- 381,387 ----
"imull %%edx\n\t"
"idivl %3\n\t"
! : "=&a" (result) /* out */
! : "0" (m1), "d" (m2), "g" (d) /* in */
! : "%edx" /* mod */
);
return result;
diff -rc2 t/wine941030/rc/Imakefile wine941030/rc/Imakefile
*** t/wine941030/rc/Imakefile Sun Oct 30 11:27:00 1994
--- wine941030/rc/Imakefile Mon Oct 31 15:54:36 1994
***************
*** 7,11 ****
echo WINDOWS_H_ENDS_HERE >>$*.rct
cat $< >>$*.rct
! gcc -E -x c $(CFLAGS) $*.rct | sed -e '1,/^WINDOWS_H_ENDS_HERE/d' | winerc -v -p $* >$@
$(RM) $*.rct
--- 7,11 ----
echo WINDOWS_H_ENDS_HERE >>$*.rct
cat $< >>$*.rct
! gcc -E -x c $(CFLAGS) $*.rct | sed -e '1,/^WINDOWS_H_ENDS_HERE/d' | ./winerc -v -p $* >$@
$(RM) $*.rct
***************
*** 27,31 ****
winerc.c
! OBJS = $(SRCS:.c=.o)
depend:: rc.tab.c rc.tab.h lex.yy.c
--- 27,31 ----
winerc.c
! OBJS = $(SRCS:.c=.o) /usr/lib/libl.a
depend:: rc.tab.c rc.tab.h lex.yy.c
diff -rc2 t/wine941030/rc/rc.y wine941030/rc/rc.y
*** t/wine941030/rc/rc.y Sun Oct 30 11:27:03 1994
--- wine941030/rc/rc.y Mon Oct 31 15:50:06 1994
***************
*** 36,40 ****
%%
! resource_file: resources {create_output($1)}
/*resources are put into a linked list*/
--- 36,40 ----
%%
! resource_file: resources {create_output($1);}
/*resources are put into a linked list*/
diff -rc2 t/wine941030/rc/winerc.c wine941030/rc/winerc.c
*** t/wine941030/rc/winerc.c Sun Oct 30 11:27:05 1994
--- wine941030/rc/winerc.c Mon Oct 31 15:51:28 1994
***************
*** 30,34 ****
--- 30,38 ----
int optc,lose;
lose=0;
+ #ifdef __NetBSD__
+ while((optc=getopt(argc,argv,"dp:v"))!=-1)
+ #else
while((optc=getopt(argc,argv,"dp:v",0))!=EOF)
+ #endif
switch(optc)
{
diff -rc2 t/wine941030/toolkit/hello.c wine941030/toolkit/hello.c
*** t/wine941030/toolkit/hello.c Mon Jun 20 13:01:21 1994
--- wine941030/toolkit/hello.c Tue Nov 1 00:22:12 1994
***************
*** 52,56 ****
class.hInstance = inst;
class.hIcon = LoadIcon (0, IDI_APPLICATION);
! class.hCursor = LoadCursor (0, IDC_ARROW);
class.hbrBackground = GetStockObject (WHITE_BRUSH);
class.lpszMenuName = NULL;
--- 52,56 ----
class.hInstance = inst;
class.hIcon = LoadIcon (0, IDI_APPLICATION);
! class.hCursor = LoadCursor ((HANDLE)NULL, IDC_ARROW);
class.hbrBackground = GetStockObject (WHITE_BRUSH);
class.lpszMenuName = NULL;
diff -rc2 t/wine941030/tools/build.c wine941030/tools/build.c
*** t/wine941030/tools/build.c Sun Oct 30 11:27:06 1994
--- wine941030/tools/build.c Mon Oct 31 19:20:54 1994
***************
*** 630,634 ****
--- 630,638 ----
context_strings[i] = PUSH_EIP;
+ #ifndef __FreeBSD__
+ i = n_context_strings - 1 + ((int) &context - (int) &context.sc_eflags) / 4;
+ #else
i = n_context_strings - 1 + ((int) &context - (int) &context.sc_efl) / 4;
+ #endif
context_strings[i] = PUSH_EFL;
pop_strings[n_context_strings - 1 - i] = POP_EFL;
diff -rc2 t/wine941030/windows/cursor.c wine941030/windows/cursor.c
*** t/wine941030/windows/cursor.c Sun Oct 30 11:27:07 1994
--- wine941030/windows/cursor.c Mon Oct 31 15:59:35 1994
***************
*** 310,314 ****
CURSORALLOC *lpcur;
! if (!(lpcur = (CURSORALLOC *)GlobalLock(hCursor))) return FALSE;
if (rootWindow != DefaultRootWindow(display))
{
--- 310,314 ----
CURSORALLOC *lpcur;
! if (!(lpcur = (CURSORALLOC *)GlobalLock(hCursor))) return;
if (rootWindow != DefaultRootWindow(display))
{
diff -rc2 t/wine941030/windows/nonclient.c wine941030/windows/nonclient.c
*** t/wine941030/windows/nonclient.c Sun Oct 30 11:27:11 1994
--- wine941030/windows/nonclient.c Tue Nov 1 00:22:29 1994
***************
*** 734,754 ****
case HTLEFT:
case HTRIGHT:
! return SetCursor( LoadCursor( 0, IDC_SIZEWE ) );
case HTTOP:
case HTBOTTOM:
! return SetCursor( LoadCursor( 0, IDC_SIZENS ) );
case HTTOPLEFT:
case HTBOTTOMRIGHT:
! return SetCursor( LoadCursor( 0, IDC_SIZENWSE ) );
case HTTOPRIGHT:
case HTBOTTOMLEFT:
! return SetCursor( LoadCursor( 0, IDC_SIZENESW ) );
}
/* Default cursor: arrow */
! return SetCursor( LoadCursor( 0, IDC_ARROW ) );
}
--- 734,754 ----
case HTLEFT:
case HTRIGHT:
! return SetCursor( LoadCursor( (HANDLE)NULL, IDC_SIZEWE ) );
case HTTOP:
case HTBOTTOM:
! return SetCursor( LoadCursor( (HANDLE)NULL, IDC_SIZENS ) );
case HTTOPLEFT:
case HTBOTTOMRIGHT:
! return SetCursor( LoadCursor( (HANDLE)NULL, IDC_SIZENWSE ) );
case HTTOPRIGHT:
case HTBOTTOMLEFT:
! return SetCursor( LoadCursor( (HANDLE)NULL, IDC_SIZENESW ) );
}
/* Default cursor: arrow */
! return SetCursor( LoadCursor( (HANDLE)NULL, IDC_ARROW ) );
}
diff -rc2 t/wine941030/windows/win.c wine941030/windows/win.c
*** t/wine941030/windows/win.c Sun Oct 30 11:27:13 1994
--- wine941030/windows/win.c Tue Nov 1 00:22:34 1994
***************
*** 437,441 ****
CURSORALLOC *cursor;
HCURSOR hCursor = classPtr->wc.hCursor;
! if (!hCursor) hCursor = LoadCursor( 0, IDC_ARROW );
cursor = (CURSORALLOC *) GlobalLock(hCursor);
--- 437,441 ----
CURSORALLOC *cursor;
HCURSOR hCursor = classPtr->wc.hCursor;
! if (!hCursor) hCursor = LoadCursor( (HANDLE)NULL, IDC_ARROW );
cursor = (CURSORALLOC *) GlobalLock(hCursor);
-----8<-----snip-----8<-----snip-----8<-----snip-----8<-----snip-----8<-----