]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: call cgocallbackg indirectly on PPC64
authorCherry Mui <cherryyz@google.com>
Wed, 22 Sep 2021 14:16:06 +0000 (10:16 -0400)
committerCherry Mui <cherryyz@google.com>
Wed, 22 Sep 2021 15:00:53 +0000 (15:00 +0000)
This is CL 312669, for PPC64.

cgocallback calls cgocallbackg after switching the stack. Call it
indirectly to bypass the linker's nosplit check. The nosplit check
fails after CL 351271, which removes ABI aliases. It would have
been failing before but the linker's nosplit check didn't resolve
ABI alias (it should) so it didn't catch that. Removing the ABI
aliases exposes it. For this partuclar case it is benign as there
is actually a stack switch in between.

Should fix PPC64 build.

Change-Id: I49617aea55270663a9ee4692c54c070c5ab85470
Reviewed-on: https://go-review.googlesource.com/c/go/+/351469
Trust: Cherry Mui <cherryyz@google.com>
Run-TryBot: Cherry Mui <cherryyz@google.com>
Reviewed-by: Than McIntosh <thanm@google.com>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
src/runtime/asm_ppc64x.s

index 7270abbdee211adcb863537677ef80188e34358c..18edb67988006e0f1169f62a09c231df317ec1be 100644 (file)
@@ -688,7 +688,10 @@ havem:
        MOVD    R5, FIXED_FRAME+0(R1)
        MOVD    R6, FIXED_FRAME+8(R1)
        MOVD    R7, FIXED_FRAME+16(R1)
-       BL      runtime·cgocallbackg(SB)
+
+       MOVD    $runtime·cgocallbackg(SB), R12
+       MOVD    R12, CTR
+       CALL    (CTR) // indirect call to bypass nosplit check. We're on a different stack now.
 
        // Restore g->sched (== m->curg->sched) from saved values.
        MOVD    0(R1), R5