]> Cypherpunks repositories - gostls13.git/commitdiff
runtime, runtime/cgo: conform to PIC register use rules in ppc64 asm
authorMichael Hudson-Doyle <michael.hudson@canonical.com>
Thu, 8 Oct 2015 09:49:39 +0000 (22:49 +1300)
committerMichael Hudson-Doyle <michael.hudson@canonical.com>
Sun, 18 Oct 2015 23:36:39 +0000 (23:36 +0000)
PIC code on ppc64le uses R2 as a TOC pointer and when calling a function
through a function pointer must ensure the function pointer is in R12.  These
rules are easy enough to follow unconditionally in our assembly, so do that.

Change-Id: Icfc4e47ae5dfbe15f581cbdd785cdeed6e40bc32
Reviewed-on: https://go-review.googlesource.com/15526
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/runtime/asm_ppc64x.s
src/runtime/cgo/asm_ppc64x.s
src/runtime/cgo/gcc_ppc64x.S
src/runtime/rt0_linux_ppc64.s
src/runtime/rt0_linux_ppc64le.s
src/runtime/sys_linux_ppc64x.s

index ee2114dfc486e9b9ec1d35bedff3940721c441c2..27c649257f18c0d0b75146033d289f9314ff7eb8 100644 (file)
@@ -144,8 +144,8 @@ TEXT runtime·gogo(SB), NOSPLIT|NOFRAME, $0-8
        MOVD    R0, gobuf_lr(R5)
        MOVD    R0, gobuf_ctxt(R5)
        CMP     R0, R0 // set condition codes for == test, needed by stack split
-       MOVD    gobuf_pc(R5), R31
-       MOVD    R31, CTR
+       MOVD    gobuf_pc(R5), R12
+       MOVD    R12, CTR
        BR      (CTR)
 
 // void mcall(fn func(*g))
@@ -169,8 +169,8 @@ TEXT runtime·mcall(SB), NOSPLIT|NOFRAME, $0-8
        BNE     2(PC)
        BR      runtime·badmcall(SB)
        MOVD    fn+0(FP), R11                   // context
-       MOVD    0(R11), R                     // code pointer
-       MOVD    R4, CTR
+       MOVD    0(R11), R12                     // code pointer
+       MOVD    R12, CTR
        MOVD    (g_sched+gobuf_sp)(g), R1       // sp = m->g0->sched.sp
        MOVDU   R3, -8(R1)
        MOVDU   R0, -8(R1)
@@ -207,8 +207,8 @@ TEXT runtime·systemstack(SB), NOSPLIT, $0-8
 
        // Bad: g is not gsignal, not g0, not curg. What is it?
        // Hide call from linker nosplit analysis.
-       MOVD    $runtime·badsystemstack(SB), R3
-       MOVD    R3, CTR
+       MOVD    $runtime·badsystemstack(SB), R12
+       MOVD    R12, CTR
        BL      (CTR)
 
 switch:
@@ -232,8 +232,8 @@ switch:
        MOVD    R3, R1
 
        // call target function
-       MOVD    0(R11), R     // code pointer
-       MOVD    R3, CTR
+       MOVD    0(R11), R12     // code pointer
+       MOVD    R12, CTR
        BL      (CTR)
 
        // switch back to g
@@ -246,8 +246,8 @@ switch:
 
 noswitch:
        // already on m stack, just call directly
-       MOVD    0(R11), R     // code pointer
-       MOVD    R3, CTR
+       MOVD    0(R11), R12     // code pointer
+       MOVD    R12, CTR
        BL      (CTR)
        RET
 
@@ -333,8 +333,8 @@ TEXT runtime·stackBarrier(SB),NOSPLIT,$0
        MOVD    $MAXSIZE, R31;          \
        CMP     R3, R31;                \
        BGT     4(PC);                  \
-       MOVD    $NAME(SB), R31; \
-       MOVD    R31, CTR;               \
+       MOVD    $NAME(SB), R12;         \
+       MOVD    R12, CTR;               \
        BR      (CTR)
 // Note: can't just "BR NAME(SB)" - bad inlining results.
 
@@ -371,8 +371,8 @@ TEXT ·reflectcall(SB), NOSPLIT|NOFRAME, $0-32
        DISPATCH(runtime·call268435456, 268435456)
        DISPATCH(runtime·call536870912, 536870912)
        DISPATCH(runtime·call1073741824, 1073741824)
-       MOVD    $runtime·badreflectcall(SB), R31
-       MOVD    R31, CTR
+       MOVD    $runtime·badreflectcall(SB), R12
+       MOVD    R12, CTR
        BR      (CTR)
 
 #define CALLFN(NAME,MAXSIZE)                   \
@@ -392,8 +392,8 @@ TEXT NAME(SB), WRAPPER, $MAXSIZE-24;                \
        BR      -4(PC);                         \
        /* call function */                     \
        MOVD    f+8(FP), R11;                   \
-       MOVD    (R11), R31;                     \
-       MOVD    R31, CTR;                       \
+       MOVD    (R11), R12;                     \
+       MOVD    R12, CTR;                       \
        PCDATA  $PCDATA_StackMapIndex, $0;      \
        BL      (CTR);                          \
        /* copy return values back */           \
@@ -678,8 +678,8 @@ TEXT runtime·jmpdefer(SB), NOSPLIT|NOFRAME, $0-16
        MOVD    fv+0(FP), R11
        MOVD    argp+8(FP), R1
        SUB     $FIXED_FRAME, R1
