From 10afc6b3c6cef69ab58d6e3e4d8871c52fd14dcc Mon Sep 17 00:00:00 2001 From: kalaposfos13 <153381648+kalaposfos13@users.noreply.github.com> Date: Wed, 27 Aug 2025 12:12:39 +0200 Subject: [PATCH] Replace direct usage of wrgsbase and rdgsbase with a more portable solution (#3464) --- src/core/tls.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/core/tls.cpp b/src/core/tls.cpp index 0d1d514cf..2f7e1a1fd 100644 --- a/src/core/tls.cpp +++ b/src/core/tls.cpp @@ -18,6 +18,10 @@ #elif !defined(ARCH_X86_64) #include #endif +#if defined(__linux__) && defined(ARCH_X86_64) +#include +#include +#endif namespace Core { @@ -156,13 +160,15 @@ Tcb* GetTcbBase() { // Other POSIX x86_64 void SetTcbBase(void* image_address) { - asm volatile("wrgsbase %0" ::"r"(image_address) : "memory"); + const int ret = syscall(SYS_arch_prctl, ARCH_SET_GS, (unsigned long)image_address); + ASSERT_MSG(ret == 0, "Failed to set GS base: errno {}", errno); } Tcb* GetTcbBase() { - Tcb* tcb; - asm volatile("rdgsbase %0" : "=r"(tcb)::"memory"); - return tcb; + void* tcb = nullptr; + const int ret = syscall(SYS_arch_prctl, ARCH_GET_GS, &tcb); + ASSERT_MSG(ret == 0, "Failed to get GS base: errno {}", errno); + return static_cast(tcb); } #else