[PATCHv2] powerpc: Fix tabort usage in syscalls
Commit Message
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
"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!
@@ -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
@@ -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
@@ -18,6 +18,7 @@
#include <sysdep.h>
ENTRY (syscall)
+ ABORT_TRANSACTION
mr r0,r3
mr r3,r4
mr r4,r5