/* SPDX-License-Identifier: LGPL-2.1-only OR MIT */ /* * rseq-x86-thread-pointer.h * * (C) Copyright 2021 - Mathieu Desnoyers */ #ifndef _RSEQ_X86_THREAD_POINTER #define _RSEQ_X86_THREAD_POINTER #include #ifdef __cplusplus extern "C" { #endif #if __GNUC_PREREQ (11, 1) static inline void *rseq_thread_pointer(void) { return __builtin_thread_pointer(); } #else static inline void *rseq_thread_pointer(void) { void *__result; # ifdef __x86_64__ __asm__ ("mov %%fs:0, %0" : "=r" (__result)); # else __asm__ ("mov %%gs:0, %0" : "=r" (__result)); # endif return __result; } #endif /* !GCC 11 */ #ifdef __cplusplus } #endif #endif