1 | /* SPDX-License-Identifier: LGPL-2.1-only OR MIT */ |
2 | /* |
3 | * rseq-x86-thread-pointer.h |
4 | * |
5 | * (C) Copyright 2021 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com> |
6 | */ |
7 | |
8 | #ifndef _RSEQ_X86_THREAD_POINTER |
9 | #define _RSEQ_X86_THREAD_POINTER |
10 | |
11 | #include <features.h> |
12 | |
13 | #ifdef __cplusplus |
14 | extern "C" { |
15 | #endif |
16 | |
17 | #if __GNUC_PREREQ (11, 1) |
18 | static inline void *rseq_thread_pointer(void) |
19 | { |
20 | return __builtin_thread_pointer(); |
21 | } |
22 | #else |
23 | static inline void *rseq_thread_pointer(void) |
24 | { |
25 | void *__result; |
26 | |
27 | # ifdef __x86_64__ |
28 | __asm__ ("mov %%fs:0, %0" : "=r" (__result)); |
29 | # else |
30 | __asm__ ("mov %%gs:0, %0" : "=r" (__result)); |
31 | # endif |
32 | return __result; |
33 | } |
34 | #endif /* !GCC 11 */ |
35 | |
36 | #ifdef __cplusplus |
37 | } |
38 | #endif |
39 | |
40 | #endif |
41 | |