| /* SPDX-License-Identifier: LGPL-2.1-only OR MIT */ | |
| /* | |
| * rseq-x86-thread-pointer.h | |
| * | |
| * (C) Copyright 2021 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com> | |
| */ | |
| #ifndef _RSEQ_X86_THREAD_POINTER | |
| #define _RSEQ_X86_THREAD_POINTER | |
| #include <features.h> | |
| #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 |