diff options
author | Ian Lance Taylor <iant@golang.org> | 2016-02-11 18:09:34 -0800 |
---|---|---|
committer | Ian Lance Taylor <iant@golang.org> | 2016-02-12 19:20:19 +0000 |
commit | c93193aec0f33e901d6802e61c966286785f57ee (patch) | |
tree | ce42c613f8f1a68a01e6608daef6c1b11541b62e | |
parent | 68aa7fb636d236c23be4fa05f87a898b5e7df362 (diff) | |
download | go-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.go | 16 |
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 |