mirror of
https://gitlab.winehq.org/wine/wine-staging.git
synced 2025-01-28 22:04:43 -08:00
Added ntdll-aarch64-TEB patchset
This commit is contained in:
parent
8f33477760
commit
00b434ec7f
@ -20,7 +20,7 @@ index 88f49a0..d2d9fd7 100644
|
||||
}
|
||||
+
|
||||
+/******************************************************************************
|
||||
+ * D3DKMTCloseAdapter [GDI32.@]
|
||||
+ * D3DKMTQueryStatistics [GDI32.@]
|
||||
+ */
|
||||
+NTSTATUS WINAPI D3DKMTQueryStatistics(D3DKMT_QUERYSTATISTICS *stats)
|
||||
+{
|
||||
|
@ -0,0 +1,39 @@
|
||||
From d99a6180cdca6274f1a8b868c38a89883daf6e23 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Storsjo <martin@martin.st>
|
||||
Date: Wed, 21 Jun 2017 11:42:40 +0300
|
||||
Subject: [PATCH] configure: Avoid clobbering x18 on arm64 within wine
|
||||
|
||||
On aarch64/arm64 on linux, the compiler is free to use x18 for normal
|
||||
code generation (while the register is reserved on iOS/darwin, and
|
||||
on windows).
|
||||
|
||||
If targeting arm64, check for the flags that allows this register to
|
||||
be left untouched (the flag is supported both by gcc and clang).
|
||||
|
||||
Similar issues can still pop up as soon as system library functions
|
||||
that happen to touch x18 are called, unless the system libraries have
|
||||
been built with the same flag.
|
||||
|
||||
Signed-off-by: Martin Storsjo <martin@martin.st>
|
||||
---
|
||||
configure.ac | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index d1502bacf7..6cf838ef09 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -212,6 +212,10 @@ case $host in
|
||||
[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <stdarg.h>]], [[void func(__builtin_ms_va_list *args);]])],
|
||||
[wine_cv_builtin_ms_va_list=yes],[wine_cv_builtin_ms_va_list=no])])
|
||||
test $wine_cv_builtin_ms_va_list != no || AC_MSG_ERROR([You need clang >= 5.0 to build Wine for arm64.])
|
||||
+ # Avoid clobbering the x18 register which is reserved in windows.
|
||||
+ # This isn't complete/enough unless all of the system libraries have
|
||||
+ # been built with the same flag though.
|
||||
+ WINE_TRY_CFLAGS([-ffixed-x18], [CFLAGS="$CFLAGS -ffixed-x18"])
|
||||
;;
|
||||
i[[3456789]]86*)
|
||||
enable_win16=${enable_win16:-yes}
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,60 @@
|
||||
From ea639387658c32c0e7df03795462f140f8921f06 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Storsjo <martin@martin.st>
|
||||
Date: Wed, 16 Aug 2017 23:48:40 +0300
|
||||
Subject: [PATCH] ntdll: Always restore TEB to x18 on aarch 64 on return
|
||||
from calls to builtins
|
||||
|
||||
This requires always enabling relaying of calls though.
|
||||
|
||||
This isn't enough for cases where builtin functions call back into
|
||||
the user code though, but works well enough for all pratical cases
|
||||
I've run so far.
|
||||
|
||||
This does give a bit of performance overhead, but it makes it
|
||||
possible to run most real arm64 binaries (all I've tried).
|
||||
|
||||
Signed-off-by: Martin Storsjo <martin@martin.st>
|
||||
---
|
||||
dlls/ntdll/loader.c | 8 +++++++-
|
||||
dlls/ntdll/relay.c | 4 ++++
|
||||
2 files changed, 11 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c
|
||||
index 994ff6f215..1f40021b7a 100644
|
||||
--- a/dlls/ntdll/loader.c
|
||||
+++ b/dlls/ntdll/loader.c
|
||||
@@ -1827,7 +1827,13 @@ static void load_builtin_callback( void *module, const char *filename )
|
||||
SERVER_END_REQ;
|
||||
|
||||
/* setup relay debugging entry points */
|
||||
- if (TRACE_ON(relay)) RELAY_SetupDLL( module );
|
||||
+#ifdef __aarch64__
|
||||
+ /* Always enable relay entry points on aarch64, to allow restoring
|
||||
+ * the TEB to x18. */
|
||||
+#else
|
||||
+ if (TRACE_ON(relay))
|
||||
+#endif
|
||||
+ RELAY_SetupDLL( module );
|
||||
}
|
||||
|
||||
|
||||
diff --git a/dlls/ntdll/relay.c b/dlls/ntdll/relay.c
|
||||
index 7974587c4a..1d88eddb3f 100644
|
||||
--- a/dlls/ntdll/relay.c
|
||||
+++ b/dlls/ntdll/relay.c
|
||||
@@ -709,8 +709,12 @@ static LONGLONG WINAPI relay_call( struct relay_descr *descr, unsigned int idx,
|
||||
{
|
||||
unsigned int nb_args;
|
||||
void *func = relay_trace_entry( descr, idx, stack, &nb_args );
|
||||
+ void *teb;
|
||||
LONGLONG ret = call_entry_point( func, nb_args, stack );
|
||||
relay_trace_exit( descr, idx, stack[-1], ret );
|
||||
+ teb = NtCurrentTeb();
|
||||
+ /* Restore the TEB pointer, in case the builtin call clobbered it. */
|
||||
+ __asm__ __volatile__( "mov x18, %0" : : "r" (teb) );
|
||||
return ret;
|
||||
}
|
||||
|
||||
--
|
||||
2.17.1
|
||||
|
1
patches/ntdll-aarch-TEB/definition
Normal file
1
patches/ntdll-aarch-TEB/definition
Normal file
@ -0,0 +1 @@
|
||||
Fixes: [38780] AArch64 platforms: register X18 (TEB) must remain reserved for Wine to run 64-bit ARM Windows applications.
|
@ -225,6 +225,7 @@ patch_enable_all ()
|
||||
enable_ntdll_WRITECOPY="$1"
|
||||
enable_ntdll_Wait_User_APC="$1"
|
||||
enable_ntdll_Zero_mod_name="$1"
|
||||
enable_ntdll_aarch_TEB="$1"
|
||||
enable_ntdll_set_full_cpu_context="$1"
|
||||
enable_ntoskrnl_Stubs="$1"
|
||||
enable_ntoskrnl_exe_Fix_Relocation="$1"
|
||||
@ -812,6 +813,9 @@ patch_enable ()
|
||||
ntdll-Zero_mod_name)
|
||||
enable_ntdll_Zero_mod_name="$2"
|
||||
;;
|
||||
ntdll-aarch-TEB)
|
||||
enable_ntdll_aarch_TEB="$2"
|
||||
;;
|
||||
ntdll-set_full_cpu_context)
|
||||
enable_ntdll_set_full_cpu_context="$2"
|
||||
;;
|
||||
@ -3836,7 +3840,7 @@ if test "$enable_eventfd_synchronization" -eq 1; then
|
||||
printf '%s\n' '+ { "Zebediah Figura", "ntdll: Yield during PulseEvent().", 1 },';
|
||||
printf '%s\n' '+ { "Zebediah Figura", "ntdll, server: Check the value of WINEESYNC instead of just the presence.", 1 },';
|
||||
printf '%s\n' '+ { "Zebediah Figura", "esync: Update README.", 1 },';
|
||||
printf '%s\n' '+ { "Zebediah Figura", "server: Use default_fd_get_esync_fd() for directory change notification objects.", 1 },';
|
||||
printf '%s\n' '+ { "Zebediah Figura", "server: Create esync file descriptors for true file objects and use them for directory change notifications.", 1 },';
|
||||
) >> "$patchlist"
|
||||
fi
|
||||
|
||||
@ -5112,6 +5116,23 @@ if test "$enable_ntdll_Zero_mod_name" -eq 1; then
|
||||
) >> "$patchlist"
|
||||
fi
|
||||
|
||||
# Patchset ntdll-aarch-TEB
|
||||
# |
|
||||
# | This patchset fixes the following Wine bugs:
|
||||
# | * [#38780] AArch64 platforms: register X18 (TEB) must remain reserved for Wine to run 64-bit ARM Windows applications.
|
||||
# |
|
||||
# | Modified files:
|
||||
# | * configure.ac, dlls/ntdll/loader.c, dlls/ntdll/relay.c
|
||||
# |
|
||||
if test "$enable_ntdll_aarch_TEB" -eq 1; then
|
||||
patch_apply ntdll-aarch-TEB/0001-configure-Avoid-clobbering-x18-on-arm64-within-wine.patch
|
||||
patch_apply ntdll-aarch-TEB/0002-ntdll-Always-restore-TEB-to-x18-on-aarch-64-on-retur.patch
|
||||
(
|
||||
printf '%s\n' '+ { "Martin Storsjo", "configure: Avoid clobbering x18 on arm64 within wine.", 1 },';
|
||||
printf '%s\n' '+ { "Martin Storsjo", "ntdll: Always restore TEB to x18 on aarch 64 on return from calls to builtins.", 1 },';
|
||||
) >> "$patchlist"
|
||||
fi
|
||||
|
||||
# Patchset ntdll-set_full_cpu_context
|
||||
# |
|
||||
# | Modified files:
|
||||
@ -5472,13 +5493,13 @@ fi
|
||||
# | * [#46967] GOG Galaxy doesn't run in virtual desktop.
|
||||
# |
|
||||
# | Modified files:
|
||||
# | * dlls/user32/tests/winstation.c, include/wine/server_protocol.h, programs/explorer/desktop.c, server/async.c,
|
||||
# | server/atom.c, server/change.c, server/clipboard.c, server/completion.c, server/console.c, server/debugger.c,
|
||||
# | server/device.c, server/directory.c, server/esync.c, server/event.c, server/fd.c, server/file.c, server/handle.c,
|
||||
# | server/handle.h, server/hook.c, server/mailslot.c, server/mapping.c, server/mutex.c, server/named_pipe.c,
|
||||
# | server/object.c, server/object.h, server/process.c, server/queue.c, server/registry.c, server/request.c,
|
||||
# | server/semaphore.c, server/serial.c, server/signal.c, server/snapshot.c, server/sock.c, server/symlink.c,
|
||||
# | server/thread.c, server/timer.c, server/token.c, server/winstation.c
|
||||
# | * dlls/user32/tests/winstation.c, programs/explorer/desktop.c, server/async.c, server/atom.c, server/change.c,
|
||||
# | server/clipboard.c, server/completion.c, server/console.c, server/debugger.c, server/device.c, server/directory.c,
|
||||
# | server/esync.c, server/event.c, server/fd.c, server/file.c, server/handle.c, server/handle.h, server/hook.c,
|
||||
# | server/mailslot.c, server/mapping.c, server/mutex.c, server/named_pipe.c, server/object.c, server/object.h,
|
||||
# | server/process.c, server/queue.c, server/registry.c, server/request.c, server/semaphore.c, server/serial.c,
|
||||
# | server/signal.c, server/snapshot.c, server/sock.c, server/symlink.c, server/thread.c, server/timer.c, server/token.c,
|
||||
# | server/winstation.c
|
||||
# |
|
||||
if test "$enable_server_Desktop_Refcount" -eq 1; then
|
||||
patch_apply server-Desktop_Refcount/0001-server-Introduce-a-new-alloc_handle-object-callback..patch
|
||||
|
Loading…
x
Reference in New Issue
Block a user