Use __rseq_refcount symbol
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Wed, 24 Oct 2018 11:54:25 +0000 (07:54 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Wed, 24 Oct 2018 11:54:25 +0000 (07:54 -0400)
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
include/rseq/rseq.h
src/rseq.c

index dd1199a24fbcf8ff1615db3fc9ddb06be945327c..c45cd3874fe328b83e9f1c9883b9c5bb6962664b 100644 (file)
@@ -45,6 +45,7 @@
 #endif
 
 extern __thread volatile struct rseq __rseq_abi;
+extern __thread volatile uint32_t __rseq_refcount;
 
 #define rseq_likely(x)         __builtin_expect(!!(x), 1)
 #define rseq_unlikely(x)       __builtin_expect(!!(x), 0)
index 172f4d986da3557248894ed433d1a98fdd279ae7..a48f0e0f6f2c45a7588806bff4a4123d23a72fed 100644 (file)
 
 #define ARRAY_SIZE(arr)        (sizeof(arr) / sizeof((arr)[0]))
 
-/*
- * linux/rseq.h defines struct rseq as aligned on 32 bytes. The kernel ABI
- * size is 20 bytes. For support of multiple rseq users within a process,
- * user-space defines an extra 4 bytes field as a reference count, for a
- * total of 24 bytes.
- */
-struct libc_rseq {
-       /* kernel-userspace ABI. */
-       __u32 cpu_id_start;
-       __u32 cpu_id;
-       __u64 rseq_cs;
-       __u32 flags;
-       /* user-space ABI. */
-       __u32 refcount;
-} __attribute__((aligned(4 * sizeof(__u64))));
-
-__attribute__((visibility("hidden"))) __thread
-volatile struct libc_rseq __lib_rseq_abi = {
+__attribute__((weak)) __thread
+volatile struct rseq __rseq_abi = {
        .cpu_id = RSEQ_CPU_ID_UNINITIALIZED,
 };
 
-extern __attribute__((weak, alias("__lib_rseq_abi"))) __thread
-volatile struct rseq __rseq_abi;
+__attribute__((weak)) __thread
+volatile uint32_t __rseq_refcount;
 
 static int sys_rseq(volatile struct rseq *rseq_abi, uint32_t rseq_len,
                    int flags, uint32_t sig)
@@ -104,11 +88,11 @@ int rseq_register_current_thread(void)
        sigset_t oldset;
 
        signal_off_save(&oldset);
-       if (__lib_rseq_abi.refcount == INT_MAX) {
+       if (__rseq_refcount == UINT_MAX) {
                ret = -1;
                goto end;
        }
-       if (__lib_rseq_abi.refcount++)
+       if (__rseq_refcount++)
                goto end;
        rc = sys_rseq(&__rseq_abi, sizeof(struct rseq), 0, RSEQ_SIG);
        if (!rc) {
@@ -118,7 +102,7 @@ int rseq_register_current_thread(void)
        if (errno != EBUSY)
                __rseq_abi.cpu_id = RSEQ_CPU_ID_REGISTRATION_FAILED;
        ret = -1;
-       __lib_rseq_abi.refcount--;
+       __rseq_refcount--;
 end:
        signal_restore(oldset);
        return ret;
@@ -130,11 +114,11 @@ int rseq_unregister_current_thread(void)
        sigset_t oldset;
 
        signal_off_save(&oldset);
-       if (!__lib_rseq_abi.refcount) {
+       if (!__rseq_refcount) {
                ret = -1;
                goto end;
        }
-       if (--__lib_rseq_abi.refcount)
+       if (--__rseq_refcount)
                goto end;
        rc = sys_rseq(&__rseq_abi, sizeof(struct rseq),
                      RSEQ_FLAG_UNREGISTER, RSEQ_SIG);
This page took 0.027951 seconds and 4 git commands to generate.