Difference between revisions of "Porting/Wine"

From RCS Wiki
Jump to navigation Jump to search
Line 3: Line 3:
  
 
== Status ==
 
== Status ==
Initial compilation hurdles fixed.  Wine builds and installs but the old 32-bit ppc thunking is incompatible with the new 64-bit systems, and crashes immediately on start.
+
Initial compilation hurdles fixed.  Wine builds and installs but something isn't quite right and all applications crashes when trying to create their respective initial processes.  Unfortunately wine crashes trying to execute an illegal instruction (all zeroes) well after the process has well and truly gone off the rails, so gdb is useless.
 +
 
 +
Example:
 +
<pre>
 +
WINEDEBUG=+all,trace+all wine64 winecfg
 +
 
 +
<lots of normal wine output, DLLs loading and things generally appearing to work during wineserver startup>
 +
 
 +
343629.847:0008:0009:trace:nls:WideCharToMultiByte cp 65010 L"WINEDEBUG=+all,trace+all\0000" -> "WINEDEBUG=+all,trace+all\x00", ret = 25
 +
0009: *fd* 10 <- 23
 +
343629.847:0008:0009:trace:heap:RtlAllocateHeap (0x7fffbb0e0000,7000006a,00000010): returning 0x7fffbb0e3b90
 +
0009: new_process( inherit_all=0, create_flags=00000008, socket_fd=10, exe_file=0000, access=001fffff, cpu=POWERPC64, info_size=304, objattr={wine-devdir=0000,attributes=00000000,sd={},name=L""}, info={debug_flags=0,console_flags=0,console=0000,hstdin=0000,hstdout=0000,hstderr=0000,x=0,y=0,xsize=0,ysize=0,xchars=0,ychars=0,attribute=00,flags=100,show=0,curdir=L"Z:\\",dllpath=L"",imagepath=L"C:\\windows\\system32\\wineboot.exe",cmdline=L"C:\\windows\\system32\\wineboot.exe --init",title=L"C:\\windows\\system32\\wineboot.exe",desktop=L"",shellinfo=L"",runtime=L""}, env=L"SHELL=/bin/bash\0WINDOWID=125829136\0XTERM_VERSION=XTerm(343)\0XTERM_SHELL=/bin/bash\0LOGNAME=wine-dev\0LANG=en_US.UTF-8\0XTERM_LOCALE=en_US.UTF-8\0SSH_CONNECTION=192.168.20.70 59000 192.168.20.73 22\0TERM=xterm\0USER=wine-dev\0DISPLAY=localhost:12.0\0SHLVL=3\0XDG_SESSION_ID=62\0WINEDEBUG=+all,trace+all\0XDG_RUNTIME_DIR=/run/user/0\0SSH_CLIENT=192.168.20.70 59000 22\0DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/0/bus\0MAIL=/var/mail/wine-dev\0SSH_TTY=/dev/pts/7\0_=/usr/bin/wine64\0WINELOADERNOEXEC=1\0" )
 +
0009: new_process() = 0 { info=0014, pid=000a, handle=0018 }
 +
0009: *killed* exit_code=0
 +
0008: *process killed*
 +
Segmentation fault
 +
wine-dev@winehost:/# wineserver: exiting (pid=115735)
 +
0x132c7a060:1: Token id=0.1003 primary=1 impersonation level=-1
 +
0x132c76dc0:1: Handle table last=-1 count=32 process=0x132c79ca0
 +
0x132c79ca0:1: Process id=000a handles=0x132c76dc0
 +
0x132c76f20:1: Startup info in=0000 out=0000 err=000
 +
</pre>
  
 
== To-Do==
 
== To-Do==
* Update thunking in tools/winebuild/import.c for ppc64 systems
+
* Finish updating wine_call_on_stack() for ppc64 systems
 +
* Verify newly written stub assembly / thunking for ppc64 systems
 
* Update register save/restore in winedbg for ppc64
 
* Update register save/restore in winedbg for ppc64
 
* ???
 
* ???

Revision as of 01:19, 25 February 2019

Why?

One word: winelib! There are several large open source projects that, for one reason or another, targeted Windows at their genesis. Many of these projects are quite old, well established, and would take many man-centuries of work to rewrite for native Linux systems. Enabling wine on ppc64 gets us a cheap way to allow these projects to run (when built from source) on ppc64 systems via winelib.

Status

Initial compilation hurdles fixed. Wine builds and installs but something isn't quite right and all applications crashes when trying to create their respective initial processes. Unfortunately wine crashes trying to execute an illegal instruction (all zeroes) well after the process has well and truly gone off the rails, so gdb is useless.

Example:

WINEDEBUG=+all,trace+all wine64 winecfg

<lots of normal wine output, DLLs loading and things generally appearing to work during wineserver startup>

343629.847:0008:0009:trace:nls:WideCharToMultiByte cp 65010 L"WINEDEBUG=+all,trace+all\0000" -> "WINEDEBUG=+all,trace+all\x00", ret = 25
0009: *fd* 10 <- 23
343629.847:0008:0009:trace:heap:RtlAllocateHeap (0x7fffbb0e0000,7000006a,00000010): returning 0x7fffbb0e3b90
0009: new_process( inherit_all=0, create_flags=00000008, socket_fd=10, exe_file=0000, access=001fffff, cpu=POWERPC64, info_size=304, objattr={wine-devdir=0000,attributes=00000000,sd={},name=L""}, info={debug_flags=0,console_flags=0,console=0000,hstdin=0000,hstdout=0000,hstderr=0000,x=0,y=0,xsize=0,ysize=0,xchars=0,ychars=0,attribute=00,flags=100,show=0,curdir=L"Z:\\",dllpath=L"",imagepath=L"C:\\windows\\system32\\wineboot.exe",cmdline=L"C:\\windows\\system32\\wineboot.exe --init",title=L"C:\\windows\\system32\\wineboot.exe",desktop=L"",shellinfo=L"",runtime=L""}, env=L"SHELL=/bin/bash\0WINDOWID=125829136\0XTERM_VERSION=XTerm(343)\0XTERM_SHELL=/bin/bash\0LOGNAME=wine-dev\0LANG=en_US.UTF-8\0XTERM_LOCALE=en_US.UTF-8\0SSH_CONNECTION=192.168.20.70 59000 192.168.20.73 22\0TERM=xterm\0USER=wine-dev\0DISPLAY=localhost:12.0\0SHLVL=3\0XDG_SESSION_ID=62\0WINEDEBUG=+all,trace+all\0XDG_RUNTIME_DIR=/run/user/0\0SSH_CLIENT=192.168.20.70 59000 22\0DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/0/bus\0MAIL=/var/mail/wine-dev\0SSH_TTY=/dev/pts/7\0_=/usr/bin/wine64\0WINELOADERNOEXEC=1\0" )
0009: new_process() = 0 { info=0014, pid=000a, handle=0018 }
0009: *killed* exit_code=0
0008: *process killed*
Segmentation fault
wine-dev@winehost:/# wineserver: exiting (pid=115735)
0x132c7a060:1: Token id=0.1003 primary=1 impersonation level=-1
0x132c76dc0:1: Handle table last=-1 count=32 process=0x132c79ca0
0x132c79ca0:1: Process id=000a handles=0x132c76dc0
0x132c76f20:1: Startup info in=0000 out=0000 err=000

To-Do

  • Finish updating wine_call_on_stack() for ppc64 systems
  • Verify newly written stub assembly / thunking for ppc64 systems
  • Update register save/restore in winedbg for ppc64
  •  ???

Initial patches

Monolithic (will be split when closer to merge):