lin
2025-06-05 ed3dd9d3e7519a82bb871d5eedb24a2fa0c91f47
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
// Copyright 2015 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"
 
TEXT _rt0_arm64_linux(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_linux_lib(SB),NOSPLIT,$184
   // Preserve callee-save registers.
   MOVD R19, 24(RSP)
   MOVD R20, 32(RSP)
   MOVD R21, 40(RSP)
   MOVD R22, 48(RSP)
   MOVD R23, 56(RSP)
   MOVD R24, 64(RSP)
   MOVD R25, 72(RSP)
   MOVD R26, 80(RSP)
   MOVD R27, 88(RSP)
   FMOVD F8, 96(RSP)
   FMOVD F9, 104(RSP)
   FMOVD F10, 112(RSP)
   FMOVD F11, 120(RSP)
   FMOVD F12, 128(RSP)
   FMOVD F13, 136(RSP)
   FMOVD F14, 144(RSP)
   FMOVD F15, 152(RSP)
   MOVD g, 160(RSP)
 
   // Initialize g as null in case of using g later e.g. sigaction in cgo_sigaction.go
   MOVD    ZR, g
 
   MOVD    R0, _rt0_arm64_linux_lib_argc<>(SB)
   MOVD    R1, _rt0_arm64_linux_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
   CMP    $0, R4
   BEQ    nocgo
   MOVD    $_rt0_arm64_linux_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_linux_lib_go(SB), R1
   MOVD    R0, 8(RSP)
   MOVD    R1, 16(RSP)
   MOVD    $runtime·newosproc0(SB),R4
   BL    (R4)
 
restore:
   // Restore callee-save registers.
   MOVD 24(RSP), R19
   MOVD 32(RSP), R20
   MOVD 40(RSP), R21
   MOVD 48(RSP), R22
   MOVD 56(RSP), R23
   MOVD 64(RSP), R24
   MOVD 72(RSP), R25
   MOVD 80(RSP), R26
   MOVD 88(RSP), R27
   FMOVD 96(RSP), F8
   FMOVD 104(RSP), F9
   FMOVD 112(RSP), F10
   FMOVD 120(RSP), F11
   FMOVD 128(RSP), F12
   FMOVD 136(RSP), F13
   FMOVD 144(RSP), F14
   FMOVD 152(RSP), F15
   MOVD 160(RSP), g
   RET
 
TEXT _rt0_arm64_linux_lib_go(SB),NOSPLIT,$0
   MOVD    _rt0_arm64_linux_lib_argc<>(SB), R0
   MOVD    _rt0_arm64_linux_lib_argv<>(SB), R1
   MOVD    $runtime·rt0_go(SB),R4
   B       (R4)
 
DATA _rt0_arm64_linux_lib_argc<>(SB)/8, $0
GLOBL _rt0_arm64_linux_lib_argc<>(SB),NOPTR, $8
DATA _rt0_arm64_linux_lib_argv<>(SB)/8, $0
GLOBL _rt0_arm64_linux_lib_argv<>(SB),NOPTR, $8
 
 
TEXT main(SB),NOSPLIT|NOFRAME,$0
   MOVD    $runtime·rt0_go(SB), R2
   BL    (R2)
exit:
   MOVD $0, R0
   MOVD    $94, R8    // sys_exit
   SVC
   B    exit