diff options
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/net/fd.go | 2 | ||||
| -rw-r--r-- | src/lib/syscall/asm_amd64_darwin.s | 12 | ||||
| -rw-r--r-- | src/lib/syscall/asm_amd64_linux.s | 17 |
3 files changed, 25 insertions, 6 deletions
diff --git a/src/lib/net/fd.go b/src/lib/net/fd.go index 977df37a4..f9fba2bc0 100644 --- a/src/lib/net/fd.go +++ b/src/lib/net/fd.go @@ -248,9 +248,11 @@ func (fd *FD) Write(p *[]byte) (n int, err *os.Error) { if fd == nil || fd.osfd == nil { return -1, os.EINVAL } + // TODO(rsc): Lock fd while writing to avoid interlacing writes. err = nil; nn := 0; for nn < len(p) && err == nil { + // TODO(rsc): If os.FD.Write loops, have to use syscall instead. n, err = fd.osfd.Write(p[nn:len(p)]); for err == os.EAGAIN { pollserver.WaitWrite(fd); diff --git a/src/lib/syscall/asm_amd64_darwin.s b/src/lib/syscall/asm_amd64_darwin.s index 64b74db43..3cf6aad83 100644 --- a/src/lib/syscall/asm_amd64_darwin.s +++ b/src/lib/syscall/asm_amd64_darwin.s @@ -11,23 +11,28 @@ // Trap # in AX, args in DI SI DX, return in AX DX TEXT syscall·Syscall(SB),7,$0 + CALL sys·entersyscall(SB) MOVQ 16(SP), DI MOVQ 24(SP), SI MOVQ 32(SP), DX MOVQ 8(SP), AX // syscall entry ADDQ $0x2000000, AX SYSCALL - JCC 5(PC) + JCC ok MOVQ $-1, 40(SP) // r1 MOVQ $0, 48(SP) // r2 MOVQ AX, 56(SP) // errno + CALL sys·exitsyscall(SB) RET +ok: MOVQ AX, 40(SP) // r1 MOVQ DX, 48(SP) // r2 MOVQ $0, 56(SP) // errno + CALL sys·exitsyscall(SB) RET TEXT syscall·Syscall6(SB),7,$0 + CALL sys·entersyscall(SB) MOVQ 16(SP), DI MOVQ 24(SP), SI MOVQ 32(SP), DX @@ -37,12 +42,15 @@ TEXT syscall·Syscall6(SB),7,$0 MOVQ 8(SP), AX // syscall entry ADDQ $0x2000000, AX SYSCALL - JCC 5(PC) + JCC ok6 MOVQ $-1, 64(SP) // r1 MOVQ $0, 72(SP) // r2 MOVQ AX, 80(SP) // errno + CALL sys·exitsyscall(SB) RET +ok6: MOVQ AX, 64(SP) // r1 MOVQ DX, 72(SP) // r2 MOVQ $0, 80(SP) // errno + CALL sys·exitsyscall(SB) RET diff --git a/src/lib/syscall/asm_amd64_linux.s b/src/lib/syscall/asm_amd64_linux.s index 48630337a..e0c115387 100644 --- a/src/lib/syscall/asm_amd64_linux.s +++ b/src/lib/syscall/asm_amd64_linux.s @@ -11,25 +11,30 @@ // Note that this differs from "standard" ABI convention, which // would pass 4th arg in CX, not R10. -TEXT syscall·Syscall(SB),7,$-8 +TEXT syscall·Syscall(SB),7,$0 + CALL sys·entersyscall(SB) MOVQ 16(SP), DI MOVQ 24(SP), SI MOVQ 32(SP), DX MOVQ 8(SP), AX // syscall entry SYSCALL CMPQ AX, $0xfffffffffffff001 - JLS 6(PC) + JLS ok MOVQ $-1, 40(SP) // r1 MOVQ $0, 48(SP) // r2 NEGQ AX MOVQ AX, 56(SP) // errno + CALL sys·exitsyscall(SB) RET +ok: MOVQ AX, 40(SP) // r1 MOVQ DX, 48(SP) // r2 MOVQ $0, 56(SP) // errno + CALL sys·exitsyscall(SB) RET -TEXT syscall·Syscall6(SB),7,$-8 +TEXT syscall·Syscall6(SB),7,$0 + CALL sys·entersyscall(SB) MOVQ 16(SP), DI MOVQ 24(SP), SI MOVQ 32(SP), DX @@ -38,13 +43,17 @@ TEXT syscall·Syscall6(SB),7,$-8 MOVQ 56(SP), R9 MOVQ 8(SP), AX // syscall entry SYSCALL - JLS 6(PC) + CMPQ AX, $0xfffffffffffff001 + JLS ok6 MOVQ $-1, 64(SP) // r1 MOVQ $0, 72(SP) // r2 NEGQ AX MOVQ AX, 80(SP) // errno + CALL sys·exitsyscall(SB) RET +ok6: MOVQ AX, 64(SP) // r1 MOVQ DX, 72(SP) // r2 MOVQ $0, 80(SP) // errno + CALL sys·exitsyscall(SB) RET |
