selftests/rseq: Introduce rseq_get_abi() helper
commit e546cd48ccc456074ddb8920732aef4af65d7ca7 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, rather than through an actual Thread-Local Storage (TLS) variable, as the kernel selftests initially expected. Introduce a rseq_get_abi() helper, initially using the __rseq_abi TLS variable, in preparation for changing this userspace ABI for one which is compatible with glibc-2.35. Note that the __rseq_abi TLS and glibc-2.35's ABI for per-thread data cannot actively coexist in a process, because the kernel supports only a single rseq registration per thread. 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-6-mathieu.desnoyers@efficios.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:

committed by
Greg Kroah-Hartman

parent
3c2a416c80
commit
4a78bf83e2
@@ -185,8 +185,8 @@ int rseq_cmpeqv_storev(intptr_t *v, intptr_t expect, intptr_t newv, int cpu)
|
|||||||
"5:\n\t"
|
"5:\n\t"
|
||||||
: /* gcc asm goto does not allow outputs */
|
: /* gcc asm goto does not allow outputs */
|
||||||
: [cpu_id] "r" (cpu),
|
: [cpu_id] "r" (cpu),
|
||||||
[current_cpu_id] "m" (__rseq_abi.cpu_id),
|
[current_cpu_id] "m" (rseq_get_abi()->cpu_id),
|
||||||
[rseq_cs] "m" (__rseq_abi.rseq_cs),
|
[rseq_cs] "m" (rseq_get_abi()->rseq_cs),
|
||||||
[v] "m" (*v),
|
[v] "m" (*v),
|
||||||
[expect] "r" (expect),
|
[expect] "r" (expect),
|
||||||
[newv] "r" (newv)
|
[newv] "r" (newv)
|
||||||
@@ -255,8 +255,8 @@ int rseq_cmpnev_storeoffp_load(intptr_t *v, intptr_t expectnot,
|
|||||||
"5:\n\t"
|
"5:\n\t"
|
||||||
: /* gcc asm goto does not allow outputs */
|
: /* gcc asm goto does not allow outputs */
|
||||||
: [cpu_id] "r" (cpu),
|
: [cpu_id] "r" (cpu),
|
||||||
[current_cpu_id] "m" (__rseq_abi.cpu_id),
|
[current_cpu_id] "m" (rseq_get_abi()->cpu_id),
|
||||||
[rseq_cs] "m" (__rseq_abi.rseq_cs),
|
[rseq_cs] "m" (rseq_get_abi()->rseq_cs),
|
||||||
/* final store input */
|
/* final store input */
|
||||||
[v] "m" (*v),
|
[v] "m" (*v),
|
||||||
[expectnot] "r" (expectnot),
|
[expectnot] "r" (expectnot),
|
||||||
@@ -316,8 +316,8 @@ int rseq_addv(intptr_t *v, intptr_t count, int cpu)
|
|||||||
"5:\n\t"
|
"5:\n\t"
|
||||||
: /* gcc asm goto does not allow outputs */
|
: /* gcc asm goto does not allow outputs */
|
||||||
: [cpu_id] "r" (cpu),
|
: [cpu_id] "r" (cpu),
|
||||||
[current_cpu_id] "m" (__rseq_abi.cpu_id),
|
[current_cpu_id] "m" (rseq_get_abi()->cpu_id),
|
||||||
[rseq_cs] "m" (__rseq_abi.rseq_cs),
|
[rseq_cs] "m" (rseq_get_abi()->rseq_cs),
|
||||||
[v] "m" (*v),
|
[v] "m" (*v),
|
||||||
[count] "Ir" (count)
|
[count] "Ir" (count)
|
||||||
RSEQ_INJECT_INPUT
|
RSEQ_INJECT_INPUT
|
||||||
@@ -381,8 +381,8 @@ int rseq_cmpeqv_trystorev_storev(intptr_t *v, intptr_t expect,
|
|||||||
"5:\n\t"
|
"5:\n\t"
|
||||||
: /* gcc asm goto does not allow outputs */
|
: /* gcc asm goto does not allow outputs */
|
||||||
: [cpu_id] "r" (cpu),
|
: [cpu_id] "r" (cpu),
|
||||||
[current_cpu_id] "m" (__rseq_abi.cpu_id),
|
[current_cpu_id] "m" (rseq_get_abi()->cpu_id),
|
||||||
[rseq_cs] "m" (__rseq_abi.rseq_cs),
|
[rseq_cs] "m" (rseq_get_abi()->rseq_cs),
|
||||||
/* try store input */
|
/* try store input */
|
||||||
[v2] "m" (*v2),
|
[v2] "m" (*v2),
|
||||||
[newv2] "r" (newv2),
|
[newv2] "r" (newv2),
|
||||||
@@ -457,8 +457,8 @@ int rseq_cmpeqv_trystorev_storev_release(intptr_t *v, intptr_t expect,
|
|||||||
"5:\n\t"
|
"5:\n\t"
|
||||||
: /* gcc asm goto does not allow outputs */
|
: /* gcc asm goto does not allow outputs */
|
||||||
: [cpu_id] "r" (cpu),
|
: [cpu_id] "r" (cpu),
|
||||||
[current_cpu_id] "m" (__rseq_abi.cpu_id),
|
[current_cpu_id] "m" (rseq_get_abi()->cpu_id),
|
||||||
[rseq_cs] "m" (__rseq_abi.rseq_cs),
|
[rseq_cs] "m" (rseq_get_abi()->rseq_cs),
|
||||||
/* try store input */
|
/* try store input */
|
||||||
[v2] "m" (*v2),
|
[v2] "m" (*v2),
|
||||||
[newv2] "r" (newv2),
|
[newv2] "r" (newv2),
|
||||||
@@ -537,8 +537,8 @@ int rseq_cmpeqv_cmpeqv_storev(intptr_t *v, intptr_t expect,
|
|||||||
"5:\n\t"
|
"5:\n\t"
|
||||||
: /* gcc asm goto does not allow outputs */
|
: /* gcc asm goto does not allow outputs */
|
||||||
: [cpu_id] "r" (cpu),
|
: [cpu_id] "r" (cpu),
|
||||||
[current_cpu_id] "m" (__rseq_abi.cpu_id),
|
[current_cpu_id] "m" (rseq_get_abi()->cpu_id),
|
||||||
[rseq_cs] "m" (__rseq_abi.rseq_cs),
|
[rseq_cs] "m" (rseq_get_abi()->rseq_cs),
|
||||||
/* cmp2 input */
|
/* cmp2 input */
|
||||||
[v2] "m" (*v2),
|
[v2] "m" (*v2),
|
||||||
[expect2] "r" (expect2),
|
[expect2] "r" (expect2),
|
||||||
@@ -657,8 +657,8 @@ int rseq_cmpeqv_trymemcpy_storev(intptr_t *v, intptr_t expect,
|
|||||||
"8:\n\t"
|
"8:\n\t"
|
||||||
: /* gcc asm goto does not allow outputs */
|
: /* gcc asm goto does not allow outputs */
|
||||||
: [cpu_id] "r" (cpu),
|
: [cpu_id] "r" (cpu),
|
||||||
[current_cpu_id] "m" (__rseq_abi.cpu_id),
|
[current_cpu_id] "m" (rseq_get_abi()->cpu_id),
|
||||||
[rseq_cs] "m" (__rseq_abi.rseq_cs),
|
[rseq_cs] "m" (rseq_get_abi()->rseq_cs),
|
||||||
/* final store input */
|
/* final store input */
|
||||||
[v] "m" (*v),
|
[v] "m" (*v),
|
||||||
[expect] "r" (expect),
|
[expect] "r" (expect),
|
||||||
@@ -782,8 +782,8 @@ int rseq_cmpeqv_trymemcpy_storev_release(intptr_t *v, intptr_t expect,
|
|||||||
"8:\n\t"
|
"8:\n\t"
|
||||||
: /* gcc asm goto does not allow outputs */
|
: /* gcc asm goto does not allow outputs */
|
||||||
: [cpu_id] "r" (cpu),
|
: [cpu_id] "r" (cpu),
|
||||||
[current_cpu_id] "m" (__rseq_abi.cpu_id),
|
[current_cpu_id] "m" (rseq_get_abi()->cpu_id),
|
||||||
[rseq_cs] "m" (__rseq_abi.rseq_cs),
|
[rseq_cs] "m" (rseq_get_abi()->rseq_cs),
|
||||||
/* final store input */
|
/* final store input */
|
||||||
[v] "m" (*v),
|
[v] "m" (*v),
|
||||||
[expect] "r" (expect),
|
[expect] "r" (expect),
|
||||||
|
@@ -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)
|
RSEQ_ASM_DEFINE_ABORT(4, abort)
|
||||||
: /* gcc asm goto does not allow outputs */
|
: /* gcc asm goto does not allow outputs */
|
||||||
: [cpu_id] "r" (cpu),
|
: [cpu_id] "r" (cpu),
|
||||||
[current_cpu_id] "Qo" (__rseq_abi.cpu_id),
|
[current_cpu_id] "Qo" (rseq_get_abi()->cpu_id),
|
||||||
[rseq_cs] "m" (__rseq_abi.rseq_cs),
|
[rseq_cs] "m" (rseq_get_abi()->rseq_cs),
|
||||||
[v] "Qo" (*v),
|
[v] "Qo" (*v),
|
||||||
[expect] "r" (expect),
|
[expect] "r" (expect),
|
||||||
[newv] "r" (newv)
|
[newv] "r" (newv)
|
||||||
@@ -287,8 +287,8 @@ int rseq_cmpnev_storeoffp_load(intptr_t *v, intptr_t expectnot,
|
|||||||
RSEQ_ASM_DEFINE_ABORT(4, abort)
|
RSEQ_ASM_DEFINE_ABORT(4, abort)
|
||||||
: /* gcc asm goto does not allow outputs */
|
: /* gcc asm goto does not allow outputs */
|
||||||
: [cpu_id] "r" (cpu),
|
: [cpu_id] "r" (cpu),
|
||||||
[current_cpu_id] "Qo" (__rseq_abi.cpu_id),
|
[current_cpu_id] "Qo" (rseq_get_abi()->cpu_id),
|
||||||
[rseq_cs] "m" (__rseq_abi.rseq_cs),
|
[rseq_cs] "m" (rseq_get_abi()->rseq_cs),
|
||||||
[v] "Qo" (*v),
|
[v] "Qo" (*v),
|
||||||
[expectnot] "r" (expectnot),
|
[expectnot] "r" (expectnot),
|
||||||
[load] "Qo" (*load),
|
[load] "Qo" (*load),
|
||||||
@@ -337,8 +337,8 @@ int rseq_addv(intptr_t *v, intptr_t count, int cpu)
|
|||||||
RSEQ_ASM_DEFINE_ABORT(4, abort)
|
RSEQ_ASM_DEFINE_ABORT(4, abort)
|
||||||
: /* gcc asm goto does not allow outputs */
|
: /* gcc asm goto does not allow outputs */
|
||||||
: [cpu_id] "r" (cpu),
|
: [cpu_id] "r" (cpu),
|
||||||
[current_cpu_id] "Qo" (__rseq_abi.cpu_id),
|
[current_cpu_id] "Qo" (rseq_get_abi()->cpu_id),
|
||||||
[rseq_cs] "m" (__rseq_abi.rseq_cs),
|
[rseq_cs] "m" (rseq_get_abi()->rseq_cs),
|
||||||
[v] "Qo" (*v),
|
[v] "Qo" (*v),
|
||||||
[count] "r" (count)
|
[count] "r" (count)
|
||||||
RSEQ_INJECT_INPUT
|
RSEQ_INJECT_INPUT
|
||||||
@@ -388,8 +388,8 @@ int rseq_cmpeqv_trystorev_storev(intptr_t *v, intptr_t expect,
|
|||||||
RSEQ_ASM_DEFINE_ABORT(4, abort)
|
RSEQ_ASM_DEFINE_ABORT(4, abort)
|
||||||
: /* gcc asm goto does not allow outputs */
|
: /* gcc asm goto does not allow outputs */
|
||||||
: [cpu_id] "r" (cpu),
|
: [cpu_id] "r" (cpu),
|
||||||
[current_cpu_id] "Qo" (__rseq_abi.cpu_id),
|
[current_cpu_id] "Qo" (rseq_get_abi()->cpu_id),
|
||||||
[rseq_cs] "m" (__rseq_abi.rseq_cs),
|
[rseq_cs] "m" (rseq_get_abi()->rseq_cs),
|
||||||
[expect] "r" (expect),
|
[expect] "r" (expect),
|
||||||
[v] "Qo" (*v),
|
[v] "Qo" (*v),
|
||||||
[newv] "r" (newv),
|
[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)
|
RSEQ_ASM_DEFINE_ABORT(4, abort)
|
||||||
: /* gcc asm goto does not allow outputs */
|
: /* gcc asm goto does not allow outputs */
|
||||||
: [cpu_id] "r" (cpu),
|
: [cpu_id] "r" (cpu),
|
||||||
[current_cpu_id] "Qo" (__rseq_abi.cpu_id),
|
[current_cpu_id] "Qo" (rseq_get_abi()->cpu_id),
|
||||||
[rseq_cs] "m" (__rseq_abi.rseq_cs),
|
[rseq_cs] "m" (rseq_get_abi()->rseq_cs),
|
||||||
[expect] "r" (expect),
|
[expect] "r" (expect),
|
||||||
[v] "Qo" (*v),
|
[v] "Qo" (*v),
|
||||||
[newv] "r" (newv),
|
[newv] "r" (newv),
|
||||||
@@ -508,8 +508,8 @@ int rseq_cmpeqv_cmpeqv_storev(intptr_t *v, intptr_t expect,
|
|||||||
RSEQ_ASM_DEFINE_ABORT(4, abort)
|
RSEQ_ASM_DEFINE_ABORT(4, abort)
|
||||||
: /* gcc asm goto does not allow outputs */
|
: /* gcc asm goto does not allow outputs */
|
||||||
: [cpu_id] "r" (cpu),
|
: [cpu_id] "r" (cpu),
|
||||||
[current_cpu_id] "Qo" (__rseq_abi.cpu_id),
|
[current_cpu_id] "Qo" (rseq_get_abi()->cpu_id),
|
||||||
[rseq_cs] "m" (__rseq_abi.rseq_cs),
|
[rseq_cs] "m" (rseq_get_abi()->rseq_cs),
|
||||||
[v] "Qo" (*v),
|
[v] "Qo" (*v),
|
||||||
[expect] "r" (expect),
|
[expect] "r" (expect),
|
||||||
[v2] "Qo" (*v2),
|
[v2] "Qo" (*v2),
|
||||||
@@ -569,8 +569,8 @@ int rseq_cmpeqv_trymemcpy_storev(intptr_t *v, intptr_t expect,
|
|||||||
RSEQ_ASM_DEFINE_ABORT(4, abort)
|
RSEQ_ASM_DEFINE_ABORT(4, abort)
|
||||||
: /* gcc asm goto does not allow outputs */
|
: /* gcc asm goto does not allow outputs */
|
||||||
: [cpu_id] "r" (cpu),
|
: [cpu_id] "r" (cpu),
|
||||||
[current_cpu_id] "Qo" (__rseq_abi.cpu_id),
|
[current_cpu_id] "Qo" (rseq_get_abi()->cpu_id),
|
||||||
[rseq_cs] "m" (__rseq_abi.rseq_cs),
|
[rseq_cs] "m" (rseq_get_abi()->rseq_cs),
|
||||||
[expect] "r" (expect),
|
[expect] "r" (expect),
|
||||||
[v] "Qo" (*v),
|
[v] "Qo" (*v),
|
||||||
[newv] "r" (newv),
|
[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)
|
RSEQ_ASM_DEFINE_ABORT(4, abort)
|
||||||
: /* gcc asm goto does not allow outputs */
|
: /* gcc asm goto does not allow outputs */
|
||||||
: [cpu_id] "r" (cpu),
|
: [cpu_id] "r" (cpu),
|
||||||
[current_cpu_id] "Qo" (__rseq_abi.cpu_id),
|
[current_cpu_id] "Qo" (rseq_get_abi()->cpu_id),
|
||||||
[rseq_cs] "m" (__rseq_abi.rseq_cs),
|
[rseq_cs] "m" (rseq_get_abi()->rseq_cs),
|
||||||
[expect] "r" (expect),
|
[expect] "r" (expect),
|
||||||
[v] "Qo" (*v),
|
[v] "Qo" (*v),
|
||||||
[newv] "r" (newv),
|
[newv] "r" (newv),
|
||||||
|
@@ -190,8 +190,8 @@ int rseq_cmpeqv_storev(intptr_t *v, intptr_t expect, intptr_t newv, int cpu)
|
|||||||
"5:\n\t"
|
"5:\n\t"
|
||||||
: /* gcc asm goto does not allow outputs */
|
: /* gcc asm goto does not allow outputs */
|
||||||
: [cpu_id] "r" (cpu),
|
: [cpu_id] "r" (cpu),
|
||||||
[current_cpu_id] "m" (__rseq_abi.cpu_id),
|
[current_cpu_id] "m" (rseq_get_abi()->cpu_id),
|
||||||
[rseq_cs] "m" (__rseq_abi.rseq_cs),
|
[rseq_cs] "m" (rseq_get_abi()->rseq_cs),
|
||||||
[v] "m" (*v),
|
[v] "m" (*v),
|
||||||
[expect] "r" (expect),
|
[expect] "r" (expect),
|
||||||
[newv] "r" (newv)
|
[newv] "r" (newv)
|
||||||
@@ -258,8 +258,8 @@ int rseq_cmpnev_storeoffp_load(intptr_t *v, intptr_t expectnot,
|
|||||||
"5:\n\t"
|
"5:\n\t"
|
||||||
: /* gcc asm goto does not allow outputs */
|
: /* gcc asm goto does not allow outputs */
|
||||||
: [cpu_id] "r" (cpu),
|
: [cpu_id] "r" (cpu),
|
||||||
[current_cpu_id] "m" (__rseq_abi.cpu_id),
|
[current_cpu_id] "m" (rseq_get_abi()->cpu_id),
|
||||||
[rseq_cs] "m" (__rseq_abi.rseq_cs),
|
[rseq_cs] "m" (rseq_get_abi()->rseq_cs),
|
||||||
/* final store input */
|
/* final store input */
|
||||||
[v] "m" (*v),
|
[v] "m" (*v),
|
||||||
[expectnot] "r" (expectnot),
|
[expectnot] "r" (expectnot),
|
||||||
@@ -319,8 +319,8 @@ int rseq_addv(intptr_t *v, intptr_t count, int cpu)
|
|||||||
"5:\n\t"
|
"5:\n\t"
|
||||||
: /* gcc asm goto does not allow outputs */
|
: /* gcc asm goto does not allow outputs */
|
||||||
: [cpu_id] "r" (cpu),
|
: [cpu_id] "r" (cpu),
|
||||||
[current_cpu_id] "m" (__rseq_abi.cpu_id),
|
[current_cpu_id] "m" (rseq_get_abi()->cpu_id),
|
||||||
[rseq_cs] "m" (__rseq_abi.rseq_cs),
|
[rseq_cs] "m" (rseq_get_abi()->rseq_cs),
|
||||||
[v] "m" (*v),
|
[v] "m" (*v),
|
||||||
[count] "Ir" (count)
|
[count] "Ir" (count)
|
||||||
RSEQ_INJECT_INPUT
|
RSEQ_INJECT_INPUT
|
||||||
@@ -382,8 +382,8 @@ int rseq_cmpeqv_trystorev_storev(intptr_t *v, intptr_t expect,
|
|||||||
"5:\n\t"
|
"5:\n\t"
|
||||||
: /* gcc asm goto does not allow outputs */
|
: /* gcc asm goto does not allow outputs */
|
||||||
: [cpu_id] "r" (cpu),
|
: [cpu_id] "r" (cpu),
|
||||||
[current_cpu_id] "m" (__rseq_abi.cpu_id),
|
[current_cpu_id] "m" (rseq_get_abi()->cpu_id),
|
||||||
[rseq_cs] "m" (__rseq_abi.rseq_cs),
|
[rseq_cs] "m" (rseq_get_abi()->rseq_cs),
|
||||||
/* try store input */
|
/* try store input */
|
||||||
[v2] "m" (*v2),
|
[v2] "m" (*v2),
|
||||||
[newv2] "r" (newv2),
|
[newv2] "r" (newv2),
|
||||||
@@ -456,8 +456,8 @@ int rseq_cmpeqv_trystorev_storev_release(intptr_t *v, intptr_t expect,
|
|||||||
"5:\n\t"
|
"5:\n\t"
|
||||||
: /* gcc asm goto does not allow outputs */
|
: /* gcc asm goto does not allow outputs */
|
||||||
: [cpu_id] "r" (cpu),
|
: [cpu_id] "r" (cpu),
|
||||||
[current_cpu_id] "m" (__rseq_abi.cpu_id),
|
[current_cpu_id] "m" (rseq_get_abi()->cpu_id),
|
||||||
[rseq_cs] "m" (__rseq_abi.rseq_cs),
|
[rseq_cs] "m" (rseq_get_abi()->rseq_cs),
|
||||||
/* try store input */
|
/* try store input */
|
||||||
[v2] "m" (*v2),
|
[v2] "m" (*v2),
|
||||||
[newv2] "r" (newv2),
|
[newv2] "r" (newv2),
|
||||||
@@ -532,8 +532,8 @@ int rseq_cmpeqv_cmpeqv_storev(intptr_t *v, intptr_t expect,
|
|||||||
"5:\n\t"
|
"5:\n\t"
|
||||||
: /* gcc asm goto does not allow outputs */
|
: /* gcc asm goto does not allow outputs */
|
||||||
: [cpu_id] "r" (cpu),
|
: [cpu_id] "r" (cpu),
|
||||||
[current_cpu_id] "m" (__rseq_abi.cpu_id),
|
[current_cpu_id] "m" (rseq_get_abi()->cpu_id),
|
||||||
[rseq_cs] "m" (__rseq_abi.rseq_cs),
|
[rseq_cs] "m" (rseq_get_abi()->rseq_cs),
|
||||||
/* cmp2 input */
|
/* cmp2 input */
|
||||||
[v2] "m" (*v2),
|
[v2] "m" (*v2),
|
||||||
[expect2] "r" (expect2),
|
[expect2] "r" (expect2),
|
||||||
@@ -649,8 +649,8 @@ int rseq_cmpeqv_trymemcpy_storev(intptr_t *v, intptr_t expect,
|
|||||||
"8:\n\t"
|
"8:\n\t"
|
||||||
: /* gcc asm goto does not allow outputs */
|
: /* gcc asm goto does not allow outputs */
|
||||||
: [cpu_id] "r" (cpu),
|
: [cpu_id] "r" (cpu),
|
||||||
[current_cpu_id] "m" (__rseq_abi.cpu_id),
|
[current_cpu_id] "m" (rseq_get_abi()->cpu_id),
|
||||||
[rseq_cs] "m" (__rseq_abi.rseq_cs),
|
[rseq_cs] "m" (rseq_get_abi()->rseq_cs),
|
||||||
/* final store input */
|
/* final store input */
|
||||||
[v] "m" (*v),
|
[v] "m" (*v),
|
||||||
[expect] "r" (expect),
|
[expect] "r" (expect),
|
||||||
@@ -771,8 +771,8 @@ int rseq_cmpeqv_trymemcpy_storev_release(intptr_t *v, intptr_t expect,
|
|||||||
"8:\n\t"
|
"8:\n\t"
|
||||||
: /* gcc asm goto does not allow outputs */
|
: /* gcc asm goto does not allow outputs */
|
||||||
: [cpu_id] "r" (cpu),
|
: [cpu_id] "r" (cpu),
|
||||||
[current_cpu_id] "m" (__rseq_abi.cpu_id),
|
[current_cpu_id] "m" (rseq_get_abi()->cpu_id),
|
||||||
[rseq_cs] "m" (__rseq_abi.rseq_cs),
|
[rseq_cs] "m" (rseq_get_abi()->rseq_cs),
|
||||||
/* final store input */
|
/* final store input */
|
||||||
[v] "m" (*v),
|
[v] "m" (*v),
|
||||||
[expect] "r" (expect),
|
[expect] "r" (expect),
|
||||||
|
@@ -235,8 +235,8 @@ int rseq_cmpeqv_storev(intptr_t *v, intptr_t expect, intptr_t newv, int cpu)
|
|||||||
RSEQ_ASM_DEFINE_ABORT(4, abort)
|
RSEQ_ASM_DEFINE_ABORT(4, abort)
|
||||||
: /* gcc asm goto does not allow outputs */
|
: /* gcc asm goto does not allow outputs */
|
||||||
: [cpu_id] "r" (cpu),
|
: [cpu_id] "r" (cpu),
|
||||||
[current_cpu_id] "m" (__rseq_abi.cpu_id),
|
[current_cpu_id] "m" (rseq_get_abi()->cpu_id),
|
||||||
[rseq_cs] "m" (__rseq_abi.rseq_cs),
|
[rseq_cs] "m" (rseq_get_abi()->rseq_cs),
|
||||||
[v] "m" (*v),
|
[v] "m" (*v),
|
||||||
[expect] "r" (expect),
|
[expect] "r" (expect),
|
||||||
[newv] "r" (newv)
|
[newv] "r" (newv)
|
||||||
@@ -301,8 +301,8 @@ int rseq_cmpnev_storeoffp_load(intptr_t *v, intptr_t expectnot,
|
|||||||
RSEQ_ASM_DEFINE_ABORT(4, abort)
|
RSEQ_ASM_DEFINE_ABORT(4, abort)
|
||||||
: /* gcc asm goto does not allow outputs */
|
: /* gcc asm goto does not allow outputs */
|
||||||
: [cpu_id] "r" (cpu),
|
: [cpu_id] "r" (cpu),
|
||||||
[current_cpu_id] "m" (__rseq_abi.cpu_id),
|
[current_cpu_id] "m" (rseq_get_abi()->cpu_id),
|
||||||
[rseq_cs] "m" (__rseq_abi.rseq_cs),
|
[rseq_cs] "m" (rseq_get_abi()->rseq_cs),
|
||||||
/* final store input */
|
/* final store input */
|
||||||
[v] "m" (*v),
|
[v] "m" (*v),
|
||||||
[expectnot] "r" (expectnot),
|
[expectnot] "r" (expectnot),
|
||||||
@@ -359,8 +359,8 @@ int rseq_addv(intptr_t *v, intptr_t count, int cpu)
|
|||||||
RSEQ_ASM_DEFINE_ABORT(4, abort)
|
RSEQ_ASM_DEFINE_ABORT(4, abort)
|
||||||
: /* gcc asm goto does not allow outputs */
|
: /* gcc asm goto does not allow outputs */
|
||||||
: [cpu_id] "r" (cpu),
|
: [cpu_id] "r" (cpu),
|
||||||
[current_cpu_id] "m" (__rseq_abi.cpu_id),
|
[current_cpu_id] "m" (rseq_get_abi()->cpu_id),
|
||||||
[rseq_cs] "m" (__rseq_abi.rseq_cs),
|
[rseq_cs] "m" (rseq_get_abi()->rseq_cs),
|
||||||
/* final store input */
|
/* final store input */
|
||||||
[v] "m" (*v),
|
[v] "m" (*v),
|
||||||
[count] "r" (count)
|
[count] "r" (count)
|
||||||
@@ -419,8 +419,8 @@ int rseq_cmpeqv_trystorev_storev(intptr_t *v, intptr_t expect,
|
|||||||
RSEQ_ASM_DEFINE_ABORT(4, abort)
|
RSEQ_ASM_DEFINE_ABORT(4, abort)
|
||||||
: /* gcc asm goto does not allow outputs */
|
: /* gcc asm goto does not allow outputs */
|
||||||
: [cpu_id] "r" (cpu),
|
: [cpu_id] "r" (cpu),
|
||||||
[current_cpu_id] "m" (__rseq_abi.cpu_id),
|
[current_cpu_id] "m" (rseq_get_abi()->cpu_id),
|
||||||
[rseq_cs] "m" (__rseq_abi.rseq_cs),
|
[rseq_cs] "m" (rseq_get_abi()->rseq_cs),
|
||||||
/* try store input */
|
/* try store input */
|
||||||
[v2] "m" (*v2),
|
[v2] "m" (*v2),
|
||||||
[newv2] "r" (newv2),
|
[newv2] "r" (newv2),
|
||||||
@@ -489,8 +489,8 @@ int rseq_cmpeqv_trystorev_storev_release(intptr_t *v, intptr_t expect,
|
|||||||
RSEQ_ASM_DEFINE_ABORT(4, abort)
|
RSEQ_ASM_DEFINE_ABORT(4, abort)
|
||||||
: /* gcc asm goto does not allow outputs */
|
: /* gcc asm goto does not allow outputs */
|
||||||
: [cpu_id] "r" (cpu),
|
: [cpu_id] "r" (cpu),
|
||||||
[current_cpu_id] "m" (__rseq_abi.cpu_id),
|
[current_cpu_id] "m" (rseq_get_abi()->cpu_id),
|
||||||
[rseq_cs] "m" (__rseq_abi.rseq_cs),
|
[rseq_cs] "m" (rseq_get_abi()->rseq_cs),
|
||||||
/* try store input */
|
/* try store input */
|
||||||
[v2] "m" (*v2),
|
[v2] "m" (*v2),
|
||||||
[newv2] "r" (newv2),
|
[newv2] "r" (newv2),
|
||||||
@@ -560,8 +560,8 @@ int rseq_cmpeqv_cmpeqv_storev(intptr_t *v, intptr_t expect,
|
|||||||
RSEQ_ASM_DEFINE_ABORT(4, abort)
|
RSEQ_ASM_DEFINE_ABORT(4, abort)
|
||||||
: /* gcc asm goto does not allow outputs */
|
: /* gcc asm goto does not allow outputs */
|
||||||
: [cpu_id] "r" (cpu),
|
: [cpu_id] "r" (cpu),
|
||||||
[current_cpu_id] "m" (__rseq_abi.cpu_id),
|
[current_cpu_id] "m" (rseq_get_abi()->cpu_id),
|
||||||
[rseq_cs] "m" (__rseq_abi.rseq_cs),
|
[rseq_cs] "m" (rseq_get_abi()->rseq_cs),
|
||||||
/* cmp2 input */
|
/* cmp2 input */
|
||||||
[v2] "m" (*v2),
|
[v2] "m" (*v2),
|
||||||
[expect2] "r" (expect2),
|
[expect2] "r" (expect2),
|
||||||
@@ -635,8 +635,8 @@ int rseq_cmpeqv_trymemcpy_storev(intptr_t *v, intptr_t expect,
|
|||||||
RSEQ_ASM_DEFINE_ABORT(4, abort)
|
RSEQ_ASM_DEFINE_ABORT(4, abort)
|
||||||
: /* gcc asm goto does not allow outputs */
|
: /* gcc asm goto does not allow outputs */
|
||||||
: [cpu_id] "r" (cpu),
|
: [cpu_id] "r" (cpu),
|
||||||
[current_cpu_id] "m" (__rseq_abi.cpu_id),
|
[current_cpu_id] "m" (rseq_get_abi()->cpu_id),
|
||||||
[rseq_cs] "m" (__rseq_abi.rseq_cs),
|
[rseq_cs] "m" (rseq_get_abi()->rseq_cs),
|
||||||
/* final store input */
|
/* final store input */
|
||||||
[v] "m" (*v),
|
[v] "m" (*v),
|
||||||
[expect] "r" (expect),
|
[expect] "r" (expect),
|
||||||
@@ -711,8 +711,8 @@ int rseq_cmpeqv_trymemcpy_storev_release(intptr_t *v, intptr_t expect,
|
|||||||
RSEQ_ASM_DEFINE_ABORT(4, abort)
|
RSEQ_ASM_DEFINE_ABORT(4, abort)
|
||||||
: /* gcc asm goto does not allow outputs */
|
: /* gcc asm goto does not allow outputs */
|
||||||
: [cpu_id] "r" (cpu),
|
: [cpu_id] "r" (cpu),
|
||||||
[current_cpu_id] "m" (__rseq_abi.cpu_id),
|
[current_cpu_id] "m" (rseq_get_abi()->cpu_id),
|
||||||
[rseq_cs] "m" (__rseq_abi.rseq_cs),
|
[rseq_cs] "m" (rseq_get_abi()->rseq_cs),
|
||||||
/* final store input */
|
/* final store input */
|
||||||
[v] "m" (*v),
|
[v] "m" (*v),
|
||||||
[expect] "r" (expect),
|
[expect] "r" (expect),
|
||||||
|
@@ -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)
|
RSEQ_ASM_DEFINE_ABORT(4, "", abort)
|
||||||
: /* gcc asm goto does not allow outputs */
|
: /* gcc asm goto does not allow outputs */
|
||||||
: [cpu_id] "r" (cpu),
|
: [cpu_id] "r" (cpu),
|
||||||
[current_cpu_id] "m" (__rseq_abi.cpu_id),
|
[current_cpu_id] "m" (rseq_get_abi()->cpu_id),
|
||||||
[rseq_cs] "m" (__rseq_abi.rseq_cs),
|
[rseq_cs] "m" (rseq_get_abi()->rseq_cs),
|
||||||
[v] "m" (*v),
|
[v] "m" (*v),
|
||||||
[expect] "r" (expect),
|
[expect] "r" (expect),
|
||||||
[newv] "r" (newv)
|
[newv] "r" (newv)
|
||||||
@@ -233,8 +233,8 @@ int rseq_cmpnev_storeoffp_load(intptr_t *v, intptr_t expectnot,
|
|||||||
RSEQ_ASM_DEFINE_ABORT(4, "", abort)
|
RSEQ_ASM_DEFINE_ABORT(4, "", abort)
|
||||||
: /* gcc asm goto does not allow outputs */
|
: /* gcc asm goto does not allow outputs */
|
||||||
: [cpu_id] "r" (cpu),
|
: [cpu_id] "r" (cpu),
|
||||||
[current_cpu_id] "m" (__rseq_abi.cpu_id),
|
[current_cpu_id] "m" (rseq_get_abi()->cpu_id),
|
||||||
[rseq_cs] "m" (__rseq_abi.rseq_cs),
|
[rseq_cs] "m" (rseq_get_abi()->rseq_cs),
|
||||||
/* final store input */
|
/* final store input */
|
||||||
[v] "m" (*v),
|
[v] "m" (*v),
|
||||||
[expectnot] "r" (expectnot),
|
[expectnot] "r" (expectnot),
|
||||||
@@ -288,8 +288,8 @@ int rseq_addv(intptr_t *v, intptr_t count, int cpu)
|
|||||||
RSEQ_ASM_DEFINE_ABORT(4, "", abort)
|
RSEQ_ASM_DEFINE_ABORT(4, "", abort)
|
||||||
: /* gcc asm goto does not allow outputs */
|
: /* gcc asm goto does not allow outputs */
|
||||||
: [cpu_id] "r" (cpu),
|
: [cpu_id] "r" (cpu),
|
||||||
[current_cpu_id] "m" (__rseq_abi.cpu_id),
|
[current_cpu_id] "m" (rseq_get_abi()->cpu_id),
|
||||||
[rseq_cs] "m" (__rseq_abi.rseq_cs),
|
[rseq_cs] "m" (rseq_get_abi()->rseq_cs),
|
||||||
/* final store input */
|
/* final store input */
|
||||||
[v] "m" (*v),
|
[v] "m" (*v),
|
||||||
[count] "r" (count)
|
[count] "r" (count)
|
||||||
@@ -347,8 +347,8 @@ int rseq_cmpeqv_trystorev_storev(intptr_t *v, intptr_t expect,
|
|||||||
RSEQ_ASM_DEFINE_ABORT(4, "", abort)
|
RSEQ_ASM_DEFINE_ABORT(4, "", abort)
|
||||||
: /* gcc asm goto does not allow outputs */
|
: /* gcc asm goto does not allow outputs */
|
||||||
: [cpu_id] "r" (cpu),
|
: [cpu_id] "r" (cpu),
|
||||||
[current_cpu_id] "m" (__rseq_abi.cpu_id),
|
[current_cpu_id] "m" (rseq_get_abi()->cpu_id),
|
||||||
[rseq_cs] "m" (__rseq_abi.rseq_cs),
|
[rseq_cs] "m" (rseq_get_abi()->rseq_cs),
|
||||||
/* try store input */
|
/* try store input */
|
||||||
[v2] "m" (*v2),
|
[v2] "m" (*v2),
|
||||||
[newv2] "r" (newv2),
|
[newv2] "r" (newv2),
|
||||||
@@ -426,8 +426,8 @@ int rseq_cmpeqv_cmpeqv_storev(intptr_t *v, intptr_t expect,
|
|||||||
RSEQ_ASM_DEFINE_ABORT(4, "", abort)
|
RSEQ_ASM_DEFINE_ABORT(4, "", abort)
|
||||||
: /* gcc asm goto does not allow outputs */
|
: /* gcc asm goto does not allow outputs */
|
||||||
: [cpu_id] "r" (cpu),
|
: [cpu_id] "r" (cpu),
|
||||||
[current_cpu_id] "m" (__rseq_abi.cpu_id),
|
[current_cpu_id] "m" (rseq_get_abi()->cpu_id),
|
||||||
[rseq_cs] "m" (__rseq_abi.rseq_cs),
|
[rseq_cs] "m" (rseq_get_abi()->rseq_cs),
|
||||||
/* cmp2 input */
|
/* cmp2 input */
|
||||||
[v2] "m" (*v2),
|
[v2] "m" (*v2),
|
||||||
[expect2] "r" (expect2),
|
[expect2] "r" (expect2),
|
||||||
@@ -534,8 +534,8 @@ int rseq_cmpeqv_trymemcpy_storev(intptr_t *v, intptr_t expect,
|
|||||||
#endif
|
#endif
|
||||||
: /* gcc asm goto does not allow outputs */
|
: /* gcc asm goto does not allow outputs */
|
||||||
: [cpu_id] "r" (cpu),
|
: [cpu_id] "r" (cpu),
|
||||||
[current_cpu_id] "m" (__rseq_abi.cpu_id),
|
[current_cpu_id] "m" (rseq_get_abi()->cpu_id),
|
||||||
[rseq_cs] "m" (__rseq_abi.rseq_cs),
|
[rseq_cs] "m" (rseq_get_abi()->rseq_cs),
|
||||||
/* final store input */
|
/* final store input */
|
||||||
[v] "m" (*v),
|
[v] "m" (*v),
|
||||||
[expect] "r" (expect),
|
[expect] "r" (expect),
|
||||||
|
@@ -141,7 +141,7 @@ int rseq_cmpeqv_storev(intptr_t *v, intptr_t expect, intptr_t newv, int cpu)
|
|||||||
RSEQ_ASM_DEFINE_ABORT(4, "", abort)
|
RSEQ_ASM_DEFINE_ABORT(4, "", abort)
|
||||||
: /* gcc asm goto does not allow outputs */
|
: /* gcc asm goto does not allow outputs */
|
||||||
: [cpu_id] "r" (cpu),
|
: [cpu_id] "r" (cpu),
|
||||||
[rseq_abi] "r" (&__rseq_abi),
|
[rseq_abi] "r" (rseq_get_abi()),
|
||||||
[v] "m" (*v),
|
[v] "m" (*v),
|
||||||
[expect] "r" (expect),
|
[expect] "r" (expect),
|
||||||
[newv] "r" (newv)
|
[newv] "r" (newv)
|
||||||
@@ -207,7 +207,7 @@ int rseq_cmpnev_storeoffp_load(intptr_t *v, intptr_t expectnot,
|
|||||||
RSEQ_ASM_DEFINE_ABORT(4, "", abort)
|
RSEQ_ASM_DEFINE_ABORT(4, "", abort)
|
||||||
: /* gcc asm goto does not allow outputs */
|
: /* gcc asm goto does not allow outputs */
|
||||||
: [cpu_id] "r" (cpu),
|
: [cpu_id] "r" (cpu),
|
||||||
[rseq_abi] "r" (&__rseq_abi),
|
[rseq_abi] "r" (rseq_get_abi()),
|
||||||
/* final store input */
|
/* final store input */
|
||||||
[v] "m" (*v),
|
[v] "m" (*v),
|
||||||
[expectnot] "r" (expectnot),
|
[expectnot] "r" (expectnot),
|
||||||
@@ -258,7 +258,7 @@ int rseq_addv(intptr_t *v, intptr_t count, int cpu)
|
|||||||
RSEQ_ASM_DEFINE_ABORT(4, "", abort)
|
RSEQ_ASM_DEFINE_ABORT(4, "", abort)
|
||||||
: /* gcc asm goto does not allow outputs */
|
: /* gcc asm goto does not allow outputs */
|
||||||
: [cpu_id] "r" (cpu),
|
: [cpu_id] "r" (cpu),
|
||||||
[rseq_abi] "r" (&__rseq_abi),
|
[rseq_abi] "r" (rseq_get_abi()),
|
||||||
/* final store input */
|
/* final store input */
|
||||||
[v] "m" (*v),
|
[v] "m" (*v),
|
||||||
[count] "er" (count)
|
[count] "er" (count)
|
||||||
@@ -314,7 +314,7 @@ int rseq_offset_deref_addv(intptr_t *ptr, off_t off, intptr_t inc, int cpu)
|
|||||||
RSEQ_ASM_DEFINE_ABORT(4, "", abort)
|
RSEQ_ASM_DEFINE_ABORT(4, "", abort)
|
||||||
: /* gcc asm goto does not allow outputs */
|
: /* gcc asm goto does not allow outputs */
|
||||||
: [cpu_id] "r" (cpu),
|
: [cpu_id] "r" (cpu),
|
||||||
[rseq_abi] "r" (&__rseq_abi),
|
[rseq_abi] "r" (rseq_get_abi()),
|
||||||
/* final store input */
|
/* final store input */
|
||||||
[ptr] "m" (*ptr),
|
[ptr] "m" (*ptr),
|
||||||
[off] "er" (off),
|
[off] "er" (off),
|
||||||
@@ -372,7 +372,7 @@ int rseq_cmpeqv_trystorev_storev(intptr_t *v, intptr_t expect,
|
|||||||
RSEQ_ASM_DEFINE_ABORT(4, "", abort)
|
RSEQ_ASM_DEFINE_ABORT(4, "", abort)
|
||||||
: /* gcc asm goto does not allow outputs */
|
: /* gcc asm goto does not allow outputs */
|
||||||
: [cpu_id] "r" (cpu),
|
: [cpu_id] "r" (cpu),
|
||||||
[rseq_abi] "r" (&__rseq_abi),
|
[rseq_abi] "r" (rseq_get_abi()),
|
||||||
/* try store input */
|
/* try store input */
|
||||||
[v2] "m" (*v2),
|
[v2] "m" (*v2),
|
||||||
[newv2] "r" (newv2),
|
[newv2] "r" (newv2),
|
||||||
@@ -449,7 +449,7 @@ int rseq_cmpeqv_cmpeqv_storev(intptr_t *v, intptr_t expect,
|
|||||||
RSEQ_ASM_DEFINE_ABORT(4, "", abort)
|
RSEQ_ASM_DEFINE_ABORT(4, "", abort)
|
||||||
: /* gcc asm goto does not allow outputs */
|
: /* gcc asm goto does not allow outputs */
|
||||||
: [cpu_id] "r" (cpu),
|
: [cpu_id] "r" (cpu),
|
||||||
[rseq_abi] "r" (&__rseq_abi),
|
[rseq_abi] "r" (rseq_get_abi()),
|
||||||
/* cmp2 input */
|
/* cmp2 input */
|
||||||
[v2] "m" (*v2),
|
[v2] "m" (*v2),
|
||||||
[expect2] "r" (expect2),
|
[expect2] "r" (expect2),
|
||||||
@@ -555,7 +555,7 @@ int rseq_cmpeqv_trymemcpy_storev(intptr_t *v, intptr_t expect,
|
|||||||
#endif
|
#endif
|
||||||
: /* gcc asm goto does not allow outputs */
|
: /* gcc asm goto does not allow outputs */
|
||||||
: [cpu_id] "r" (cpu),
|
: [cpu_id] "r" (cpu),
|
||||||
[rseq_abi] "r" (&__rseq_abi),
|
[rseq_abi] "r" (rseq_get_abi()),
|
||||||
/* final store input */
|
/* final store input */
|
||||||
[v] "m" (*v),
|
[v] "m" (*v),
|
||||||
[expect] "r" (expect),
|
[expect] "r" (expect),
|
||||||
@@ -719,7 +719,7 @@ int rseq_cmpeqv_storev(intptr_t *v, intptr_t expect, intptr_t newv, int cpu)
|
|||||||
RSEQ_ASM_DEFINE_ABORT(4, "", abort)
|
RSEQ_ASM_DEFINE_ABORT(4, "", abort)
|
||||||
: /* gcc asm goto does not allow outputs */
|
: /* gcc asm goto does not allow outputs */
|
||||||
: [cpu_id] "r" (cpu),
|
: [cpu_id] "r" (cpu),
|
||||||
[rseq_abi] "r" (&__rseq_abi),
|
[rseq_abi] "r" (rseq_get_abi()),
|
||||||
[v] "m" (*v),
|
[v] "m" (*v),
|
||||||
[expect] "r" (expect),
|
[expect] "r" (expect),
|
||||||
[newv] "r" (newv)
|
[newv] "r" (newv)
|
||||||
@@ -785,7 +785,7 @@ int rseq_cmpnev_storeoffp_load(intptr_t *v, intptr_t expectnot,
|
|||||||
RSEQ_ASM_DEFINE_ABORT(4, "", abort)
|
RSEQ_ASM_DEFINE_ABORT(4, "", abort)
|
||||||
: /* gcc asm goto does not allow outputs */
|
: /* gcc asm goto does not allow outputs */
|
||||||
: [cpu_id] "r" (cpu),
|
: [cpu_id] "r" (cpu),
|
||||||
[rseq_abi] "r" (&__rseq_abi),
|
[rseq_abi] "r" (rseq_get_abi()),
|
||||||
/* final store input */
|
/* final store input */
|
||||||
[v] "m" (*v),
|
[v] "m" (*v),
|
||||||
[expectnot] "r" (expectnot),
|
[expectnot] "r" (expectnot),
|
||||||
@@ -836,7 +836,7 @@ int rseq_addv(intptr_t *v, intptr_t count, int cpu)
|
|||||||
RSEQ_ASM_DEFINE_ABORT(4, "", abort)
|
RSEQ_ASM_DEFINE_ABORT(4, "", abort)
|
||||||
: /* gcc asm goto does not allow outputs */
|
: /* gcc asm goto does not allow outputs */
|
||||||
: [cpu_id] "r" (cpu),
|
: [cpu_id] "r" (cpu),
|
||||||
[rseq_abi] "r" (&__rseq_abi),
|
[rseq_abi] "r" (rseq_get_abi()),
|
||||||
/* final store input */
|
/* final store input */
|
||||||
[v] "m" (*v),
|
[v] "m" (*v),
|
||||||
[count] "ir" (count)
|
[count] "ir" (count)
|
||||||
@@ -894,7 +894,7 @@ int rseq_cmpeqv_trystorev_storev(intptr_t *v, intptr_t expect,
|
|||||||
RSEQ_ASM_DEFINE_ABORT(4, "", abort)
|
RSEQ_ASM_DEFINE_ABORT(4, "", abort)
|
||||||
: /* gcc asm goto does not allow outputs */
|
: /* gcc asm goto does not allow outputs */
|
||||||
: [cpu_id] "r" (cpu),
|
: [cpu_id] "r" (cpu),
|
||||||
[rseq_abi] "r" (&__rseq_abi),
|
[rseq_abi] "r" (rseq_get_abi()),
|
||||||
/* try store input */
|
/* try store input */
|
||||||
[v2] "m" (*v2),
|
[v2] "m" (*v2),
|
||||||
[newv2] "m" (newv2),
|
[newv2] "m" (newv2),
|
||||||
@@ -962,7 +962,7 @@ int rseq_cmpeqv_trystorev_storev_release(intptr_t *v, intptr_t expect,
|
|||||||
RSEQ_ASM_DEFINE_ABORT(4, "", abort)
|
RSEQ_ASM_DEFINE_ABORT(4, "", abort)
|
||||||
: /* gcc asm goto does not allow outputs */
|
: /* gcc asm goto does not allow outputs */
|
||||||
: [cpu_id] "r" (cpu),
|
: [cpu_id] "r" (cpu),
|
||||||
[rseq_abi] "r" (&__rseq_abi),
|
[rseq_abi] "r" (rseq_get_abi()),
|
||||||
/* try store input */
|
/* try store input */
|
||||||
[v2] "m" (*v2),
|
[v2] "m" (*v2),
|
||||||
[newv2] "r" (newv2),
|
[newv2] "r" (newv2),
|
||||||
@@ -1032,7 +1032,7 @@ int rseq_cmpeqv_cmpeqv_storev(intptr_t *v, intptr_t expect,
|
|||||||
RSEQ_ASM_DEFINE_ABORT(4, "", abort)
|
RSEQ_ASM_DEFINE_ABORT(4, "", abort)
|
||||||
: /* gcc asm goto does not allow outputs */
|
: /* gcc asm goto does not allow outputs */
|
||||||
: [cpu_id] "r" (cpu),
|
: [cpu_id] "r" (cpu),
|
||||||
[rseq_abi] "r" (&__rseq_abi),
|
[rseq_abi] "r" (rseq_get_abi()),
|
||||||
/* cmp2 input */
|
/* cmp2 input */
|
||||||
[v2] "m" (*v2),
|
[v2] "m" (*v2),
|
||||||
[expect2] "r" (expect2),
|
[expect2] "r" (expect2),
|
||||||
@@ -1142,7 +1142,7 @@ int rseq_cmpeqv_trymemcpy_storev(intptr_t *v, intptr_t expect,
|
|||||||
#endif
|
#endif
|
||||||
: /* gcc asm goto does not allow outputs */
|
: /* gcc asm goto does not allow outputs */
|
||||||
: [cpu_id] "r" (cpu),
|
: [cpu_id] "r" (cpu),
|
||||||
[rseq_abi] "r" (&__rseq_abi),
|
[rseq_abi] "r" (rseq_get_abi()),
|
||||||
/* final store input */
|
/* final store input */
|
||||||
[v] "m" (*v),
|
[v] "m" (*v),
|
||||||
[expect] "m" (expect),
|
[expect] "m" (expect),
|
||||||
@@ -1255,7 +1255,7 @@ int rseq_cmpeqv_trymemcpy_storev_release(intptr_t *v, intptr_t expect,
|
|||||||
#endif
|
#endif
|
||||||
: /* gcc asm goto does not allow outputs */
|
: /* gcc asm goto does not allow outputs */
|
||||||
: [cpu_id] "r" (cpu),
|
: [cpu_id] "r" (cpu),
|
||||||
[rseq_abi] "r" (&__rseq_abi),
|
[rseq_abi] "r" (rseq_get_abi()),
|
||||||
/* final store input */
|
/* final store input */
|
||||||
[v] "m" (*v),
|
[v] "m" (*v),
|
||||||
[expect] "m" (expect),
|
[expect] "m" (expect),
|
||||||
|
@@ -46,6 +46,11 @@
|
|||||||
extern __thread struct rseq_abi __rseq_abi;
|
extern __thread struct rseq_abi __rseq_abi;
|
||||||
extern int __rseq_handled;
|
extern int __rseq_handled;
|
||||||
|
|
||||||
|
static inline struct rseq_abi *rseq_get_abi(void)
|
||||||
|
{
|
||||||
|
return &__rseq_abi;
|
||||||
|
}
|
||||||
|
|
||||||
#define rseq_likely(x) __builtin_expect(!!(x), 1)
|
#define rseq_likely(x) __builtin_expect(!!(x), 1)
|
||||||
#define rseq_unlikely(x) __builtin_expect(!!(x), 0)
|
#define rseq_unlikely(x) __builtin_expect(!!(x), 0)
|
||||||
#define rseq_barrier() __asm__ __volatile__("" : : : "memory")
|
#define rseq_barrier() __asm__ __volatile__("" : : : "memory")
|
||||||
@@ -108,7 +113,7 @@ int32_t rseq_fallback_current_cpu(void);
|
|||||||
*/
|
*/
|
||||||
static inline int32_t rseq_current_cpu_raw(void)
|
static inline int32_t rseq_current_cpu_raw(void)
|
||||||
{
|
{
|
||||||
return RSEQ_ACCESS_ONCE(__rseq_abi.cpu_id);
|
return RSEQ_ACCESS_ONCE(rseq_get_abi()->cpu_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -124,7 +129,7 @@ static inline int32_t rseq_current_cpu_raw(void)
|
|||||||
*/
|
*/
|
||||||
static inline uint32_t rseq_cpu_start(void)
|
static inline uint32_t rseq_cpu_start(void)
|
||||||
{
|
{
|
||||||
return RSEQ_ACCESS_ONCE(__rseq_abi.cpu_id_start);
|
return RSEQ_ACCESS_ONCE(rseq_get_abi()->cpu_id_start);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline uint32_t rseq_current_cpu(void)
|
static inline uint32_t rseq_current_cpu(void)
|
||||||
@@ -139,7 +144,7 @@ static inline uint32_t rseq_current_cpu(void)
|
|||||||
|
|
||||||
static inline void rseq_clear_rseq_cs(void)
|
static inline void rseq_clear_rseq_cs(void)
|
||||||
{
|
{
|
||||||
RSEQ_WRITE_ONCE(__rseq_abi.rseq_cs.arch.ptr, 0);
|
RSEQ_WRITE_ONCE(rseq_get_abi()->rseq_cs.arch.ptr, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Reference in New Issue
Block a user