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