From 36b414f6397cadffab1a945eed645a3213f39d8a Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Wed, 6 Mar 2013 15:03:04 -0500 Subject: [PATCH] runtime: change amd64 startup convention Now the default startup is that the program begins at _rt0_amd64_$GOOS, which sets DI = argc, SI = argv and jumps to _rt0_amd64. This makes the _rt0_amd64 entry match the expected semantics for the standard C "main" function, which we can now provide for use when linking against a standard C library. R=golang-dev, devon.odell, minux.ma CC=golang-dev https://golang.org/cl/7525043 --- src/pkg/runtime/asm_amd64.s | 4 ++-- src/pkg/runtime/rt0_darwin_amd64.s | 11 +++++++---- src/pkg/runtime/rt0_freebsd_amd64.s | 12 ++++++++---- src/pkg/runtime/rt0_linux_amd64.s | 11 +++++++---- src/pkg/runtime/rt0_netbsd_amd64.s | 13 +++++++++---- src/pkg/runtime/rt0_openbsd_amd64.s | 11 ++++++++--- src/pkg/runtime/rt0_plan9_amd64.s | 5 +++-- src/pkg/runtime/rt0_windows_amd64.s | 9 +++++++-- 8 files changed, 51 insertions(+), 25 deletions(-) diff --git a/src/pkg/runtime/asm_amd64.s b/src/pkg/runtime/asm_amd64.s index 696befd6e4d..a671f39925c 100644 --- a/src/pkg/runtime/asm_amd64.s +++ b/src/pkg/runtime/asm_amd64.s @@ -6,8 +6,8 @@ TEXT _rt0_amd64(SB),7,$-8 // copy arguments forward on an even stack - MOVQ 0(DI), AX // argc - LEAQ 8(DI), BX // argv + MOVQ DI, AX // argc + MOVQ SI, BX // argv SUBQ $(4*8+7), SP // 2args 2auto ANDQ $~15, SP MOVQ AX, 16(SP) diff --git a/src/pkg/runtime/rt0_darwin_amd64.s b/src/pkg/runtime/rt0_darwin_amd64.s index 4cfab587644..45e69a01596 100644 --- a/src/pkg/runtime/rt0_darwin_amd64.s +++ b/src/pkg/runtime/rt0_darwin_amd64.s @@ -2,9 +2,12 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// Darwin and Linux use the same linkage to main - TEXT _rt0_amd64_darwin(SB),7,$-8 - MOVQ $_rt0_amd64(SB), AX - MOVQ SP, DI + LEAQ 8(SP), SI // argv + MOVQ 0(SP), DI // argc + MOVQ $main(SB), AX + JMP AX + +TEXT main(SB),7,$-8 + MOVQ $_rt0_amd64(SB), AX JMP AX diff --git a/src/pkg/runtime/rt0_freebsd_amd64.s b/src/pkg/runtime/rt0_freebsd_amd64.s index 5d2eeeefff4..e6c6fb9cac7 100644 --- a/src/pkg/runtime/rt0_freebsd_amd64.s +++ b/src/pkg/runtime/rt0_freebsd_amd64.s @@ -2,8 +2,12 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// Darwin and Linux use the same linkage to main - TEXT _rt0_amd64_freebsd(SB),7,$-8 - MOVQ $_rt0_amd64(SB), DX - JMP DX + LEAQ 8(DI), SI // argv + MOVQ 0(DI), DI // argc + MOVQ $main(SB), AX + JMP AX + +TEXT main(SB),7,$-8 + MOVQ $_rt0_amd64(SB), AX + JMP AX diff --git a/src/pkg/runtime/rt0_linux_amd64.s b/src/pkg/runtime/rt0_linux_amd64.s index dac9ae181b0..dfc9c0421bd 100644 --- a/src/pkg/runtime/rt0_linux_amd64.s +++ b/src/pkg/runtime/rt0_linux_amd64.s @@ -2,9 +2,12 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// Darwin and Linux use the same linkage to main - TEXT _rt0_amd64_linux(SB),7,$-8 - MOVQ $_rt0_amd64(SB), AX - MOVQ SP, DI + LEAQ 8(SP), SI // argv + MOVQ 0(SP), DI // argc + MOVQ $main(SB), AX + JMP AX + +TEXT main(SB),7,$-8 + MOVQ $_rt0_amd64(SB), AX JMP AX diff --git a/src/pkg/runtime/rt0_netbsd_amd64.s b/src/pkg/runtime/rt0_netbsd_amd64.s index 85482b98db2..245a4c0f9b4 100644 --- a/src/pkg/runtime/rt0_netbsd_amd64.s +++ b/src/pkg/runtime/rt0_netbsd_amd64.s @@ -2,7 +2,12 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -TEXT _rt0_amd64_netbsd(SB),7,$-8 - MOVQ $_rt0_amd64(SB), DX - MOVQ SP, DI - JMP DX +TEXT _rt0_amd64_openbsd(SB),7,$-8 + LEAQ 8(SP), SI // argv + MOVQ 0(SP), DI // argc + MOVQ $main(SB), AX + JMP AX + +TEXT main(SB),7,$-8 + MOVQ $_rt0_amd64(SB), AX + JMP AX diff --git a/src/pkg/runtime/rt0_openbsd_amd64.s b/src/pkg/runtime/rt0_openbsd_amd64.s index e7fce596968..245a4c0f9b4 100644 --- a/src/pkg/runtime/rt0_openbsd_amd64.s +++ b/src/pkg/runtime/rt0_openbsd_amd64.s @@ -3,6 +3,11 @@ // license that can be found in the LICENSE file. TEXT _rt0_amd64_openbsd(SB),7,$-8 - MOVQ $_rt0_amd64(SB), DX - MOVQ SP, DI - JMP DX + LEAQ 8(SP), SI // argv + MOVQ 0(SP), DI // argc + MOVQ $main(SB), AX + JMP AX + +TEXT main(SB),7,$-8 + MOVQ $_rt0_amd64(SB), AX + JMP AX diff --git a/src/pkg/runtime/rt0_plan9_amd64.s b/src/pkg/runtime/rt0_plan9_amd64.s index 2b1fa2ae1dd..16e5e82b755 100644 --- a/src/pkg/runtime/rt0_plan9_amd64.s +++ b/src/pkg/runtime/rt0_plan9_amd64.s @@ -2,9 +2,10 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -TEXT _rt0_amd64_plan9(SB),7, $0 +TEXT _rt0_amd64_plan9(SB),7,$-8 + LEAQ 8(SP), SI // argv + MOVQ 0(SP), DI // argc MOVQ $_rt0_amd64(SB), AX - MOVQ SP, DI JMP AX DATA runtime·isplan9(SB)/4, $1 diff --git a/src/pkg/runtime/rt0_windows_amd64.s b/src/pkg/runtime/rt0_windows_amd64.s index dc1408adc35..4fc61dc687b 100644 --- a/src/pkg/runtime/rt0_windows_amd64.s +++ b/src/pkg/runtime/rt0_windows_amd64.s @@ -4,9 +4,14 @@ #include "zasm_GOOS_GOARCH.h" -TEXT _rt0_amd64_windows(SB),7,$-8 +TEXT _rt0_amd64_darwin(SB),7,$-8 + LEAQ 8(SP), SI // argv + MOVQ 0(SP), DI // argc + MOVQ $main(SB), AX + JMP AX + +TEXT main(SB),7,$-8 MOVQ $_rt0_amd64(SB), AX - MOVQ SP, DI JMP AX DATA runtime·iswindows(SB)/4, $1