From 516753278df2eb4896ba8b3350bf5ca19ec4b1f0 Mon Sep 17 00:00:00 2001 From: qmuntal Date: Wed, 8 Feb 2023 10:27:20 +0100 Subject: [PATCH] runtime: use explicit NOFRAME on dragonfly/amd64 This CL marks some dragonfly assembly functions as NOFRAME to avoid relying on the implicit amd64 NOFRAME heuristic, where NOSPLIT functions without stack were also marked as NOFRAME. Updates #58378 Change-Id: I832a1a78d68a49f11df3b03fa9d50d4796bcac03 Reviewed-on: https://go-review.googlesource.com/c/go/+/466355 Run-TryBot: Quim Muntal Reviewed-by: Than McIntosh TryBot-Result: Gopher Robot Reviewed-by: Cherry Mui --- src/cmd/internal/obj/x86/obj6.go | 2 +- src/runtime/sys_dragonfly_amd64.s | 10 ++++------ src/syscall/asm9_unix2_amd64.s | 21 ++++++++++----------- 3 files changed, 15 insertions(+), 18 deletions(-) diff --git a/src/cmd/internal/obj/x86/obj6.go b/src/cmd/internal/obj/x86/obj6.go index c6fe3279c4..d220751591 100644 --- a/src/cmd/internal/obj/x86/obj6.go +++ b/src/cmd/internal/obj/x86/obj6.go @@ -613,7 +613,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { var usefpheuristic bool switch ctxt.Headtype { - case objabi.Hwindows, objabi.Hdarwin, objabi.Hlinux: + case objabi.Hwindows, objabi.Hdarwin, objabi.Hlinux, objabi.Hdragonfly: default: usefpheuristic = true } diff --git a/src/runtime/sys_dragonfly_amd64.s b/src/runtime/sys_dragonfly_amd64.s index 0cf98219fb..cae2039477 100644 --- a/src/runtime/sys_dragonfly_amd64.s +++ b/src/runtime/sys_dragonfly_amd64.s @@ -213,16 +213,14 @@ TEXT runtime·sigfwd(SB),NOSPLIT,$0-32 MOVL sig+8(FP), DI MOVQ info+16(FP), SI MOVQ ctx+24(FP), DX - PUSHQ BP - MOVQ SP, BP - ANDQ $~15, SP // alignment for x86_64 ABI + MOVQ SP, BX // callee-saved + ANDQ $~15, SP // alignment for x86_64 ABI CALL AX - MOVQ BP, SP - POPQ BP + MOVQ BX, SP RET // Called using C ABI. -TEXT runtime·sigtramp(SB),NOSPLIT|TOPFRAME,$0 +TEXT runtime·sigtramp(SB),NOSPLIT|TOPFRAME|NOFRAME,$0 // Transition from C ABI to Go ABI. PUSH_REGS_HOST_TO_ABI0() diff --git a/src/syscall/asm9_unix2_amd64.s b/src/syscall/asm9_unix2_amd64.s index 5bf53a1251..6daa58d386 100644 --- a/src/syscall/asm9_unix2_amd64.s +++ b/src/syscall/asm9_unix2_amd64.s @@ -12,7 +12,8 @@ // // func Syscall9(trap int64, a1, a2, a3, a4, a5, a6, a7, a8, a9 int64) (r1, r2, err int64); -TEXT ·Syscall9(SB),NOSPLIT,$0-104 +TEXT ·Syscall9(SB),NOSPLIT,$32-104 + NO_LOCAL_POINTERS CALL runtime·entersyscall(SB) MOVQ num+0(FP), AX // syscall entry MOVQ a1+8(FP), DI @@ -21,17 +22,15 @@ TEXT ·Syscall9(SB),NOSPLIT,$0-104 MOVQ a4+32(FP), R10 MOVQ a5+40(FP), R8 MOVQ a6+48(FP), R9 + MOVQ a7+56(FP), R11 + MOVQ a8+64(FP), R12 + MOVQ a9+72(FP), R13 - // shift around the last three arguments so they're at the - // top of the stack when the syscall is called. - // note that we are scribbling over the Go arguments now. - MOVQ SP, CX // hide (SP) writes from vet - MOVQ a7+56(FP), R11 // arg 7 - MOVQ R11, 8(CX) - MOVQ a8+64(FP), R11 // arg 8 - MOVQ R11, 16(CX) - MOVQ a9+72(FP), R11 // arg 9 - MOVQ R11, 24(CX) + // only the first 6 arguments can be passed in registers, + // the last three should be placed at the top of the stack. + MOVQ R11, 8(SP) // arg 7 + MOVQ R12, 16(SP) // arg 8 + MOVQ R13, 24(SP) // arg 9 SYSCALL JCC ok9 -- 2.50.0