aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@golang.org>2016-02-11 18:09:34 -0800
committerIan Lance Taylor <iant@golang.org>2016-02-12 19:20:19 +0000
commitc93193aec0f33e901d6802e61c966286785f57ee (patch)
treece42c613f8f1a68a01e6608daef6c1b11541b62e
parent68aa7fb636d236c23be4fa05f87a898b5e7df362 (diff)
downloadgo-c93193aec0f33e901d6802e61c966286785f57ee.tar.gz
go-c93193aec0f33e901d6802e61c966286785f57ee.zip
runtime: return errno value from Solaris mmap as expected
The code in mem_bsd.go expects that when mmap fails it will return a positive errno value. This fixes the Solaris implementation of mmap to work as expected. Change-Id: Id1c34a9b916e8dc955ced90ea2f4af8321d92265 Reviewed-on: https://go-review.googlesource.com/19477 Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Russ Cox <rsc@golang.org>
-rw-r--r--src/runtime/os3_solaris.go16
1 files changed, 15 insertions, 1 deletions
diff --git a/src/runtime/os3_solaris.go b/src/runtime/os3_solaris.go
index 7bda07bd4a..7ebb35c8e9 100644
--- a/src/runtime/os3_solaris.go
+++ b/src/runtime/os3_solaris.go
@@ -442,7 +442,21 @@ func madvise(addr unsafe.Pointer, n uintptr, flags int32) {
//go:nosplit
func mmap(addr unsafe.Pointer, n uintptr, prot, flags, fd int32, off uint32) unsafe.Pointer {
- return unsafe.Pointer(sysvicall6(&libc_mmap, uintptr(addr), uintptr(n), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(off)))
+ p, err := doMmap(uintptr(addr), n, uintptr(prot), uintptr(flags), uintptr(fd), uintptr(off))
+ if p == ^uintptr(0) {
+ return unsafe.Pointer(err)
+ }
+ return unsafe.Pointer(p)
+}
+
+//go:nosplit
+func doMmap(addr, n, prot, flags, fd, off uintptr) (uintptr, uintptr) {
+ var libcall libcall
+ libcall.fn = uintptr(unsafe.Pointer(&libc_mmap))
+ libcall.n = 6
+ libcall.args = uintptr(noescape(unsafe.Pointer(&addr)))
+ asmcgocall(unsafe.Pointer(&asmsysvicall6), unsafe.Pointer(&libcall))
+ return libcall.r1, libcall.err
}
//go:nosplit