Skip to content

Commit ba7f3d9

Browse files
committed
runtime: use ABIInternal for most calls to sigtrampgo
sigtramp on openbsd-arm64 is teetering on the edge of the nosplit stack limit. Add more headroom by calling sigtrampgo using ABIInternal, which eliminates a 48-byte ABI wrapper frame. openbsd-amd64 has slightly more space, but is also close to the limit, so convert it as well. Other operating systems don't have it as bad, but many have nearly identical implementations of sigtramp, so I have converted them as well. I've omitted darwin-arm64 and solaris, as those are quite different and would benefit from not needing ifdef for both cases. For #51485. Change-Id: I70512645d4208b346a59d5e5d03836a45833b1d7 Reviewed-on: https://go-review.googlesource.com/c/go/+/390814 Run-TryBot: Michael Pratt <mpratt@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Cherry Mui <cherryyz@google.com>
1 parent 06b0a65 commit ba7f3d9

10 files changed

+148
-56
lines changed

src/runtime/sys_darwin_amd64.s

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -218,13 +218,21 @@ TEXT runtime·sigtramp(SB),NOSPLIT,$0
218218
// Transition from C ABI to Go ABI.
219219
PUSH_REGS_HOST_TO_ABI0()
220220

221-
// Call into the Go signal handler
221+
// Set up ABIInternal environment: g in R14, cleared X15.
222+
get_tls(R12)
223+
MOVQ g(R12), R14
224+
PXOR X15, X15
225+
226+
// Reserve space for spill slots.
222227
NOP SP // disable vet stack checking
223-
ADJSP $24
224-
MOVL DI, 0(SP) // sig
225-
MOVQ SI, 8(SP) // info
226-
MOVQ DX, 16(SP) // ctx
227-
CALL ·sigtrampgo(SB)
228+
ADJSP $24
229+
230+
// Call into the Go signal handler
231+
MOVQ DI, AX // sig
232+
MOVQ SI, BX // info
233+
MOVQ DX, CX // ctx
234+
CALL ·sigtrampgo<ABIInternal>(SB)
235+
228236
ADJSP $-24
229237

230238
POP_REGS_HOST_TO_ABI0()

src/runtime/sys_dragonfly_amd64.s

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -226,13 +226,21 @@ TEXT runtime·sigtramp(SB),NOSPLIT,$0
226226
// Transition from C ABI to Go ABI.
227227
PUSH_REGS_HOST_TO_ABI0()
228228

229-
// Call into the Go signal handler
229+
// Set up ABIInternal environment: g in R14, cleared X15.
230+
get_tls(R12)
231+
MOVQ g(R12), R14
232+
PXOR X15, X15
233+
234+
// Reserve space for spill slots.
230235
NOP SP // disable vet stack checking
231-
ADJSP $24
232-
MOVQ DI, 0(SP) // sig
233-
MOVQ SI, 8(SP) // info
234-
MOVQ DX, 16(SP) // ctx
235-
CALL ·sigtrampgo(SB)
236+
ADJSP $24
237+
238+
// Call into the Go signal handler
239+
MOVQ DI, AX // sig
240+
MOVQ SI, BX // info
241+
MOVQ DX, CX // ctx
242+
CALL ·sigtrampgo<ABIInternal>(SB)
243+
236244
ADJSP $-24
237245

238246
POP_REGS_HOST_TO_ABI0()

src/runtime/sys_freebsd_amd64.s

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -228,13 +228,21 @@ TEXT runtime·sigtramp(SB),NOSPLIT,$0
228228
// Transition from C ABI to Go ABI.
229229
PUSH_REGS_HOST_TO_ABI0()
230230

231-
// Call into the Go signal handler
231+
// Set up ABIInternal environment: g in R14, cleared X15.
232+
get_tls(R12)
233+
MOVQ g(R12), R14
234+
PXOR X15, X15
235+
236+
// Reserve space for spill slots.
232237
NOP SP // disable vet stack checking
233-
ADJSP $24
234-
MOVQ DI, 0(SP) // sig
235-
MOVQ SI, 8(SP) // info
236-
MOVQ DX, 16(SP) // ctx
237-
CALL ·sigtrampgo(SB)
238+
ADJSP $24
239+
240+
// Call into the Go signal handler
241+
MOVQ DI, AX // sig
242+
MOVQ SI, BX // info
243+
MOVQ DX, CX // ctx
244+
CALL ·sigtrampgo<ABIInternal>(SB)
245+
238246
ADJSP $-24
239247

240248
POP_REGS_HOST_TO_ABI0()
@@ -245,13 +253,21 @@ TEXT runtime·sigprofNonGoWrapper<>(SB),NOSPLIT,$0
245253
// Transition from C ABI to Go ABI.
246254
PUSH_REGS_HOST_TO_ABI0()
247255

