Hello,
We've done couple of changes in wine in order to compile with gcc-3.3.1 using binutils-2.14 and run on solaris --- mercy% uname -a SunOS mercy 5.8 Generic_108528-19 sun4u sparc SUNW,Sun-Blade-1000 --- I'm not posting this patch to wine-patch yet, since there are couple of things I'm not sure are solved in "correct" way. Diff file made on 2003-10-06 06:13 EST is attached. I've configured wine this way: "./configure --without-opengl CFLAGS="-g3 -O0""
Here go my questions regarding to this files: * dlls/x11drv/xvidmode.c I've been just ifdeffing out anything I couldn't compile because of missing LIBXXF86VM. Maybe original author of the code knows what *exactly* should be ifdeffed out.
* libs/wine/port.c Hm, good old wine_switch_to_stack() I've been changing aproximately one year ago was changed a lot from that time. Anyways current change I've done in this file prevents crash caused by instruction "0xfed9d100 <start_process+16>: st %i0, [%fp +0x44]" (unused function argument arg resolves to %fp+0x44 address... (why? it's not used in that function, maybe -g3 -O0 flags?)). Substracting 96 bytes from original stack "emulates" ommited save instruction in wine_switch_to_stack() and ensures, that store instruction doesn't crash. Well, I guess original wine_switch_to_stack() code could work with older versions of gcc (very probably with gcc-3.2)...
* programs/Makefile.in Just removed winegdb from building - we still don't have sparc register map (and related) defined.
* tools/bin2res.c include <limits.h> ensures PATH_MAX used later is defined.
* tools/winebuild/import.c This is another hack needed because of gcc-3.3.1 I guess. I don't know if this would work also on x86 platform, but on solaris fixes gas's "Error: operation combines symbols in different segments". Gcc-3.3.1 compiles imports and delayed_imports into the different sections (.data.rel.local, .data.rel), thus gas threw the error mentioned above.
* windows/winproc.c Finally, allignment problem on sparc platform - I've just ifdeffed out packing includes, so structs are alligned to (default) 4 byte boundary.
I'd appreciate any comments - especially those related to gcc-3.3.1.
Regards ;-), Juraj
? output.txt ? wine-solaris-20031006.diff ? dlls/comctl32/a.out ? dlls/comctl32/comctl32.spec.s ? dlls/ddraw/a.out ? dlls/ddraw/ddraw.spec.s ? tools/makedep.o.aBaiw5 ? tools/winebuild.tar.gz ? tools/winebuild/ddraw.spec.s ? tools/winebuild/out.txt ? windows/winproc.ii Index: dlls/iphlpapi/ifenum.c =================================================================== RCS file: /home/wine/wine/dlls/iphlpapi/ifenum.c,v retrieving revision 1.6 diff -u -r1.6 ifenum.c --- dlls/iphlpapi/ifenum.c 5 Sep 2003 23:08:37 -0000 1.6 +++ dlls/iphlpapi/ifenum.c 6 Oct 2003 10:13:07 -0000 @@ -785,14 +785,27 @@
fd = socket(PF_INET, SOCK_DGRAM, 0); if (fd != -1) { +#if defined(__sparc__) + struct lifreq ifr; +#else struct ifreq ifr; +#endif
+#if defined(__sparc__) + strncpy(ifr.lifr_name, name, IFNAMSIZ); + ifr.lifr_name[IFNAMSIZ-1] = '\0'; +#else strncpy(ifr.ifr_name, name, IFNAMSIZ); ifr.ifr_name[IFNAMSIZ-1] = '\0'; +#endif if ((ioctl(fd, SIOCGIFMTU, &ifr))) ret = ERROR_INVALID_DATA; else { +#if defined(__sparc__) + *mtu = ifr.lifr_mtu; +#else *mtu = ifr.ifr_mtu; +#endif ret = NO_ERROR; } } Index: dlls/x11drv/xvidmode.c =================================================================== RCS file: /home/wine/wine/dlls/x11drv/xvidmode.c,v retrieving revision 1.23 diff -u -r1.23 xvidmode.c --- dlls/x11drv/xvidmode.c 30 Sep 2003 00:31:42 -0000 1.23 +++ dlls/x11drv/xvidmode.c 6 Oct 2003 10:13:07 -0000 @@ -101,7 +101,7 @@ return 1; }
-static Bool in_desktop_mode; +static Bool in_desktop_mode = 0; static const unsigned int depths[] = {8, 16, 32};
void X11DRV_XF86VM_Init(void) @@ -454,6 +454,7 @@ #endif }
+#ifdef HAVE_LIBXXF86VM /* implementation of EnumDisplaySettings for XF86VM */ BOOL X11DRV_XF86VM_EnumDisplaySettingsExW( LPCWSTR name, DWORD n, LPDEVMODEW devmode, DWORD flags) { @@ -492,6 +493,7 @@ TRACE("mode %ld -- not present\n", n); return FALSE; } +#endif
/* implementation of ChangeDisplaySettings for XF86VM */ LONG X11DRV_XF86VM_ChangeDisplaySettingsExW( LPCWSTR devname, LPDEVMODEW devmode, @@ -612,17 +614,20 @@ */ BOOL X11DRV_EnumDisplaySettingsExW( LPCWSTR name, DWORD n, LPDEVMODEW devmode, DWORD flags) { +#ifdef HAVE_LIBXXF86VM if (dd_modes) { /* XVidMode */ return X11DRV_XF86VM_EnumDisplaySettingsExW(name, n, devmode, flags); } - else if (in_desktop_mode) + else + if (in_desktop_mode) { /* desktop */ return X11DRV_desktop_EnumDisplaySettingsExW(name, n, devmode, flags); } else +#endif { /* no resolution changing */ return X11DRV_nores_EnumDisplaySettingsExW(name, n, devmode, flags); @@ -674,6 +679,7 @@ { TRACE("Return to original display mode\n"); } +#ifdef HAVE_LIBXXF86VM if (dd_modes) { /* XVidMode */ @@ -687,6 +693,7 @@ hwnd, flags, lpvoid ); } else +#endif { /* no resolution changing */ return X11DRV_nores_ChangeDisplaySettingsExW( devname, devmode, Index: libs/wine/port.c =================================================================== RCS file: /home/wine/wine/libs/wine/port.c,v retrieving revision 1.1 diff -u -r1.1 port.c --- libs/wine/port.c 29 Aug 2003 22:23:42 -0000 1.1 +++ libs/wine/port.c 6 Oct 2003 10:13:07 -0000 @@ -69,7 +69,7 @@ __ASM_GLOBAL_FUNC( wine_switch_to_stack, "mov %o0, %l0\n\t" /* store first argument */ "mov %o1, %l1\n\t" /* store second argument */ - "mov %o2, %sp\n\t" /* store stack */ + "sub %o2, 96, %sp\n\t" /* store stack */ "call %l0, 0\n\t" /* call func */ "mov %l1, %o0\n\t" /* delay slot: arg for func */ "ta 0x01"); /* breakpoint - we never get here */ Index: programs/Makefile.in =================================================================== RCS file: /home/wine/wine/programs/Makefile.in,v retrieving revision 1.39 diff -u -r1.39 Makefile.in --- programs/Makefile.in 23 Jun 2003 19:51:21 -0000 1.39 +++ programs/Makefile.in 6 Oct 2003 10:13:07 -0000 @@ -26,7 +26,6 @@ wineboot \ winecfg \ wineconsole \ - winedbg \ winefile \ winemenubuilder \ winemine \ @@ -53,7 +52,6 @@ wineboot \ winecfg \ wineconsole \ - winedbg \ winefile \ winemenubuilder \ winemine \ @@ -74,7 +72,6 @@ wineboot \ winecfg \ wineconsole \ - winedbg \ winefile \ winemine \ winepath \ @@ -85,7 +82,6 @@ rpcss.exe \ wcmd.exe \ wineconsole.exe \ - winedbg.exe \ winemenubuilder.exe \ winevdm.exe \ winhelp.exe Index: tools/bin2res.c =================================================================== RCS file: /home/wine/wine/tools/bin2res.c,v retrieving revision 1.18 diff -u -r1.18 bin2res.c --- tools/bin2res.c 3 Oct 2003 03:34:10 -0000 1.18 +++ tools/bin2res.c 6 Oct 2003 10:13:07 -0000 @@ -24,6 +24,7 @@ #include "wine/port.h"
#include <stdio.h> +#include <limits.h> #include <stdlib.h> #include <ctype.h> #include <string.h> Index: tools/winebuild/import.c =================================================================== RCS file: /home/wine/wine/tools/winebuild/import.c,v retrieving revision 1.52 diff -u -r1.52 import.c --- tools/winebuild/import.c 13 Aug 2003 21:57:42 -0000 1.52 +++ tools/winebuild/import.c 6 Oct 2003 10:13:07 -0000 @@ -806,7 +806,7 @@
fprintf( outfile, "#ifndef __GNUC__\nstatic void __asm__dummy_import(void) {\n#endif\n\n" ); pos = 20 * (nb_imm + 1); /* offset of imports.data from start of imports */ - fprintf( outfile, "asm(".data\n\t.align %d\n"\n", get_alignment(8) ); + fprintf( outfile, "asm(".section\t\".data.rel.local\"\n\t.align %d\n"\n", get_alignment(8) ); for (i = 0; i < nb_imports; i++) { if (dll_imports[i]->delay) continue; @@ -1082,7 +1082,7 @@ idx++; }
- fprintf( outfile, "\n ".data\n\t.align %d\n"\n", get_alignment(8) ); + fprintf( outfile, "\n ".section\t\".data.rel\"\n\t.align %d\n"\n", get_alignment(8) ); pos = nb_delayed * 32; for (i = 0; i < nb_imports; i++) { Index: windows/winproc.c =================================================================== RCS file: /home/wine/wine/windows/winproc.c,v retrieving revision 1.108 diff -u -r1.108 winproc.c --- windows/winproc.c 5 Sep 2003 23:15:39 -0000 1.108 +++ windows/winproc.c 6 Oct 2003 10:13:07 -0000 @@ -47,7 +47,9 @@ WINE_DECLARE_DEBUG_CHANNEL(relay); WINE_DEFAULT_DEBUG_CHANNEL(win);
-#include "pshpack1.h" +#if !defined(__sparc__) +# include "pshpack1.h" +#endif
/* Window procedure 16-to-32-bit thunk */ typedef struct @@ -78,7 +80,10 @@ BYTE jmp; /* jmp proc (relative jump) */ WNDPROC proc; } WINPROC_JUMP; -#include "poppack.h" + +#if !defined(__sparc__) +# include "poppack.h" +#endif
typedef union {
On Mon, 6 Oct 2003, Juraj Hercek wrote:
Hello,
Here go my questions regarding to this files:
* dlls/iphlpapi/ifenum.c 6 Oct 2003 10:13:07 -0000
These changes look too ugly. Why not do:
#if defined(__sparc__) # define ifreq lifreq # define ifr_name lifr_name #endif
In fact, this may require a configure check, but this is a better start IMO.
- programs/Makefile.in Just removed winegdb from building - we still don't have sparc
register map (and related) defined.
This can't quite go into the tree ... :)
- windows/winproc.c Finally, allignment problem on sparc platform - I've just ifdeffed
out packing includes, so structs are alligned to (default) 4 byte boundary.
If we can't pack on sparc, maybe we should disable packing in pshpackX.h directly -- why is this structure any different from all the others where we use packing?
Dimitrie O. Paun wrote:
- dlls/iphlpapi/ifenum.c 6 Oct 2003 10:13:07 -0000
These changes look too ugly. Why not do:
#if defined(__sparc__) # define ifreq lifreq # define ifr_name lifr_name #endif
In fact, this may require a configure check, but this is a better start IMO.
Yes, I agree. I just wanted to show *all* involved lines. That's also the reason why I send it in "raw" form. ;-).
- programs/Makefile.in Just removed winegdb from building - we still don't have sparc
register map (and related) defined.
This can't quite go into the tree ... :)
Yeah, I know :-)
- windows/winproc.c Finally, allignment problem on sparc platform - I've just ifdeffed
out packing includes, so structs are alligned to (default) 4 byte boundary.
If we can't pack on sparc, maybe we should disable packing in pshpackX.h directly -- why is this structure any different from all the others where we use packing?
Hm, I don't understand how packing is supposed to work in wine and *especially* what should be packed and what shouldn't. I used the fastest way how to make it working, leaving comments on others - you know definitely more about wine than I do :-). AFAIK everything should be alligned to 4 byte boundary in order to avoid SIGSEGV, SIGBUS (or SIGTRAP?) exceptions on sparc platforms.
I know that many changes aren't acceptable by now, one of the reasons was to show what changes needs to be applied in order to compile and run wine on sparc solaris :-).
On Mon, 6 Oct 2003, Juraj Hercek wrote:
Hm, I don't understand how packing is supposed to work in wine and *especially* what should be packed and what shouldn't. I used the fastest way how to make it working, leaving comments on others - you know definitely more about wine than I do :-). AFAIK everything should be alligned to 4 byte boundary in order to avoid SIGSEGV, SIGBUS (or SIGTRAP?) exceptions on sparc platforms.
We shouldn't need packign on sparc, since there is no need for binary compatibility there. That's why I suggested that we can probably just turn it off in pshpackX.h directly.