Skip to content

Commit c925715

Browse files
qmuntalgopherbot
authored andcommitted
runtime: unify ppc64/ppc64le library entry point
Cq-Include-Trybots: luci.golang.try:gotip-linux-ppc64le_power10 Change-Id: Ifd7861488b1b47a5d30163552b51838f2bef7248 Reviewed-on: https://go-review.googlesource.com/c/go/+/706395 Reviewed-by: Carlos Amedee <[email protected]> Reviewed-by: Keith Randall <[email protected]> Reviewed-by: Keith Randall <[email protected]> Auto-Submit: Keith Randall <[email protected]> LUCI-TryBot-Result: Go LUCI <[email protected]>
1 parent 4ff8a45 commit c925715

File tree

3 files changed

+60
-197
lines changed

3 files changed

+60
-197
lines changed

src/runtime/asm_ppc64x.s

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,63 @@
99
#include "funcdata.h"
1010
#include "textflag.h"
1111
#include "asm_ppc64x.h"
12+
#include "cgo/abi_ppc64x.h"
13+
14+
15+
TEXT _rt0_ppc64x_lib(SB),NOSPLIT|NOFRAME,$0
16+
// This is called with ELFv2 calling conventions. Convert to Go.
17+
// Allocate argument storage for call to newosproc0.
18+
STACK_AND_SAVE_HOST_TO_GO_ABI(16)
19+
20+
MOVD R3, _rt0_ppc64x_lib_argc<>(SB)
21+
MOVD R4, _rt0_ppc64x_lib_argv<>(SB)
22+
23+
// Synchronous initialization.
24+
MOVD $runtime·libpreinit(SB), R12
25+
MOVD R12, CTR
26+
BL (CTR)
27+
28+
// Create a new thread to do the runtime initialization and return.
29+
MOVD _cgo_sys_thread_create(SB), R12
30+
CMP $0, R12
31+
BEQ nocgo
32+
MOVD $_rt0_ppc64x_lib_go(SB), R3
33+
MOVD $0, R4
34+
MOVD R12, CTR
35+
BL (CTR)
36+
BR done
37+
38+
nocgo:
39+
MOVD $0x800000, R12 // stacksize = 8192KB
40+
MOVD R12, 8+FIXED_FRAME(R1)
41+
MOVD $_rt0_ppc64x_lib_go(SB), R12
42+
MOVD R12, 16+FIXED_FRAME(R1)
43+
MOVD $runtime·newosproc0(SB),R12
44+
MOVD R12, CTR
45+
BL (CTR)
46+
47+
done:
48+
// Restore and return to ELFv2 caller.
49+
UNSTACK_AND_RESTORE_GO_TO_HOST_ABI(16)
50+
RET
51+
52+
#ifdef GO_PPC64X_HAS_FUNCDESC
53+
DEFINE_PPC64X_FUNCDESC(_rt0_ppc64x_lib_go, __rt0_ppc64x_lib_go)
54+
TEXT __rt0_ppc64x_lib_go(SB),NOSPLIT,$0
55+
#else
56+
TEXT _rt0_ppc64x_lib_go(SB),NOSPLIT,$0
57+
#endif
58+
MOVD _rt0_ppc64x_lib_argc<>(SB), R3
59+
MOVD _rt0_ppc64x_lib_argv<>(SB), R4
60+
MOVD $runtime·rt0_go(SB), R12
61+
MOVD R12, CTR
62+
BR (CTR)
63+
64+
DATA _rt0_ppc64x_lib_argc<>(SB)/8, $0
65+
GLOBL _rt0_ppc64x_lib_argc<>(SB),NOPTR, $8
66+
DATA _rt0_ppc64x_lib_argv<>(SB)/8, $0
67+
GLOBL _rt0_ppc64x_lib_argv<>(SB),NOPTR, $8
68+
1269

1370
#ifdef GOOS_aix
1471
#define cgoCalleeStackSize 48

src/runtime/rt0_aix_ppc64.s

