aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/cgo
diff options
context:
space:
mode:
authorClément Chigot <clement.chigot@atos.net>2019-02-20 16:05:23 +0100
committerIan Lance Taylor <iant@golang.org>2019-03-06 05:07:54 +0000
commit53d859bdf570699c7d581f6ba3cdc45d0ad102f3 (patch)
treef2baf1826e28470e5de79d2402f3d7a728cd2158 /src/runtime/cgo
parent312bfc5d55994aaef5910716e096a675aa3bce39 (diff)
downloadgo-53d859bdf570699c7d581f6ba3cdc45d0ad102f3.tar.gz
go-53d859bdf570699c7d581f6ba3cdc45d0ad102f3.zip
runtime/cgo: add port for aix/ppc64
This commit add port of runtime/cgo for aix/ppc64. AIX assembly is different from Linux assembly, therefore gcc_ppc64.S must be redone for AIX. Change-Id: I780ebab4ef9c4ce912f4c4d521d8c135b1eebf6e Reviewed-on: https://go-review.googlesource.com/c/go/+/164002 Run-TryBot: Bryan C. Mills <bcmills@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
Diffstat (limited to 'src/runtime/cgo')
-rw-r--r--src/runtime/cgo/asm_ppc64x.s13
-rw-r--r--src/runtime/cgo/gcc_aix_ppc64.S133
-rw-r--r--src/runtime/cgo/gcc_context.c2
-rw-r--r--src/runtime/cgo/gcc_fatalf.c2
-rw-r--r--src/runtime/cgo/gcc_libinit.c2
-rw-r--r--src/runtime/cgo/gcc_linux_ppc64x.S (renamed from src/runtime/cgo/gcc_ppc64x.S)1
-rw-r--r--src/runtime/cgo/gcc_ppc64x.c (renamed from src/runtime/cgo/gcc_linux_ppc64x.c)0
-rw-r--r--src/runtime/cgo/gcc_setenv.c2
-rw-r--r--src/runtime/cgo/setenv.go2
9 files changed, 148 insertions, 9 deletions
diff --git a/src/runtime/cgo/asm_ppc64x.s b/src/runtime/cgo/asm_ppc64x.s
index 1cf27ddc96..3876f9389c 100644
--- a/src/runtime/cgo/asm_ppc64x.s
+++ b/src/runtime/cgo/asm_ppc64x.s
@@ -11,8 +11,6 @@
// func crosscall2(fn func(a unsafe.Pointer, n int32, ctxt uintptr), a unsafe.Pointer, n int32, ctxt uintptr)
// Saves C callee-saved registers and calls fn with three arguments.
TEXT crosscall2(SB),NOSPLIT|NOFRAME,$0
- // TODO(austin): ABI v1 (fn is probably a function descriptor)
-
// Start with standard C stack frame layout and linkage
MOVD LR, R0
MOVD R0, 16(R1) // Save LR in caller's frame
@@ -29,9 +27,16 @@ TEXT crosscall2(SB),NOSPLIT|NOFRAME,$0
BL runtime·load_g(SB)
MOVD R3, R12
- MOVD R3, CTR
+#ifdef GOARCH_ppc64
+ // ppc64 use elf ABI v1. we must get the real entry address from
+ // first slot of the function descriptor before call.
+ // Same for AIX.
+ MOVD 8(R12), R2
+ MOVD (R12), R12
+#endif
+ MOVD R12, CTR
MOVD R4, FIXED_FRAME+0(R1)
- MOVD R5, FIXED_FRAME+8(R1)
+ MOVW R5, FIXED_FRAME+8(R1)
MOVD R6, FIXED_FRAME+16(R1)
BL (CTR)
diff --git a/src/runtime/cgo/gcc_aix_ppc64.S b/src/runtime/cgo/gcc_aix_ppc64.S
new file mode 100644
index 0000000000..bff6dd1999
--- /dev/null
+++ b/src/runtime/cgo/gcc_aix_ppc64.S
@@ -0,0 +1,133 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build ppc64
+// +build aix
+
+/*
+ * void crosscall_ppc64(void (*fn)(void), void *g)
+ *
+ * Calling into the gc tool chain, where all registers are caller save.
+ * Called from standard ppc64 C ABI, where r2, r14-r31, f14-f31 are
+ * callee-save, so they must be saved explicitly.
+ * AIX has a special assembly syntax and keywords that can be mixed with
+ * Linux assembly.
+ */
+ .toc
+ .csect .text[PR]
+ .globl crosscall_ppc64
+ .globl .crosscall_ppc64
+ .csect crosscall_ppc64[DS]
+crosscall_ppc64:
+ .llong .crosscall_ppc64, TOC[tc0], 0
+ .csect .text[PR]
+.crosscall_ppc64:
+ // Start with standard C stack frame layout and linkage
+ mflr 0
+ std 0, 16(1) // Save LR in caller's frame
+ std 2, 40(1) // Save TOC in caller's frame
+ bl saveregs
+ stdu 1, -296(1)
+
+ // Set up Go ABI constant registers
+ bl ._cgo_reginit
+ nop
+
+ // Restore g pointer (r30 in Go ABI, which may have been clobbered by C)
+ mr 30, 4
+
+ // Call fn
+ mr 12, 3
+ mtctr 12
+ bctrl
+
+ addi 1, 1, 296
+ bl restoreregs
+ ld 2, 40(1)
+ ld 0, 16(1)
+ mtlr 0
+ blr
+
+saveregs:
+ // Save callee-save registers
+ // O=-288; for R in {14..31}; do echo "\tstd\t$R, $O(1)"; ((O+=8)); done; for F in f{14..31}; do echo "\tstfd\t$F, $O(1)"; ((O+=8)); done
+ std 14, -288(1)
+ std 15, -280(1)
+ std 16, -272(1)
+ std 17, -264(1)
+ std 18, -256(1)
+ std 19, -248(1)
+ std 20, -240(1)
+ std 21, -232(1)
+ std 22, -224(1)
+ std 23, -216(1)
+ std 24, -208(1)
+ std 25, -200(1)
+ std 26, -192(1)
+ std 27, -184(1)
+ std 28, -176(1)
+ std 29, -168(1)
+ std 30, -160(1)
+ std 31, -152(1)
+ stfd 14, -144(1)
+ stfd 15, -136(1)
+ stfd 16, -128(1)
+ stfd 17, -120(1)
+ stfd 18, -112(1)
+ stfd 19, -104(1)
+ stfd 20, -96(1)
+ stfd 21, -88(1)
+ stfd 22, -80(1)
+ stfd 23, -72(1)
+ stfd 24, -64(1)
+ stfd 25, -56(1)
+ stfd 26, -48(1)
+ stfd 27, -40(1)
+ stfd 28, -32(1)
+ stfd 29, -24(1)
+ stfd 30, -16(1)
+ stfd 31, -8(1)
+
+ blr
+
+restoreregs:
+ // O=-288; for R in {14..31}; do echo "\tld\t$R, $O(1)"; ((O+=8)); done; for F in {14..31}; do echo "\tlfd\t$F, $O(1)"; ((O+=8)); done
+ ld 14, -288(1)
+ ld 15, -280(1)
+ ld 16, -272(1)
+ ld 17, -264(1)
+ ld 18, -256(1)
+ ld 19, -248(1)
+ ld 20, -240(1)
+ ld 21, -232(1)
+ ld 22, -224(1)
+ ld 23, -216(1)
+ ld 24, -208(1)
+ ld 25, -200(1)
+ ld 26, -192(1)
+ ld 27, -184(1)
+ ld 28, -176(1)
+ ld 29, -168(1)
+ ld 30, -160(1)
+ ld 31, -152(1)
+ lfd 14, -144(1)
+ lfd 15, -136(1)
+ lfd 16, -128(1)
+ lfd 17, -120(1)
+ lfd 18, -112(1)
+ lfd 19, -104(1)
+ lfd 20, -96(1)
+ lfd 21, -88(1)
+ lfd 22, -80(1)
+ lfd 23, -72(1)
+ lfd 24, -64(1)
+ lfd 25, -56(1)
+ lfd 26, -48(1)
+ lfd 27, -40(1)
+ lfd 28, -32(1)
+ lfd 29, -24(1)
+ lfd 30, -16(1)
+ lfd 31, -8(1)
+
+ blr
diff --git a/src/runtime/cgo/gcc_context.c b/src/runtime/cgo/gcc_context.c
index b46b6040d2..5fc0abb8bc 100644
--- a/src/runtime/cgo/gcc_context.c
+++ b/src/runtime/cgo/gcc_context.c
@@ -3,7 +3,7 @@
// license that can be found in the LICENSE file.
// +build cgo
-// +build darwin dragonfly freebsd linux netbsd openbsd solaris windows
+// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris windows
#include "libcgo.h"
diff --git a/src/runtime/cgo/gcc_fatalf.c b/src/runtime/cgo/gcc_fatalf.c
index fdcf6f5e52..597e750f12 100644
--- a/src/runtime/cgo/gcc_fatalf.c
+++ b/src/runtime/cgo/gcc_fatalf.c
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-// +build !android,linux freebsd
+// +build aix !android,linux freebsd
#include <stdarg.h>
#include <stdio.h>
diff --git a/src/runtime/cgo/gcc_libinit.c b/src/runtime/cgo/gcc_libinit.c
index 3dafd10b7b..d35726d953 100644
--- a/src/runtime/cgo/gcc_libinit.c
+++ b/src/runtime/cgo/gcc_libinit.c
@@ -3,7 +3,7 @@
// license that can be found in the LICENSE file.
// +build cgo
-// +build darwin dragonfly freebsd linux netbsd openbsd solaris
+// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris
#include <pthread.h>
#include <errno.h>
diff --git a/src/runtime/cgo/gcc_ppc64x.S b/src/runtime/cgo/gcc_linux_ppc64x.S
index 5f37a8bfc1..595eb38460 100644
--- a/src/runtime/cgo/gcc_ppc64x.S
+++ b/src/runtime/cgo/gcc_linux_ppc64x.S
@@ -3,6 +3,7 @@
// license that can be found in the LICENSE file.
// +build ppc64 ppc64le
+// +build linux
/*
* Apple still insists on underscore prefixes for C function names.
diff --git a/src/runtime/cgo/gcc_linux_ppc64x.c b/src/runtime/cgo/gcc_ppc64x.c
index 9cb6e0ce4b..9cb6e0ce4b 100644
--- a/src/runtime/cgo/gcc_linux_ppc64x.c
+++ b/src/runtime/cgo/gcc_ppc64x.c
diff --git a/src/runtime/cgo/gcc_setenv.c b/src/runtime/cgo/gcc_setenv.c
index ed5d203fb0..88e92bfd8a 100644
--- a/src/runtime/cgo/gcc_setenv.c
+++ b/src/runtime/cgo/gcc_setenv.c
@@ -3,7 +3,7 @@
// license that can be found in the LICENSE file.
// +build cgo
-// +build darwin dragonfly freebsd linux netbsd openbsd solaris
+// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris
#include "libcgo.h"
diff --git a/src/runtime/cgo/setenv.go b/src/runtime/cgo/setenv.go
index fab43399e2..6495fcb5f8 100644
--- a/src/runtime/cgo/setenv.go
+++ b/src/runtime/cgo/setenv.go
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-// +build darwin dragonfly freebsd linux netbsd openbsd solaris
+// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris
package cgo