From 3ed8a1e629e95dc6337a73d5db9936dabd43f4f4 Mon Sep 17 00:00:00 2001 From: Guoqi Chen Date: Tue, 5 Jul 2022 19:41:27 +0800 Subject: [PATCH] cmd/internal/obj/loong64: save LR after decrementing SP Refer to CL 413428 and 412474, for loong64, like mips, s390x and riscv, there is no single instruction that saves the LR and decrements the SP, so we also need to insert an instruction to save the LR after decrementing the SP. Fixes #56623. Updates #53374. Change-Id: I3de040792f0a041d3d2a98ea89c23a2dd2f4ad10 Reviewed-on: https://go-review.googlesource.com/c/go/+/416154 TryBot-Result: Gopher Robot Reviewed-by: Ian Lance Taylor Auto-Submit: Cherry Mui Reviewed-by: Cherry Mui Reviewed-by: WANG Xuerui Reviewed-by: xiaodong liu Run-TryBot: Cherry Mui Reviewed-by: Meidan Li --- src/cmd/internal/obj/loong64/obj.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/cmd/internal/obj/loong64/obj.go b/src/cmd/internal/obj/loong64/obj.go index dc05e18c7d..0c1f5c029d 100644 --- a/src/cmd/internal/obj/loong64/obj.go +++ b/src/cmd/internal/obj/loong64/obj.go @@ -260,6 +260,20 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { q.Spadj = +autosize q = c.ctxt.EndUnsafePoint(q, c.newprog, -1) + + // On Linux, in a cgo binary we may get a SIGSETXID signal early on + // before the signal stack is set, as glibc doesn't allow us to block + // SIGSETXID. So a signal may land on the current stack and clobber + // the content below the SP. We store the LR again after the SP is + // decremented. + q = obj.Appendp(q, newprog) + q.As = mov + q.Pos = p.Pos + q.From.Type = obj.TYPE_REG + q.From.Reg = REGLINK + q.To.Type = obj.TYPE_MEM + q.To.Offset = 0 + q.To.Reg = REGSP } if c.cursym.Func().Text.From.Sym.Wrapper() && c.cursym.Func().Text.Mark&LEAF == 0 {