Lines changed: 2 additions & 149 deletions
Original file line numberDiff line numberDiff line change
@@ -41,152 +41,5 @@ TEXT _main(SB),NOSPLIT,$-8
4141
MOVD R12, CTR
4242
BR (CTR)
4343

44-
// Paramater save space required to cross-call into _cgo_sys_thread_create
45-
#define PARAM_SPACE 16
46-
47-
TEXT _rt0_ppc64_aix_lib(SB),NOSPLIT,$-8
48-
// Start with standard C stack frame layout and linkage.
49-
MOVD LR, R0
50-
MOVD R0, 16(R1) // Save LR in caller's frame.
51-
MOVW CR, R0 // Save CR in caller's frame
52-
MOVD R0, 8(R1)
53-
54-
MOVDU R1, -344-PARAM_SPACE(R1) // Allocate frame.
55-
56-
// Preserve callee-save registers.
57-
MOVD R14, 48+PARAM_SPACE(R1)
58-
MOVD R15, 56+PARAM_SPACE(R1)
59-
MOVD R16, 64+PARAM_SPACE(R1)
60-
MOVD R17, 72+PARAM_SPACE(R1)
61-
MOVD R18, 80+PARAM_SPACE(R1)
62-
MOVD R19, 88+PARAM_SPACE(R1)
63-
MOVD R20, 96+PARAM_SPACE(R1)
64-
MOVD R21,104+PARAM_SPACE(R1)
65-
MOVD R22, 112+PARAM_SPACE(R1)
66-
MOVD R23, 120+PARAM_SPACE(R1)
67-
MOVD R24, 128+PARAM_SPACE(R1)
68-
MOVD R25, 136+PARAM_SPACE(R1)
69-
MOVD R26, 144+PARAM_SPACE(R1)
70-
MOVD R27, 152+PARAM_SPACE(R1)
71-
MOVD R28, 160+PARAM_SPACE(R1)
72-
MOVD R29, 168+PARAM_SPACE(R1)
73-
MOVD g, 176+PARAM_SPACE(R1) // R30
74-
MOVD R31, 184+PARAM_SPACE(R1)
75-
FMOVD F14, 192+PARAM_SPACE(R1)
76-
FMOVD F15, 200+PARAM_SPACE(R1)
77-
FMOVD F16, 208+PARAM_SPACE(R1)
78-
FMOVD F17, 216+PARAM_SPACE(R1)
79-
FMOVD F18, 224+PARAM_SPACE(R1)
80-
FMOVD F19, 232+PARAM_SPACE(R1)
81-
FMOVD F20, 240+PARAM_SPACE(R1)
82-
FMOVD F21, 248+PARAM_SPACE(R1)
83-
FMOVD F22, 256+PARAM_SPACE(R1)
84-
FMOVD F23, 264+PARAM_SPACE(R1)
85-
FMOVD F24, 272+PARAM_SPACE(R1)
86-
FMOVD F25, 280+PARAM_SPACE(R1)
87-
FMOVD F26, 288+PARAM_SPACE(R1)
88-
FMOVD F27, 296+PARAM_SPACE(R1)
89-
FMOVD F28, 304+PARAM_SPACE(R1)
90-
FMOVD F29, 312+PARAM_SPACE(R1)
91-
FMOVD F30, 320+PARAM_SPACE(R1)
92-
FMOVD F31, 328+PARAM_SPACE(R1)
93-
94-
// Synchronous initialization.
95-
MOVD $runtime·reginit(SB), R12
96-
MOVD R12, CTR
97-
BL (CTR)
98-
99-
MOVBZ runtime·isarchive(SB), R3 // Check buildmode = c-archive
100-
CMP $0, R3
101-
BEQ done
102-
103-
MOVD R14, _rt0_ppc64_aix_lib_argc<>(SB)
104-
MOVD R15, _rt0_ppc64_aix_lib_argv<>(SB)
105-
106-
MOVD $runtime·libpreinit(SB), R12
107-
MOVD R12, CTR
108-
BL (CTR)
109-
110-
// Create a new thread to do the runtime initialization and return.
111-
MOVD _cgo_sys_thread_create(SB), R12
112-
CMP $0, R12
113-
BEQ nocgo
114-
MOVD $_rt0_ppc64_aix_lib_go(SB), R3
115-
MOVD $0, R4
116-
MOVD R2, 40(R1)
117-
MOVD 8(R12), R2
118-
MOVD (R12), R12
119-
MOVD R12, CTR
120-
BL (CTR)
121-
MOVD 40(R1), R2
122-
BR done
123-
124-
nocgo:
125-
MOVD $0x800000, R12 // stacksize = 8192KB
126-
MOVD R12, 8(R1)
127-
MOVD $_rt0_ppc64_aix_lib_go(SB), R12
128-
MOVD R12, 16(R1)
129-
MOVD $runtime·newosproc0(SB),R12
130-
MOVD R12, CTR
131-
BL (CTR)
132-
133-
done:
134-
// Restore saved registers.
135-
MOVD 48+PARAM_SPACE(R1), R14
136-
MOVD 56+PARAM_SPACE(R1), R15
137-
MOVD 64+PARAM_SPACE(R1), R16
138-
MOVD 72+PARAM_SPACE(R1), R17
139-
MOVD 80+PARAM_SPACE(R1), R18
140-
MOVD 88+PARAM_SPACE(R1), R19
141-
MOVD 96+PARAM_SPACE(R1), R20
142-
MOVD 104+PARAM_SPACE(R1), R21
143-
MOVD 112+PARAM_SPACE(R1), R22
144-
MOVD 120+PARAM_SPACE(R1), R23
145-
MOVD 128+PARAM_SPACE(R1), R24
146-
MOVD 136+PARAM_SPACE(R1), R25
147-
MOVD 144+PARAM_SPACE(R1), R26
148-
MOVD 152+PARAM_SPACE(R1), R27
149-
MOVD 160+PARAM_SPACE(R1), R28
150-
MOVD 168+PARAM_SPACE(R1), R29
151-
MOVD 176+PARAM_SPACE(R1), g // R30
152-
MOVD 184+PARAM_SPACE(R1), R31
153-
FMOVD 196+PARAM_SPACE(R1), F14
154-
FMOVD 200+PARAM_SPACE(R1), F15
155-
FMOVD 208+PARAM_SPACE(R1), F16
156-
FMOVD 216+PARAM_SPACE(R1), F17
157-
FMOVD 224+PARAM_SPACE(R1), F18
158-
FMOVD 232+PARAM_SPACE(R1), F19
159-
FMOVD 240+PARAM_SPACE(R1), F20
160-
FMOVD 248+PARAM_SPACE(R1), F21
161-
FMOVD 256+PARAM_SPACE(R1), F22
162-
FMOVD 264+PARAM_SPACE(R1), F23
163-
FMOVD 272+PARAM_SPACE(R1), F24
164-
FMOVD 280+PARAM_SPACE(R1), F25
165-
FMOVD 288+PARAM_SPACE(R1), F26
166-
FMOVD 296+PARAM_SPACE(R1), F27
167-
FMOVD 304+PARAM_SPACE(R1), F28
168-
FMOVD 312+PARAM_SPACE(R1), F29
169-
FMOVD 320+PARAM_SPACE(R1), F30
170-
FMOVD 328+PARAM_SPACE(R1), F31
171-
172-
ADD $344+PARAM_SPACE, R1
173-
174-
MOVD 8(R1), R0
175-
MOVFL R0, $0xff
176-
MOVD 16(R1), R0
177-
MOVD R0, LR
178-
RET
179-
180-
DEFINE_PPC64X_FUNCDESC(_rt0_ppc64_aix_lib_go, __rt0_ppc64_aix_lib_go)
181-
182-
TEXT __rt0_ppc64_aix_lib_go(SB),NOSPLIT,$0
183-
MOVD _rt0_ppc64_aix_lib_argc<>(SB), R3
184-
MOVD _rt0_ppc64_aix_lib_argv<>(SB), R4
185-
MOVD $runtime·rt0_go(SB), R12
186-
MOVD R12, CTR
187-
BR (CTR)
188-
189-
DATA _rt0_ppc64_aix_lib_argc<>(SB)/8, $0
190-
GLOBL _rt0_ppc64_aix_lib_argc<>(SB),NOPTR, $8
191-
DATA _rt0_ppc64_aix_lib_argv<>(SB)/8, $0
192-
GLOBL _rt0_ppc64_aix_lib_argv<>(SB),NOPTR, $8
44+
TEXT _rt0_ppc64_aix_lib(SB),NOSPLIT,$0
45+
JMP _rt0_ppc64x_lib(SB)

