[PATCH] RFC: ntdll: Restore x18 right before handing over control to new processes and threads

Martin Storsjo martin at martin.st
Tue May 14 08:14:36 CDT 2019


If building with a compiler that backs up and restores x18 on entry to
MS ABI functions (clang patched with https://reviews.llvm.org/D61892),
function calls to the libc can still clobber x18 after signal_init_thread,
before handing control over to the native code.

Alternatively, if built with a compiler that restores x18 after function
calls to functions in other translation units (in order to protect
the value of x18, see https://reviews.llvm.org/D61894), the function call
to signal_init_thread will have x18 restored on return.

Signed-off-by: Martin Storsjo <martin at martin.st>
---
 dlls/ntdll/signal_arm64.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/dlls/ntdll/signal_arm64.c b/dlls/ntdll/signal_arm64.c
index 94520c95ce..1c3a49a80a 100644
--- a/dlls/ntdll/signal_arm64.c
+++ b/dlls/ntdll/signal_arm64.c
@@ -1126,6 +1126,7 @@ static void thread_startup( void *param )
 void signal_start_thread( LPTHREAD_START_ROUTINE entry, void *arg, BOOL suspend )
 {
     struct startup_info info = { call_thread_entry_point, entry, arg, suspend };
+    __asm__ __volatile__( "mov x18, %0" : : "r" (NtCurrentTeb()) );
     wine_switch_to_stack( thread_startup, &info, NtCurrentTeb()->Tib.StackBase );
 }
 
@@ -1140,6 +1141,7 @@ void signal_start_thread( LPTHREAD_START_ROUTINE entry, void *arg, BOOL suspend
 void signal_start_process( LPTHREAD_START_ROUTINE entry, BOOL suspend )
 {
     struct startup_info info = { kernel32_start_process, entry, NtCurrentTeb()->Peb, suspend };
+    __asm__ __volatile__( "mov x18, %0" : : "r" (NtCurrentTeb()) );
     wine_switch_to_stack( thread_startup, &info, NtCurrentTeb()->Tib.StackBase );
 }
 
-- 
2.17.1




More information about the wine-devel mailing list