freebsd-dev/sys/riscv
John Baldwin b96562eb86 Fix atomic_*cmpset32 on riscv64 with clang.
The lr.w instruction used to read the value from memory sign-extends
the value read from memory.  GCC sign-extends the 32-bit comparison
value passed in whereas clang currently does not.  As a result, if the
value being compared has the MSB set, the comparison fails for
matching 32-bit values when compiled with clang.

Use a cast to explicitly sign-extend the unsigned comparison value.
This works with both GCC and clang.

There is commentary in the RISC-V spec that suggests that GCC's
approach is more correct, but it is not clear if the commentary in the
RISC-V spec is binding.

Reviewed by:	mhorne
Obtained from:	Axiado
MFC after:	2 weeks
Sponsored by:	DARPA
Differential Revision:	https://reviews.freebsd.org/D22084
2019-10-23 16:41:31 +00:00
..
conf RISC-V: Support EARLY_AP_STARTUP 2019-09-16 22:17:16 +00:00
include Fix atomic_*cmpset32 on riscv64 with clang. 2019-10-23 16:41:31 +00:00
riscv Fix thread0 kernel stack initialization on riscv. 2019-10-22 16:52:56 +00:00