Update librseq to co-exist with glibc rseq integration
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Mon, 13 Dec 2021 15:40:54 +0000 (10:40 -0500)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Tue, 14 Dec 2021 20:32:03 +0000 (15:32 -0500)
Update librseq to co-exist with the rseq integration merged within the
glibc 2.35 release cycle.

librseq exposes its own "rseq_offset, rseq_size, rseq_flags" ABI.

Query for glibc rseq ABI (__rseq_offset, __rseq_size, __rseq_flags)
using dlsym() in a librseq library constructor. If those are found,
copy their values into rseq_offset, rseq_size, and rseq_flags.

Else, if those glibc symbols are not found, handle rseq registration
ourselves and use our own IE-model TLS to implement the rseq ABI
per-thread storage.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: I1220cb5c31e823e9cddf211ec56fee03b729b137

13 files changed:
configure.ac
include/rseq/rseq-arm.h
include/rseq/rseq-arm64.h
include/rseq/rseq-mips.h
include/rseq/rseq-ppc-thread-pointer.h [new file with mode: 0644]
include/rseq/rseq-ppc.h
include/rseq/rseq-s390.h
include/rseq/rseq-x86-thread-pointer.h [new file with mode: 0644]
include/rseq/rseq-x86.h
include/rseq/rseq.h
src/Makefile.am
src/rseq.c
tests/Makefile.am

