]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: netbsd-arm64 fixes
authorBenny Siegert <bsiegert@gmail.com>
Sat, 26 Sep 2020 19:40:17 +0000 (19:40 +0000)
committerBenny Siegert <bsiegert@gmail.com>
Mon, 28 Sep 2020 06:01:37 +0000 (06:01 +0000)
Add missing declaration of crosscall1.

Fix stack alignment for pipe2 return value.

Work around kernel clobbering of r28 on aarch64 by reloading from ucontext.
https://nxr.netbsd.org/xref/src/sys/arch/aarch64/aarch64/sig_machdep.c#104

Update #30824

Change-Id: I7f9472939f4c02953f8c207308610118f5d3c54c
Reviewed-on: https://go-review.googlesource.com/c/go/+/257645
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Trust: Benny Siegert <bsiegert@gmail.com>

src/runtime/cgo/gcc_netbsd_arm64.c
src/runtime/sys_netbsd_arm64.s

index b29fab0f8c64dfe3e191af1474ee89fb06d28341..694116ce7098d64fb1e9e726ba4e899af1a3e81a 100644 (file)
@@ -53,6 +53,8 @@ _cgo_sys_thread_start(ThreadStart *ts)
        }
 }
 
+extern void crosscall1(void (*fn)(void), void (*setg_gcc)(void*), void *g);
+
 static void*
 threadentry(void *v)
 {
index e70be0fa743a285c5fcd62121ac2846a716b57e3..f19a8b78f6a21aeb4e822b9ac219c5ed88515d1a 100644 (file)
@@ -169,11 +169,12 @@ pipeok:
 
 // func pipe2(flags int32) (r, w int32, errno int32)
 TEXT runtimeĀ·pipe2(SB),NOSPLIT|NOFRAME,$0-20
-       ADD     $8, RSP, R0
+       ADD     $16, RSP, R0
        MOVW    flags+0(FP), R1
        SVC     $SYS_pipe2
-       BCC     2(PC)
+       BCC     pipe2ok
        NEG     R0, R0
+pipe2ok:
        MOVW    R0, errno+16(FP)
        RET
 
@@ -319,6 +320,12 @@ TEXT runtimeĀ·sigtramp(SB),NOSPLIT,$192
        MOVD    R26, 8*11(RSP)
        MOVD    R27, 8*12(RSP)
        MOVD    g, 8*13(RSP)
+       // Unclobber g for now (kernel uses it as ucontext ptr)
+       // See https://github.com/golang/go/issues/30824#issuecomment-492772426
+       // This is only correct in the non-cgo case.
+       // XXX should use lwp_getprivate as suggested.
+       // 8*36 is ucontext.uc_mcontext.__gregs[_REG_X28]
+       MOVD    8*36(g), g
        MOVD    R29, 8*14(RSP)
        FMOVD   F8, 8*15(RSP)
        FMOVD   F9, 8*16(RSP)