248-
// Call into the Go signal handler
256+
// Set up ABIInternal environment: g in R14, cleared X15.
257+
get_tls(R12)
258+
MOVQ g(R12), R14
259+
PXOR X15, X15
260+
261+
// Reserve space for spill slots.
249262
NOP SP // disable vet stack checking
250-
ADJSP $24
251-
MOVL DI, 0(SP) // sig
252-
MOVQ SI, 8(SP) // info
253-
MOVQ DX, 16(SP) // ctx
254-
CALL ·sigprofNonGo(SB)
263+
ADJSP $24
264+
265+
// Call into the Go signal handler
266+
MOVQ DI, AX // sig
267+
MOVQ SI, BX // info
268+
MOVQ DX, CX // ctx
269+
CALL ·sigprofNonGo<ABIInternal>(SB)
270+
255271
ADJSP $-24
256272

257273
POP_REGS_HOST_TO_ABI0()

src/runtime/sys_freebsd_arm64.s

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -295,10 +295,16 @@ TEXT runtime·sigtramp(SB),NOSPLIT,$176
295295
BEQ 2(PC)
296296
BL runtime·load_g(SB)
297297

298+
#ifdef GOEXPERIMENT_regabiargs
299+
// Restore signum to R0.
300+
MOVW 8(RSP), R0
301+
// R1 and R2 already contain info and ctx, respectively.
302+
#else
298303
MOVD R1, 16(RSP)
299304
MOVD R2, 24(RSP)
300-
MOVD $runtime·sigtrampgo(SB), R0
301-
BL (R0)
305+
#endif
306+
MOVD $runtime·sigtrampgo<ABIInternal>(SB), R3
307+
BL (R3)
302308

303309
// Restore callee-save registers.
304310
RESTORE_R19_TO_R28(8*4)

src/runtime/sys_linux_amd64.s

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -343,13 +343,21 @@ TEXT runtime·sigtramp(SB),NOSPLIT,$0
343343
// Transition from C ABI to Go ABI.
344344
PUSH_REGS_HOST_TO_ABI0()
345345

346-
// Call into the Go signal handler
346+
// Set up ABIInternal environment: g in R14, cleared X15.
347+
get_tls(R12)
348+
MOVQ g(R12), R14
349+
PXOR X15, X15
350+
351+
// Reserve space for spill slots.
347352
NOP SP // disable vet stack checking
348-
ADJSP $24
349-
MOVQ DI, 0(SP) // sig
350-
MOVQ SI, 8(SP) // info
351-
MOVQ DX, 16(SP) // ctx
352-
CALL ·sigtrampgo(SB)
353+
ADJSP $24
354+
355+
// Call into the Go signal handler
356+
MOVQ DI, AX // sig
357+
MOVQ SI, BX // info
358+
MOVQ DX, CX // ctx
359+
CALL ·sigtrampgo<ABIInternal>(SB)
360+
353361
ADJSP $-24
354362

355363
POP_REGS_HOST_TO_ABI0()
@@ -360,13 +368,21 @@ TEXT runtime·sigprofNonGoWrapper<>(SB),NOSPLIT,$0
360368
// Transition from C ABI to Go ABI.
361369
PUSH_REGS_HOST_TO_ABI0()
362370

363-
// Call into the Go signal handler
371+
// Set up ABIInternal environment: g in R14, cleared X15.
372+
get_tls(R12)
373+
MOVQ g(R12), R14
374+
PXOR X15, X15
375+
376+
// Reserve space for spill slots.
364377
NOP SP // disable vet stack checking
365-
ADJSP $24
366-
MOVL DI, 0(SP) // sig
367-
MOVQ SI, 8(SP) // info
368-
MOVQ DX, 16(SP) // ctx
369-
CALL ·sigprofNonGo(SB)
378+
ADJSP $24
379+
380+
// Call into the Go signal handler
381+
MOVQ DI, AX // sig
382+
MOVQ SI, BX // info
383+
MOVQ DX, CX // ctx
384+
CALL ·sigprofNonGo<ABIInternal>(SB)
385+
370386
ADJSP $-24
371387

372388
POP_REGS_HOST_TO_ABI0()

src/runtime/sys_linux_arm64.s

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -459,10 +459,16 @@ TEXT runtime·sigtramp(SB),NOSPLIT,$176
459459
CBZ R0, 2(PC)
460460
BL runtime·load_g(SB)
461461

462+
#ifdef GOEXPERIMENT_regabiargs
463+
// Restore signum to R0.
464+
MOVW 8(RSP), R0
465+
// R1 and R2 already contain info and ctx, respectively.
466+
#else
462467
MOVD R1, 16(RSP)
463468
MOVD R2, 24(RSP)
464-
MOVD $runtime·sigtrampgo(SB), R0
465-
BL (R0)
469+
#endif
470+
MOVD $runtime·sigtrampgo<ABIInternal>(SB), R3
471+
BL (R3)
466472

467473
// Restore callee-save registers.
468474
RESTORE_R19_TO_R28(8*4)
@@ -476,10 +482,14 @@ TEXT runtime·sigprofNonGoWrapper<>(SB),NOSPLIT,$176
476482
SAVE_R19_TO_R28(8*4)
477483
SAVE_F8_TO_F15(8*14)
478484

485+
#ifdef GOEXPERIMENT_regabiargs
486+
// R0, R1 and R2 already contain sig, info and ctx, respectively.
487+
#else
479488
MOVW R0, 8(RSP) // sig
480489
MOVD R1, 16(RSP) // info
481490
MOVD R2, 24(RSP) // ctx
482-
CALL runtime·sigprofNonGo(SB)
491+
#endif
492+
CALL runtime·sigprofNonGo<ABIInternal>(SB)
483493

484494
// Restore callee-save registers.
485495
RESTORE_R19_TO_R28(8*4)

src/runtime/sys_netbsd_amd64.s

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -309,13 +309,21 @@ TEXT runtime·sigtramp(SB),NOSPLIT,$0
309309
// Transition from C ABI to Go ABI.
310310
PUSH_REGS_HOST_TO_ABI0()
311311

312-
// Call into the Go signal handler
312+
// Set up ABIInternal environment: g in R14, cleared X15.
313+
get_tls(R12)
314+
MOVQ g(R12), R14
315+
PXOR X15, X15
316+
317+
// Reserve space for spill slots.
313318
NOP SP // disable vet stack checking
314-
ADJSP $24
315-
MOVQ DI, 0(SP) // sig
316-
MOVQ SI, 8(SP) // info
317-
MOVQ DX, 16(SP) // ctx
318-
CALL ·sigtrampgo(SB)
319+
ADJSP $24
320+
321+
// Call into the Go signal handler
322+
MOVQ DI, AX // sig
323+
MOVQ SI, BX // info
324+
MOVQ DX, CX // ctx
325+
CALL ·sigtrampgo<ABIInternal>(SB)
326+
319327
ADJSP $-24
320328

321329
POP_REGS_HOST_TO_ABI0()

src/runtime/sys_netbsd_arm64.s

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -317,9 +317,15 @@ TEXT runtime·sigtramp(SB),NOSPLIT,$176
317317
BEQ 2(PC)
318318
BL runtime·load_g(SB)
319319

320+
#ifdef GOEXPERIMENT_regabiargs
321+
// Restore signum to R0.
322+
MOVW 8(RSP), R0
323+
// R1 and R2 already contain info and ctx, respectively.
324+
#else
320325
MOVD R1, 16(RSP)
321326
MOVD R2, 24(RSP)
322-
BL runtime·sigtrampgo(SB)
327+
#endif
328+
BL runtime·sigtrampgo<ABIInternal>(SB)
323329

324330
// Restore callee-save registers.
325331
RESTORE_R19_TO_R28(8*4)

src/runtime/sys_openbsd_amd64.s

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -62,16 +62,24 @@ TEXT runtime·sigtramp(SB),NOSPLIT,$0
6262
// Transition from C ABI to Go ABI.
6363
PUSH_REGS_HOST_TO_ABI0()
6464

65-
// Call into the Go signal handler
65+
// Set up ABIInternal environment: g in R14, cleared X15.
66+
get_tls(R12)
67+
MOVQ g(R12), R14
68+
PXOR X15, X15
69+
70+
// Reserve space for spill slots.
6671
NOP SP // disable vet stack checking
67-
ADJSP $24
68-
MOVQ DI, 0(SP) // sig
69-
MOVQ SI, 8(SP) // info
70-
MOVQ DX, 16(SP) // ctx
71-
CALL ·sigtrampgo(SB)
72+
ADJSP $24
73+
74+
// Call into the Go signal handler
75+
MOVQ DI, AX // sig
76+
MOVQ SI, BX // info
77+
MOVQ DX, CX // ctx
78+
CALL ·sigtrampgo<ABIInternal>(SB)
79+
7280
ADJSP $-24
7381

74-
POP_REGS_HOST_TO_ABI0()
82+
POP_REGS_HOST_TO_ABI0()
7583
RET
7684

7785
//

src/runtime/sys_openbsd_arm64.s

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,15 @@ TEXT runtime·sigtramp(SB),NOSPLIT,$192
6262
MOVW R0, 8(RSP) // signum
6363
BL runtime·load_g(SB)
6464

65+
#ifdef GOEXPERIMENT_regabiargs
66+
// Restore signum to R0.
67+
MOVW 8(RSP), R0
68+
// R1 and R2 already contain info and ctx, respectively.
69+
#else
6570
MOVD R1, 16(RSP)
6671
MOVD R2, 24(RSP)
67-
BL runtime·sigtrampgo(SB)
72+
#endif
73+
BL runtime·sigtrampgo<ABIInternal>(SB)
6874

6975
// Restore callee-save registers.
7076
RESTORE_R19_TO_R28(8*4)

0 commit comments

Comments
 (0)