From 60e7460aa797b4b18f6fc589c4870ada51b100f2 Mon Sep 17 00:00:00 2001 From: Christian Stewart Date: Wed, 3 Aug 2022 19:44:38 -0700 Subject: [PATCH] package/go: fix go on riscv64 in sv57 mode On machines supporting Riscv SV57 mode like Qemu, Go programs currently crash with the following type of error: runtime: lfstack.push invalid packing: node=0xffffff5908a940 cnt=0x1 packed=0xffff5908a9400001 -> node=0xffff5908a940 The upstream PR fixes this error, but has not yet been merged. Upstream: https://go-review.googlesource.com/c/go/+/409055/4 Signed-off-by: Christian Stewart Signed-off-by: Thomas Petazzoni (cherry picked from commit fb97f4f354bd4e2fce270eebfba072c45a2a8a7c) Signed-off-by: Peter Korsgaard --- ...03-runtime-support-riscv64-SV57-mode.patch | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 package/go/0003-runtime-support-riscv64-SV57-mode.patch diff --git a/package/go/0003-runtime-support-riscv64-SV57-mode.patch b/package/go/0003-runtime-support-riscv64-SV57-mode.patch new file mode 100644 index 0000000000..f51c2ca093 --- /dev/null +++ b/package/go/0003-runtime-support-riscv64-SV57-mode.patch @@ -0,0 +1,65 @@ +From 6618c7af436488fa12018cdcd31eeedb3a698745 Mon Sep 17 00:00:00 2001 +From: Dmitry Vyukov +Date: Fri, 27 May 2022 18:55:35 +0200 +Subject: [PATCH] runtime: support riscv64 SV57 mode + +Riscv64 has SV57 mode when user-space VA is 56 bits. +Linux kernel recently got support for this mode and Go binaries started crashing as: + +runtime: lfstack.push invalid packing: node=0xffffff5908a940 cnt=0x1 +packed=0xffff5908a9400001 -> node=0xffff5908a940 + +Adjust lfstack code to use only 8 top bits of pointers on riscv64. + +For context see: +https://groups.google.com/g/syzkaller-bugs/c/lU0GQTZoNQQ/m/O_c3vmE3AAAJ + +Update #54104 + +Change-Id: Ib5d3d6a79c0c6eddf11618d73fcc8bc1832a9c25 +Signed-off-by: Christian Stewart +--- + +Upstream: https://go-review.googlesource.com/c/go/+/409055/4 +--- + src/runtime/lfstack_64bit.go | 12 ++++++++++++ + 1 file changed, 12 insertions(+) + +diff --git a/src/runtime/lfstack_64bit.go b/src/runtime/lfstack_64bit.go +index 154130cf63..39fa647b9e 100644 +--- a/src/runtime/lfstack_64bit.go ++++ b/src/runtime/lfstack_64bit.go +@@ -36,12 +36,21 @@ const ( + // We use one bit to distinguish between the two ranges. + aixAddrBits = 57 + aixCntBits = 64 - aixAddrBits + 3 ++ ++ // Riscv64 SV57 mode gives 56 bits of userspace VA. ++ // lfstack code supports it, but broader support for SV57 mode is incomplete, ++ // and there may be other issues (see #54104). ++ riscv64AddrBits = 56 ++ riscv64CntBits = 64 - riscv64AddrBits + 3 + ) + + func lfstackPack(node *lfnode, cnt uintptr) uint64 { + if GOARCH == "ppc64" && GOOS == "aix" { + return uint64(uintptr(unsafe.Pointer(node)))<<(64-aixAddrBits) | uint64(cnt&(1<> aixCntBits << 3) | 0xa<<56))) + } ++ if GOARCH == "riscv64" { ++ return (*lfnode)(unsafe.Pointer(uintptr(val >> riscv64CntBits << 3))) ++ } + return (*lfnode)(unsafe.Pointer(uintptr(val >> cntBits << 3))) + } +-- +2.35.1 +