shithub: gefs

Download patch

ref: 90c65adbd50f21bc2802438d03451c7845b8e43f
parent: e2994142e890cd2ac79cc9ac3b76900ffce420b4
author: mia soweli <[email protected]>
date: Mon May 13 19:17:31 EDT 2024

atomic: fix 386 atomics

atomics now pass the tests on 386 and i can successfully
mount and ream a filesystem on a single core 386.
not tested with many cores.

--- a/atomic-386.s
+++ b/atomic-386.s
@@ -2,10 +2,10 @@
 	BYTE $0x0F; BYTE $0xB1; BYTE $0x11
 #define CMPXCHG64 /* (DI) */\
 	BYTE $0x0F; BYTE $0xC7; BYTE $0x0F
-#define XADDL /* CX, (AX) */ \
-	BYTE $0x67; BYTE $0x0F; BYTE $0xC1; BYTE $0x08
-#define MFENCE
-	BYTE $0x0F; BYTE $0xAE; BYTE $0xF0
+#define XADDL /* BX, (AX) */ \
+	BYTE $0x0F; BYTE $0xC1; BYTE $0x03
+#define XADDLSP /* AX, (SP) */ \
+	BYTE $0x0F; BYTE $0xC1; BYTE $0x04; BYTE $0x24
 
 /*  get variants */
 TEXT ageti+0(SB),1,$0
@@ -16,10 +16,10 @@
 	RET
 
 TEXT agetv+0(SB),1,$0
-	MOVL	p+0(FP),AX
-	MOVL	p+4(FP),BX
-	FMOVD	(BX),F0
-	FMOVD	F0,(AX)
+	MOVL	r+0(FP), AX
+	MOVL	p+4(FP), BX
+	FMOVD	(BX), F0
+	FMOVDP	F0, (AX)
 	RET
 
 /*  set variants */
@@ -26,10 +26,9 @@
 TEXT aseti+0(SB),1,$0
 TEXT asetl+0(SB),1,$0
 TEXT asetp+0(SB),1,$0
-	MOVL		v+0(FP), AX
-	MOVL		0(AX), AX
-	MOVL		v+4(FP), BX
-	LOCK; XCHGL	(AX), BX
+	MOVL		p+0(FP), BX
+	MOVL		v+4(FP), AX
+	LOCK; XCHGL	(BX), AX
 	RET
 
 TEXT asetv+0(SB),1,$0
@@ -50,26 +49,27 @@
 TEXT ainci+0(SB),1,$0
 TEXT aincl+0(SB),1,$0
 TEXT aincp+0(SB),1,$0
-	MOVL		p+0(FP), AX
-	MOVL		0(AX), AX
-	MOVL		v+4(FP), CX
-	LOCK; XADDL //	AX, (DX)
+	MOVL	p+0(FP), BX
+	MOVL	v+4(FP), CX
+	MOVL	CX, AX
+	LOCK; XADDL
+	ADDL	CX, AX
 	RET
 
 TEXT aincv+0(SB),1,$0
 	MOVL	p+4(FP), DI
 retry:
-	MOVL	0x0(DI), AX	// ov = *p
-	MOVL	0x4(DI), DX
-	MOVL	AX, BX		// nv = ov
+	MOVL	0(DI), AX
+	MOVL	4(DI), DX
+	MOVL 	AX, BX
 	MOVL	DX, CX
-	ADDL	dv+0x8(FP), BX	// nv += dv
-	ADCL	dv+0x12(FP), CX
+	ADDL	v+8(FP), BX
+	ADCL	v+12(FP), CX
 	LOCK; CMPXCHG64
 	JNE	retry
 	MOVL	r+0(FP), DI
-	MOVL	BX, (DI)
-	MOVL	CX, (DI)
+	MOVL	BX, 0x0(DI)
+	MOVL	CX, 0x4(DI)
 	RET
 
 /*  cas variants */
@@ -79,7 +79,7 @@
 	MOVL	p+0(FP), CX
 	MOVL	ov+4(FP), AX
 	MOVL	nv+8(FP), DX
-	LOCK; CMPXCHG // (CX)
+	LOCK; CMPXCHG
 	JNE	fail32
 	MOVL	$1,AX
 	RET
@@ -89,13 +89,14 @@
 
 TEXT acasv+0(SB),1,$0
 	MOVL	p+0(FP), DI
-	MOVL	ov+0x4(FP), AX
-	MOVL	ov+0x8(FP), DX
-	MOVL	nv+0xc(FP), BX
-	MOVL	nv+0x10(FP), CX
-	LOCK; CMPXCHG64 // (DI)
+	MOVL	ov+4(FP), AX
+	MOVL	ov+8(FP), DX
+	MOVL	nv+12(FP), BX
+	MOVL	nv+16(FP), CX
+	LOCK; CMPXCHG64
 	JNE	fail64
 	MOVL	$1,AX
+	RET
 fail64:
 	MOVL	$0,AX
 	RET
@@ -102,5 +103,7 @@
 
 /* barriers (do we want to distinguish types?) */
 TEXT coherence+0(SB),1,$0
-	MFENCE
+	/* this is essentially mfence but that requires sse2 */
+	XORL	AX, AX
+	LOCK; XADDLSP
 	RET