]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: add library startup support for ppc64le
authorRuss Cox <rsc@golang.org>
Wed, 25 May 2016 18:54:21 +0000 (14:54 -0400)
committerRuss Cox <rsc@golang.org>
Thu, 26 May 2016 03:31:59 +0000 (03:31 +0000)
I have been running this patch inside Google against Go 1.6 for the last month.

The new tests will probably break the builders but let's see
exactly how they break.

Change-Id: Ia65cf7d3faecffeeb4b06e9b80875c0e57d86d9e
Reviewed-on: https://go-review.googlesource.com/23452
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/cmd/dist/test.go
src/runtime/rt0_linux_ppc64le.s

index 1a1f7d961bea77aa31b6073bacca7f5d90d4a722..366b3af9ae7a57121b3a39298528f97a58989013 100644 (file)
@@ -680,7 +680,8 @@ func (t *tester) supportedBuildmode(mode string) bool {
                }
                switch pair {
                case "darwin-386", "darwin-amd64", "darwin-arm", "darwin-arm64",
-                       "linux-amd64", "linux-386", "windows-amd64", "windows-386":
+                       "linux-amd64", "linux-386", "windows-amd64", "windows-386",
+                       "linux-ppc64le":
                        return true
                }
                return false
@@ -688,7 +689,8 @@ func (t *tester) supportedBuildmode(mode string) bool {
                switch pair {
                case "linux-386", "linux-amd64", "linux-arm", "linux-arm64",
                        "darwin-amd64", "darwin-386",
-                       "android-arm", "android-arm64", "android-386":
+                       "android-arm", "android-arm64", "android-386",
+                       "linux-ppc64le":
                        return true
                }
                return false
index ac7b9225a43bef982954fd952ce639240c709f9c..2c5541357f2af77c896bf9471ea7bca19a7330af 100644 (file)
@@ -4,6 +4,135 @@
 TEXT _rt0_ppc64le_linux(SB),NOSPLIT,$0
        BR _main<>(SB)
 
+TEXT _rt0_ppc64le_linux_lib(SB),NOSPLIT,$-8
+       // Start with standard C stack frame layout and linkage.
+       MOVD    LR, R0
+       MOVD    R0, 16(R1) // Save LR in caller's frame.
+       MOVD    R2, 24(R1) // Save TOC in caller's frame.
+       MOVDU   R1, -320(R1) // Allocate frame.
+       
+       // Preserve callee-save registers.
+       MOVD    R14, 24(R1)
+       MOVD    R15, 32(R1)
+       MOVD    R16, 40(R1)
+       MOVD    R17, 48(R1)
+       MOVD    R18, 56(R1)
+       MOVD    R19, 64(R1)
+       MOVD    R20, 72(R1)
+       MOVD    R21, 80(R1)
+       MOVD    R22, 88(R1)
+       MOVD    R23, 96(R1)
+       MOVD    R24, 104(R1)
+       MOVD    R25, 112(R1)
+       MOVD    R26, 120(R1)
+       MOVD    R27, 128(R1)
+       MOVD    R28, 136(R1)
+       MOVD    R29, 144(R1)
+       MOVD    g, 152(R1) // R30
+       MOVD    R31, 160(R1)
+       FMOVD   F14, 168(R1)
+       FMOVD   F15, 176(R1)
+       FMOVD   F16, 184(R1)
+       FMOVD   F17, 192(R1)
+       FMOVD   F18, 200(R1)
+       FMOVD   F19, 208(R1)
+       FMOVD   F20, 216(R1)
+       FMOVD   F21, 224(R1)
+       FMOVD   F22, 232(R1)
+       FMOVD   F23, 240(R1)
+       FMOVD   F24, 248(R1)
+       FMOVD   F25, 256(R1)
+       FMOVD   F26, 264(R1)
+       FMOVD   F27, 272(R1)
+       FMOVD   F28, 280(R1)
+       FMOVD   F29, 288(R1)
+       FMOVD   F30, 296(R1)
+       FMOVD   F31, 304(R1)
+
+       MOVD    R3, _rt0_ppc64le_linux_lib_argc<>(SB)
+       MOVD    R4, _rt0_ppc64le_linux_lib_argv<>(SB)
+
+       // Synchronous initialization.
+       MOVD    $runtime·libpreinit(SB), R12
+       MOVD    R12, CTR
+       BL      (CTR)
+
+       // Create a new thread to do the runtime initialization and return.
+       MOVD    _cgo_sys_thread_create(SB), R12
+       CMP     $0, R12
+       BEQ     nocgo
+       MOVD    $_rt0_ppc64le_linux_lib_go(SB), R3
+       MOVD    $0, R4
+       MOVD    R12, CTR
+       BL      (CTR)
+       BR      done
+
+nocgo:
+       MOVD    $0x800000, R12                     // stacksize = 8192KB
+       MOVD    R12, 8(R1)
+       MOVD    $_rt0_ppc64le_linux_lib_go(SB), R12
+       MOVD    R12, 16(R1)
+       MOVD    $runtime·newosproc0(SB),R12
+       MOVD    R12, CTR
+       BL      (CTR)
+
+done:
+       // Restore saved registers.
+       MOVD    24(R1), R14
+       MOVD    32(R1), R15
+       MOVD    40(R1), R16
+       MOVD    48(R1), R17
+       MOVD    56(R1), R18
+       MOVD    64(R1), R19
+       MOVD    72(R1), R20
+       MOVD    80(R1), R21
+       MOVD    88(R1), R22
+       MOVD    96(R1), R23
+       MOVD    104(R1), R24
+       MOVD    112(R1), R25
+       MOVD    120(R1), R26
+       MOVD    128(R1), R27
+       MOVD    136(R1), R28
+       MOVD    144(R1), R29
+       MOVD    152(R1), g // R30
+       MOVD    160(R1), R31
+       FMOVD   168(R1), F14
+       FMOVD   176(R1), F15
+       FMOVD   184(R1), F16
+       FMOVD   192(R1), F17
+       FMOVD   200(R1), F18
+       FMOVD   208(R1), F19
+       FMOVD   216(R1), F20
+       FMOVD   224(R1), F21
+       FMOVD   232(R1), F22
+       FMOVD   240(R1), F23
+       FMOVD   248(R1), F24
+       FMOVD   256(R1), F25
+       FMOVD   264(R1), F26
+       FMOVD   272(R1), F27
+       FMOVD   280(R1), F28
+       FMOVD   288(R1), F29
+       FMOVD   296(R1), F30
+       FMOVD   304(R1), F31
+
+       ADD     $320, R1
+       MOVD    24(R1), R2
+       MOVD    16(R1), R0
+       MOVD    R0, LR
+       RET
+
+TEXT _rt0_ppc64le_linux_lib_go(SB),NOSPLIT,$0
+       MOVD    _rt0_ppc64le_linux_lib_argc<>(SB), R3
+       MOVD    _rt0_ppc64le_linux_lib_argv<>(SB), R4
+       MOVD    $runtime·rt0_go(SB), R12
+       MOVD    R12, CTR
+       BR      (CTR)
+
+DATA _rt0_ppc64le_linux_lib_argc<>(SB)/8, $0
+GLOBL _rt0_ppc64le_linux_lib_argc<>(SB),NOPTR, $8
+DATA _rt0_ppc64le_linux_lib_argv<>(SB)/8, $0
+GLOBL _rt0_ppc64le_linux_lib_argv<>(SB),NOPTR, $8
+
 TEXT _main<>(SB),NOSPLIT,$-8
        // In a statically linked binary, the stack contains argc,
        // argv as argc string pointers followed by a NULL, envv as a