src/runtime/rt0_linux_ppc64le.s

Lines changed: 1 addition & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -5,60 +5,13 @@
55
#include "go_asm.h"
66
#include "textflag.h"
77
#include "asm_ppc64x.h"
8-
#include "cgo/abi_ppc64x.h"
98

109
TEXT _rt0_ppc64le_linux(SB),NOSPLIT,$0
1110
XOR R0, R0 // Make sure R0 is zero before _main
1211
BR _main<>(SB)
1312

1413
TEXT _rt0_ppc64le_linux_lib(SB),NOSPLIT|NOFRAME,$0
15-
// This is called with ELFv2 calling conventions. Convert to Go.
16-
// Allocate argument storage for call to newosproc0.
17-
STACK_AND_SAVE_HOST_TO_GO_ABI(16)
18-
19-
MOVD R3, _rt0_ppc64le_linux_lib_argc<>(SB)
20-
MOVD R4, _rt0_ppc64le_linux_lib_argv<>(SB)
21-
22-
// Synchronous initialization.
23-
MOVD $runtime·libpreinit(SB), R12
24-
MOVD R12, CTR
25-
BL (CTR)
26-
27-
// Create a new thread to do the runtime initialization and return.
28-
MOVD _cgo_sys_thread_create(SB), R12
29-
CMP $0, R12
30-
BEQ nocgo
31-
MOVD $_rt0_ppc64le_linux_lib_go(SB), R3
32-
MOVD $0, R4
33-
MOVD R12, CTR
34-
BL (CTR)
35-
BR done
36-
37-
nocgo:
38-
MOVD $0x800000, R12 // stacksize = 8192KB
39-
MOVD R12, 8+FIXED_FRAME(R1)
40-
MOVD $_rt0_ppc64le_linux_lib_go(SB), R12
41-
MOVD R12, 16+FIXED_FRAME(R1)
42-
MOVD $runtime·newosproc0(SB),R12
43-
MOVD R12, CTR
44-
BL (CTR)
45-
46-
done:
47-
// Restore and return to ELFv2 caller.
48-
UNSTACK_AND_RESTORE_GO_TO_HOST_ABI(16)
49-
RET
50-
51-
TEXT _rt0_ppc64le_linux_lib_go(SB),NOSPLIT,$0
52-
MOVD _rt0_ppc64le_linux_lib_argc<>(SB), R3
53-
MOVD _rt0_ppc64le_linux_lib_argv<>(SB), R4
54-
MOVD $runtime·rt0_go(SB), R12
55-
MOVD R12, CTR
56-
BR (CTR)
57-
58-
DATA _rt0_ppc64le_linux_lib_argc<>(SB)/8, $0
59-
GLOBL _rt0_ppc64le_linux_lib_argc<>(SB),NOPTR, $8
60-
DATA _rt0_ppc64le_linux_lib_argv<>(SB)/8, $0
61-
GLOBL _rt0_ppc64le_linux_lib_argv<>(SB),NOPTR, $8
14+
JMP _rt0_ppc64x_lib(SB)
6215

6316
TEXT _main<>(SB),NOSPLIT,$-8
6417
// In a statically linked binary, the stack contains argc,

0 commit comments

Comments
 (0)