]> git.ipfire.org Git - thirdparty/kernel/stable.git/commit
arm64: cmpxchg: Use "K" instead of "L" for ll/sc immediate constraint
authorWill Deacon <will.deacon@arm.com>
Tue, 18 Sep 2018 08:39:55 +0000 (09:39 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 7 Mar 2021 10:27:42 +0000 (11:27 +0100)
commit8e3b6aa4b97f8d9f875b4434334caa304d4aef67
tree2fb069003d1f0a600e713b96521be56637025cee
parent52ce2fba3b41798302f810bbb28c7cf1a26074b7
arm64: cmpxchg: Use "K" instead of "L" for ll/sc immediate constraint

commit 4230509978f2921182da4e9197964dccdbe463c3 upstream.

The "L" AArch64 machine constraint, which we use for the "old" value in
an LL/SC cmpxchg(), generates an immediate that is suitable for a 64-bit
logical instruction. However, for cmpxchg() operations on types smaller
than 64 bits, this constraint can result in an invalid instruction which
is correctly rejected by GAS, such as EOR W1, W1, #0xffffffff.

Whilst we could special-case the constraint based on the cmpxchg size,
it's far easier to change the constraint to "K" and put up with using
a register for large 64-bit immediates. For out-of-line LL/SC atomics,
this is all moot anyway.

Reported-by: Robin Murphy <robin.murphy@arm.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
arch/arm64/include/asm/atomic_ll_sc.h