-       MOVD    0(R11), R3
-       MOVD    R3, CTR
+       MOVD    0(R11), R12
+       MOVD    R12, CTR
        BR      (CTR)
 
 // Save state of caller into g->sched. Smashes R31.
@@ -700,7 +700,7 @@ TEXT ·asmcgocall(SB),NOSPLIT,$0-20
        MOVD    fn+0(FP), R3
        MOVD    arg+8(FP), R4
 
-       MOVD    R1, R2          // save original stack pointer
+       MOVD    R1, R7          // save original stack pointer
        MOVD    g, R5
 
        // Figure out if we need to switch to m->g0 stack.
@@ -723,7 +723,7 @@ g0:
        RLDCR   $0, R1, $~15, R1        // 16-byte alignment for gcc ABI
        MOVD    R5, 40(R1)      // save old g on stack
        MOVD    (g_stack+stack_hi)(R5), R5
-       SUB     R2, R5
+       SUB     R7, R5
        MOVD    R5, 32(R1)      // save depth in old g stack (can't just save SP, as stack might be copied during a callback)
        MOVD    R0, 0(R1)       // clear back chain pointer (TODO can we give it real back trace information?)
        // This is a "global call", so put the global entry point in r12
@@ -756,8 +756,8 @@ TEXT runtime·cgocallback(SB),NOSPLIT,$24-24
        MOVD    R3, FIXED_FRAME+8(R1)
        MOVD    framesize+16(FP), R3
        MOVD    R3, FIXED_FRAME+16(R1)
-       MOVD    $runtime·cgocallback_gofunc(SB), R3
-       MOVD    R3, CTR
+       MOVD    $runtime·cgocallback_gofunc(SB), R12
+       MOVD    R12, CTR
        BL      (CTR)
        RET
 
@@ -781,8 +781,8 @@ nocgo:
        CMP     g, $0
        BNE     havem
        MOVD    g, savedm-8(SP) // g is zero, so is m.
-       MOVD    $runtime·needm(SB), R3
-       MOVD    R3, CTR
+       MOVD    $runtime·needm(SB), R12
+       MOVD    R12, CTR
        BL      (CTR)
 
        // Set m->sched.sp = SP, so that if a panic happens
@@ -857,8 +857,8 @@ havem:
        MOVD    savedm-8(SP), R6
        CMP     R6, $0
        BNE     droppedm
-       MOVD    $runtime·dropm(SB), R3
-       MOVD    R3, CTR
+       MOVD    $runtime·dropm(SB), R12
+       MOVD    R12, CTR
        BL      (CTR)
 droppedm:
 
index 5659f758c40e7246b25d420a6ee5940088a3b541..5cdbe06bbe6f302f913b6bcf6d3b8b6081661e46 100644 (file)
@@ -28,6 +28,7 @@ TEXT crosscall2(SB),NOSPLIT|NOFRAME,$0
        BL      runtime·reginit(SB)
        BL      runtime·load_g(SB)
 
+       MOVD    R3, R12
        MOVD    R3, CTR
        MOVD    R4, FIXED_FRAME+0(R1)
        MOVD    R5, FIXED_FRAME+8(R1)
index 682349b2ab1d2295dee588ec91336a7b51e25868..58f13364c64a93ae4bfd840acf1578c20c6e961c 100644 (file)
@@ -36,6 +36,7 @@ EXT(crosscall_ppc64):
        mr      %r30, %r4
 
        // Call fn
+       mr      %r12, %r3
        mtctr   %r3
        bctrl
 
index 33e973db96599475320ea19a81bbd853759fd8a7..f81451543830d5d7818e36c0b736ec99048d7a11 100644 (file)
@@ -18,6 +18,6 @@ TEXT _main<>(SB),NOSPLIT,$-8
        BR main(SB)
 
 TEXT main(SB),NOSPLIT,$-8
-       MOVD    $runtime·rt0_go(SB), R31
-       MOVD    R31, CTR
+       MOVD    $runtime·rt0_go(SB), R12
+       MOVD    R12, CTR
        BR      (CTR)
index f5c0af5c715676ab2974d573a4df6febc7123ff2..5616e1d5b3f032aa34f365c7dd0ab1cf439a9aa2 100644 (file)
@@ -29,6 +29,6 @@ dlink:
        BR      main(SB)
 
 TEXT main(SB),NOSPLIT,$-8
-       MOVD    $runtime·rt0_go(SB), R31
-       MOVD    R31, CTR
+       MOVD    $runtime·rt0_go(SB), R12
+       MOVD    R12, CTR
        BR      (CTR)
index ee15beeb3a72d79924982a25a524ad86847d47ae..b334a03038866e5fa57a83562c944a70915b2ba0 100644 (file)
@@ -206,8 +206,8 @@ TEXT runtime·sigfwd(SB),NOSPLIT,$0-32
        MOVW    sig+8(FP), R3
        MOVD    info+16(FP), R4
        MOVD    ctx+24(FP), R5
-       MOVD    fn+0(FP), R31
-       MOVD    R31, CTR
+       MOVD    fn+0(FP), R12
+       MOVD    R12, CTR
        BL      (CTR)
        RET
 
@@ -235,8 +235,8 @@ TEXT runtime·_sigtramp(SB),NOSPLIT,$64
        MOVW    R3, FIXED_FRAME+0(R1)
        MOVD    R4, FIXED_FRAME+8(R1)
        MOVD    R5, FIXED_FRAME+16(R1)
-       MOVD    $runtime·sigtrampgo(SB), R31
-       MOVD    R31, CTR
+       MOVD    $runtime·sigtrampgo(SB), R12
+       MOVD    R12, CTR
        BL      (CTR)
        RET