summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/net/fd.go2
-rw-r--r--src/lib/syscall/asm_amd64_darwin.s12
-rw-r--r--src/lib/syscall/asm_amd64_linux.s17
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