-
Notifications
You must be signed in to change notification settings - Fork 102
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
selftests/rseq: Introduce thread pointer getters
commit 886ddfb upstream. This is done in preparation for the selftest uplift to become compatible with glibc-2.35. glibc-2.35 exposes the rseq per-thread data in the TCB, accessible at an offset from the thread pointer. The toolchains do not implement accessing the thread pointer on all architectures. Provide thread pointer getters for ppc and x86 which lack (or lacked until recently) toolchain support. Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Link: https://lkml.kernel.org/r/20220124171253.22072-7-mathieu.desnoyers@efficios.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
- Loading branch information
Showing
4 changed files
with
114 additions
and
0 deletions.
There are no files selected for viewing
25 changes: 25 additions & 0 deletions
25
tools/testing/selftests/rseq/rseq-generic-thread-pointer.h
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
/* SPDX-License-Identifier: LGPL-2.1-only OR MIT */ | ||
/* | ||
* rseq-generic-thread-pointer.h | ||
* | ||
* (C) Copyright 2021 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com> | ||
*/ | ||
|
||
#ifndef _RSEQ_GENERIC_THREAD_POINTER | ||
#define _RSEQ_GENERIC_THREAD_POINTER | ||
|
||
#ifdef __cplusplus | ||
extern "C" { | ||
#endif | ||
|
||
/* Use gcc builtin thread pointer. */ | ||
static inline void *rseq_thread_pointer(void) | ||
{ | ||
return __builtin_thread_pointer(); | ||
} | ||
|
||
#ifdef __cplusplus | ||
} | ||
#endif | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
/* SPDX-License-Identifier: LGPL-2.1-only OR MIT */ | ||
/* | ||
* rseq-ppc-thread-pointer.h | ||
* | ||
* (C) Copyright 2021 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com> | ||
*/ | ||
|
||
#ifndef _RSEQ_PPC_THREAD_POINTER | ||
#define _RSEQ_PPC_THREAD_POINTER | ||
|
||
#ifdef __cplusplus | ||
extern "C" { | ||
#endif | ||
|
||
static inline void *rseq_thread_pointer(void) | ||
{ | ||
#ifdef __powerpc64__ | ||
register void *__result asm ("r13"); | ||
#else | ||
register void *__result asm ("r2"); | ||
#endif | ||
asm ("" : "=r" (__result)); | ||
return __result; | ||
} | ||
|
||
#ifdef __cplusplus | ||
} | ||
#endif | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
/* SPDX-License-Identifier: LGPL-2.1-only OR MIT */ | ||
/* | ||
* rseq-thread-pointer.h | ||
* | ||
* (C) Copyright 2021 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com> | ||
*/ | ||
|
||
#ifndef _RSEQ_THREAD_POINTER | ||
#define _RSEQ_THREAD_POINTER | ||
|
||
#if defined(__x86_64__) || defined(__i386__) | ||
#include "rseq-x86-thread-pointer.h" | ||
#elif defined(__PPC__) | ||
#include "rseq-ppc-thread-pointer.h" | ||
#else | ||
#include "rseq-generic-thread-pointer.h" | ||
#endif | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
/* SPDX-License-Identifier: LGPL-2.1-only OR MIT */ | ||
/* | ||
* rseq-x86-thread-pointer.h | ||
* | ||
* (C) Copyright 2021 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com> | ||
*/ | ||
|
||
#ifndef _RSEQ_X86_THREAD_POINTER | ||
#define _RSEQ_X86_THREAD_POINTER | ||
|
||
#include <features.h> | ||
|
||
#ifdef __cplusplus | ||
extern "C" { | ||
#endif | ||
|
||
#if __GNUC_PREREQ (11, 1) | ||
static inline void *rseq_thread_pointer(void) | ||
{ | ||
return __builtin_thread_pointer(); | ||
} | ||
#else | ||
static inline void *rseq_thread_pointer(void) | ||
{ | ||
void *__result; | ||
|
||
# ifdef __x86_64__ | ||
__asm__ ("mov %%fs:0, %0" : "=r" (__result)); | ||
# else | ||
__asm__ ("mov %%gs:0, %0" : "=r" (__result)); | ||
# endif | ||
return __result; | ||
} | ||
#endif /* !GCC 11 */ | ||
|
||
#ifdef __cplusplus | ||
} | ||
#endif | ||
|
||
#endif |