[PATCHv2] powerpc: Fix tabort usage in syscalls

Message ID 55D77E55.4010801@linux.vnet.ibm.com
State Committed
Delegated to: Tulio Magno Quites Machado Filho
Headers

Commit Message

Paul E. Murphy Aug. 21, 2015, 7:39 p.m. UTC
  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-03  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.
---
 sysdeps/powerpc/powerpc32/sysdep.h        |    4 ++--
 sysdeps/powerpc/powerpc64/sysdep.h        |    4 ++--
 sysdeps/unix/sysv/linux/powerpc/syscall.S |    1 +
 3 files changed, 5 insertions(+), 4 deletions(-)
  

Comments

Tulio Magno Quites Machado Filho Aug. 25, 2015, 4:30 p.m. UTC | #1
"Paul E. Murphy" <murphyp@linux.vnet.ibm.com> writes:

> 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-03  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.

LGTM.

I'm pushing it.

Thanks!
  

Patch

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