shithub: riscv

Download patch

ref: 04066fe973c628476fbe9eb65bf62a67334987f7
parent: 7de7414e885c3fa3c52200c49528e1e8da5adcc9
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Thu May 7 19:27:27 EDT 2020

bcm64: fix kernels cmpswap() function

spectacular bug. cmpswap() had a sign extension bug
using sign extending MOV to load the old compare
value and LDXRW using zero extension while the CMP
instruction compared 64 bit registers.

this caused cmpswap with negative old value always
to fail.

interestingly, libc's version of this function was
fine.

--- a/sys/src/9/bcm64/l.s
+++ b/sys/src/9/bcm64/l.s
@@ -229,8 +229,8 @@
 
 TEXT cas(SB), 1, $-4
 TEXT cmpswap(SB), 1, $-4
-	MOVW	ov+8(FP), R1
-	MOVW	nv+16(FP), R2
+	MOVWU	ov+8(FP), R1
+	MOVWU	nv+16(FP), R2
 _cas1:
 	LDXRW	(R0), R3
 	CMP	R3, R1