mirror of
https://github.com/golang/go
synced 2024-11-23 07:00:05 -07:00
runtime: change read and write to return negative errno value
The internal read and write functions used to return -1 on error; change them to return a negative errno value instead. This will be used by later CLs in this series. For most targets this is a simplification, although for ones that call into libc it is a complication. Updates #27707 Change-Id: Id02bf9487f03e7e88e4f2b85e899e986738697ad Reviewed-on: https://go-review.googlesource.com/c/go/+/171823 Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Michael Knyszek <mknyszek@google.com>
This commit is contained in:
parent
6917b3c839
commit
b653c878b1
@ -18,6 +18,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"syscall"
|
"syscall"
|
||||||
"testing"
|
"testing"
|
||||||
|
"unsafe"
|
||||||
)
|
)
|
||||||
|
|
||||||
// sigquit is the signal to send to kill a hanging testdata program.
|
// sigquit is the signal to send to kill a hanging testdata program.
|
||||||
@ -33,6 +34,29 @@ func init() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestBadOpen(t *testing.T) {
|
||||||
|
// make sure we get the correct error code if open fails. Same for
|
||||||
|
// read/write/close on the resulting -1 fd. See issue 10052.
|
||||||
|
nonfile := []byte("/notreallyafile")
|
||||||
|
fd := runtime.Open(&nonfile[0], 0, 0)
|
||||||
|
if fd != -1 {
|
||||||
|
t.Errorf("open(%q)=%d, want -1", nonfile, fd)
|
||||||
|
}
|
||||||
|
var buf [32]byte
|
||||||
|
r := runtime.Read(-1, unsafe.Pointer(&buf[0]), int32(len(buf)))
|
||||||
|
if got, want := r, -int32(syscall.EBADF); got != want {
|
||||||
|
t.Errorf("read()=%d, want %d", got, want)
|
||||||
|
}
|
||||||
|
w := runtime.Write(^uintptr(0), unsafe.Pointer(&buf[0]), int32(len(buf)))
|
||||||
|
if got, want := w, -int32(syscall.EBADF); got != want {
|
||||||
|
t.Errorf("write()=%d, want %d", got, want)
|
||||||
|
}
|
||||||
|
c := runtime.Close(-1)
|
||||||
|
if c != -1 {
|
||||||
|
t.Errorf("close()=%d, want -1", c)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestCrashDumpsAllThreads(t *testing.T) {
|
func TestCrashDumpsAllThreads(t *testing.T) {
|
||||||
if *flagQuick {
|
if *flagQuick {
|
||||||
t.Skip("-quick")
|
t.Skip("-quick")
|
||||||
|
@ -399,16 +399,23 @@ func write1(fd uintptr, p unsafe.Pointer, n int32) int32 {
|
|||||||
// Check the validity of g because without a g during
|
// Check the validity of g because without a g during
|
||||||
// newosproc0.
|
// newosproc0.
|
||||||
if _g_ != nil {
|
if _g_ != nil {
|
||||||
r, _ := syscall3(&libc_write, uintptr(fd), uintptr(p), uintptr(n))
|
r, errno := syscall3(&libc_write, uintptr(fd), uintptr(p), uintptr(n))
|
||||||
|
if int32(r) < 0 {
|
||||||
|
return -int32(errno)
|
||||||
|
}
|
||||||
return int32(r)
|
return int32(r)
|
||||||
}
|
}
|
||||||
|
// Note that in this case we can't return a valid errno value.
|
||||||
return write2(fd, uintptr(p), n)
|
return write2(fd, uintptr(p), n)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//go:nosplit
|
//go:nosplit
|
||||||
func read(fd int32, p unsafe.Pointer, n int32) int32 {
|
func read(fd int32, p unsafe.Pointer, n int32) int32 {
|
||||||
r, _ := syscall3(&libc_read, uintptr(fd), uintptr(p), uintptr(n))
|
r, errno := syscall3(&libc_read, uintptr(fd), uintptr(p), uintptr(n))
|
||||||
|
if int32(r) < 0 {
|
||||||
|
return -int32(errno)
|
||||||
|
}
|
||||||
return int32(r)
|
return int32(r)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -447,7 +447,11 @@ func raiseproc(sig uint32) /* int32 */ {
|
|||||||
|
|
||||||
//go:nosplit
|
//go:nosplit
|
||||||
func read(fd int32, buf unsafe.Pointer, nbyte int32) int32 {
|
func read(fd int32, buf unsafe.Pointer, nbyte int32) int32 {
|
||||||
return int32(sysvicall3(&libc_read, uintptr(fd), uintptr(buf), uintptr(nbyte)))
|
r1, err := sysvicall3Err(&libc_read, uintptr(fd), uintptr(buf), uintptr(nbyte))
|
||||||
|
if c := int32(r1); c >= 0 {
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
return -int32(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
//go:nosplit
|
//go:nosplit
|
||||||
@ -511,7 +515,11 @@ func walltime1() (sec int64, nsec int32) {
|
|||||||
|
|
||||||
//go:nosplit
|
//go:nosplit
|
||||||
func write1(fd uintptr, buf unsafe.Pointer, nbyte int32) int32 {
|
func write1(fd uintptr, buf unsafe.Pointer, nbyte int32) int32 {
|
||||||
return int32(sysvicall3(&libc_write, uintptr(fd), uintptr(buf), uintptr(nbyte)))
|
r1, err := sysvicall3Err(&libc_write, fd, uintptr(buf), uintptr(nbyte))
|
||||||
|
if c := int32(r1); c >= 0 {
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
return -int32(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func osyield1()
|
func osyield1()
|
||||||
|
@ -122,6 +122,16 @@ func sysvicall2(fn *libcFunc, a1, a2 uintptr) uintptr {
|
|||||||
|
|
||||||
//go:nosplit
|
//go:nosplit
|
||||||
func sysvicall3(fn *libcFunc, a1, a2, a3 uintptr) uintptr {
|
func sysvicall3(fn *libcFunc, a1, a2, a3 uintptr) uintptr {
|
||||||
|
r1, _ := sysvicall3Err(fn, a1, a2, a3)
|
||||||
|
return r1
|
||||||
|
}
|
||||||
|
|
||||||
|
//go:nosplit
|
||||||
|
//go:cgo_unsafe_args
|
||||||
|
|
||||||
|
// sysvicall3Err returns both the system call result and the errno value.
|
||||||
|
// This is used by sysicall3 and write1.
|
||||||
|
func sysvicall3Err(fn *libcFunc, a1, a2, a3 uintptr) (r1, err uintptr) {
|
||||||
// Leave caller's PC/SP around for traceback.
|
// Leave caller's PC/SP around for traceback.
|
||||||
gp := getg()
|
gp := getg()
|
||||||
var mp *m
|
var mp *m
|
||||||
@ -146,7 +156,7 @@ func sysvicall3(fn *libcFunc, a1, a2, a3 uintptr) uintptr {
|
|||||||
if mp != nil {
|
if mp != nil {
|
||||||
mp.libcallsp = 0
|
mp.libcallsp = 0
|
||||||
}
|
}
|
||||||
return libcall.r1
|
return libcall.r1, libcall.err
|
||||||
}
|
}
|
||||||
|
|
||||||
//go:nosplit
|
//go:nosplit
|
||||||
|
@ -290,32 +290,6 @@ func TestTrailingZero(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestBadOpen(t *testing.T) {
|
|
||||||
if GOOS == "windows" || GOOS == "js" {
|
|
||||||
t.Skip("skipping OS that doesn't have open/read/write/close")
|
|
||||||
}
|
|
||||||
// make sure we get the correct error code if open fails. Same for
|
|
||||||
// read/write/close on the resulting -1 fd. See issue 10052.
|
|
||||||
nonfile := []byte("/notreallyafile")
|
|
||||||
fd := Open(&nonfile[0], 0, 0)
|
|
||||||
if fd != -1 {
|
|
||||||
t.Errorf("open(\"%s\")=%d, want -1", string(nonfile), fd)
|
|
||||||
}
|
|
||||||
var buf [32]byte
|
|
||||||
r := Read(-1, unsafe.Pointer(&buf[0]), int32(len(buf)))
|
|
||||||
if r != -1 {
|
|
||||||
t.Errorf("read()=%d, want -1", r)
|
|
||||||
}
|
|
||||||
w := Write(^uintptr(0), unsafe.Pointer(&buf[0]), int32(len(buf)))
|
|
||||||
if w != -1 {
|
|
||||||
t.Errorf("write()=%d, want -1", w)
|
|
||||||
}
|
|
||||||
c := Close(-1)
|
|
||||||
if c != -1 {
|
|
||||||
t.Errorf("close()=%d, want -1", c)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestAppendGrowth(t *testing.T) {
|
func TestAppendGrowth(t *testing.T) {
|
||||||
var x []int64
|
var x []int64
|
||||||
check := func(want int) {
|
check := func(want int) {
|
||||||
|
@ -13,12 +13,17 @@ package runtime
|
|||||||
|
|
||||||
import "unsafe"
|
import "unsafe"
|
||||||
|
|
||||||
|
// read calls the read system call.
|
||||||
|
// It returns a non-negative number of bytes written or a negative errno value.
|
||||||
func read(fd int32, p unsafe.Pointer, n int32) int32
|
func read(fd int32, p unsafe.Pointer, n int32) int32
|
||||||
|
|
||||||
func closefd(fd int32) int32
|
func closefd(fd int32) int32
|
||||||
|
|
||||||
func exit(code int32)
|
func exit(code int32)
|
||||||
func usleep(usec uint32)
|
func usleep(usec uint32)
|
||||||
|
|
||||||
|
// write calls the write system call.
|
||||||
|
// It returns a non-negative number of bytes written or a negative errno value.
|
||||||
//go:noescape
|
//go:noescape
|
||||||
func write1(fd uintptr, p unsafe.Pointer, n int32) int32
|
func write1(fd uintptr, p unsafe.Pointer, n int32) int32
|
||||||
|
|
||||||
|
@ -64,6 +64,12 @@ TEXT runtime·read_trampoline(SB),NOSPLIT,$0
|
|||||||
MOVL 8(CX), AX // arg 3 count
|
MOVL 8(CX), AX // arg 3 count
|
||||||
MOVL AX, 8(SP)
|
MOVL AX, 8(SP)
|
||||||
CALL libc_read(SB)
|
CALL libc_read(SB)
|
||||||
|
TESTL AX, AX
|
||||||
|
JGE noerr
|
||||||
|
CALL libc_error(SB)
|
||||||
|
MOVL (AX), AX
|
||||||
|
NEGL AX // caller expects negative errno value
|
||||||
|
noerr:
|
||||||
MOVL BP, SP
|
MOVL BP, SP
|
||||||
POPL BP
|
POPL BP
|
||||||
RET
|
RET
|
||||||
@ -80,6 +86,12 @@ TEXT runtime·write_trampoline(SB),NOSPLIT,$0
|
|||||||
MOVL 8(CX), AX // arg 3 count
|
MOVL 8(CX), AX // arg 3 count
|
||||||
MOVL AX, 8(SP)
|
MOVL AX, 8(SP)
|
||||||
CALL libc_write(SB)
|
CALL libc_write(SB)
|
||||||
|
TESTL AX, AX
|
||||||
|
JGE noerr
|
||||||
|
CALL libc_error(SB)
|
||||||
|
MOVL (AX), AX
|
||||||
|
NEGL AX // caller expects negative errno value
|
||||||
|
noerr:
|
||||||
MOVL BP, SP
|
MOVL BP, SP
|
||||||
POPL BP
|
POPL BP
|
||||||
RET
|
RET
|
||||||
|
@ -46,6 +46,12 @@ TEXT runtime·read_trampoline(SB),NOSPLIT,$0
|
|||||||
MOVL 16(DI), DX // arg 3 count
|
MOVL 16(DI), DX // arg 3 count
|
||||||
MOVL 0(DI), DI // arg 1 fd
|
MOVL 0(DI), DI // arg 1 fd
|
||||||
CALL libc_read(SB)
|
CALL libc_read(SB)
|
||||||
|
TESTL AX, AX
|
||||||
|
JGE noerr
|
||||||
|
CALL libc_error(SB)
|
||||||
|
MOVL (AX), AX
|
||||||
|
NEGL AX // caller expects negative errno value
|
||||||
|
noerr:
|
||||||
POPQ BP
|
POPQ BP
|
||||||
RET
|
RET
|
||||||
|
|
||||||
@ -56,6 +62,12 @@ TEXT runtime·write_trampoline(SB),NOSPLIT,$0
|
|||||||
MOVL 16(DI), DX // arg 3 count
|
MOVL 16(DI), DX // arg 3 count
|
||||||
MOVQ 0(DI), DI // arg 1 fd
|
MOVQ 0(DI), DI // arg 1 fd
|
||||||
CALL libc_write(SB)
|
CALL libc_write(SB)
|
||||||
|
TESTL AX, AX
|
||||||
|
JGE noerr
|
||||||
|
CALL libc_error(SB)
|
||||||
|
MOVL (AX), AX
|
||||||
|
NEGL AX // caller expects negative errno value
|
||||||
|
noerr:
|
||||||
POPQ BP
|
POPQ BP
|
||||||
RET
|
RET
|
||||||
|
|
||||||
|
@ -32,6 +32,13 @@ TEXT runtime·write_trampoline(SB),NOSPLIT,$0
|
|||||||
MOVW 8(R0), R2 // arg 3 count
|
MOVW 8(R0), R2 // arg 3 count
|
||||||
MOVW 0(R0), R0 // arg 1 fd
|
MOVW 0(R0), R0 // arg 1 fd
|
||||||
BL libc_write(SB)
|
BL libc_write(SB)
|
||||||
|
MOVW $-1, R1
|
||||||
|
CMP R0, R1
|
||||||
|
BNE noerr
|
||||||
|
BL libc_error(SB)
|
||||||
|
MOVW (R0), R0
|
||||||
|
RSB $0, R0, R0 // caller expects negative errno value
|
||||||
|
noerr:
|
||||||
RET
|
RET
|
||||||
|
|
||||||
TEXT runtime·read_trampoline(SB),NOSPLIT,$0
|
TEXT runtime·read_trampoline(SB),NOSPLIT,$0
|
||||||
@ -39,6 +46,13 @@ TEXT runtime·read_trampoline(SB),NOSPLIT,$0
|
|||||||
MOVW 8(R0), R2 // arg 3 count
|
MOVW 8(R0), R2 // arg 3 count
|
||||||
MOVW 0(R0), R0 // arg 1 fd
|
MOVW 0(R0), R0 // arg 1 fd
|
||||||
BL libc_read(SB)
|
BL libc_read(SB)
|
||||||
|
MOVW $-1, R1
|
||||||
|
CMP R0, R1
|
||||||
|
BNE noerr
|
||||||
|
BL libc_error(SB)
|
||||||
|
MOVW (R0), R0
|
||||||
|
RSB $0, R0, R0 // caller expects negative errno value
|
||||||
|
noerr:
|
||||||
RET
|
RET
|
||||||
|
|
||||||
TEXT runtime·pipe_trampoline(SB),NOSPLIT,$0
|
TEXT runtime·pipe_trampoline(SB),NOSPLIT,$0
|
||||||
|
@ -35,6 +35,13 @@ TEXT runtime·write_trampoline(SB),NOSPLIT,$0
|
|||||||
MOVW 16(R0), R2 // arg 3 count
|
MOVW 16(R0), R2 // arg 3 count
|
||||||
MOVW 0(R0), R0 // arg 1 fd
|
MOVW 0(R0), R0 // arg 1 fd
|
||||||
BL libc_write(SB)
|
BL libc_write(SB)
|
||||||
|
MOVD $-1, R1
|
||||||
|
CMP R0, R1
|
||||||
|
BNE noerr
|
||||||
|
BL libc_error(SB)
|
||||||
|
MOVW (R0), R0
|
||||||
|
NEG R0, R0 // caller expects negative errno value
|
||||||
|
noerr:
|
||||||
RET
|
RET
|
||||||
|
|
||||||
TEXT runtime·read_trampoline(SB),NOSPLIT,$0
|
TEXT runtime·read_trampoline(SB),NOSPLIT,$0
|
||||||
@ -42,6 +49,13 @@ TEXT runtime·read_trampoline(SB),NOSPLIT,$0
|
|||||||
MOVW 16(R0), R2 // arg 3 count
|
MOVW 16(R0), R2 // arg 3 count
|
||||||
MOVW 0(R0), R0 // arg 1 fd
|
MOVW 0(R0), R0 // arg 1 fd
|
||||||
BL libc_read(SB)
|
BL libc_read(SB)
|
||||||
|
MOVD $-1, R1
|
||||||
|
CMP R0, R1
|
||||||
|
BNE noerr
|
||||||
|
BL libc_error(SB)
|
||||||
|
MOVW (R0), R0
|
||||||
|
NEG R0, R0 // caller expects negative errno value
|
||||||
|
noerr:
|
||||||
RET
|
RET
|
||||||
|
|
||||||
TEXT runtime·pipe_trampoline(SB),NOSPLIT,$0
|
TEXT runtime·pipe_trampoline(SB),NOSPLIT,$0
|
||||||
|
@ -104,7 +104,7 @@ TEXT runtime·read(SB),NOSPLIT,$-8
|
|||||||
MOVL $3, AX
|
MOVL $3, AX
|
||||||
SYSCALL
|
SYSCALL
|
||||||
JCC 2(PC)
|
JCC 2(PC)
|
||||||
MOVL $-1, AX
|
NEGL AX // caller expects negative errno
|
||||||
MOVL AX, ret+24(FP)
|
MOVL AX, ret+24(FP)
|
||||||
RET
|
RET
|
||||||
|
|
||||||
@ -130,7 +130,7 @@ TEXT runtime·write1(SB),NOSPLIT,$-8
|
|||||||
MOVL $4, AX
|
MOVL $4, AX
|
||||||
SYSCALL
|
SYSCALL
|
||||||
JCC 2(PC)
|
JCC 2(PC)
|
||||||
MOVL $-1, AX
|
NEGL AX // caller expects negative errno
|
||||||
MOVL AX, ret+24(FP)
|
MOVL AX, ret+24(FP)
|
||||||
RET
|
RET
|
||||||
|
|
||||||
|
@ -93,7 +93,7 @@ TEXT runtime·read(SB),NOSPLIT,$-4
|
|||||||
MOVL $3, AX
|
MOVL $3, AX
|
||||||
INT $0x80
|
INT $0x80
|
||||||
JAE 2(PC)
|
JAE 2(PC)
|
||||||
MOVL $-1, AX
|
NEGL AX // caller expects negative errno
|
||||||
MOVL AX, ret+12(FP)
|
MOVL AX, ret+12(FP)
|
||||||
RET
|
RET
|
||||||
|
|
||||||
@ -127,7 +127,7 @@ TEXT runtime·write1(SB),NOSPLIT,$-4
|
|||||||
MOVL $4, AX
|
MOVL $4, AX
|
||||||
INT $0x80
|
INT $0x80
|
||||||
JAE 2(PC)
|
JAE 2(PC)
|
||||||
MOVL $-1, AX
|
NEGL AX // caller expects negative errno
|
||||||
MOVL AX, ret+12(FP)
|
MOVL AX, ret+12(FP)
|
||||||
RET
|
RET
|
||||||
|
|
||||||
|
@ -93,7 +93,7 @@ TEXT runtime·read(SB),NOSPLIT,$-8
|
|||||||
MOVL $3, AX
|
MOVL $3, AX
|
||||||
SYSCALL
|
SYSCALL
|
||||||
JCC 2(PC)
|
JCC 2(PC)
|
||||||
MOVL $-1, AX
|
NEGQ AX // caller expects negative errno
|
||||||
MOVL AX, ret+24(FP)
|
MOVL AX, ret+24(FP)
|
||||||
RET
|
RET
|
||||||
|
|
||||||
@ -128,7 +128,7 @@ TEXT runtime·write1(SB),NOSPLIT,$-8
|
|||||||
MOVL $4, AX
|
MOVL $4, AX
|
||||||
SYSCALL
|
SYSCALL
|
||||||
JCC 2(PC)
|
JCC 2(PC)
|
||||||
MOVL $-1, AX
|
NEGQ AX // caller expects negative errno
|
||||||
MOVL AX, ret+24(FP)
|
MOVL AX, ret+24(FP)
|
||||||
RET
|
RET
|
||||||
|
|
||||||
|
@ -117,7 +117,7 @@ TEXT runtime·read(SB),NOSPLIT|NOFRAME,$0
|
|||||||
MOVW n+8(FP), R2 // arg 3 count
|
MOVW n+8(FP), R2 // arg 3 count
|
||||||
MOVW $SYS_read, R7
|
MOVW $SYS_read, R7
|
||||||
SWI $0
|
SWI $0
|
||||||
MOVW.CS $-1, R0
|
SUB.CS $0, R0, R0 // caller expects negative errno
|
||||||
MOVW R0, ret+12(FP)
|
MOVW R0, ret+12(FP)
|
||||||
RET
|
RET
|
||||||
|
|
||||||
@ -153,7 +153,7 @@ TEXT runtime·write1(SB),NOSPLIT|NOFRAME,$0
|
|||||||
MOVW n+8(FP), R2 // arg 3 count
|
MOVW n+8(FP), R2 // arg 3 count
|
||||||
MOVW $SYS_write, R7
|
MOVW $SYS_write, R7
|
||||||
SWI $0
|
SWI $0
|
||||||
MOVW.CS $-1, R0
|
SUB.CS $0, R0, R0 // caller expects negative errno
|
||||||
MOVW R0, ret+12(FP)
|
MOVW R0, ret+12(FP)
|
||||||
RET
|
RET
|
||||||
|
|
||||||
|
@ -115,9 +115,6 @@ TEXT runtime·write1(SB),NOSPLIT,$0
|
|||||||
MOVL p+4(FP), CX
|
MOVL p+4(FP), CX
|
||||||
MOVL n+8(FP), DX
|
MOVL n+8(FP), DX
|
||||||
INVOKE_SYSCALL
|
INVOKE_SYSCALL
|
||||||
CMPL AX, $0xfffff001
|
|
||||||
JLS 2(PC)
|
|
||||||
MOVL $-1, AX
|
|
||||||
MOVL AX, ret+12(FP)
|
MOVL AX, ret+12(FP)
|
||||||
RET
|
RET
|
||||||
|
|
||||||
@ -127,9 +124,6 @@ TEXT runtime·read(SB),NOSPLIT,$0
|
|||||||
MOVL p+4(FP), CX
|
MOVL p+4(FP), CX
|
||||||
MOVL n+8(FP), DX
|
MOVL n+8(FP), DX
|
||||||
INVOKE_SYSCALL
|
INVOKE_SYSCALL
|
||||||
CMPL AX, $0xfffff001
|
|
||||||
JLS 2(PC)
|
|
||||||
MOVL $-1, AX
|
|
||||||
MOVL AX, ret+12(FP)
|
MOVL AX, ret+12(FP)
|
||||||
RET
|
RET
|
||||||
|
|
||||||
|
@ -97,9 +97,6 @@ TEXT runtime·write1(SB),NOSPLIT,$0-28
|
|||||||
MOVL n+16(FP), DX
|
MOVL n+16(FP), DX
|
||||||
MOVL $SYS_write, AX
|
MOVL $SYS_write, AX
|
||||||
SYSCALL
|
SYSCALL
|
||||||
CMPQ AX, $0xfffffffffffff001
|
|
||||||
JLS 2(PC)
|
|
||||||
MOVL $-1, AX
|
|
||||||
MOVL AX, ret+24(FP)
|
MOVL AX, ret+24(FP)
|
||||||
RET
|
RET
|
||||||
|
|
||||||
@ -109,9 +106,6 @@ TEXT runtime·read(SB),NOSPLIT,$0-28
|
|||||||
MOVL n+16(FP), DX
|
MOVL n+16(FP), DX
|
||||||
MOVL $SYS_read, AX
|
MOVL $SYS_read, AX
|
||||||
SYSCALL
|
SYSCALL
|
||||||
CMPQ AX, $0xfffffffffffff001
|
|
||||||
JLS 2(PC)
|
|
||||||
MOVL $-1, AX
|
|
||||||
MOVL AX, ret+24(FP)
|
MOVL AX, ret+24(FP)
|
||||||
RET
|
RET
|
||||||
|
|
||||||
|
@ -83,9 +83,6 @@ TEXT runtime·write1(SB),NOSPLIT,$0
|
|||||||
MOVW n+8(FP), R2
|
MOVW n+8(FP), R2
|
||||||
MOVW $SYS_write, R7
|
MOVW $SYS_write, R7
|
||||||
SWI $0
|
SWI $0
|
||||||
MOVW $0xfffff001, R1
|
|
||||||
CMP R1, R0
|
|
||||||
MOVW.HI $-1, R0
|
|
||||||
MOVW R0, ret+12(FP)
|
MOVW R0, ret+12(FP)
|
||||||
RET
|
RET
|
||||||
|
|
||||||
@ -95,9 +92,6 @@ TEXT runtime·read(SB),NOSPLIT,$0
|
|||||||
MOVW n+8(FP), R2
|
MOVW n+8(FP), R2
|
||||||
MOVW $SYS_read, R7
|
MOVW $SYS_read, R7
|
||||||
SWI $0
|
SWI $0
|
||||||
MOVW $0xfffff001, R1
|
|
||||||
CMP R1, R0
|
|
||||||
MOVW.HI $-1, R0
|
|
||||||
MOVW R0, ret+12(FP)
|
MOVW R0, ret+12(FP)
|
||||||
RET
|
RET
|
||||||
|
|
||||||
|
@ -98,10 +98,6 @@ TEXT runtime·write1(SB),NOSPLIT|NOFRAME,$0-28
|
|||||||
MOVW n+16(FP), R2
|
MOVW n+16(FP), R2
|
||||||
MOVD $SYS_write, R8
|
MOVD $SYS_write, R8
|
||||||
SVC
|
SVC
|
||||||
CMN $4095, R0
|
|
||||||
BCC done
|
|
||||||
MOVW $-1, R0
|
|
||||||
done:
|
|
||||||
MOVW R0, ret+24(FP)
|
MOVW R0, ret+24(FP)
|
||||||
RET
|
RET
|
||||||
|
|
||||||
@ -111,10 +107,6 @@ TEXT runtime·read(SB),NOSPLIT|NOFRAME,$0-28
|
|||||||
MOVW n+16(FP), R2
|
MOVW n+16(FP), R2
|
||||||
MOVD $SYS_read, R8
|
MOVD $SYS_read, R8
|
||||||
SVC
|
SVC
|
||||||
CMN $4095, R0
|
|
||||||
BCC done
|
|
||||||
MOVW $-1, R0
|
|
||||||
done:
|
|
||||||
MOVW R0, ret+24(FP)
|
MOVW R0, ret+24(FP)
|
||||||
RET
|
RET
|
||||||
|
|
||||||
|
@ -96,7 +96,7 @@ TEXT runtime·write1(SB),NOSPLIT|NOFRAME,$0-28
|
|||||||
MOVV $SYS_write, R2
|
MOVV $SYS_write, R2
|
||||||
SYSCALL
|
SYSCALL
|
||||||
BEQ R7, 2(PC)
|
BEQ R7, 2(PC)
|
||||||
MOVW $-1, R2
|
SUBVU R2, R0, R2 // caller expects negative errno
|
||||||
MOVW R2, ret+24(FP)
|
MOVW R2, ret+24(FP)
|
||||||
RET
|
RET
|
||||||
|
|
||||||
@ -107,7 +107,7 @@ TEXT runtime·read(SB),NOSPLIT|NOFRAME,$0-28
|
|||||||
MOVV $SYS_read, R2
|
MOVV $SYS_read, R2
|
||||||
SYSCALL
|
SYSCALL
|
||||||
BEQ R7, 2(PC)
|
BEQ R7, 2(PC)
|
||||||
MOVW $-1, R2
|
SUBVU R2, R0, R2 // caller expects negative errno
|
||||||
MOVW R2, ret+24(FP)
|
MOVW R2, ret+24(FP)
|
||||||
RET
|
RET
|
||||||
|
|
||||||
|
@ -95,7 +95,7 @@ TEXT runtime·write1(SB),NOSPLIT,$0-16
|
|||||||
MOVW $SYS_write, R2
|
MOVW $SYS_write, R2
|
||||||
SYSCALL
|
SYSCALL
|
||||||
BEQ R7, 2(PC)
|
BEQ R7, 2(PC)
|
||||||
MOVW $-1, R2
|
SUBU R2, R0, R2 // caller expects negative errno
|
||||||
MOVW R2, ret+12(FP)
|
MOVW R2, ret+12(FP)
|
||||||
RET
|
RET
|
||||||
|
|
||||||
@ -106,7 +106,7 @@ TEXT runtime·read(SB),NOSPLIT,$0-16
|
|||||||
MOVW $SYS_read, R2
|
MOVW $SYS_read, R2
|
||||||
SYSCALL
|
SYSCALL
|
||||||
BEQ R7, 2(PC)
|
BEQ R7, 2(PC)
|
||||||
MOVW $-1, R2
|
SUBU R2, R0, R2 // caller expects negative errno
|
||||||
MOVW R2, ret+12(FP)
|
MOVW R2, ret+12(FP)
|
||||||
RET
|
RET
|
||||||
|
|
||||||
|
@ -88,7 +88,7 @@ TEXT runtime·write1(SB),NOSPLIT|NOFRAME,$0-28
|
|||||||
MOVW n+16(FP), R5
|
MOVW n+16(FP), R5
|
||||||
SYSCALL $SYS_write
|
SYSCALL $SYS_write
|
||||||
BVC 2(PC)
|
BVC 2(PC)
|
||||||
MOVW $-1, R3
|
NEG R3 // caller expects negative errno
|
||||||
MOVW R3, ret+24(FP)
|
MOVW R3, ret+24(FP)
|
||||||
RET
|
RET
|
||||||
|
|
||||||
@ -98,7 +98,7 @@ TEXT runtime·read(SB),NOSPLIT|NOFRAME,$0-28
|
|||||||
MOVW n+16(FP), R5
|
MOVW n+16(FP), R5
|
||||||
SYSCALL $SYS_read
|
SYSCALL $SYS_read
|
||||||
BVC 2(PC)
|
BVC 2(PC)
|
||||||
MOVW $-1, R3
|
NEG R3 // caller expects negative errno
|
||||||
MOVW R3, ret+24(FP)
|
MOVW R3, ret+24(FP)
|
||||||
RET
|
RET
|
||||||
|
|
||||||
|
@ -88,9 +88,6 @@ TEXT runtime·write1(SB),NOSPLIT|NOFRAME,$0-28
|
|||||||
MOVW n+16(FP), R4
|
MOVW n+16(FP), R4
|
||||||
MOVW $SYS_write, R1
|
MOVW $SYS_write, R1
|
||||||
SYSCALL
|
SYSCALL
|
||||||
MOVD $-4095, R3
|
|
||||||
CMPUBLT R2, R3, 2(PC)
|
|
||||||
MOVW $-1, R2
|
|
||||||
MOVW R2, ret+24(FP)
|
MOVW R2, ret+24(FP)
|
||||||
RET
|
RET
|
||||||
|
|
||||||
@ -100,9 +97,6 @@ TEXT runtime·read(SB),NOSPLIT|NOFRAME,$0-28
|
|||||||
MOVW n+16(FP), R4
|
MOVW n+16(FP), R4
|
||||||
MOVW $SYS_read, R1
|
MOVW $SYS_read, R1
|
||||||
SYSCALL
|
SYSCALL
|
||||||
MOVD $-4095, R3
|
|
||||||
CMPUBLT R2, R3, 2(PC)
|
|
||||||
MOVW $-1, R2
|
|
||||||
MOVW R2, ret+24(FP)
|
MOVW R2, ret+24(FP)
|
||||||
RET
|
RET
|
||||||
|
|
||||||
|
@ -83,7 +83,7 @@ TEXT runtime·read(SB),NOSPLIT,$-4
|
|||||||
MOVL $SYS_read, AX
|
MOVL $SYS_read, AX
|
||||||
INT $0x80
|
INT $0x80
|
||||||
JAE 2(PC)
|
JAE 2(PC)
|
||||||
MOVL $-1, AX
|
NEGL AX // caller expects negative errno
|
||||||
MOVL AX, ret+12(FP)
|
MOVL AX, ret+12(FP)
|
||||||
RET
|
RET
|
||||||
|
|
||||||
@ -117,7 +117,7 @@ TEXT runtime·write1(SB),NOSPLIT,$-4
|
|||||||
MOVL $SYS_write, AX
|
MOVL $SYS_write, AX
|
||||||
INT $0x80
|
INT $0x80
|
||||||
JAE 2(PC)
|
JAE 2(PC)
|
||||||
MOVL $-1, AX
|
NEGL AX // caller expects negative errno
|
||||||
MOVL AX, ret+12(FP)
|
MOVL AX, ret+12(FP)
|
||||||
RET
|
RET
|
||||||
|
|
||||||
|
@ -154,7 +154,7 @@ TEXT runtime·read(SB),NOSPLIT,$-8
|
|||||||
MOVL $SYS_read, AX
|
MOVL $SYS_read, AX
|
||||||
SYSCALL
|
SYSCALL
|
||||||
JCC 2(PC)
|
JCC 2(PC)
|
||||||
MOVL $-1, AX
|
NEGQ AX // caller expects negative errno
|
||||||
MOVL AX, ret+24(FP)
|
MOVL AX, ret+24(FP)
|
||||||
RET
|
RET
|
||||||
|
|
||||||
@ -189,7 +189,7 @@ TEXT runtime·write1(SB),NOSPLIT,$-8
|
|||||||
MOVL $SYS_write, AX
|
MOVL $SYS_write, AX
|
||||||
SYSCALL
|
SYSCALL
|
||||||
JCC 2(PC)
|
JCC 2(PC)
|
||||||
MOVL $-1, AX
|
NEGQ AX // caller expects negative errno
|
||||||
MOVL AX, ret+24(FP)
|
MOVL AX, ret+24(FP)
|
||||||
RET
|
RET
|
||||||
|
|
||||||
|
@ -92,7 +92,7 @@ TEXT runtime·read(SB),NOSPLIT|NOFRAME,$0
|
|||||||
MOVW p+4(FP), R1
|
MOVW p+4(FP), R1
|
||||||
MOVW n+8(FP), R2
|
MOVW n+8(FP), R2
|
||||||
SWI $SYS_read
|
SWI $SYS_read
|
||||||
MOVW.CS $-1, R0
|
SUB.CS $0, R0, R0 // caller expects negative errno
|
||||||
MOVW R0, ret+12(FP)
|
MOVW R0, ret+12(FP)
|
||||||
RET
|
RET
|
||||||
|
|
||||||
@ -125,7 +125,7 @@ TEXT runtime·write1(SB),NOSPLIT|NOFRAME,$0
|
|||||||
MOVW p+4(FP), R1 // arg 2 - buf
|
MOVW p+4(FP), R1 // arg 2 - buf
|
||||||
MOVW n+8(FP), R2 // arg 3 - nbyte
|
MOVW n+8(FP), R2 // arg 3 - nbyte
|
||||||
SWI $SYS_write
|
SWI $SYS_write
|
||||||
MOVW.CS $-1, R0
|
SUB.CS $0, R0, R0 // caller expects negative errno
|
||||||
MOVW R0, ret+12(FP)
|
MOVW R0, ret+12(FP)
|
||||||
RET
|
RET
|
||||||
|
|
||||||
|
@ -145,7 +145,7 @@ TEXT runtime·read(SB),NOSPLIT|NOFRAME,$0
|
|||||||
MOVW n+16(FP), R2 // arg 3 - count
|
MOVW n+16(FP), R2 // arg 3 - count
|
||||||
SVC $SYS_read
|
SVC $SYS_read
|
||||||
BCC ok
|
BCC ok
|
||||||
MOVW $-1, R0
|
NEG R0, R0
|
||||||
ok:
|
ok:
|
||||||
MOVW R0, ret+24(FP)
|
MOVW R0, ret+24(FP)
|
||||||
RET
|
RET
|
||||||
@ -183,7 +183,7 @@ TEXT runtime·write1(SB),NOSPLIT,$-8
|
|||||||
MOVW n+16(FP), R2 // arg 3 - nbyte
|
MOVW n+16(FP), R2 // arg 3 - nbyte
|
||||||
SVC $SYS_write
|
SVC $SYS_write
|
||||||
BCC ok
|
BCC ok
|
||||||
MOVW $-1, R0
|
NEG R0, R0
|
||||||
ok:
|
ok:
|
||||||
MOVW R0, ret+24(FP)
|
MOVW R0, ret+24(FP)
|
||||||
RET
|
RET
|
||||||
|
@ -46,7 +46,7 @@ TEXT runtime·read(SB),NOSPLIT,$-4
|
|||||||
MOVL $3, AX
|
MOVL $3, AX
|
||||||
INT $0x80
|
INT $0x80
|
||||||
JAE 2(PC)
|
JAE 2(PC)
|
||||||
MOVL $-1, AX
|
NEGL AX // caller expects negative errno
|
||||||
MOVL AX, ret+12(FP)
|
MOVL AX, ret+12(FP)
|
||||||
RET
|
RET
|
||||||
|
|
||||||
@ -74,7 +74,7 @@ TEXT runtime·write1(SB),NOSPLIT,$-4
|
|||||||
MOVL $4, AX // sys_write
|
MOVL $4, AX // sys_write
|
||||||
INT $0x80
|
INT $0x80
|
||||||
JAE 2(PC)
|
JAE 2(PC)
|
||||||
MOVL $-1, AX
|
NEGL AX // caller expects negative errno
|
||||||
MOVL AX, ret+12(FP)
|
MOVL AX, ret+12(FP)
|
||||||
RET
|
RET
|
||||||
|
|
||||||
|
@ -123,7 +123,7 @@ TEXT runtime·read(SB),NOSPLIT,$-8
|
|||||||
MOVL $3, AX
|
MOVL $3, AX
|
||||||
SYSCALL
|
SYSCALL
|
||||||
JCC 2(PC)
|
JCC 2(PC)
|
||||||
MOVL $-1, AX
|
NEGQ AX // caller expects negative errno
|
||||||
MOVL AX, ret+24(FP)
|
MOVL AX, ret+24(FP)
|
||||||
RET
|
RET
|
||||||
|
|
||||||
@ -151,7 +151,7 @@ TEXT runtime·write1(SB),NOSPLIT,$-8
|
|||||||
MOVL $4, AX // sys_write
|
MOVL $4, AX // sys_write
|
||||||
SYSCALL
|
SYSCALL
|
||||||
JCC 2(PC)
|
JCC 2(PC)
|
||||||
MOVL $-1, AX
|
NEGQ AX // caller expects negative errno
|
||||||
MOVL AX, ret+24(FP)
|
MOVL AX, ret+24(FP)
|
||||||
RET
|
RET
|
||||||
|
|
||||||
|
@ -55,7 +55,7 @@ TEXT runtime·read(SB),NOSPLIT|NOFRAME,$0
|
|||||||
MOVW n+8(FP), R2 // arg 3 - nbyte
|
MOVW n+8(FP), R2 // arg 3 - nbyte
|
||||||
MOVW $3, R12 // sys_read
|
MOVW $3, R12 // sys_read
|
||||||
SWI $0
|
SWI $0
|
||||||
MOVW.CS $-1, R0
|
SUB.CS $0, R0, R0 // caller expects negative errno
|
||||||
MOVW R0, ret+12(FP)
|
MOVW R0, ret+12(FP)
|
||||||
RET
|
RET
|
||||||
|
|
||||||
@ -82,7 +82,7 @@ TEXT runtime·write1(SB),NOSPLIT|NOFRAME,$0
|
|||||||
MOVW n+8(FP), R2 // arg 3 - nbyte
|
MOVW n+8(FP), R2 // arg 3 - nbyte
|
||||||
MOVW $4, R12 // sys_write
|
MOVW $4, R12 // sys_write
|
||||||
SWI $0
|
SWI $0
|
||||||
MOVW.CS $-1, R0
|
SUB.CS $0, R0, R0 // caller expects negative errno
|
||||||
MOVW R0, ret+12(FP)
|
MOVW R0, ret+12(FP)
|
||||||
RET
|
RET
|
||||||
|
|
||||||
|
@ -59,7 +59,7 @@ TEXT runtime·read(SB),NOSPLIT|NOFRAME,$0
|
|||||||
MOVD $3, R8 // sys_read
|
MOVD $3, R8 // sys_read
|
||||||
SVC
|
SVC
|
||||||
BCC 2(PC)
|
BCC 2(PC)
|
||||||
MOVW $-1, R0
|
NEG R0, R0
|
||||||
MOVW R0, ret+24(FP)
|
MOVW R0, ret+24(FP)
|
||||||
RET
|
RET
|
||||||
|
|
||||||
@ -92,7 +92,7 @@ TEXT runtime·write1(SB),NOSPLIT|NOFRAME,$0
|
|||||||
MOVD $4, R8 // sys_write
|
MOVD $4, R8 // sys_write
|
||||||
SVC
|
SVC
|
||||||
BCC 2(PC)
|
BCC 2(PC)
|
||||||
MOVW $-1, R0
|
NEG R0, R0
|
||||||
MOVW R0, ret+24(FP)
|
MOVW R0, ret+24(FP)
|
||||||
RET
|
RET
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user