diff options
author | Adhemerval Zanella <azanella@linux.vnet.ibm.com> | 2014-11-07 12:34:52 -0500 |
---|---|---|
committer | Adhemerval Zanella <azanella@linux.vnet.ibm.com> | 2015-01-12 06:32:08 -0500 |
commit | 56cf2763819d2f721c98f2b8bcc04a3c673837d3 (patch) | |
tree | 5d2fde37897779f64b83951c1ef99406fd384055 /sysdeps/powerpc/sysdep.h | |
parent | 4b45943a6f62cfc239e79ad8902f5c7f71fd13ec (diff) | |
download | glibc-56cf2763819d2f721c98f2b8bcc04a3c673837d3.tar.gz glibc-56cf2763819d2f721c98f2b8bcc04a3c673837d3.tar.xz glibc-56cf2763819d2f721c98f2b8bcc04a3c673837d3.zip |
powerpc: abort transaction in syscalls
Linux kernel powerpc documentation states issuing a syscall inside a transaction is not recommended and may lead to undefined behavior. It also states syscalls does not abort transactoin neither they run in transactional state. To avoid side-effects being visible outside transactions, GLIBC with lock elision enabled will issue a transaction abort instruction just before all syscalls if hardware supports hardware transactions.
Diffstat (limited to 'sysdeps/powerpc/sysdep.h')
-rw-r--r-- | sysdeps/powerpc/sysdep.h | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/sysdeps/powerpc/sysdep.h b/sysdeps/powerpc/sysdep.h index 3d37b1b92e..e32168e8f4 100644 --- a/sysdeps/powerpc/sysdep.h +++ b/sysdeps/powerpc/sysdep.h @@ -21,6 +21,10 @@ */ #define _SYSDEPS_SYSDEP_H 1 #include <bits/hwcap.h> +#ifdef ENABLE_LOCK_ELISION +#include <tls.h> +#include <htm.h> +#endif #define PPC_FEATURE_970 (PPC_FEATURE_POWER4 + PPC_FEATURE_HAS_ALTIVEC) @@ -164,4 +168,22 @@ #define ALIGNARG(log2) log2 #define ASM_SIZE_DIRECTIVE(name) .size name,.-name +#else + +/* Linux kernel powerpc documentation [1] states issuing a syscall inside a + transaction is not recommended and may lead to undefined behavior. It + also states syscalls do not abort transactions. To avoid such traps, + we abort transaction just before syscalls. + + [1] Documentation/powerpc/transactional_memory.txt [Syscalls] */ +#if !IS_IN(rtld) && defined (ENABLE_LOCK_ELISION) +# define ABORT_TRANSACTION \ + ({ \ + if (THREAD_GET_TM_CAPABLE ()) \ + __builtin_tabort (_ABORT_SYSCALL); \ + }) +#else +# define ABORT_TRANSACTION +#endif + #endif /* __ASSEMBLER__ */ |