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 Workerstatic 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