aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul E. Murphy <murphyp@linux.vnet.ibm.com>2015-08-21 14:39:01 -0500
committerTulio Magno Quites Machado Filho <tuliom@linux.vnet.ibm.com>2015-08-25 13:45:56 -0300
commit18173559a23e28055640b152e623d9f0d40ecca8 (patch)
treef8c6124358298856fd939b2a6cf77a34d3dfaa46
parentfe7faec3e56a8dd64f78023a2f4a74fc8d42e79f (diff)
downloadglibc-18173559a23e28055640b152e623d9f0d40ecca8.zip
glibc-18173559a23e28055640b152e623d9f0d40ecca8.tar.gz
glibc-18173559a23e28055640b152e623d9f0d40ecca8.tar.bz2
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.
-rw-r--r--ChangeLog8
-rw-r--r--sysdeps/powerpc/powerpc32/sysdep.h4
-rw-r--r--sysdeps/powerpc/powerpc64/sysdep.h4
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/syscall.S1
4 files changed, 13 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index 13fc3fb..6e55d88 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.
+
2015-08-25 Rajalakshmi Srinivasaraghavan <raji@linux.vnet.ibm.com>
* sysdeps/powerpc/powerpc64/power7/strstr.S: Handle worst case.
diff --git a/sysdeps/powerpc/powerpc32/sysdep.h b/sysdeps/powerpc/powerpc32/sysdep.h
index e16fe3e..ecb492a 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 bf2a884..a9d37ad 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 157e3e3..4477303 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