ARM support

Motivation

Windows apps are mostly compiled for x86 and they won't run on ARM with bare Wine, likewise ARM applications won't run on x86(_64) with bare Wine, so this is not our motivation. The original Motivation was to be able to run winelib-apps on ARM, that even was before it got public that win8 will run on ARM devices. Meanwhile we are in progress to support these new ARM PEs for win8! Possible other goals, but they need some more brainstorming:

  • use it for WineCE, which might be able to run WinCE apps. Actual Problem is that all CE apps come along without relocation table, so they should be loaded at their baseaddress (0x10000), which might not always be free. (Further all DLL exports should be register call on x86.) Still there is a pre-alpha or maybe proof-of-concept of WineCE at github.

  • run the assembler parts of x86 in qemu and call function in Wine compiled for ARM, which might speed up some things (darwine tried that before to support x86 apps on PowerPC, but they stopped because the byteswapping (big endian <-> little endian) was too much work, but ARM is mostly little endian, so we have a chance if everything works fine with packed structures. I already gathered some information how darwine tried to do it)

Status

  • Yes, It works! (TM)
  • First patch was September 18. 2009, final patchset sent September 18. 2010 and they got in Wine-1.3.4
  • Wine on ARM already get's packaged in Maemo and Fedora.
  • Already ported Putty to ARM as winelib application.
  • Running trivial win8 ARM PEs also works with native c runtime.

Todo

  • (./) libs/port/interlocked.c: get multiarch ready

  • (./) libs/wine/port.c: add assembler parts

  • (./) add assembler parts in winebuild

  • (./) find the problem with wineboot

  • (./) rebase the patches to current git

  • (./) make some tools and dlls ARM ready (step by step, mostly easy so AndreHentschel will do it when its time has come)

  • (./) turn the debugger stuff in winedbg and dbghelp from stubs to implementation for ARM (mostly done)

  • (./) add an ARM disassembler

  • (./) add a Thumb disassembler

  • (./) add a Thumb2 disassembler

  • (./) Implement LCMapStringEx to support win8 PEs (Bug 29730)

  • (./) relay tracing (winebuild port to ARM? on wine-devel)

  • (./) relocation (LdrProcessRelocationBlock)

  • libs/port/interlocked.c: maybe native operations
  • wine-gecko/wine-mono ARM port (waiting for mingw-w64-arm)

  • (./) Notify the user when the kernel doesn't use a 3GiB/1GiB user/kernel virtual memory split (Bug 31892)

  • Get the Linux Kernel patch upstream that fixes running win32/ARM applications

Compiling

Toolchains:

before wine-1.5.4

e.g. crosscompiling per Scratchbox (An ARM mode crti.o is expected)

wine-1.5.4 - wine-1.5.7

Use the Linaro toolchain (A Thumb mode crti.o is expected (Bug 30134))

after wine-1.5.7

Every toolchain with Thumb support should work as we are independent from the crti.o mode now

Compiling on the ARM Device is recommended, anyway here is a crosscompiling example:

../configure --host=arm-linux-gnueabi host_alias=arm-linux-gnueabi --with-wine-tools=../path/to/your/native/wine/build

How to help

  • Fix compiler warnings

x86 per qemu

Actually there is a bug in qemu, so it can't work without a patch (qemu-i386-user on ARM host: wine hangs).

This configuration is not supported, but you'll be able to run some Applications. Don't ask for support on winehq.org, but be free to read I got Wine/x86 1.5.11 to run on Linux/ARM with qemu!.

./configure --target-list=i386-linux-user --extra-cflags=-marm && make
  • copy Wine/x86 with all needed libraries from your desktop to the corresponding /usr/gnemul/qemu-i386/* folders except wine-preloader (it won't work)
  • as root run

echo ':i386:M::\x7fELF\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x03:\xff\xff\xff\xff\xff\xfe\xfe\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfb\xff\xff:/path/to/patched/qemu/i386-linux-user/qemu-i386:' >/proc/sys/fs/binfmt_misc/register
echo ':DOSWin:M::MZ::/usr/gnemul/qemu-i386/usr/bin/wine:' >/proc/sys/fs/binfmt_misc/register
  • create a wineprefix on your desktop with

WINEARCH=win32 WINEPREFIX=~/.winex86 wine wineboot
  • copy it from your desktop to your home folder
  • run Wine/x86 with something like /path/to/patched/qemu/i386-linux-user/qemu-i386 /usr/gnemul/qemu-i386/usr/bin/wine winecfg

Remember: This configuration is not supported. Don't ask for support on winehq.org.

See also

ARM commits in Wine (and the Thumb ones)

ARM Bugs

aarch64: ARM64

My and Vincents slides can be found here: FOSDEM2013

For Windows RT recompiled applications: at xda-developers and at shinysurface

Examples of Winelib ports: First tests with Wine ARM - on OpenPan-dora

Example use of Qemu for running x86 code: Wine for PPC (per qemu usermode emulation)

Example of porting existing source to Android using SDL: Qemu on Android

Much earlier, there was some experience using Qemu to run the WINE x86 binary under Zaurus's ARM Debian: http://www.oesf.org/forum/index.php?showtopic=14829

Qemu Backend success story: http://forum.winehq.org/viewtopic.php?t=13286 and http://forum.winehq.org/viewtopic.php?t=13330

Mixed topic, including ARM discussions: http://forum.winehq.org/viewtopic.php?p=67218

Some x86-to-ARM translation strategies were also discussed: http://forum.openhandhelds.org/viewtopic.php?f=16&t=1088

Replacing X11 backend driver with SDL (mostly for Android): http://forum.winehq.org/viewtopic.php?t=13533

Android running x86 wine and solitaire (by using ubuntu hack and binfmt) : http://forum.xda-developers.com/showthread.php?t=1258506

Winulator (Android APP) claims it is not wine-based, but does somewhat the same a Wine x86_2_ARM would do: http://docs.winulator.com/faq

Limbo is an Intel x86 PC Emulator for Android based on QEMU,also uses code from android-vnc-viewer and glib among others: https://code.google.com/p/limbo-android/


CategoryArchitecture

ARM (last edited 2013-05-02 09:19:37 by JuanMelgarejo)