]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.typeparams] runtime: call cgocallbackg indirectly on ARM64
authorCherry Mui <cherryyz@google.com>
Wed, 2 Jun 2021 23:43:28 +0000 (19:43 -0400)
committerCherry Mui <cherryyz@google.com>
Thu, 3 Jun 2021 16:28:28 +0000 (16:28 +0000)
This is CL 312669, for ARM64.

cgocallback calls cgocallbackg after switching the stack. Call it
indirectly to bypass the linker's nosplit check. In particular,
this avoids a nosplit stack overflow on Windows when register ABI
is enabled.

Change-Id: I7054a750fb0ec2579d46004f94b46b6f7b9e3a21
Reviewed-on: https://go-review.googlesource.com/c/go/+/324734
Trust: Cherry Mui <cherryyz@google.com>
Run-TryBot: Cherry Mui <cherryyz@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
src/runtime/asm_arm64.s

index 4babcc7fcbc30fdcd88aba8e6082edce8bfd7de7..be4313d35d5b713b33fc8564813ed4aca6858397 100644 (file)
@@ -1196,7 +1196,8 @@ havem:
        MOVD    R1, 8(RSP)
        MOVD    R2, 16(RSP)
        MOVD    R3, 24(RSP)
-       BL      runtime·cgocallbackg(SB)
+       MOVD    $runtime·cgocallbackg(SB), R0
+       CALL    (R0) // indirect call to bypass nosplit check. We're on a different stack now.
 
        // Restore g->sched (== m->curg->sched) from saved values.
        MOVD    0(RSP), R5