diff options
author | Paul E. Murphy <murphyp@linux.vnet.ibm.com> | 2015-08-21 14:39:01 -0500 |
---|---|---|
committer | Aurelien Jarno <aurelien@aurel32.net> | 2016-04-08 23:30:47 +0200 |
commit | ab753f625e1dd77d388d1db6b9ecae54e871de84 (patch) | |
tree | 86ebcaa1ba006bc78a25c00c66d820f4b99614f0 | |
parent | a07df04187284a7993d890d5164a4433cebfd930 (diff) | |
download | glibc-ab753f625e1dd77d388d1db6b9ecae54e871de84.tar.gz glibc-ab753f625e1dd77d388d1db6b9ecae54e871de84.tar.xz glibc-ab753f625e1dd77d388d1db6b9ecae54e871de84.zip |
powerpc: Fix tabort usage in syscalls
Fix usage of tabort in generated syscalls. r0 has special meaning when used with this instruction, thus it will not generate persistent errors, nor return an error code. This mitigates poor CPU usage when performing elided critical sections. Additionally, transactions should be aborted when entering a user invoked syscall. Otherwise the results of the transaction may be undefined. 2015-08-25 Paul E. Murphy <murphyp@linux.vnet.ibm.com> * sysdeps/powerpc/powerpc32/sysdep.h (ABORT_TRANSACTION): Use register other than r0 for tabort, it has special meaning. * sysdeps/powerpc/powerpc64/sysdep.h (ABORT_TRANSACTION): Likewise * sysdeps/unix.sysv/linux/powerpc/syscall.S (syscall): Abort transaction before starting syscall. (cherry picked from commit 18173559a23e28055640b152e623d9f0d40ecca8)
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | sysdeps/powerpc/powerpc32/sysdep.h | 4 | ||||
-rw-r--r-- | sysdeps/powerpc/powerpc64/sysdep.h | 4 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/powerpc/syscall.S | 1 |
4 files changed, 13 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog index 6c8f1adff6..0b6deab1f2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2015-08-25 Paul E. Murphy <murphyp@linux.vnet.ibm.com> + + * sysdeps/powerpc/powerpc32/sysdep.h (ABORT_TRANSACTION): Use + register other than r0 for tabort, it has special meaning. + * sysdeps/powerpc/powerpc64/sysdep.h (ABORT_TRANSACTION): Likewise + * sysdeps/unix.sysv/linux/powerpc/syscall.S (syscall): Abort + transaction before starting syscall. + 2016-04-04 Stefan Liebler <stli@linux.vnet.ibm.com> * sysdeps/s390/bits/link.h: (La_s390_vr) New typedef. diff --git a/sysdeps/powerpc/powerpc32/sysdep.h b/sysdeps/powerpc/powerpc32/sysdep.h index e16fe3e224..ecb492a5ab 100644 --- a/sysdeps/powerpc/powerpc32/sysdep.h +++ b/sysdeps/powerpc/powerpc32/sysdep.h @@ -95,8 +95,8 @@ GOT_LABEL: ; \ lwz 0,TM_CAPABLE(2); \ cmpwi 0,0; \ beq 1f; \ - li 0,_ABORT_SYSCALL; \ - tabort. 0; \ + li 11,_ABORT_SYSCALL; \ + tabort. 11; \ .align 4; \ 1: #else diff --git a/sysdeps/powerpc/powerpc64/sysdep.h b/sysdeps/powerpc/powerpc64/sysdep.h index bf2a884b99..a9d37ad437 100644 --- a/sysdeps/powerpc/powerpc64/sysdep.h +++ b/sysdeps/powerpc/powerpc64/sysdep.h @@ -279,8 +279,8 @@ LT_LABELSUFFIX(name,_name_end): ; \ lwz 0,TM_CAPABLE(13); \ cmpwi 0,0; \ beq 1f; \ - li 0,_ABORT_SYSCALL; \ - tabort. 0; \ + li 11,_ABORT_SYSCALL; \ + tabort. 11; \ .align 4; \ 1: #else diff --git a/sysdeps/unix/sysv/linux/powerpc/syscall.S b/sysdeps/unix/sysv/linux/powerpc/syscall.S index 157e3e3296..44773038bc 100644 --- a/sysdeps/unix/sysv/linux/powerpc/syscall.S +++ b/sysdeps/unix/sysv/linux/powerpc/syscall.S @@ -18,6 +18,7 @@ #include <sysdep.h> ENTRY (syscall) + ABORT_TRANSACTION mr r0,r3 mr r3,r4 mr r4,r5 |