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