Message ID | 55D77E55.4010801@linux.vnet.ibm.com |
---|---|
State | New |
Headers | show |
"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!
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