| /* 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 |