index e52697698bd88503f069dec89c5581fc96b10b70..c13be33aa022615ed1e65fbcee6d1e606d865a8a 100644 (file)
@@ -125,6 +125,20 @@ AC_CHECK_FUNCS([ \
 # AC_FUNC_MALLOC causes problems when cross-compiling.
 #AC_FUNC_MALLOC
 
+# Check dor dlopen() in -ldl or -lc
+AC_CHECK_LIB([dl], [dlopen], [
+  libdl_name=dl
+  DL_LIBS="-ldl"
+], [
+  # dlopen not found in libdl, check in libc
+  AC_CHECK_LIB([c], [dlopen], [
+    libdl_name=c
+    DL_LIBS="-lc"
+  ], [
+    AC_MSG_ERROR([Cannot find dlopen in libdl nor libc. Use [LDFLAGS]=-Ldir to specify their location.])
+  ])
+])
+AC_SUBST(DL_LIBS)
 
 ##                                             ##
 ## Substitute variables for use in Makefile.am ##
index 0ab07ef1ec31fc1293ad19cb29b769e7a5ffdc68..b07aa4cd9b18abb279a1d2847f6f5b730d55df08 100644 (file)
@@ -185,8 +185,8 @@ int rseq_cmpeqv_storev(intptr_t *v, intptr_t expect, intptr_t newv, int cpu)
                "5:\n\t"
                : /* gcc asm goto does not allow outputs */
                : [cpu_id]              "r" (cpu),
-                 [current_cpu_id]      "m" (__rseq_abi.cpu_id),
-                 [rseq_cs]             "m" (__rseq_abi.rseq_cs),
+                 [current_cpu_id]      "m" (rseq_get_abi()->cpu_id),
+                 [rseq_cs]             "m" (rseq_get_abi()->rseq_cs),
                  [v]                   "m" (*v),
                  [expect]              "r" (expect),
                  [newv]                "r" (newv)
@@ -255,8 +255,8 @@ int rseq_cmpnev_storeoffp_load(intptr_t *v, intptr_t expectnot,
                "5:\n\t"
                : /* gcc asm goto does not allow outputs */
                : [cpu_id]              "r" (cpu),
-                 [current_cpu_id]      "m" (__rseq_abi.cpu_id),
-                 [rseq_cs]             "m" (__rseq_abi.rseq_cs),
+                 [current_cpu_id]      "m" (rseq_get_abi()->cpu_id),
+                 [rseq_cs]             "m" (rseq_get_abi()->rseq_cs),
                  /* final store input */
                  [v]                   "m" (*v),
                  [expectnot]           "r" (expectnot),
@@ -316,8 +316,8 @@ int rseq_addv(intptr_t *v, intptr_t count, int cpu)
                "5:\n\t"
                : /* gcc asm goto does not allow outputs */
                : [cpu_id]              "r" (cpu),
-                 [current_cpu_id]      "m" (__rseq_abi.cpu_id),
-                 [rseq_cs]             "m" (__rseq_abi.rseq_cs),
+                 [current_cpu_id]      "m" (rseq_get_abi()->cpu_id),
+                 [rseq_cs]             "m" (rseq_get_abi()->rseq_cs),
                  [v]                   "m" (*v),
                  [count]               "Ir" (count)
                  RSEQ_INJECT_INPUT
@@ -381,8 +381,8 @@ int rseq_cmpeqv_trystorev_storev(intptr_t *v, intptr_t expect,
                "5:\n\t"
                : /* gcc asm goto does not allow outputs */
                : [cpu_id]              "r" (cpu),
-                 [current_cpu_id]      "m" (__rseq_abi.cpu_id),
-                 [rseq_cs]             "m" (__rseq_abi.rseq_cs),
+                 [current_cpu_id]      "m" (rseq_get_abi()->cpu_id),
+                 [rseq_cs]             "m" (rseq_get_abi()->rseq_cs),
                  /* try store input */
                  [v2]                  "m" (*v2),
                  [newv2]               "r" (newv2),
@@ -457,8 +457,8 @@ int rseq_cmpeqv_trystorev_storev_release(intptr_t *v, intptr_t expect,
                "5:\n\t"
                : /* gcc asm goto does not allow outputs */
                : [cpu_id]              "r" (cpu),
-                 [current_cpu_id]      "m" (__rseq_abi.cpu_id),
-                 [rseq_cs]             "m" (__rseq_abi.rseq_cs),
+                 [current_cpu_id]      "m" (rseq_get_abi()->cpu_id),
+                 [rseq_cs]             "m" (rseq_get_abi()->rseq_cs),
                  /* try store input */
                  [v2]                  "m" (*v2),
                  [newv2]               "r" (newv2),
@@ -537,8 +537,8 @@ int rseq_cmpeqv_cmpeqv_storev(intptr_t *v, intptr_t expect,
                "5:\n\t"
                : /* gcc asm goto does not allow outputs */
                : [cpu_id]              "r" (cpu),
-                 [current_cpu_id]      "m" (__rseq_abi.cpu_id),
-                 [rseq_cs]             "m" (__rseq_abi.rseq_cs),
+                 [current_cpu_id]      "m" (rseq_get_abi()->cpu_id),
+                 [rseq_cs]             "m" (rseq_get_abi()->rseq_cs),
                  /* cmp2 input */
                  [v2]                  "m" (*v2),
                  [expect2]             "r" (expect2),
@@ -657,8 +657,8 @@ int rseq_cmpeqv_trymemcpy_storev(intptr_t *v, intptr_t expect,
                "8:\n\t"
                : /* gcc asm goto does not allow outputs */
                : [cpu_id]              "r" (cpu),
-                 [current_cpu_id]      "m" (__rseq_abi.cpu_id),
-                 [rseq_cs]             "m" (__rseq_abi.rseq_cs),
+                 [current_cpu_id]      "m" (rseq_get_abi()->cpu_id),
+                 [rseq_cs]             "m" (rseq_get_abi()->rseq_cs),
                  /* final store input */
                  [v]                   "m" (*v),
                  [expect]              "r" (expect),
@@ -782,8 +782,8 @@ int rseq_cmpeqv_trymemcpy_storev_release(intptr_t *v, intptr_t expect,
                "8:\n\t"
                : /* gcc asm goto does not allow outputs */
                : [cpu_id]              "r" (cpu),
-                 [current_cpu_id]      "m" (__rseq_abi.cpu_id),
-                 [rseq_cs]             "m" (__rseq_abi.rseq_cs),
+                 [current_cpu_id]      "m" (rseq_get_abi()->cpu_id),
+                 [rseq_cs]             "m" (rseq_get_abi()->rseq_cs),
                  /* final store input */
                  [v]                   "m" (*v),
                  [expect]              "r" (expect),
index cd5741649ac7b83571aac86bcf842e67cd3fdf05..c4738373d537defde1e6b7d0b06e218d17bc24a2 100644 (file)
@@ -230,8 +230,8 @@ int rseq_cmpeqv_storev(intptr_t *v, intptr_t expect, intptr_t newv, int cpu)
                RSEQ_ASM_DEFINE_ABORT(4, abort)
                : /* gcc asm goto does not allow outputs */
                : [cpu_id]              "r" (cpu),
-                 [current_cpu_id]      "Qo" (__rseq_abi.cpu_id),
-                 [rseq_cs]             "m" (__rseq_abi.rseq_cs),
+                 [current_cpu_id]      "Qo" (rseq_get_abi()->cpu_id),
+                 [rseq_cs]             "m" (rseq_get_abi()->rseq_cs),
                  [v]                   "Qo" (*v),
                  [expect]              "r" (expect),
                  [newv]                "r" (newv)
@@ -287,8 +287,8 @@ int rseq_cmpnev_storeoffp_load(intptr_t *v, intptr_t expectnot,
                RSEQ_ASM_DEFINE_ABORT(4, abort)
                : /* gcc asm goto does not allow outputs */
                : [cpu_id]              "r" (cpu),
-                 [current_cpu_id]      "Qo" (__rseq_abi.cpu_id),
-                 [rseq_cs]             "m" (__rseq_abi.rseq_cs),
+                 [current_cpu_id]      "Qo" (rseq_get_abi()->cpu_id),
+                 [rseq_cs]             "m" (rseq_get_abi()->rseq_cs),
                  [v]                   "Qo" (*v),
                  [expectnot]           "r" (expectnot),
                  [load]                "Qo" (*load),
@@ -337,8 +337,8 @@ int rseq_addv(intptr_t *v, intptr_t count, int cpu)
                RSEQ_ASM_DEFINE_ABORT(4, abort)
                : /* gcc asm goto does not allow outputs */
                : [cpu_id]              "r" (cpu),
-                 [current_cpu_id]      "Qo" (__rseq_abi.cpu_id),
-                 [rseq_cs]             "m" (__rseq_abi.rseq_cs),
+                 [current_cpu_id]      "Qo" (rseq_get_abi()->cpu_id),
+                 [rseq_cs]             "m" (rseq_get_abi()->rseq_cs),
                  [v]                   "Qo" (*v),
                  [count]               "r" (count)
                  RSEQ_INJECT_INPUT
@@ -388,8 +388,8 @@ int rseq_cmpeqv_trystorev_storev(intptr_t *v, intptr_t expect,
                RSEQ_ASM_DEFINE_ABORT(4, abort)
                : /* gcc asm goto does not allow outputs */
                : [cpu_id]              "r" (cpu),
-                 [current_cpu_id]      "Qo" (__rseq_abi.cpu_id),
-                 [rseq_cs]             "m" (__rseq_abi.rseq_cs),
+                 [current_cpu_id]      "Qo" (rseq_get_abi()->cpu_id),
+                 [rseq_cs]             "m" (rseq_get_abi()->rseq_cs),
                  [expect]              "r" (expect),
                  [v]                   "Qo" (*v),
                  [newv]                "r" (newv),
@@ -447,8 +447,8 @@ int rseq_cmpeqv_trystorev_storev_release(intptr_t *v, intptr_t expect,
                RSEQ_ASM_DEFINE_ABORT(4, abort)
                : /* gcc asm goto does not allow outputs */
                : [cpu_id]              "r" (cpu),
-                 [current_cpu_id]      "Qo" (__rseq_abi.cpu_id),
-                 [rseq_cs]             "m" (__rseq_abi.rseq_cs),
+                 [current_cpu_id]      "Qo" (rseq_get_abi()->cpu_id),
+                 [rseq_cs]             "m" (rseq_get_abi()->rseq_cs),
                  [expect]              "r" (expect),
                  [v]                   "Qo" (*v),
                  [newv]                "r" (newv),
@@ -508,8 +508,8 @@ int rseq_cmpeqv_cmpeqv_storev(intptr_t *v, intptr_t expect,
                RSEQ_ASM_DEFINE_ABORT(4, abort)
                : /* gcc asm goto does not allow outputs */
                : [cpu_id]              "r" (cpu),
-                 [current_cpu_id]      "Qo" (__rseq_abi.cpu_id),
-                 [rseq_cs]             "m" (__rseq_abi.rseq_cs),
+                 [current_cpu_id]      "Qo" (rseq_get_abi()->cpu_id),
+                 [rseq_cs]             "m" (rseq_get_abi()->rseq_cs),
                  [v]                   "Qo" (*v),
                  [expect]              "r" (expect),
                  [v2]                  "Qo" (*v2),
@@ -569,8 +569,8 @@ int rseq_cmpeqv_trymemcpy_storev(intptr_t *v, intptr_t expect,
                RSEQ_ASM_DEFINE_ABORT(4, abort)
                : /* gcc asm goto does not allow outputs */
                : [cpu_id]              "r" (cpu),
-                 [current_cpu_id]      "Qo" (__rseq_abi.cpu_id),
-                 [rseq_cs]             "m" (__rseq_abi.rseq_cs),
+                 [current_cpu_id]      "Qo" (rseq_get_abi()->cpu_id),
+                 [rseq_cs]             "m" (rseq_get_abi()->rseq_cs),
                  [expect]              "r" (expect),
                  [v]                   "Qo" (*v),
                  [newv]                "r" (newv),
@@ -629,8 +629,8 @@ int rseq_cmpeqv_trymemcpy_storev_release(intptr_t *v, intptr_t expect,
                RSEQ_ASM_DEFINE_ABORT(4, abort)
                : /* gcc asm goto does not allow outputs */
                : [cpu_id]              "r" (cpu),
-                 [current_cpu_id]      "Qo" (__rseq_abi.cpu_id),
-                 [rseq_cs]             "m" (__rseq_abi.rseq_cs),
+                 [current_cpu_id]      "Qo" (rseq_get_abi()->cpu_id),
+                 [rseq_cs]             "m" (rseq_get_abi()->rseq_cs),
                  [expect]              "r" (expect),
                  [v]                   "Qo" (*v),
                  [newv]                "r" (newv),
index 6365b309b7f38a7269776fe863bef320e6d15b9f..76a330498418934b24459ece1a9e53aa56c56111 100644 (file)
@@ -190,8 +190,8 @@ int rseq_cmpeqv_storev(intptr_t *v, intptr_t expect, intptr_t newv, int cpu)
                "5:\n\t"
                : /* gcc asm goto does not allow outputs */
                : [cpu_id]              "r" (cpu),
-                 [current_cpu_id]      "m" (__rseq_abi.cpu_id),
-                 [rseq_cs]             "m" (__rseq_abi.rseq_cs),
+                 [current_cpu_id]      "m" (rseq_get_abi()->cpu_id),
+                 [rseq_cs]             "m" (rseq_get_abi()->rseq_cs),
                  [v]                   "m" (*v),
                  [expect]              "r" (expect),
                  [newv]                "r" (newv)
@@ -258,8 +258,8 @@ int rseq_cmpnev_storeoffp_load(intptr_t *v, intptr_t expectnot,
                "5:\n\t"
                : /* gcc asm goto does not allow outputs */
                : [cpu_id]              "r" (cpu),
-                 [current_cpu_id]      "m" (__rseq_abi.cpu_id),
-                 [rseq_cs]             "m" (__rseq_abi.rseq_cs),
+                 [current_cpu_id]      "m" (rseq_get_abi()->cpu_id),
+                 [rseq_cs]             "m" (rseq_get_abi()->rseq_cs),
                  /* final store input */
                  [v]                   "m" (*v),
                  [expectnot]           "r" (expectnot),
@@ -319,8 +319,8 @@ int rseq_addv(intptr_t *v, intptr_t count, int cpu)
                "5:\n\t"
                : /* gcc asm goto does not allow outputs */
                : [cpu_id]              "r" (cpu),
-                 [current_cpu_id]      "m" (__rseq_abi.cpu_id),
-                 [rseq_cs]             "m" (__rseq_abi.rseq_cs),
+                 [current_cpu_id]      "m" (rseq_get_abi()->cpu_id),
+                 [rseq_cs]             "m" (rseq_get_abi()->rseq_cs),
                  [v]                   "m" (*v),
                  [count]               "Ir" (count)
                  RSEQ_INJECT_INPUT
@@ -382,8 +382,8 @@ int rseq_cmpeqv_trystorev_storev(intptr_t *v, intptr_t expect,
                "5:\n\t"
                : /* gcc asm goto does not allow outputs */
                : [cpu_id]              "r" (cpu),
-                 [current_cpu_id]      "m" (__rseq_abi.cpu_id),
-                 [rseq_cs]             "m" (__rseq_abi.rseq_cs),
+                 [current_cpu_id]      "m" (rseq_get_abi()->cpu_id),
+                 [rseq_cs]             "m" (rseq_get_abi()->rseq_cs),
                  /* try store input */
                  [v2]                  "m" (*v2),
                  [newv2]               "r" (newv2),
@@ -456,8 +456,8 @@ int rseq_cmpeqv_trystorev_storev_release(intptr_t *v, intptr_t expect,
                "5:\n\t"
                : /* gcc asm goto does not allow outputs */
                : [cpu_id]              "r" (cpu),
-                 [current_cpu_id]      "m" (__rseq_abi.cpu_id),
-                 [rseq_cs]             "m" (__rseq_abi.rseq_cs),
+                 [current_cpu_id]      "m" (rseq_get_abi()->cpu_id),
+                 [rseq_cs]             "m" (rseq_get_abi()->rseq_cs),
                  /* try store input */
                  [v2]                  "m" (*v2),
                  [newv2]               "r" (newv2),
@@ -532,8 +532,8 @@ int rseq_cmpeqv_cmpeqv_storev(intptr_t *v, intptr_t expect,
                "5:\n\t"
                : /* gcc asm goto does not allow outputs */
                : [cpu_id]              "r" (cpu),
-                 [current_cpu_id]      "m" (__rseq_abi.cpu_id),
-                 [rseq_cs]             "m" (__rseq_abi.rseq_cs),
+                 [current_cpu_id]      "m" (rseq_get_abi()->cpu_id),
+                 [rseq_cs]             "m" (rseq_get_abi()->rseq_cs),
                  /* cmp2 input */
                  [v2]                  "m" (*v2),
                  [expect2]             "r" (expect2),
@@ -649,8 +649,8 @@ int rseq_cmpeqv_trymemcpy_storev(intptr_t *v, intptr_t expect,
                "8:\n\t"
                : /* gcc asm goto does not allow outputs */
                : [cpu_id]              "r" (cpu),
-                 [current_cpu_id]      "m" (__rseq_abi.cpu_id),
-                 [rseq_cs]             "m" (__rseq_abi.rseq_cs),
+                 [current_cpu_id]      "m" (rseq_get_abi()->cpu_id),
+                 [rseq_cs]             "m" (rseq_get_abi()->rseq_cs),
                  /* final store input */
                  [v]                   "m" (*v),
                  [expect]              "r" (expect),
@@ -771,8 +771,8 @@ int rseq_cmpeqv_trymemcpy_storev_release(intptr_t *v, intptr_t expect,
                "8:\n\t"
                : /* gcc asm goto does not allow outputs */
                : [cpu_id]              "r" (cpu),
-                 [current_cpu_id]      "m" (__rseq_abi.cpu_id),
-                 [rseq_cs]             "m" (__rseq_abi.rseq_cs),
+                 [current_cpu_id]      "m" (rseq_get_abi()->cpu_id),
+                 [rseq_cs]             "m" (rseq_get_abi()->rseq_cs),
                  /* final store input */
                  [v]                   "m" (*v),
                  [expect]              "r" (expect),
diff --git a/include/rseq/rseq-ppc-thread-pointer.h b/include/rseq/rseq-ppc-thread-pointer.h
new file mode 100644 (file)
index 0000000..7319443
--- /dev/null
@@ -0,0 +1,21 @@
+/* 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
+
+static inline void *rseq_thread_pointer(void)
+{
+#ifdef __powerpc64__
+       register void *__result asm ("r13");
+#else
+       register void *__result asm ("r2");
+#endif
+       return __result;
+}
+
+#endif
index 6780683f6950960f9789b25297b6eabbc908e1e2..4ff41c6ca75e6f8eeb231d62f95d08d98f151dd6 100644 (file)
@@ -239,8 +239,8 @@ int rseq_cmpeqv_storev(intptr_t *v, intptr_t expect, intptr_t newv, int cpu)
                RSEQ_ASM_DEFINE_ABORT(4, abort)
                : /* gcc asm goto does not allow outputs */
                : [cpu_id]              "r" (cpu),
-                 [current_cpu_id]      "m" (__rseq_abi.cpu_id),
-                 [rseq_cs]             "m" (__rseq_abi.rseq_cs),
+                 [current_cpu_id]      "m" (rseq_get_abi()->cpu_id),
+                 [rseq_cs]             "m" (rseq_get_abi()->rseq_cs),
                  [v]                   "m" (*v),
                  [expect]              "r" (expect),
                  [newv]                "r" (newv)
@@ -305,8 +305,8 @@ int rseq_cmpnev_storeoffp_load(intptr_t *v, intptr_t expectnot,
                RSEQ_ASM_DEFINE_ABORT(4, abort)
                : /* gcc asm goto does not allow outputs */
                : [cpu_id]              "r" (cpu),
-                 [current_cpu_id]      "m" (__rseq_abi.cpu_id),
-                 [rseq_cs]             "m" (__rseq_abi.rseq_cs),
+                 [current_cpu_id]      "m" (rseq_get_abi()->cpu_id),
+                 [rseq_cs]             "m" (rseq_get_abi()->rseq_cs),
                  /* final store input */
                  [v]                   "m" (*v),
                  [expectnot]           "r" (expectnot),
@@ -363,8 +363,8 @@ int rseq_addv(intptr_t *v, intptr_t count, int cpu)
                RSEQ_ASM_DEFINE_ABORT(4, abort)
                : /* gcc asm goto does not allow outputs */
                : [cpu_id]              "r" (cpu),
-                 [current_cpu_id]      "m" (__rseq_abi.cpu_id),
-                 [rseq_cs]             "m" (__rseq_abi.rseq_cs),
+                 [current_cpu_id]      "m" (rseq_get_abi()->cpu_id),
+                 [rseq_cs]             "m" (rseq_get_abi()->rseq_cs),
                  /* final store input */
                  [v]                   "m" (*v),
                  [count]               "r" (count)
@@ -423,8 +423,8 @@ int rseq_cmpeqv_trystorev_storev(intptr_t *v, intptr_t expect,
                RSEQ_ASM_DEFINE_ABORT(4, abort)
                : /* gcc asm goto does not allow outputs */
                : [cpu_id]              "r" (cpu),
-                 [current_cpu_id]      "m" (__rseq_abi.cpu_id),
-                 [rseq_cs]             "m" (__rseq_abi.rseq_cs),
+                 [current_cpu_id]      "m" (rseq_get_abi()->cpu_id),
+                 [rseq_cs]             "m" (rseq_get_abi()->rseq_cs),
                  /* try store input */
                  [v2]                  "m" (*v2),
                  [newv2]               "r" (newv2),
@@ -493,8 +493,8 @@ int rseq_cmpeqv_trystorev_storev_release(intptr_t *v, intptr_t expect,
                RSEQ_ASM_DEFINE_ABORT(4, abort)
                : /* gcc asm goto does not allow outputs */
                : [cpu_id]              "r" (cpu),
-                 [current_cpu_id]      "m" (__rseq_abi.cpu_id),
-                 [rseq_cs]             "m" (__rseq_abi.rseq_cs),
+                 [current_cpu_id]      "m" (rseq_get_abi()->cpu_id),
+                 [rseq_cs]             "m" (rseq_get_abi()->rseq_cs),
                  /* try store input */
                  [v2]                  "m" (*v2),
                  [newv2]               "r" (newv2),
@@ -564,8 +564,8 @@ int rseq_cmpeqv_cmpeqv_storev(intptr_t *v, intptr_t expect,
                RSEQ_ASM_DEFINE_ABORT(4, abort)
                : /* gcc asm goto does not allow outputs */
                : [cpu_id]              "r" (cpu),
-                 [current_cpu_id]      "m" (__rseq_abi.cpu_id),
-                 [rseq_cs]             "m" (__rseq_abi.rseq_cs),
+                 [current_cpu_id]      "m" (rseq_get_abi()->cpu_id),
+                 [rseq_cs]             "m" (rseq_get_abi()->rseq_cs),
                  /* cmp2 input */
                  [v2]                  "m" (*v2),
                  [expect2]             "r" (expect2),
@@ -639,8 +639,8 @@ int rseq_cmpeqv_trymemcpy_storev(intptr_t *v, intptr_t expect,
                RSEQ_ASM_DEFINE_ABORT(4, abort)
                : /* gcc asm goto does not allow outputs */
                : [cpu_id]              "r" (cpu),
-                 [current_cpu_id]      "m" (__rseq_abi.cpu_id),
-                 [rseq_cs]             "m" (__rseq_abi.rseq_cs),
+                 [current_cpu_id]      "m" (rseq_get_abi()->cpu_id),
+                 [rseq_cs]             "m" (rseq_get_abi()->rseq_cs),
                  /* final store input */
                  [v]                   "m" (*v),
                  [expect]              "r" (expect),
@@ -715,8 +715,8 @@ int rseq_cmpeqv_trymemcpy_storev_release(intptr_t *v, intptr_t expect,
                RSEQ_ASM_DEFINE_ABORT(4, abort)
                : /* gcc asm goto does not allow outputs */
                : [cpu_id]              "r" (cpu),
-                 [current_cpu_id]      "m" (__rseq_abi.cpu_id),
-                 [rseq_cs]             "m" (__rseq_abi.rseq_cs),
+                 [current_cpu_id]      "m" (rseq_get_abi()->cpu_id),
+                 [rseq_cs]             "m" (rseq_get_abi()->rseq_cs),
                  /* final store input */
                  [v]                   "m" (*v),
                  [expect]              "r" (expect),
index f7693c38a6068a9d3de9d1c73ffec73111ea0d4e..2739eabfb25aca1686fbb028d64a47ee0dd451c9 100644 (file)
@@ -165,8 +165,8 @@ int rseq_cmpeqv_storev(intptr_t *v, intptr_t expect, intptr_t newv, int cpu)
                RSEQ_ASM_DEFINE_ABORT(4, "", abort)
                : /* gcc asm goto does not allow outputs */
                : [cpu_id]              "r" (cpu),
-                 [current_cpu_id]      "m" (__rseq_abi.cpu_id),
-                 [rseq_cs]             "m" (__rseq_abi.rseq_cs),
+                 [current_cpu_id]      "m" (rseq_get_abi()->cpu_id),
+                 [rseq_cs]             "m" (rseq_get_abi()->rseq_cs),
                  [v]                   "m" (*v),
                  [expect]              "r" (expect),
                  [newv]                "r" (newv)
@@ -233,8 +233,8 @@ int rseq_cmpnev_storeoffp_load(intptr_t *v, intptr_t expectnot,
                RSEQ_ASM_DEFINE_ABORT(4, "", abort)
                : /* gcc asm goto does not allow outputs */
                : [cpu_id]              "r" (cpu),
-                 [current_cpu_id]      "m" (__rseq_abi.cpu_id),
-                 [rseq_cs]             "m" (__rseq_abi.rseq_cs),
+                 [current_cpu_id]      "m" (rseq_get_abi()->cpu_id),
+                 [rseq_cs]             "m" (rseq_get_abi()->rseq_cs),
                  /* final store input */
                  [v]                   "m" (*v),
                  [expectnot]           "r" (expectnot),
@@ -288,8 +288,8 @@ int rseq_addv(intptr_t *v, intptr_t count, int cpu)
                RSEQ_ASM_DEFINE_ABORT(4, "", abort)
                : /* gcc asm goto does not allow outputs */
                : [cpu_id]              "r" (cpu),
-                 [current_cpu_id]      "m" (__rseq_abi.cpu_id),
-                 [rseq_cs]             "m" (__rseq_abi.rseq_cs),
+                 [current_cpu_id]      "m" (rseq_get_abi()->cpu_id),
+                 [rseq_cs]             "m" (rseq_get_abi()->rseq_cs),
                  /* final store input */
                  [v]                   "m" (*v),
                  [count]               "r" (count)
@@ -347,8 +347,8 @@ int rseq_cmpeqv_trystorev_storev(intptr_t *v, intptr_t expect,
                RSEQ_ASM_DEFINE_ABORT(4, "", abort)
                : /* gcc asm goto does not allow outputs */
                : [cpu_id]              "r" (cpu),
-                 [current_cpu_id]      "m" (__rseq_abi.cpu_id),
-                 [rseq_cs]             "m" (__rseq_abi.rseq_cs),
+                 [current_cpu_id]      "m" (rseq_get_abi()->cpu_id),
+                 [rseq_cs]             "m" (rseq_get_abi()->rseq_cs),
                  /* try store input */
                  [v2]                  "m" (*v2),
                  [newv2]               "r" (newv2),
@@ -426,8 +426,8 @@ int rseq_cmpeqv_cmpeqv_storev(intptr_t *v, intptr_t expect,
                RSEQ_ASM_DEFINE_ABORT(4, "", abort)
                : /* gcc asm goto does not allow outputs */
                : [cpu_id]              "r" (cpu),
-                 [current_cpu_id]      "m" (__rseq_abi.cpu_id),
-                 [rseq_cs]             "m" (__rseq_abi.rseq_cs),
+                 [current_cpu_id]      "m" (rseq_get_abi()->cpu_id),
+                 [rseq_cs]             "m" (rseq_get_abi()->rseq_cs),
                  /* cmp2 input */
                  [v2]                  "m" (*v2),
                  [expect2]             "r" (expect2),
@@ -534,8 +534,8 @@ int rseq_cmpeqv_trymemcpy_storev(intptr_t *v, intptr_t expect,
 #endif
                : /* gcc asm goto does not allow outputs */
                : [cpu_id]              "r" (cpu),
-                 [current_cpu_id]      "m" (__rseq_abi.cpu_id),
-                 [rseq_cs]             "m" (__rseq_abi.rseq_cs),
+                 [current_cpu_id]      "m" (rseq_get_abi()->cpu_id),
+                 [rseq_cs]             "m" (rseq_get_abi()->rseq_cs),
                  /* final store input */
                  [v]                   "m" (*v),
                  [expect]              "r" (expect),
diff --git a/include/rseq/rseq-x86-thread-pointer.h b/include/rseq/rseq-x86-thread-pointer.h
new file mode 100644 (file)
index 0000000..79818f5
--- /dev/null
@@ -0,0 +1,32 @@
+/* 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>
+
+#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 */
+
+#endif
index 87624f8c20d18d6a1ddbe466cfcf75fd17a8010f..283458f0c10b7dd56be7c638f83b7832b66244af 100644 (file)
@@ -20,6 +20,7 @@
  * Due to a compiler optimization bug in gcc-8 with asm goto and TLS asm input
  * operands, we cannot use "m" input operands, and rather pass the __rseq_abi
  * address through a "r" input operand.
+ * (TODO: revisit after migration to glibc's ABI)
  */
 
 /* Offset of cpu_id and rseq_cs fields in struct rseq. */
@@ -141,7 +142,7 @@ int rseq_cmpeqv_storev(intptr_t *v, intptr_t expect, intptr_t newv, int cpu)
                RSEQ_ASM_DEFINE_ABORT(4, "", abort)
                : /* gcc asm goto does not allow outputs */
                : [cpu_id]              "r" (cpu),
-                 [rseq_abi]            "r" (&__rseq_abi),
+                 [rseq_abi]            "r" (rseq_get_abi()),
                  [v]                   "m" (*v),
                  [expect]              "r" (expect),
                  [newv]                "r" (newv)
@@ -207,7 +208,7 @@ int rseq_cmpnev_storeoffp_load(intptr_t *v, intptr_t expectnot,
                RSEQ_ASM_DEFINE_ABORT(4, "", abort)
                : /* gcc asm goto does not allow outputs */
                : [cpu_id]              "r" (cpu),
-                 [rseq_abi]            "r" (&__rseq_abi),
+                 [rseq_abi]            "r" (rseq_get_abi()),
                  /* final store input */
                  [v]                   "m" (*v),
                  [expectnot]           "r" (expectnot),
@@ -258,7 +259,7 @@ int rseq_addv(intptr_t *v, intptr_t count, int cpu)
                RSEQ_ASM_DEFINE_ABORT(4, "", abort)
                : /* gcc asm goto does not allow outputs */
                : [cpu_id]              "r" (cpu),
-                 [rseq_abi]            "r" (&__rseq_abi),
+                 [rseq_abi]            "r" (rseq_get_abi()),
                  /* final store input */
                  [v]                   "m" (*v),
                  [count]               "er" (count)
@@ -315,7 +316,7 @@ int rseq_cmpeqv_trystorev_storev(intptr_t *v, intptr_t expect,
                RSEQ_ASM_DEFINE_ABORT(4, "", abort)
                : /* gcc asm goto does not allow outputs */
                : [cpu_id]              "r" (cpu),
-                 [rseq_abi]            "r" (&__rseq_abi),
+                 [rseq_abi]            "r" (rseq_get_abi()),
                  /* try store input */
                  [v2]                  "m" (*v2),
                  [newv2]               "r" (newv2),
@@ -392,7 +393,7 @@ int rseq_cmpeqv_cmpeqv_storev(intptr_t *v, intptr_t expect,
                RSEQ_ASM_DEFINE_ABORT(4, "", abort)
                : /* gcc asm goto does not allow outputs */
                : [cpu_id]              "r" (cpu),
-                 [rseq_abi]            "r" (&__rseq_abi),
+                 [rseq_abi]            "r" (rseq_get_abi()),
                  /* cmp2 input */
                  [v2]                  "m" (*v2),
                  [expect2]             "r" (expect2),
@@ -498,7 +499,7 @@ int rseq_cmpeqv_trymemcpy_storev(intptr_t *v, intptr_t expect,
 #endif
                : /* gcc asm goto does not allow outputs */
                : [cpu_id]              "r" (cpu),
-                 [rseq_abi]            "r" (&__rseq_abi),
+                 [rseq_abi]            "r" (rseq_get_abi()),
                  /* final store input */
                  [v]                   "m" (*v),
                  [expect]              "r" (expect),
@@ -572,7 +573,7 @@ int rseq_deref_loadoffp(intptr_t *p, off_t voffp, intptr_t *load, int cpu)
                RSEQ_ASM_DEFINE_ABORT(4, "", abort)
                : /* gcc asm goto does not allow outputs */
                : [cpu_id]              "r" (cpu),
-                 [rseq_abi]            "r" (&__rseq_abi),
+                 [rseq_abi]            "r" (rseq_get_abi()),
                  /* final store input */
                  [p]                   "m" (*p),
                  [voffp]               "er" (voffp),
@@ -715,7 +716,7 @@ int rseq_cmpeqv_storev(intptr_t *v, intptr_t expect, intptr_t newv, int cpu)
                RSEQ_ASM_DEFINE_ABORT(4, "", abort)
                : /* gcc asm goto does not allow outputs */
                : [cpu_id]              "r" (cpu),
-                 [rseq_abi]            "r" (&__rseq_abi),
+                 [rseq_abi]            "r" (rseq_get_abi()),
                  [v]                   "m" (*v),
                  [expect]              "r" (expect),
                  [newv]                "r" (newv)
@@ -781,7 +782,7 @@ int rseq_cmpnev_storeoffp_load(intptr_t *v, intptr_t expectnot,
                RSEQ_ASM_DEFINE_ABORT(4, "", abort)
                : /* gcc asm goto does not allow outputs */
                : [cpu_id]              "r" (cpu),
-                 [rseq_abi]            "r" (&__rseq_abi),
+                 [rseq_abi]            "r" (rseq_get_abi()),
                  /* final store input */
                  [v]                   "m" (*v),
                  [expectnot]           "r" (expectnot),
@@ -832,7 +833,7 @@ int rseq_addv(intptr_t *v, intptr_t count, int cpu)
                RSEQ_ASM_DEFINE_ABORT(4, "", abort)
                : /* gcc asm goto does not allow outputs */
                : [cpu_id]              "r" (cpu),
-                 [rseq_abi]            "r" (&__rseq_abi),
+                 [rseq_abi]            "r" (rseq_get_abi()),
                  /* final store input */
                  [v]                   "m" (*v),
                  [count]               "ir" (count)
@@ -890,7 +891,7 @@ int rseq_cmpeqv_trystorev_storev(intptr_t *v, intptr_t expect,
                RSEQ_ASM_DEFINE_ABORT(4, "", abort)
                : /* gcc asm goto does not allow outputs */
                : [cpu_id]              "r" (cpu),
-                 [rseq_abi]            "r" (&__rseq_abi),
+                 [rseq_abi]            "r" (rseq_get_abi()),
                  /* try store input */
                  [v2]                  "m" (*v2),
                  [newv2]               "m" (newv2),
@@ -958,7 +959,7 @@ int rseq_cmpeqv_trystorev_storev_release(intptr_t *v, intptr_t expect,
                RSEQ_ASM_DEFINE_ABORT(4, "", abort)
                : /* gcc asm goto does not allow outputs */
                : [cpu_id]              "r" (cpu),
-                 [rseq_abi]            "r" (&__rseq_abi),
+                 [rseq_abi]            "r" (rseq_get_abi()),
                  /* try store input */
                  [v2]                  "m" (*v2),
                  [newv2]               "r" (newv2),
@@ -1028,7 +1029,7 @@ int rseq_cmpeqv_cmpeqv_storev(intptr_t *v, intptr_t expect,
                RSEQ_ASM_DEFINE_ABORT(4, "", abort)
                : /* gcc asm goto does not allow outputs */
                : [cpu_id]              "r" (cpu),
-                 [rseq_abi]            "r" (&__rseq_abi),
+                 [rseq_abi]            "r" (rseq_get_abi()),
                  /* cmp2 input */
                  [v2]                  "m" (*v2),
                  [expect2]             "r" (expect2),
@@ -1138,7 +1139,7 @@ int rseq_cmpeqv_trymemcpy_storev(intptr_t *v, intptr_t expect,
 #endif
                : /* gcc asm goto does not allow outputs */
                : [cpu_id]              "r" (cpu),
-                 [rseq_abi]            "r" (&__rseq_abi),
+                 [rseq_abi]            "r" (rseq_get_abi()),
                  /* final store input */
                  [v]                   "m" (*v),
                  [expect]              "m" (expect),
@@ -1251,7 +1252,7 @@ int rseq_cmpeqv_trymemcpy_storev_release(intptr_t *v, intptr_t expect,
 #endif
                : /* gcc asm goto does not allow outputs */
                : [cpu_id]              "r" (cpu),
-                 [rseq_abi]            "r" (&__rseq_abi),
+                 [rseq_abi]            "r" (rseq_get_abi()),
                  /* final store input */
                  [v]                   "m" (*v),
                  [expect]              "m" (expect),
@@ -1315,7 +1316,7 @@ int rseq_deref_loadoffp(intptr_t *p, off_t voffp, intptr_t *load, int cpu)
                RSEQ_ASM_DEFINE_ABORT(4, "", abort)
                : /* gcc asm goto does not allow outputs */
                : [cpu_id]              "r" (cpu),
-                 [rseq_abi]            "r" (&__rseq_abi),
+                 [rseq_abi]            "r" (rseq_get_abi()),
                  /* final store input */
                  [p]                   "m" (*p),
                  [voffp]               "ir" (voffp),
index ecf0e9c955608c45b3055f2654c40177da4fdacf..7fd9da3625a8ce841d0dc73d6f723f97831c9cdd 100644 (file)
 extern "C" {
 #endif
 
-extern __thread struct rseq __rseq_abi;
+/* Offset from the thread pointer to the rseq area.  */
+extern int rseq_offset;
+/* Size of the registered rseq area.  0 if the registration was
+   unsuccessful.  */
+extern unsigned int rseq_size;
+/* Flags used during rseq registration.  */
+extern unsigned int rseq_flags;
 
 #ifdef __cplusplus
 }
@@ -75,6 +81,23 @@ extern __thread struct rseq __rseq_abi;
                abort();                \
        } while (0)
 
+#if defined(__x86_64__) || defined(__i386__)
+#include <rseq/rseq-x86-thread-pointer.h>
+#elif defined(__PPC__)
+#include <rseq/rseq-ppc-thread-pointer.h>
+#else
+/* Use gcc builtin thread pointer. */
+static inline void *rseq_thread_pointer(void)
+{
+       return __builtin_thread_pointer();
+}
+#endif
+
+static inline struct rseq *rseq_get_abi(void)
+{
+       return (struct rseq *) (rseq_thread_pointer() + rseq_offset);
+}
+
 #if defined(__x86_64__) || defined(__i386__)
 #include <rseq/rseq-x86.h>
 #elif defined(__ARMEL__) || defined(__ARMEB__)
@@ -122,7 +145,7 @@ int rseq_available(void);
  */
 static inline int32_t rseq_current_cpu_raw(void)
 {
-       return RSEQ_READ_ONCE(__rseq_abi.cpu_id);
+       return RSEQ_READ_ONCE(rseq_get_abi()->cpu_id);
 }
 
 /*
@@ -138,7 +161,7 @@ static inline int32_t rseq_current_cpu_raw(void)
  */
 static inline uint32_t rseq_cpu_start(void)
 {
-       return RSEQ_READ_ONCE(__rseq_abi.cpu_id_start);
+       return RSEQ_READ_ONCE(rseq_get_abi()->cpu_id_start);
 }
 
 static inline uint32_t rseq_current_cpu(void)
@@ -154,9 +177,9 @@ static inline uint32_t rseq_current_cpu(void)
 static inline void rseq_clear_rseq_cs(void)
 {
 #ifdef __LP64__
-       RSEQ_WRITE_ONCE(__rseq_abi.rseq_cs.ptr, 0);
+       RSEQ_WRITE_ONCE(rseq_get_abi()->rseq_cs.ptr, 0);
 #else
-       RSEQ_WRITE_ONCE(__rseq_abi.rseq_cs.ptr.ptr32, 0);
+       RSEQ_WRITE_ONCE(rseq_get_abi()->rseq_cs.ptr.ptr32, 0);
 #endif
 }
 
index 85b692c4a15b10305f24f2a7717129f08d488236..2a989105a788bf42fd6e06257d5bcd61b0a47162 100644 (file)
@@ -9,6 +9,7 @@ librseq_la_SOURCES = \
        rseq.c
 
 librseq_la_LDFLAGS = -no-undefined -version-info $(RSEQ_LIBRARY_VERSION)
+librseq_la_LIBADD = $(DL_LIBS)
 
 pkgconfigdir = $(libdir)/pkgconfig
 pkgconfig_DATA = librseq.pc
index af431dd8b449a6293575143e372ec705a8ebce72..54e080f44f1c64610569b86a96a6fd48ed8150b2 100644 (file)
 #include <assert.h>
 #include <signal.h>
 #include <limits.h>
+#include <dlfcn.h>
 
 #include <rseq/rseq.h>
 
 #define ARRAY_SIZE(arr)        (sizeof(arr) / sizeof((arr)[0]))
 
-__thread struct rseq __rseq_abi = {
+static const int *libc_rseq_offset_p;
+static const unsigned int *libc_rseq_size_p;
+static const unsigned int *libc_rseq_flags_p;
+
+/* Offset from the thread pointer to the rseq area.  */
+int rseq_offset;
+
+/* Size of the registered rseq area.  0 if the registration was
+   unsuccessful.  */
+unsigned int rseq_size = -1U;
+
+/* Flags used during rseq registration.  */
+unsigned int rseq_flags;
+
+static int rseq_ownership;
+
+static
+__thread struct rseq __rseq_abi __attribute__((tls_model("initial-exec"))) = {
        .cpu_id = RSEQ_CPU_ID_UNINITIALIZED,
 };
 
-static __thread uint32_t __rseq_refcount;
-
 static int sys_rseq(struct rseq *rseq_abi, uint32_t rseq_len,
                    int flags, uint32_t sig)
 {
@@ -61,104 +77,64 @@ int rseq_available(void)
        }
 }
 
-static void signal_off_save(sigset_t *oldset)
+int rseq_register_current_thread(void)
 {
-       sigset_t set;
-       int ret;
+       int rc;
 
-       sigfillset(&set);
-       ret = pthread_sigmask(SIG_BLOCK, &set, oldset);
-       if (ret)
-               abort();
+       if (!rseq_ownership) {
+               /* Treat libc's ownership as a successful registration. */
+               return 0;
+       }
+       rc = sys_rseq(&__rseq_abi, sizeof(struct rseq), 0, RSEQ_SIG);
+       if (rc)
+               return -1;
+       assert(rseq_current_cpu_raw() >= 0);
+       return 0;
 }
 
-static void signal_restore(sigset_t oldset)
+int rseq_unregister_current_thread(void)
 {
-       int ret;
+       int rc;
 
-       ret = pthread_sigmask(SIG_SETMASK, &oldset, NULL);
-       if (ret)
-               abort();
+       if (!rseq_ownership) {
+               /* Treat libc's ownership as a successful unregistration. */
+               return 0;
+       }
+       rc = sys_rseq(&__rseq_abi, sizeof(struct rseq), RSEQ_FLAG_UNREGISTER, RSEQ_SIG);
+       if (rc)
+               return -1;
+       return 0;
 }
 
-int rseq_register_current_thread(void)
+static __attribute__((constructor))
+void rseq_init(void)
 {
-       int rc, ret = 0, cpu_id;
-       sigset_t oldset;
-
-       signal_off_save(&oldset);
-       cpu_id = rseq_current_cpu_raw();
-       if (cpu_id == RSEQ_CPU_ID_REGISTRATION_FAILED) {
-               errno = EPERM;
-               ret = -1;
-               goto end;
+       libc_rseq_offset_p = dlsym(RTLD_NEXT, "__rseq_offset");
+       libc_rseq_size_p = dlsym(RTLD_NEXT, "__rseq_size");
+       libc_rseq_flags_p = dlsym(RTLD_NEXT, "__rseq_flags");
+       if (libc_rseq_size_p && libc_rseq_offset_p && libc_rseq_flags_p) {
+               /* rseq registration owned by glibc */
+               rseq_offset = *libc_rseq_offset_p;
+               rseq_size = *libc_rseq_size_p;
+               rseq_flags = *libc_rseq_flags_p;
+               return;
        }
-       /*
-        * If cpu_id >= 0, rseq is already successfully registered either by
-        * libc (__rseq_refcount == 0) or by another user library
-        * (__rseq_refcount > 0) for this thread.
-        */
-       if (cpu_id >= 0) {
-               /* Treat libc's ownership as a successful registration. */
-               if (__rseq_refcount == 0)
-                       goto end;
-               if (__rseq_refcount == UINT_MAX) {
-                       errno = EOVERFLOW;
-                       ret = -1;
-                       goto end;
-               }
-       } else {
-               assert(__rseq_refcount == 0);
-               rc = sys_rseq(&__rseq_abi, sizeof(struct rseq), 0, RSEQ_SIG);
-               if (rc) {
-                       assert(errno != EBUSY);
-                       __rseq_abi.cpu_id = RSEQ_CPU_ID_REGISTRATION_FAILED;
-                       ret = -1;
-                       goto end;
-               }
-               assert(rseq_current_cpu_raw() >= 0);
-       }
-       __rseq_refcount++;
-end:
-       signal_restore(oldset);
-       return ret;
+       if (!rseq_available())
+               return;
+       rseq_ownership = 1;
+       rseq_offset = (void *)&__rseq_abi - rseq_thread_pointer();
+       rseq_size = sizeof(struct rseq);
+       rseq_flags = 0;
 }
 
-int rseq_unregister_current_thread(void)
+static __attribute__((destructor))
+void rseq_exit(void)
 {
-       int rc, ret = 0, cpu_id;
-       sigset_t oldset;
-
-       signal_off_save(&oldset);
-       cpu_id = rseq_current_cpu_raw();
-       /* cpu_id < 0 means rseq is either uninitialized or registration failed. */
-       if (cpu_id < 0) {
-               errno = EPERM;
-               ret = -1;
-               goto end;
-       }
-       /*
-        * If cpu_id >= 0, rseq is currently successfully registered either by
-        * libc (__rseq_refcount == 0) or by another user library
-        * (__rseq_refcount > 0) for this thread.
-        *
-        * Treat libc's ownership as a successful unregistration.
-        */
-       if (__rseq_refcount == 0) {
-               goto end;
-       }
-       if (__rseq_refcount == 1) {
-               rc = sys_rseq(&__rseq_abi, sizeof(struct rseq),
-                             RSEQ_FLAG_UNREGISTER, RSEQ_SIG);
-               if (rc) {
-                       ret = -1;
-                       goto end;
-               }
-       }
-       __rseq_refcount--;
-end:
-       signal_restore(oldset);
-       return ret;
+       if (!rseq_ownership)
+               return;
+       rseq_offset = 0;
+       rseq_size = -1U;
+       rseq_ownership = 0;
 }
 
 int32_t rseq_fallback_current_cpu(void)
index 60c541b2329ec69409b4bfdb156cc8c6b33a197d..4104a4ec0154114f5bf15460dbe2025b3f38074d 100644 (file)
@@ -19,20 +19,20 @@ noinst_PROGRAMS = basic_percpu_ops_test.tap basic_test.tap param_test \
 dist_noinst_SCRIPTS = run_param_test.tap
 
 basic_percpu_ops_test_tap_SOURCES = basic_percpu_ops_test.c
-basic_percpu_ops_test_tap_LDADD = $(top_builddir)/src/librseq.la $(top_builddir)/tests/utils/libtap.la
+basic_percpu_ops_test_tap_LDADD = $(top_builddir)/src/librseq.la $(top_builddir)/tests/utils/libtap.la $(DL_LIBS)
 
 basic_test_tap_SOURCES = basic_test.c
-basic_test_tap_LDADD = $(top_builddir)/src/librseq.la $(top_builddir)/tests/utils/libtap.la
+basic_test_tap_LDADD = $(top_builddir)/src/librseq.la $(top_builddir)/tests/utils/libtap.la $(DL_LIBS)
 
 param_test_SOURCES = param_test.c
-param_test_LDADD = $(top_builddir)/src/librseq.la
+param_test_LDADD = $(top_builddir)/src/librseq.la $(DL_LIBS)
 
 param_test_benchmark_SOURCES = param_test.c
 param_test_benchmark_CPPFLAGS = $(AM_CPPFLAGS) -DBENCHMARK
-param_test_benchmark_LDADD = $(top_builddir)/src/librseq.la
+param_test_benchmark_LDADD = $(top_builddir)/src/librseq.la $(DL_LIBS)
 
 param_test_compare_twice_SOURCES = param_test.c
 param_test_compare_twice_CPPFLAGS = $(AM_CPPFLAGS) -DRSEQ_COMPARE_TWICE
-param_test_compare_twice_LDADD = $(top_builddir)/src/librseq.la
+param_test_compare_twice_LDADD = $(top_builddir)/src/librseq.la $(DL_LIBS)
 
 TESTS = basic_percpu_ops_test.tap basic_test.tap run_param_test.tap
This page took 0.052034 seconds and 4 git commands to generate.