$OpenBSD: patch-src_runtime_asm_arm_s,v 1.1 2021/03/02 17:56:41 jsing Exp $

Index: src/runtime/asm_arm.s
--- src/runtime/asm_arm.s.orig
+++ src/runtime/asm_arm.s
@@ -127,6 +127,11 @@ TEXT runtime·rt0_go(SB),NOSPLIT|NOFRAME,$0
 	MOVW	$runtime·g0(SB), g
 	MOVW	$runtime·m0(SB), R8
 
+#ifdef GOOS_openbsd
+	// Save g to TLS so that it is available from signal trampoline.
+	BL	runtime·save_g(SB)
+#endif
+
 	// save m->g0 = g0
 	MOVW	g, m_g0(R8)
 	// save g->m = m0
@@ -273,9 +278,6 @@ TEXT runtime·mcall(SB),NOSPLIT|NOFRAME,$0-4
 	CMP	g, R1
 	B.NE	2(PC)
 	B	runtime·badmcall(SB)
-	MOVB	runtime·iscgo(SB), R11
-	CMP	$0, R11
-	BL.NE	runtime·save_g(SB)
 	MOVW	fn+0(FP), R0
 	MOVW	(g_sched+gobuf_sp)(g), R13
 	SUB	$8, R13
@@ -649,9 +651,13 @@ TEXT	·cgocallback(SB),NOSPLIT,$12-12
 	NO_LOCAL_POINTERS
 
 	// Load m and g from thread-local storage.
+#ifdef GOOS_openbsd
+	BL	runtime·load_g(SB)
+#else
 	MOVB	runtime·iscgo(SB), R0
 	CMP	$0, R0
 	BL.NE	runtime·load_g(SB)
+#endif
 
 	// If g is nil, Go did not create the current thread.
 	// Call needm to obtain one for temporary use.
@@ -760,7 +766,11 @@ TEXT setg<>(SB),NOSPLIT|NOFRAME,$0-0
 	// Save g to thread-local storage.
 #ifdef GOOS_windows
 	B	runtime·save_g(SB)
-#else
+#endif
+#ifdef GOOS_openbsd
+	B	runtime·save_g(SB)
+#endif
+
 	MOVB	runtime·iscgo(SB), R0
 	CMP	$0, R0
 	B.EQ	2(PC)
@@ -768,7 +778,6 @@ TEXT setg<>(SB),NOSPLIT|NOFRAME,$0-0
 
 	MOVW	g, R0
 	RET
-#endif
 
 TEXT runtime·emptyfunc(SB),0,$0-0
 	RET
