mirror of
https://github.com/golang/go
synced 2024-11-15 04:30:32 -07:00
eee6f9f825
There are several of places that save and restore the C callee-saved registers, the operation is the same everywhere, so this CL defines several macros to do this, which will help reduce code redundancy and unify the operation. This CL also replaced consecutive MOVD instructions with STP and LDP instructions in several places where these macros do not apply. Change-Id: I815f39fe484a9ab9b6bd157dfcbc8ad99c1420fe Reviewed-on: https://go-review.googlesource.com/c/go/+/374397 Trust: Eric Fang <eric.fang@arm.com> Run-TryBot: Eric Fang <eric.fang@arm.com> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Cherry Mui <cherryyz@google.com>
72 lines
1.8 KiB
ArmAsm
72 lines
1.8 KiB
ArmAsm
// 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.
|
|
|
|
#include "textflag.h"
|
|
#include "cgo/abi_arm64.h"
|
|
|
|
TEXT _rt0_arm64_netbsd(SB),NOSPLIT|NOFRAME,$0
|
|
MOVD 0(RSP), R0 // argc
|
|
ADD $8, RSP, R1 // argv
|
|
BL main(SB)
|
|
|
|
// When building with -buildmode=c-shared, this symbol is called when the shared
|
|
// library is loaded.
|
|
TEXT _rt0_arm64_netbsd_lib(SB),NOSPLIT,$184
|
|
// Preserve callee-save registers.
|
|
SAVE_R19_TO_R28(24)
|
|
SAVE_F8_TO_F15(104)
|
|
|
|
// Initialize g as null in case of using g later e.g. sigaction in cgo_sigaction.go
|
|
MOVD ZR, g
|
|
|
|
MOVD R0, _rt0_arm64_netbsd_lib_argc<>(SB)
|
|
MOVD R1, _rt0_arm64_netbsd_lib_argv<>(SB)
|
|
|
|
// Synchronous initialization.
|
|
MOVD $runtime·libpreinit(SB), R4
|
|
BL (R4)
|
|
|
|
// Create a new thread to do the runtime initialization and return.
|
|
MOVD _cgo_sys_thread_create(SB), R4
|
|
CBZ R4, nocgo
|
|
MOVD $_rt0_arm64_netbsd_lib_go(SB), R0
|
|
MOVD $0, R1
|
|
SUB $16, RSP // reserve 16 bytes for sp-8 where fp may be saved.
|
|
BL (R4)
|
|
ADD $16, RSP
|
|
B restore
|
|
|
|
nocgo:
|
|
MOVD $0x800000, R0 // stacksize = 8192KB
|
|
MOVD $_rt0_arm64_netbsd_lib_go(SB), R1
|
|
MOVD R0, 8(RSP)
|
|
MOVD R1, 16(RSP)
|
|
MOVD $runtime·newosproc0(SB),R4
|
|
BL (R4)
|
|
|
|
restore:
|
|
// Restore callee-save registers.
|
|
RESTORE_R19_TO_R28(24)
|
|
RESTORE_F8_TO_F15(104)
|
|
RET
|
|
|
|
TEXT _rt0_arm64_netbsd_lib_go(SB),NOSPLIT,$0
|
|
MOVD _rt0_arm64_netbsd_lib_argc<>(SB), R0
|
|
MOVD _rt0_arm64_netbsd_lib_argv<>(SB), R1
|
|
MOVD $runtime·rt0_go(SB),R4
|
|
B (R4)
|
|
|
|
DATA _rt0_arm64_netbsd_lib_argc<>(SB)/8, $0
|
|
GLOBL _rt0_arm64_netbsd_lib_argc<>(SB),NOPTR, $8
|
|
DATA _rt0_arm64_netbsd_lib_argv<>(SB)/8, $0
|
|
GLOBL _rt0_arm64_netbsd_lib_argv<>(SB),NOPTR, $8
|
|
|
|
|
|
TEXT main(SB),NOSPLIT|NOFRAME,$0
|
|
MOVD $runtime·rt0_go(SB), R2
|
|
BL (R2)
|
|
exit:
|
|
MOVD $0, R0
|
|
SVC $1 // sys_exit
|