From b76e836042dd65b39cfe7af0f8ff5f73f12142a2 Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Wed, 19 Nov 2014 11:30:58 -0500 Subject: [dev.cc] runtime: allow more address bits in lfstack on Power64 Previously, lfstack assumed Linux limited user space addresses to 43 bits on Power64 based on a paper from 2001. It turns out the limit is now 46 bits, so lfstack was truncating pointers. Raise the limit to 48 bits (for some future proofing and to make it match amd64) and add a self-test that will fail in a useful way if ever unpack(pack(x)) != x. With this change, dev.cc passes all.bash on power64le. LGTM=rsc R=rsc CC=golang-codereviews https://golang.org/cl/174430043 --- src/runtime/lfstack.go | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'src/runtime/lfstack.go') diff --git a/src/runtime/lfstack.go b/src/runtime/lfstack.go index 4a20fff9d8..8a36a67b35 100644 --- a/src/runtime/lfstack.go +++ b/src/runtime/lfstack.go @@ -12,6 +12,10 @@ import "unsafe" func lfstackpush(head *uint64, node *lfnode) { node.pushcnt++ new := lfstackPack(node, node.pushcnt) + if node1, _ := lfstackUnpack(new); node1 != node { + println("runtime: lfstackpush invalid packing: node=", node, " cnt=", hex(node.pushcnt), " packed=", hex(new), " -> node=", node1, "\n") + gothrow("lfstackpush") + } for { old := atomicload64(head) node.next, _ = lfstackUnpack(old) -- cgit v1.3