mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
runtime: fix errno sign for some mmap and mincore cases
The caller of mmap expects it to return a positive errno value, but the linux-arm64 and nacl-386 system calls returned a negative errno value. Correct them to negate the errno value. The caller of mincore expects it to return a negative errno value (yes, this is inconsistent), but the linux-mips64x and linux-ppc64x system call returned a positive errno value. Correct them to negate the errno value. Add a test that mmap returns errno with the correct sign. Brad added a test for mincore's errno value in https://golang.org/cl/19457. Fixes #14297. Change-Id: I2b93f32e679bd1eae1c9aef9ae7bcf0ba39521b5 Reviewed-on: https://go-review.googlesource.com/19455 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Reviewed-by: Minux Ma <minux@golang.org> Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
parent
70418eb819
commit
cc0a04d351
10 changed files with 69 additions and 16 deletions
|
|
@ -7,3 +7,4 @@
|
||||||
package runtime
|
package runtime
|
||||||
|
|
||||||
var NewOSProc0 = newosproc0
|
var NewOSProc0 = newosproc0
|
||||||
|
var Mincore = mincore
|
||||||
|
|
|
||||||
15
src/runtime/export_mmap_test.go
Normal file
15
src/runtime/export_mmap_test.go
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
// Copyright 2016 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris
|
||||||
|
|
||||||
|
// Export guts for testing.
|
||||||
|
|
||||||
|
package runtime
|
||||||
|
|
||||||
|
var Mmap = mmap
|
||||||
|
|
||||||
|
const ENOMEM = _ENOMEM
|
||||||
|
const MAP_ANON = _MAP_ANON
|
||||||
|
const MAP_PRIVATE = _MAP_PRIVATE
|
||||||
|
|
@ -28,8 +28,6 @@ var Exitsyscall = exitsyscall
|
||||||
var LockedOSThread = lockedOSThread
|
var LockedOSThread = lockedOSThread
|
||||||
var Xadduintptr = atomic.Xadduintptr
|
var Xadduintptr = atomic.Xadduintptr
|
||||||
|
|
||||||
var Mincore = mincore
|
|
||||||
|
|
||||||
var FuncPC = funcPC
|
var FuncPC = funcPC
|
||||||
|
|
||||||
var Fastlog2 = fastlog2
|
var Fastlog2 = fastlog2
|
||||||
|
|
|
||||||
|
|
@ -59,9 +59,9 @@ func sysReserve(v unsafe.Pointer, n uintptr, reserved *bool) unsafe.Pointer {
|
||||||
return p
|
return p
|
||||||
}
|
}
|
||||||
|
|
||||||
func sysMap(v unsafe.Pointer, n uintptr, reserved bool, sysStat *uint64) {
|
const _ENOMEM = 12
|
||||||
const _ENOMEM = 12
|
|
||||||
|
|
||||||
|
func sysMap(v unsafe.Pointer, n uintptr, reserved bool, sysStat *uint64) {
|
||||||
mSysStatInc(sysStat, n)
|
mSysStatInc(sysStat, n)
|
||||||
|
|
||||||
// On 64-bit, we don't actually have v reserved, so tread carefully.
|
// On 64-bit, we don't actually have v reserved, so tread carefully.
|
||||||
|
|
|
||||||
|
|
@ -10,18 +10,19 @@ const (
|
||||||
|
|
||||||
// native_client/src/trusted/service_runtime/include/sys/errno.h
|
// native_client/src/trusted/service_runtime/include/sys/errno.h
|
||||||
// The errors are mainly copied from Linux.
|
// The errors are mainly copied from Linux.
|
||||||
_EPERM = 1 /* Operation not permitted */
|
_EPERM = 1 /* Operation not permitted */
|
||||||
_ENOENT = 2 /* No such file or directory */
|
_ENOENT = 2 /* No such file or directory */
|
||||||
_ESRCH = 3 /* No such process */
|
_ESRCH = 3 /* No such process */
|
||||||
_EINTR = 4 /* Interrupted system call */
|
_EINTR = 4 /* Interrupted system call */
|
||||||
_EIO = 5 /* I/O error */
|
_EIO = 5 /* I/O error */
|
||||||
_ENXIO = 6 /* No such device or address */
|
_ENXIO = 6 /* No such device or address */
|
||||||
_E2BIG = 7 /* Argument list too long */
|
_E2BIG = 7 /* Argument list too long */
|
||||||
_ENOEXEC = 8 /* Exec format error */
|
_ENOEXEC = 8 /* Exec format error */
|
||||||
_EBADF = 9 /* Bad file number */
|
_EBADF = 9 /* Bad file number */
|
||||||
_ECHILD = 10 /* No child processes */
|
_ECHILD = 10 /* No child processes */
|
||||||
_EAGAIN = 11 /* Try again */
|
_EAGAIN = 11 /* Try again */
|
||||||
_ENOMEM = 12 /* Out of memory */
|
// _ENOMEM is defined in mem_bsd.go for nacl.
|
||||||
|
// _ENOMEM = 12 /* Out of memory */
|
||||||
_EACCES = 13 /* Permission denied */
|
_EACCES = 13 /* Permission denied */
|
||||||
_EFAULT = 14 /* Bad address */
|
_EFAULT = 14 /* Bad address */
|
||||||
_EBUSY = 16 /* Device or resource busy */
|
_EBUSY = 16 /* Device or resource busy */
|
||||||
|
|
|
||||||
30
src/runtime/runtime_mmap_test.go
Normal file
30
src/runtime/runtime_mmap_test.go
Normal file
|
|
@ -0,0 +1,30 @@
|
||||||
|
// Copyright 2016 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris
|
||||||
|
|
||||||
|
package runtime_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"runtime"
|
||||||
|
"runtime/internal/sys"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Test that the error value returned by mmap is positive, as that is
|
||||||
|
// what the code in mem_bsd.go, mem_darwin.go, and mem_linux.go expects.
|
||||||
|
// See the uses of ENOMEM in sysMap in those files.
|
||||||
|
func TestMmapErrorSign(t *testing.T) {
|
||||||
|
p := runtime.Mmap(nil, ^uintptr(0)&^(sys.PhysPageSize-1), 0, runtime.MAP_ANON|runtime.MAP_PRIVATE, -1, 0)
|
||||||
|
|
||||||
|
// The runtime.mmap function is nosplit, but t.Errorf is not.
|
||||||
|
// Reset the pointer so that we don't get an "invalid stack
|
||||||
|
// pointer" error from t.Errorf if we call it.
|
||||||
|
v := uintptr(p)
|
||||||
|
p = nil
|
||||||
|
|
||||||
|
if v != runtime.ENOMEM {
|
||||||
|
t.Errorf("mmap = %v, want %v", v, runtime.ENOMEM)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -269,6 +269,9 @@ TEXT runtime·mmap(SB),NOSPLIT,$-8
|
||||||
|
|
||||||
MOVD $SYS_mmap, R8
|
MOVD $SYS_mmap, R8
|
||||||
SVC
|
SVC
|
||||||
|
CMN $4095, R0
|
||||||
|
BCC 2(PC)
|
||||||
|
NEG R0,R0
|
||||||
MOVD R0, ret+32(FP)
|
MOVD R0, ret+32(FP)
|
||||||
RET
|
RET
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -168,6 +168,7 @@ TEXT runtime·mincore(SB),NOSPLIT,$-8-28
|
||||||
MOVV dst+16(FP), R6
|
MOVV dst+16(FP), R6
|
||||||
MOVV $SYS_mincore, R2
|
MOVV $SYS_mincore, R2
|
||||||
SYSCALL
|
SYSCALL
|
||||||
|
SUBVU R2, R0, R2 // caller expects negative errno
|
||||||
MOVW R2, ret+24(FP)
|
MOVW R2, ret+24(FP)
|
||||||
RET
|
RET
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -153,6 +153,7 @@ TEXT runtime·mincore(SB),NOSPLIT|NOFRAME,$0-28
|
||||||
MOVD n+8(FP), R4
|
MOVD n+8(FP), R4
|
||||||
MOVD dst+16(FP), R5
|
MOVD dst+16(FP), R5
|
||||||
SYSCALL $SYS_mincore
|
SYSCALL $SYS_mincore
|
||||||
|
NEG R3 // caller expects negative errno
|
||||||
MOVW R3, ret+24(FP)
|
MOVW R3, ret+24(FP)
|
||||||
RET
|
RET
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -227,6 +227,9 @@ TEXT runtime·mmap(SB),NOSPLIT,$32
|
||||||
LEAL 24(SP), AX
|
LEAL 24(SP), AX
|
||||||
MOVL AX, 20(SP)
|
MOVL AX, 20(SP)
|
||||||
NACL_SYSCALL(SYS_mmap)
|
NACL_SYSCALL(SYS_mmap)
|
||||||
|
CMPL AX, $-4095
|
||||||
|
JNA 2(PC)
|
||||||
|
NEGL AX
|
||||||
MOVL AX, ret+24(FP)
|
MOVL AX, ret+24(FP)
|
||||||
RET
|
RET
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue