mirror of
https://github.com/golang/go
synced 2024-11-24 05:40:15 -07:00
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>
This commit is contained in:
parent
06b0a655a1
commit
ba7f3d98d4
@ -218,13 +218,21 @@ TEXT runtime·sigtramp(SB),NOSPLIT,$0
|
||||
// Transition from C ABI to Go ABI.
|
||||
PUSH_REGS_HOST_TO_ABI0()
|
||||
|
||||
// Call into the Go signal handler
|
||||
// Set up ABIInternal environment: g in R14, cleared X15.
|
||||
get_tls(R12)
|
||||
MOVQ g(R12), R14
|
||||
PXOR X15, X15
|
||||
|
||||
// Reserve space for spill slots.
|
||||
NOP SP // disable vet stack checking
|
||||
ADJSP $24
|
||||
MOVL DI, 0(SP) // sig
|
||||
MOVQ SI, 8(SP) // info
|
||||
MOVQ DX, 16(SP) // ctx
|
||||
CALL ·sigtrampgo(SB)
|
||||
ADJSP $24
|
||||
|
||||
// Call into the Go signal handler
|
||||
MOVQ DI, AX // sig
|
||||
MOVQ SI, BX // info
|
||||
MOVQ DX, CX // ctx
|
||||
CALL ·sigtrampgo<ABIInternal>(SB)
|
||||
|
||||
ADJSP $-24
|
||||
|
||||
POP_REGS_HOST_TO_ABI0()
|
||||
|
@ -226,13 +226,21 @@ TEXT runtime·sigtramp(SB),NOSPLIT,$0
|
||||
// Transition from C ABI to Go ABI.
|
||||
PUSH_REGS_HOST_TO_ABI0()
|
||||
|
||||
// Call into the Go signal handler
|
||||
// Set up ABIInternal environment: g in R14, cleared X15.
|
||||
get_tls(R12)
|
||||
MOVQ g(R12), R14
|
||||
PXOR X15, X15
|
||||
|
||||
// Reserve space for spill slots.
|
||||
NOP SP // disable vet stack checking
|
||||
ADJSP $24
|
||||
MOVQ DI, 0(SP) // sig
|
||||
MOVQ SI, 8(SP) // info
|
||||
MOVQ DX, 16(SP) // ctx
|
||||
CALL ·sigtrampgo(SB)
|
||||
ADJSP $24
|
||||
|
||||
// Call into the Go signal handler
|
||||
MOVQ DI, AX // sig
|
||||
MOVQ SI, BX // info
|
||||
MOVQ DX, CX // ctx
|
||||
CALL ·sigtrampgo<ABIInternal>(SB)
|
||||
|
||||
ADJSP $-24
|
||||
|
||||
POP_REGS_HOST_TO_ABI0()
|
||||
|
@ -228,13 +228,21 @@ TEXT runtime·sigtramp(SB),NOSPLIT,$0
|
||||
// Transition from C ABI to Go ABI.
|
||||
PUSH_REGS_HOST_TO_ABI0()
|
||||
|
||||
// Call into the Go signal handler
|
||||
// Set up ABIInternal environment: g in R14, cleared X15.
|
||||
get_tls(R12)
|
||||
MOVQ g(R12), R14
|
||||
PXOR X15, X15
|
||||
|
||||
// Reserve space for spill slots.
|
||||
NOP SP // disable vet stack checking
|
||||
ADJSP $24
|
||||
MOVQ DI, 0(SP) // sig
|
||||
MOVQ SI, 8(SP) // info
|
||||
MOVQ DX, 16(SP) // ctx
|
||||
CALL ·sigtrampgo(SB)
|
||||
ADJSP $24
|
||||
|
||||
// Call into the Go signal handler
|
||||
MOVQ DI, AX // sig
|
||||
MOVQ SI, BX // info
|
||||
MOVQ DX, CX // ctx
|
||||
CALL ·sigtrampgo<ABIInternal>(SB)
|
||||
|
||||
ADJSP $-24
|
||||
|
||||
POP_REGS_HOST_TO_ABI0()
|
||||
@ -245,13 +253,21 @@ TEXT runtime·sigprofNonGoWrapper<>(SB),NOSPLIT,$0
|
||||
// Transition from C ABI to Go ABI.
|
||||
PUSH_REGS_HOST_TO_ABI0()
|
||||
|
||||
// Call into the Go signal handler
|
||||
// Set up ABIInternal environment: g in R14, cleared X15.
|
||||
get_tls(R12)
|
||||
MOVQ g(R12), R14
|
||||
PXOR X15, X15
|
||||
|
||||
// Reserve space for spill slots.
|
||||
NOP SP // disable vet stack checking
|
||||
ADJSP $24
|
||||
MOVL DI, 0(SP) // sig
|
||||
MOVQ SI, 8(SP) // info
|
||||
MOVQ DX, 16(SP) // ctx
|
||||
CALL ·sigprofNonGo(SB)
|
||||
ADJSP $24
|
||||
|
||||
// Call into the Go signal handler
|
||||
MOVQ DI, AX // sig
|
||||
MOVQ SI, BX // info
|
||||
MOVQ DX, CX // ctx
|
||||
CALL ·sigprofNonGo<ABIInternal>(SB)
|
||||
|
||||
ADJSP $-24
|
||||
|
||||
POP_REGS_HOST_TO_ABI0()
|
||||
|
@ -295,10 +295,16 @@ TEXT runtime·sigtramp(SB),NOSPLIT,$176
|
||||
BEQ 2(PC)
|
||||
BL runtime·load_g(SB)
|
||||
|
||||
#ifdef GOEXPERIMENT_regabiargs
|
||||
// Restore signum to R0.
|
||||
MOVW 8(RSP), R0
|
||||
// R1 and R2 already contain info and ctx, respectively.
|
||||
#else
|
||||
MOVD R1, 16(RSP)
|
||||
MOVD R2, 24(RSP)
|
||||
MOVD $runtime·sigtrampgo(SB), R0
|
||||
BL (R0)
|
||||
#endif
|
||||
MOVD $runtime·sigtrampgo<ABIInternal>(SB), R3
|
||||
BL (R3)
|
||||
|
||||
// Restore callee-save registers.
|
||||
RESTORE_R19_TO_R28(8*4)
|
||||
|
@ -343,13 +343,21 @@ TEXT runtime·sigtramp(SB),NOSPLIT,$0
|
||||
// Transition from C ABI to Go ABI.
|
||||
PUSH_REGS_HOST_TO_ABI0()
|
||||
|
||||
// Call into the Go signal handler
|
||||
// Set up ABIInternal environment: g in R14, cleared X15.
|
||||
get_tls(R12)
|
||||
MOVQ g(R12), R14
|
||||
PXOR X15, X15
|
||||
|
||||
// Reserve space for spill slots.
|
||||
NOP SP // disable vet stack checking
|
||||
ADJSP $24
|
||||
MOVQ DI, 0(SP) // sig
|
||||
MOVQ SI, 8(SP) // info
|
||||
MOVQ DX, 16(SP) // ctx
|
||||
CALL ·sigtrampgo(SB)
|
||||
ADJSP $24
|
||||
|
||||
// Call into the Go signal handler
|
||||
MOVQ DI, AX // sig
|
||||
MOVQ SI, BX // info
|
||||
MOVQ DX, CX // ctx
|
||||
CALL ·sigtrampgo<ABIInternal>(SB)
|
||||
|
||||
ADJSP $-24
|
||||
|
||||
POP_REGS_HOST_TO_ABI0()
|
||||
@ -360,13 +368,21 @@ TEXT runtime·sigprofNonGoWrapper<>(SB),NOSPLIT,$0
|
||||
// Transition from C ABI to Go ABI.
|
||||
PUSH_REGS_HOST_TO_ABI0()
|
||||
|
||||
// Call into the Go signal handler
|
||||
// Set up ABIInternal environment: g in R14, cleared X15.
|
||||
get_tls(R12)
|
||||
MOVQ g(R12), R14
|
||||
PXOR X15, X15
|
||||
|
||||
// Reserve space for spill slots.
|
||||
NOP SP // disable vet stack checking
|
||||
ADJSP $24
|
||||
MOVL DI, 0(SP) // sig
|
||||
MOVQ SI, 8(SP) // info
|
||||
MOVQ DX, 16(SP) // ctx
|
||||
CALL ·sigprofNonGo(SB)
|
||||
ADJSP $24
|
||||
|
||||
// Call into the Go signal handler
|
||||
MOVQ DI, AX // sig
|
||||
MOVQ SI, BX // info
|
||||
MOVQ DX, CX // ctx
|
||||
CALL ·sigprofNonGo<ABIInternal>(SB)
|
||||
|
||||
ADJSP $-24
|
||||
|
||||
POP_REGS_HOST_TO_ABI0()
|
||||
|
@ -459,10 +459,16 @@ TEXT runtime·sigtramp(SB),NOSPLIT,$176
|
||||
CBZ R0, 2(PC)
|
||||
BL runtime·load_g(SB)
|
||||
|
||||
#ifdef GOEXPERIMENT_regabiargs
|
||||
// Restore signum to R0.
|
||||
MOVW 8(RSP), R0
|
||||
// R1 and R2 already contain info and ctx, respectively.
|
||||
#else
|
||||
MOVD R1, 16(RSP)
|
||||
MOVD R2, 24(RSP)
|
||||
MOVD $runtime·sigtrampgo(SB), R0
|
||||
BL (R0)
|
||||
#endif
|
||||
MOVD $runtime·sigtrampgo<ABIInternal>(SB), R3
|
||||
BL (R3)
|
||||
|
||||
// Restore callee-save registers.
|
||||
RESTORE_R19_TO_R28(8*4)
|
||||
@ -476,10 +482,14 @@ TEXT runtime·sigprofNonGoWrapper<>(SB),NOSPLIT,$176
|
||||
SAVE_R19_TO_R28(8*4)
|
||||
SAVE_F8_TO_F15(8*14)
|
||||
|
||||
#ifdef GOEXPERIMENT_regabiargs
|
||||
// R0, R1 and R2 already contain sig, info and ctx, respectively.
|
||||
#else
|
||||
MOVW R0, 8(RSP) // sig
|
||||
MOVD R1, 16(RSP) // info
|
||||
MOVD R2, 24(RSP) // ctx
|
||||
CALL runtime·sigprofNonGo(SB)
|
||||
#endif
|
||||
CALL runtime·sigprofNonGo<ABIInternal>(SB)
|
||||
|
||||
// Restore callee-save registers.
|
||||
RESTORE_R19_TO_R28(8*4)
|
||||
|
@ -309,13 +309,21 @@ TEXT runtime·sigtramp(SB),NOSPLIT,$0
|
||||
// Transition from C ABI to Go ABI.
|
||||
PUSH_REGS_HOST_TO_ABI0()
|
||||
|
||||
// Call into the Go signal handler
|
||||
// Set up ABIInternal environment: g in R14, cleared X15.
|
||||
get_tls(R12)
|
||||
MOVQ g(R12), R14
|
||||
PXOR X15, X15
|
||||
|
||||
// Reserve space for spill slots.
|
||||
NOP SP // disable vet stack checking
|
||||
ADJSP $24
|
||||
MOVQ DI, 0(SP) // sig
|
||||
MOVQ SI, 8(SP) // info
|
||||
MOVQ DX, 16(SP) // ctx
|
||||
CALL ·sigtrampgo(SB)
|
||||
ADJSP $24
|
||||
|
||||
// Call into the Go signal handler
|
||||
MOVQ DI, AX // sig
|
||||
MOVQ SI, BX // info
|
||||
MOVQ DX, CX // ctx
|
||||
CALL ·sigtrampgo<ABIInternal>(SB)
|
||||
|
||||
ADJSP $-24
|
||||
|
||||
POP_REGS_HOST_TO_ABI0()
|
||||
|
@ -317,9 +317,15 @@ TEXT runtime·sigtramp(SB),NOSPLIT,$176
|
||||
BEQ 2(PC)
|
||||
BL runtime·load_g(SB)
|
||||
|
||||
#ifdef GOEXPERIMENT_regabiargs
|
||||
// Restore signum to R0.
|
||||
MOVW 8(RSP), R0
|
||||
// R1 and R2 already contain info and ctx, respectively.
|
||||
#else
|
||||
MOVD R1, 16(RSP)
|
||||
MOVD R2, 24(RSP)
|
||||
BL runtime·sigtrampgo(SB)
|
||||
#endif
|
||||
BL runtime·sigtrampgo<ABIInternal>(SB)
|
||||
|
||||
// Restore callee-save registers.
|
||||
RESTORE_R19_TO_R28(8*4)
|
||||
|
@ -62,16 +62,24 @@ TEXT runtime·sigtramp(SB),NOSPLIT,$0
|
||||
// Transition from C ABI to Go ABI.
|
||||
PUSH_REGS_HOST_TO_ABI0()
|
||||
|
||||
// Call into the Go signal handler
|
||||
// Set up ABIInternal environment: g in R14, cleared X15.
|
||||
get_tls(R12)
|
||||
MOVQ g(R12), R14
|
||||
PXOR X15, X15
|
||||
|
||||
// Reserve space for spill slots.
|
||||
NOP SP // disable vet stack checking
|
||||
ADJSP $24
|
||||
MOVQ DI, 0(SP) // sig
|
||||
MOVQ SI, 8(SP) // info
|
||||
MOVQ DX, 16(SP) // ctx
|
||||
CALL ·sigtrampgo(SB)
|
||||
ADJSP $24
|
||||
|
||||
// Call into the Go signal handler
|
||||
MOVQ DI, AX // sig
|
||||
MOVQ SI, BX // info
|
||||
MOVQ DX, CX // ctx
|
||||
CALL ·sigtrampgo<ABIInternal>(SB)
|
||||
|
||||
ADJSP $-24
|
||||
|
||||
POP_REGS_HOST_TO_ABI0()
|
||||
POP_REGS_HOST_TO_ABI0()
|
||||
RET
|
||||
|
||||
//
|
||||
|
@ -62,9 +62,15 @@ TEXT runtime·sigtramp(SB),NOSPLIT,$192
|
||||
MOVW R0, 8(RSP) // signum
|
||||
BL runtime·load_g(SB)
|
||||
|
||||
#ifdef GOEXPERIMENT_regabiargs
|
||||
// Restore signum to R0.
|
||||
MOVW 8(RSP), R0
|
||||
// R1 and R2 already contain info and ctx, respectively.
|
||||
#else
|
||||
MOVD R1, 16(RSP)
|
||||
MOVD R2, 24(RSP)
|
||||
BL runtime·sigtrampgo(SB)
|
||||
#endif
|
||||
BL runtime·sigtrampgo<ABIInternal>(SB)
|
||||
|
||||
// Restore callee-save registers.
|
||||
RESTORE_R19_TO_R28(8*4)
|
||||
|
Loading…
Reference in New Issue
Block a user