Hi Martin,

On 2026-06-16 08:40, Martin Storsjö wrote:
> When running Wine on arm64, on HW with pointer authentication
> (armv8.3 and newer), Wine fails to run.

[...]

> The issue can be consistently observed by running
> "WINEDEBUG=+seh wine wineboot" in a fresh install with no
> preexisting wine prefix (~/.wine).
> 
> On older hardware, without support for pointer authentication,
> Wine starts up nicely (and there are a handful of debug printouts
> about unwinding one exception). On newer hardware, it results in
> repeated printouts about EXCEPTION_ILLEGAL_INSTRUCTION.

On systems with FEAT_FPAC support, indeed I could reproduce the behavior
you mentioned: EXCEPTION_ILLEGAL_INSTRUCTION printed out repeatedly,
immediate failure.

On systems with pointer authentication but without FEAT_FPAC, the issue
is more subtle: things seem to more or less work, but explorer.exe maxes
out one CPU core. Also, running simple stuff like `wine cmd` does not
really work.
 
> This fix will be in the upcoming development release Wine 11.12,
> but it also applies cleanly on e.g. Wine 10.0. Applying this
> patch in the Debian packaging will likely fix this issue.

I built a local version of wine with your patch, and it does seem to fix
the issue for systems without FEAT_FPAC. I don't see explorer.exe maxing
out cores, and `wine cmd` works fine.

However, on systems with FEAT_FPAC I still get illegal instructions.

The general difference between the two is that with FEAT_FPAC, the
autiasp (or equivalent) instruction fails with a SIGILL when failing to
validate the value stored in LR. Without FEAT_FPAC, the autiasp
instruction itself does not cause an exception, but instead it leaves a
faulting value in LR. The crash then occurs when that corrupted value is
next used.

See https://wiki.debian.org/ToolChain/PACBTI#PAC-1.

Here's the SIGILL with your patch:

 $ WINEDEBUG=+seh gdb /usr/lib/aarch64-linux-gnu/wine/wine
 [...]
 (gdb) run wineboot
 [...]
 wine_dbg_output: debugstr buffer overflow (contents: 
'002c:trace:seh:dispatch_exception code=c000001d 
(EXCEPTION_ILLEGAL_INSTRUCTION) flags=0 addr=0000FFFFF7D76230
 code=c000001d (EXCEPTION_ILLEGAL_INSTRUCTION) flags=0 addr=0000FFFFF7D763F0
 code=c000001d (EXCEPTION_ILLEGAL_INSTRUCTION) flags=0 addr=0000FFFFF7D763F0
 code=c000001d (EXCEPTION_ILLEGAL_INSTRUCTION) flags=0 addr=0000FFFFF7D763F0
 code=c000001d (EXCEPTION_ILLEGAL_INSTRUCTION) flags=0 addr=0000FFFFF7D763F0
 code=c000001d (EXCEPTION_ILLEGAL_INSTRUCTION) flags=0 addr=0000FFFFF7D763F0
 code=c000001d (EXCEPTION_ILLEGAL_INSTRUCTION) flags=0 addr=0000FFFFF7D763F0
 code=c000001d (EXCEPTION_ILLEGAL_INSTRUCTION) flags=0 addr=0000FFFFF7D763F0
 code=c000001d (EXCEPTION_ILLEGAL_INSTRUCTION) flags=0 addr=0000FFFFF7D763F0
 code=c000001d (EXCEPTION_ILLEGAL_INSTRUCTION) flags=0 addr=0000FFFFF7D763F0
 code=c000001d (EXCEPTION_ILLEGAL_INSTRUCTION) flags=0 addr=0000FFFFF7D763F0
 code=c000001d (EXCEPTION_ILLEGAL_INSTRUCTION) flags=0 addr=0000FFFFF7D763F0
 code=c00000fd (EXCEPTION_STACK_OVERFLOW) flags=0 addr=00006FFFFFD567C4
 ')
 002c:err:virtual:virtual_setup_exception nested exception on signal stack addr 
0xfffff7e7b5bc stack 0x7ffce130
 
 Program received signal SIGILL, Illegal instruction.
 0x0000fffff7d76230 in __wine_syscall_dispatcher () from 
/usr/lib/aarch64-linux-gnu/wine/aarch64-unix/ntdll.so

For anyone who wants to follow along and build a patched wine, the
version currently in sid (10.0~repack-12) does not build for several
reasons.

First you have to install a bunch of unicode-related packages from
stable due to https://bugs.debian.org/1125336

# apt install unicode-data=15.1.0-1 unicode-idna=16.0.0-1 
unicode-cldr-core=46-0.1

Then the make_vulkan bits fail due to the XML files shipped by libvulkan
being too new. Again installing stuff from stable helps:

# apt install libvulkan-dev=1.4.309.0-1 libvulkan1=1.4.309.0-1

The patch disable/duplicate-nls.patch does not seem to apply, I've
commented it out in debian/patch/series. Then later the build fails due
to NLS files not being installed anywhere. Out of time, I just added the
following to debian/wine-common.install to carry on with the build:

usr/* usr/share/wine/nls

Reply via email to