summaryrefslogtreecommitdiff
path: root/src/pkg/syscall/asm_linux_arm.s
diff options
context:
space:
mode:
authorOndřej Surý <ondrej@sury.org>2011-01-17 12:40:45 +0100
committerOndřej Surý <ondrej@sury.org>2011-01-17 12:40:45 +0100
commit3e45412327a2654a77944249962b3652e6142299 (patch)
treebc3bf69452afa055423cbe0c5cfa8ca357df6ccf /src/pkg/syscall/asm_linux_arm.s
parentc533680039762cacbc37db8dc7eed074c3e497be (diff)
downloadgolang-upstream/2011.01.12.tar.gz
Imported Upstream version 2011.01.12upstream/2011.01.12
Diffstat (limited to 'src/pkg/syscall/asm_linux_arm.s')
-rw-r--r--src/pkg/syscall/asm_linux_arm.s78
1 files changed, 73 insertions, 5 deletions
diff --git a/src/pkg/syscall/asm_linux_arm.s b/src/pkg/syscall/asm_linux_arm.s
index 830d41c78..04dbdb624 100644
--- a/src/pkg/syscall/asm_linux_arm.s
+++ b/src/pkg/syscall/asm_linux_arm.s
@@ -17,9 +17,21 @@ TEXT ·Syscall(SB),7,$0
MOVW 12(SP), R1
MOVW 16(SP), R2
SWI $0
- MOVW R0, 20(SP) // r1
- MOVW R1, 24(SP) // r2
+ MOVW $0xfffff001, R1
+ CMP R1, R0
+ BLS ok
+ MOVW $-1, R1
+ MOVW R1, 20(SP) // r1
+ MOVW $0, R2
+ MOVW R2, 24(SP) // r2
+ RSB $0, R0, R0
+ MOVW R0, 28(SP) // errno
+ BL runtime·exitsyscall(SB)
+ RET
+ok:
+ MOVW R0, 20(SP) // r1
MOVW $0, R0
+ MOVW R0, 24(SP) // r2
MOVW R0, 28(SP) // errno
BL runtime·exitsyscall(SB)
RET
@@ -36,13 +48,57 @@ TEXT ·Syscall6(SB),7,$0
MOVW 24(SP), R4
MOVW 28(SP), R5
SWI $0
- MOVW R0, 32(SP) // r1
+ MOVW $0xfffff001, R6
+ CMP R6, R0
+ BLS ok6
+ MOVW $-1, R1
+ MOVW R1, 32(SP) // r1
+ MOVW $0, R2
+ MOVW R2, 36(SP) // r2
+ RSB $0, R0, R0
+ MOVW R0, 40(SP) // errno
+ BL runtime·exitsyscall(SB)
+ RET
+ok6:
+ MOVW R0, 32(SP) // r1
MOVW R1, 36(SP) // r2
MOVW $0, R0
MOVW R0, 40(SP) // errno
BL runtime·exitsyscall(SB)
RET
+#define SYS__LLSEEK 140 /* from zsysnum_linux_arm.go */
+// func Seek(fd int, offset int64, whence int) (newoffset int64, errno int)
+// Implemented in assembly to avoid allocation when
+// taking the address of the return value newoffset.
+// Underlying system call is
+// llseek(int fd, int offhi, int offlo, int64 *result, int whence)
+TEXT ·Seek(SB),7,$0
+ BL runtime·entersyscall(SB)
+ MOVW $SYS__LLSEEK, R7 // syscall entry
+ MOVW 4(SP), R0 // fd
+ MOVW 12(SP), R1 // offset-high
+ MOVW 8(SP), R2 // offset-low
+ MOVW $20(SP), R3
+ MOVW 16(SP), R4 // whence
+ SWI $0
+ MOVW $0xfffff001, R6
+ CMP R6, R0
+ BLS okseek
+ MOVW $0, R1
+ MOVW R1, 20(SP)
+ MOVW R1, 24(SP)
+ RSB $0, R0, R0
+ MOVW R0, 28(SP) // errno
+ BL runtime·exitsyscall(SB)
+ RET
+okseek:
+ // system call filled in newoffset already
+ MOVW $0, R0
+ MOVW R0, 28(SP) // errno
+ BL runtime·exitsyscall(SB)
+ RET
+
// func RawSyscall(trap uintptr, a1, a2, a3 uintptr) (r1, r2, err uintptr);
TEXT ·RawSyscall(SB),7,$0
MOVW 4(SP), R7 // syscall entry
@@ -50,8 +106,20 @@ TEXT ·RawSyscall(SB),7,$0
MOVW 12(SP), R1
MOVW 16(SP), R2
SWI $0
- MOVW R0, 20(SP) // r1
- MOVW R1, 24(SP) // r2
+ MOVW $0xfffff001, R1
+ CMP R1, R0
+ BLS ok1
+ MOVW $-1, R1
+ MOVW R1, 20(SP) // r1
+ MOVW $0, R2
+ MOVW R2, 24(SP) // r2
+ RSB $0, R0, R0
+ MOVW R0, 28(SP) // errno
+ RET
+ok1:
+ MOVW R0, 20(SP) // r1
MOVW $0, R0
+ MOVW R0, 24(SP) // r2
MOVW R0, 28(SP) // errno
RET
+