]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
powerpc: Fix tabort usage in syscalls
authorPaul E. Murphy <murphyp@linux.vnet.ibm.com>
Fri, 21 Aug 2015 19:39:01 +0000 (14:39 -0500)
committerPaul E. Murphy <murphyp@linux.vnet.ibm.com>
Tue, 1 Sep 2015 14:46:05 +0000 (09:46 -0500)
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)

ChangeLog
sysdeps/powerpc/powerpc32/sysdep.h
sysdeps/powerpc/powerpc64/sysdep.h
sysdeps/unix/sysv/linux/powerpc/syscall.S

index 8396a46ccfd969d4fd78423e604935ee0a8f53da..a3173c6531d876eee2bb54b28de12a0a85541b93 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2015-09-01  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-09-01  Paul E. Murphy  <murphyp@linux.vnet.ibm.com>
 
        * sysdeps/unix/sysv/linux/powerpc/elision-lock.c
index c4b3ca8696ddbb3cb2935ae52e1c6f7c7e830c06..261ca5f86bfb3a672c875834027a3da9902a0676 100644 (file)
@@ -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
index 78722c687340c3c37ba793885dd146927589dee7..1636899c1a6e954383ae230c0a319f9c8eb6d914 100644 (file)
@@ -290,8 +290,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
index 346e962240b4918a86c36b801ef8d1e726716769..d78eee76f1a62e8c081807ad94ce0c6a4f6b091d 100644 (file)
@@ -18,6 +18,7 @@
 #include <sysdep.h>
 
 ENTRY (syscall)
+       ABORT_TRANSACTION
        mr   r0,r3
        mr   r3,r4
        mr   r4,r5