18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: LGPL-2.1-only OR MIT */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * rseq-x86-thread-pointer.h 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * (C) Copyright 2021 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com> 68c2ecf20Sopenharmony_ci */ 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci#ifndef _RSEQ_X86_THREAD_POINTER 98c2ecf20Sopenharmony_ci#define _RSEQ_X86_THREAD_POINTER 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci#include <features.h> 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ci#ifdef __cplusplus 148c2ecf20Sopenharmony_ciextern "C" { 158c2ecf20Sopenharmony_ci#endif 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_ci#if __GNUC_PREREQ (11, 1) 188c2ecf20Sopenharmony_cistatic inline void *rseq_thread_pointer(void) 198c2ecf20Sopenharmony_ci{ 208c2ecf20Sopenharmony_ci return __builtin_thread_pointer(); 218c2ecf20Sopenharmony_ci} 228c2ecf20Sopenharmony_ci#else 238c2ecf20Sopenharmony_cistatic inline void *rseq_thread_pointer(void) 248c2ecf20Sopenharmony_ci{ 258c2ecf20Sopenharmony_ci void *__result; 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_ci# ifdef __x86_64__ 288c2ecf20Sopenharmony_ci __asm__ ("mov %%fs:0, %0" : "=r" (__result)); 298c2ecf20Sopenharmony_ci# else 308c2ecf20Sopenharmony_ci __asm__ ("mov %%gs:0, %0" : "=r" (__result)); 318c2ecf20Sopenharmony_ci# endif 328c2ecf20Sopenharmony_ci return __result; 338c2ecf20Sopenharmony_ci} 348c2ecf20Sopenharmony_ci#endif /* !GCC 11 */ 358c2ecf20Sopenharmony_ci 368c2ecf20Sopenharmony_ci#ifdef __cplusplus 378c2ecf20Sopenharmony_ci} 388c2ecf20Sopenharmony_ci#endif 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_ci#endif 41