#ifdef __x86_64__
-#define smp_mb() __asm__ __volatile__ ("mfence" : : : "memory")
-#define smp_rmb() barrier()
-#define smp_wmb() barrier()
-
-#define smp_load_acquire(p) \
-__extension__ ({ \
- __typeof(*p) ____p1 = READ_ONCE(*p); \
- barrier(); \
- ____p1; \
-})
-
-#define smp_acquire__after_ctrl_dep() smp_rmb()
-
-#define smp_store_release(p, v) \
-do { \
- barrier(); \
- WRITE_ONCE(*p, v); \
-} while (0)
-
#define has_fast_acquire_release() 1
#define has_single_copy_load_64() 1
"1:\n\t" \
_setup \
RSEQ_INJECT_ASM(1) \
- "movq $3b, %[rseq_cs]\n\t" \
+ "leaq 3b(%%rip), %%rax\n\t" \
+ "movq %%rax, %[rseq_cs]\n\t" \
RSEQ_INJECT_ASM(2) \
"cmpl %[start_event_counter], %[current_event_counter]\n\t" \
"jnz 4f\n\t" \
_final_store \
"2:\n\t" \
RSEQ_INJECT_ASM(5) \
- "movq $0, %[rseq_cs]\n\t" \
_teardown \
".pushsection __rseq_failure, \"a\"\n\t" \
"4:\n\t" \
- "movq $0, %[rseq_cs]\n\t" \
_teardown \
"jmp %l[failure]\n\t" \
".popsection\n\t" \
- : /* no outputs */ \
+ : /* gcc asm goto does not allow outputs */ \
: [start_event_counter]"r"((_start_value).event_counter), \
[current_event_counter]"m"((_start_value).rseqp->u.e.event_counter), \
[rseq_cs]"m"((_start_value).rseqp->rseq_cs) \
_spec_input \
_final_input \
RSEQ_INJECT_INPUT \
- : "memory", "cc" \
+ : "memory", "cc", "rax" \
_extra_clobber \
RSEQ_INJECT_CLOBBER \
: _failure \
#elif __i386__
-/*
- * Support older 32-bit architectures that do not implement fence
- * instructions.
- */
-#define smp_mb() \
- __asm__ __volatile__ ("lock; addl $0,0(%%esp)" : : : "memory")
-#define smp_rmb() \
- __asm__ __volatile__ ("lock; addl $0,0(%%esp)" : : : "memory")
-#define smp_wmb() \
- __asm__ __volatile__ ("lock; addl $0,0(%%esp)" : : : "memory")
-
-#define smp_load_acquire(p) \
-__extension__ ({ \
- __typeof(*p) ____p1 = READ_ONCE(*p); \
- smp_mb(); \
- ____p1; \
-})
-
-#define smp_acquire__after_ctrl_dep() smp_rmb()
-
-#define smp_store_release(p, v) \
-do { \
- smp_mb(); \
- WRITE_ONCE(*p, v); \
-} while (0)
-
#define has_fast_acquire_release() 0
#define has_single_copy_load_64() 0
_final_store \
"2:\n\t" \
RSEQ_INJECT_ASM(5) \
- "movl $0, %[rseq_cs]\n\t" \
_teardown \
".pushsection __rseq_failure, \"a\"\n\t" \
"4:\n\t" \
- "movl $0, %[rseq_cs]\n\t" \
_teardown \
"jmp %l[failure]\n\t" \
".popsection\n\t" \
- : /* no outputs */ \
+ : /* gcc asm goto does not allow outputs */ \
: [start_event_counter]"m"((_start_value).event_counter), \
[current_event_counter]"m"((_start_value).rseqp->u.e.event_counter), \
[rseq_cs]"m"((_start_value).rseqp->rseq_cs) \