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 <christian@paral.in> Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
This commit is contained in:
parent
2dc8b0dd74
commit
fb97f4f354
65
package/go/0003-runtime-support-riscv64-SV57-mode.patch
Normal file
65
package/go/0003-runtime-support-riscv64-SV57-mode.patch
Normal file
@ -0,0 +1,65 @@
|
||||
From 6618c7af436488fa12018cdcd31eeedb3a698745 Mon Sep 17 00:00:00 2001
|
||||
From: Dmitry Vyukov <dvyukov@google.com>
|
||||
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 <christian@paral.in>
|
||||
---
|
||||
|
||||
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-1))
|
||||
}
|
||||
+ if GOARCH == "riscv64" {
|
||||
+ return uint64(uintptr(unsafe.Pointer(node)))<<(64-riscv64AddrBits) | uint64(cnt&(1<<riscv64CntBits-1))
|
||||
+ }
|
||||
return uint64(uintptr(unsafe.Pointer(node)))<<(64-addrBits) | uint64(cnt&(1<<cntBits-1))
|
||||
}
|
||||
|
||||
@@ -54,5 +63,8 @@ func lfstackUnpack(val uint64) *lfnode {
|
||||
if GOARCH == "ppc64" && GOOS == "aix" {
|
||||
return (*lfnode)(unsafe.Pointer(uintptr((val >> 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
|
||||
|
Loading…
Reference in New Issue
Block a user