Skip to content

Commit

Permalink
[RFC] package/go: fix go on riscv64 in sv57 mode
Browse files Browse the repository at this point in the history
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

This pending upstream PR fixes this error, but has not yet been merged because
it does not fully fix the problem in all areas of the compiler yet.

https://go-review.googlesource.com/c/go/+/409055/3

Signed-off-by: Christian Stewart <[email protected]>
  • Loading branch information
paralin committed Jun 27, 2022
1 parent a20e676 commit c5e35c6
Showing 1 changed file with 59 additions and 0 deletions.
59 changes: 59 additions & 0 deletions package/go/0003-runtime-support-riscv64-SV57-mode.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
From 98eeeaeaa20279368be0466b24afe44ed24fceb8 Mon Sep 17 00:00:00 2001
From: Dmitry Vyukov <[email protected]>
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

Change-Id: Ib5d3d6a79c0c6eddf11618d73fcc8bc1832a9c25

Upstream: https://go-review.googlesource.com/c/go/+/409055/3
---
src/runtime/lfstack_64bit.go | 10 ++++++++++
1 file changed, 10 insertions(+)

diff --git a/src/runtime/lfstack_64bit.go b/src/runtime/lfstack_64bit.go
index 3f0e480897..9f13e72fa6 100644
--- a/src/runtime/lfstack_64bit.go
+++ b/src/runtime/lfstack_64bit.go
@@ -36,12 +36,19 @@ 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.
+ 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 +61,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

0 comments on commit c5e35c6

Please sign in to comment.