summaryrefslogtreecommitdiff
path: root/arch/s390/include/asm/futex.h
diff options
context:
space:
mode:
authorHeiko Carstens <hca@linux.ibm.com>2025-01-21 15:55:01 +0100
committerAlexander Gordeev <agordeev@linux.ibm.com>2025-01-26 17:24:07 +0100
commit554f8842dcd9555cfd91517062c31f229b309ba1 (patch)
tree6bdd8877c717ac8da7749b3c886a061bd5f04cff /arch/s390/include/asm/futex.h
parent9e8f72f7730a403b66b3cf4b8e34244d08f74db5 (diff)
s390/futex: Cleanup futex_atomic_cmpxchg_inatomic()
Cleanup the futex_atomic_cmpxchg_inatomic() inline assembly to make it a bit more readable. Acked-by: Ilya Leoshkevich <iii@linux.ibm.com> Signed-off-by: Heiko Carstens <hca@linux.ibm.com> Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com>
Diffstat (limited to 'arch/s390/include/asm/futex.h')
-rw-r--r--arch/s390/include/asm/futex.h21
1 files changed, 11 insertions, 10 deletions
diff --git a/arch/s390/include/asm/futex.h b/arch/s390/include/asm/futex.h
index 84fedd7beaec..6aa2544e5ff4 100644
--- a/arch/s390/include/asm/futex.h
+++ b/arch/s390/include/asm/futex.h
@@ -71,19 +71,20 @@ int arch_futex_atomic_op_inuser(int op, int oparg, int *oval, u32 __user *uaddr)
static inline int futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr,
u32 oldval, u32 newval)
{
- int ret;
+ int rc;
- asm volatile(
- " sacf 256\n"
- "0: cs %1,%4,0(%5)\n"
- "1: la %0,0\n"
- "2: sacf 768\n"
- EX_TABLE(0b,2b) EX_TABLE(1b,2b)
- : "=d" (ret), "+d" (oldval), "=m" (*uaddr)
- : "0" (-EFAULT), "d" (newval), "a" (uaddr), "m" (*uaddr)
+ asm_inline volatile(
+ " sacf 256\n"
+ "0: cs %[old],%[new],%[uaddr]\n"
+ "1: lhi %[rc],0\n"
+ "2: sacf 768\n"
+ EX_TABLE_UA_FAULT(0b, 2b, %[rc])
+ EX_TABLE_UA_FAULT(1b, 2b, %[rc])
+ : [rc] "=d" (rc), [old] "+d" (oldval), [uaddr] "+Q" (*uaddr)
+ : [new] "d" (newval)
: "cc", "memory");
*uval = oldval;
- return ret;
+ return rc;
}
#endif /* _ASM_S390_FUTEX_H */