Commit 30bc05cf by Ian Lance Taylor

libgo: support for sparc64 GNU/Linux

    
    Fix lfstack code to work with sparc64 GNU/Linux address map.
    
    Force alignment of epollevent.  To make this work reliably, pass
    GOARCH explicitly to mkrsysinfo.sh.
    
    Patch by Vladimir Mezentsev.
    
    Reviewed-on: https://go-review.googlesource.com/44494

From-SVN: r248765
parent 4f14911c
884df09c3da0f39309ab13f2ad401628fb933050 e5870eac67d4d5b1f86bdbfb13dadf4d5723f71d
The first line of this file holds the git revision number of the last The first line of this file holds the git revision number of the last
merge done from the gofrontend repository. merge done from the gofrontend repository.
...@@ -531,7 +531,7 @@ s-version: Makefile ...@@ -531,7 +531,7 @@ s-version: Makefile
runtime_sysinfo.go: s-runtime_sysinfo; @true runtime_sysinfo.go: s-runtime_sysinfo; @true
s-runtime_sysinfo: $(srcdir)/mkrsysinfo.sh gen-sysinfo.go s-runtime_sysinfo: $(srcdir)/mkrsysinfo.sh gen-sysinfo.go
GOOS=$(GOOS) $(SHELL) $(srcdir)/mkrsysinfo.sh GOARCH=$(GOARCH) GOOS=$(GOOS) $(SHELL) $(srcdir)/mkrsysinfo.sh
$(SHELL) $(srcdir)/mvifdiff.sh tmp-runtime_sysinfo.go runtime_sysinfo.go $(SHELL) $(srcdir)/mvifdiff.sh tmp-runtime_sysinfo.go runtime_sysinfo.go
$(STAMP) $@ $(STAMP) $@
......
...@@ -3081,7 +3081,7 @@ s-version: Makefile ...@@ -3081,7 +3081,7 @@ s-version: Makefile
runtime_sysinfo.go: s-runtime_sysinfo; @true runtime_sysinfo.go: s-runtime_sysinfo; @true
s-runtime_sysinfo: $(srcdir)/mkrsysinfo.sh gen-sysinfo.go s-runtime_sysinfo: $(srcdir)/mkrsysinfo.sh gen-sysinfo.go
GOOS=$(GOOS) $(SHELL) $(srcdir)/mkrsysinfo.sh GOARCH=$(GOARCH) GOOS=$(GOOS) $(SHELL) $(srcdir)/mkrsysinfo.sh
$(SHELL) $(srcdir)/mvifdiff.sh tmp-runtime_sysinfo.go runtime_sysinfo.go $(SHELL) $(srcdir)/mvifdiff.sh tmp-runtime_sysinfo.go runtime_sysinfo.go
$(STAMP) $@ $(STAMP) $@
......
...@@ -32,9 +32,18 @@ const ( ...@@ -32,9 +32,18 @@ const (
// bottom, because node must be pointer-aligned, giving a total of 19 bits // bottom, because node must be pointer-aligned, giving a total of 19 bits
// of count. // of count.
cntBits = 64 - addrBits + 3 cntBits = 64 - addrBits + 3
// On sparc64-linux, user addresses are 52-bit numbers sign extended to 64.
// We shift the address left 12 to eliminate the sign extended part and make
// room in the bottom for the count.
sparcLinuxAddrBits = 52
sparcLinuxCntBits = 64 - sparcLinuxAddrBits + 3
) )
func lfstackPack(node *lfnode, cnt uintptr) uint64 { func lfstackPack(node *lfnode, cnt uintptr) uint64 {
if GOARCH == "sparc64" && GOOS == "linux" {
return uint64(uintptr(unsafe.Pointer(node)))<<(64-sparcLinuxAddrBits) | uint64(cnt&(1<<sparcLinuxCntBits-1))
}
return uint64(uintptr(unsafe.Pointer(node)))<<(64-addrBits) | uint64(cnt&(1<<cntBits-1)) return uint64(uintptr(unsafe.Pointer(node)))<<(64-addrBits) | uint64(cnt&(1<<cntBits-1))
} }
...@@ -44,5 +53,8 @@ func lfstackUnpack(val uint64) *lfnode { ...@@ -44,5 +53,8 @@ func lfstackUnpack(val uint64) *lfnode {
// val before unpacking. // val before unpacking.
return (*lfnode)(unsafe.Pointer(uintptr(int64(val) >> cntBits << 3))) return (*lfnode)(unsafe.Pointer(uintptr(int64(val) >> cntBits << 3)))
} }
if GOARCH == "sparc64" && GOOS == "linux" {
return (*lfnode)(unsafe.Pointer(uintptr(int64(val) >> sparcLinuxCntBits << 3)))
}
return (*lfnode)(unsafe.Pointer(uintptr(val >> cntBits << 3))) return (*lfnode)(unsafe.Pointer(uintptr(val >> cntBits << 3)))
} }
...@@ -83,7 +83,11 @@ if grep '^const _epoll_data_offset ' ${OUT} >/dev/null 2>&1; then ...@@ -83,7 +83,11 @@ if grep '^const _epoll_data_offset ' ${OUT} >/dev/null 2>&1; then
if test "$val" = "4"; then if test "$val" = "4"; then
echo 'type epollevent struct { events uint32; data [8]byte }' >> ${OUT} echo 'type epollevent struct { events uint32; data [8]byte }' >> ${OUT}
elif test "$val" = "8"; then elif test "$val" = "8"; then
echo 'type epollevent struct { events uint32; pad [4]byte; data [8]byte }' >> ${OUT} if test "$GOARCH" = "sparc64" -a "$GOOS" = "linux"; then
echo 'type epollevent struct { events uint32; pad [4]byte; data [8]byte; _align [0]int64 }' >> ${OUT}
else
echo 'type epollevent struct { events uint32; pad [4]byte; data [8]byte }' >> ${OUT}
fi
else else
echo 1>&2 "unknown epoll data offset value ${val}" echo 1>&2 "unknown epoll data offset value ${val}"
exit 1 exit 1
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment