blob: 997ba6f1c1e74f59c2e8447c1fb8c45a732c847d [file] [log] [blame]
Kai Backmanee311572009-08-28 07:23:24 -07001// Copyright 2009 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
Rob Pike8bca1482014-08-12 17:04:45 -07005#include "textflag.h"
Russ Cox860a6452014-09-12 00:55:24 -04006#include "funcdata.h"
Keith Randalldb324cc2013-08-12 10:24:30 -07007
Kai Backmane5c884f2009-10-01 06:55:01 -07008//
9// System calls for arm, Linux
10//
11
Kai Backmane5c884f2009-10-01 06:55:01 -070012// TODO(kaib): handle error returns
13
14// func Syscall(syscall uintptr, a1, a2, a3 uintptr) (r1, r2, err uintptr);
15
Keith Randalldb324cc2013-08-12 10:24:30 -070016TEXT ·Syscall(SB),NOSPLIT,$0-28
Russ Cox22a5c782009-10-15 23:10:49 -070017 BL runtime·entersyscall(SB)
David Crawshawe10e9132015-01-14 14:36:17 -050018 MOVW trap+0(FP), R7
19 MOVW a1+4(FP), R0
20 MOVW a2+8(FP), R1
21 MOVW a3+12(FP), R2
Russ Cox83824632014-09-04 23:12:10 -040022 MOVW $0, R3
23 MOVW $0, R4
24 MOVW $0, R5
Kai Backman6f91ba12009-10-25 11:51:16 -070025 SWI $0
Kai Backmandf88fc62010-08-06 16:57:49 -070026 MOVW $0xfffff001, R1
27 CMP R1, R0
28 BLS ok
29 MOVW $-1, R1
David Crawshawe10e9132015-01-14 14:36:17 -050030 MOVW R1, r1+16(FP)
Kai Backmandf88fc62010-08-06 16:57:49 -070031 MOVW $0, R2
David Crawshawe10e9132015-01-14 14:36:17 -050032 MOVW R2, r2+20(FP)
Kai Backmandf88fc62010-08-06 16:57:49 -070033 RSB $0, R0, R0
David Crawshawe10e9132015-01-14 14:36:17 -050034 MOVW R0, err+24(FP)
Kai Backmandf88fc62010-08-06 16:57:49 -070035 BL runtime·exitsyscall(SB)
36 RET
37ok:
David Crawshawe10e9132015-01-14 14:36:17 -050038 MOVW R0, r1+16(FP)
Kai Backman98fff8f2009-10-08 22:16:08 -070039 MOVW $0, R0
David Crawshawe10e9132015-01-14 14:36:17 -050040 MOVW R0, r2+20(FP)
41 MOVW R0, err+24(FP)
Russ Cox22a5c782009-10-15 23:10:49 -070042 BL runtime·exitsyscall(SB)
Kai Backmane5c884f2009-10-01 06:55:01 -070043 RET
44
45// func Syscall6(trap uintptr, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr);
46// Actually Syscall5 but the rest of the code expects it to be named Syscall6.
Keith Randalldb324cc2013-08-12 10:24:30 -070047TEXT ·Syscall6(SB),NOSPLIT,$0-40
Russ Cox22a5c782009-10-15 23:10:49 -070048 BL runtime·entersyscall(SB)
David Crawshawe10e9132015-01-14 14:36:17 -050049 MOVW trap+0(FP), R7 // syscall entry
50 MOVW a1+4(FP), R0
51 MOVW a2+8(FP), R1
52 MOVW a3+12(FP), R2
53 MOVW a4+16(FP), R3
54 MOVW a5+20(FP), R4
55 MOVW a6+24(FP), R5
Kai Backman6f91ba12009-10-25 11:51:16 -070056 SWI $0
Russ Cox1142b602010-10-20 10:39:46 -040057 MOVW $0xfffff001, R6
58 CMP R6, R0
Kai Backmandf88fc62010-08-06 16:57:49 -070059 BLS ok6
60 MOVW $-1, R1
David Crawshawe10e9132015-01-14 14:36:17 -050061 MOVW R1, r1+28(FP)
Kai Backmandf88fc62010-08-06 16:57:49 -070062 MOVW $0, R2
David Crawshawe10e9132015-01-14 14:36:17 -050063 MOVW R2, r2+32(FP)
Kai Backmandf88fc62010-08-06 16:57:49 -070064 RSB $0, R0, R0
David Crawshawe10e9132015-01-14 14:36:17 -050065 MOVW R0, err+36(FP)
Kai Backmandf88fc62010-08-06 16:57:49 -070066 BL runtime·exitsyscall(SB)
67 RET
68ok6:
David Crawshawe10e9132015-01-14 14:36:17 -050069 MOVW R0, r1+28(FP)
70 MOVW R1, r2+32(FP)
Kai Backman98fff8f2009-10-08 22:16:08 -070071 MOVW $0, R0
David Crawshawe10e9132015-01-14 14:36:17 -050072 MOVW R0, err+36(FP)
Russ Cox22a5c782009-10-15 23:10:49 -070073 BL runtime·exitsyscall(SB)
Kai Backmane5c884f2009-10-01 06:55:01 -070074 RET
75
Ian Lance Taylor4fd41e42011-03-16 19:03:01 -070076// func RawSyscall6(trap uintptr, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr);
77// Actually RawSyscall5 but the rest of the code expects it to be named RawSyscall6.
Keith Randalldb324cc2013-08-12 10:24:30 -070078TEXT ·RawSyscall6(SB),NOSPLIT,$0-40
David Crawshawe10e9132015-01-14 14:36:17 -050079 MOVW trap+0(FP), R7 // syscall entry
80 MOVW a1+4(FP), R0
81 MOVW a2+8(FP), R1
82 MOVW a3+12(FP), R2
83 MOVW a4+16(FP), R3
84 MOVW a5+20(FP), R4
85 MOVW a6+24(FP), R5
Ian Lance Taylor4fd41e42011-03-16 19:03:01 -070086 SWI $0
87 MOVW $0xfffff001, R6
88 CMP R6, R0
89 BLS ok2
90 MOVW $-1, R1
David Crawshawe10e9132015-01-14 14:36:17 -050091 MOVW R1, r1+28(FP)
Ian Lance Taylor4fd41e42011-03-16 19:03:01 -070092 MOVW $0, R2
David Crawshawe10e9132015-01-14 14:36:17 -050093 MOVW R2, r2+32(FP)
Ian Lance Taylor4fd41e42011-03-16 19:03:01 -070094 RSB $0, R0, R0
David Crawshawe10e9132015-01-14 14:36:17 -050095 MOVW R0, err+36(FP)
Ian Lance Taylor4fd41e42011-03-16 19:03:01 -070096 RET
97ok2:
David Crawshawe10e9132015-01-14 14:36:17 -050098 MOVW R0, r1+28(FP)
99 MOVW R1, r2+32(FP)
Ian Lance Taylor4fd41e42011-03-16 19:03:01 -0700100 MOVW $0, R0
David Crawshawe10e9132015-01-14 14:36:17 -0500101 MOVW R0, err+36(FP)
Ian Lance Taylor4fd41e42011-03-16 19:03:01 -0700102 RET
103
Russ Cox1142b602010-10-20 10:39:46 -0400104#define SYS__LLSEEK 140 /* from zsysnum_linux_arm.go */
Russ Coxbf68f662014-05-16 12:15:32 -0400105// func seek(fd int, offset int64, whence int) (newoffset int64, errno int)
Russ Cox1142b602010-10-20 10:39:46 -0400106// Implemented in assembly to avoid allocation when
107// taking the address of the return value newoffset.
108// Underlying system call is
109// llseek(int fd, int offhi, int offlo, int64 *result, int whence)
David Crawshaw094a0542015-01-14 10:20:58 -0500110TEXT ·seek(SB),NOSPLIT,$0-28
Russ Cox1142b602010-10-20 10:39:46 -0400111 BL runtime·entersyscall(SB)
112 MOVW $SYS__LLSEEK, R7 // syscall entry
David Crawshawe10e9132015-01-14 14:36:17 -0500113 MOVW fd+0(FP), R0
114 MOVW offset_hi+8(FP), R1
115 MOVW offset_lo+4(FP), R2
116 MOVW $newoffset_lo+16(FP), R3
117 MOVW whence+12(FP), R4
Russ Cox1142b602010-10-20 10:39:46 -0400118 SWI $0
119 MOVW $0xfffff001, R6
120 CMP R6, R0
121 BLS okseek
122 MOVW $0, R1
David Crawshawe10e9132015-01-14 14:36:17 -0500123 MOVW R1, newoffset_lo+16(FP)
124 MOVW R1, newoffset_hi+20(FP)
Russ Cox1142b602010-10-20 10:39:46 -0400125 RSB $0, R0, R0
David Crawshawe10e9132015-01-14 14:36:17 -0500126 MOVW R0, err+24(FP)
Russ Cox1142b602010-10-20 10:39:46 -0400127 BL runtime·exitsyscall(SB)
128 RET
129okseek:
130 // system call filled in newoffset already
131 MOVW $0, R0
David Crawshawe10e9132015-01-14 14:36:17 -0500132 MOVW R0, err+24(FP)
Russ Cox1142b602010-10-20 10:39:46 -0400133 BL runtime·exitsyscall(SB)
134 RET
135
Kai Backmane5c884f2009-10-01 06:55:01 -0700136// func RawSyscall(trap uintptr, a1, a2, a3 uintptr) (r1, r2, err uintptr);
Keith Randalldb324cc2013-08-12 10:24:30 -0700137TEXT ·RawSyscall(SB),NOSPLIT,$0-28
David Crawshawe10e9132015-01-14 14:36:17 -0500138 MOVW trap+0(FP), R7 // syscall entry
139 MOVW a1+4(FP), R0
140 MOVW a2+8(FP), R1
141 MOVW a3+12(FP), R2
Kai Backman6f91ba12009-10-25 11:51:16 -0700142 SWI $0
Kai Backmandf88fc62010-08-06 16:57:49 -0700143 MOVW $0xfffff001, R1
144 CMP R1, R0
145 BLS ok1
146 MOVW $-1, R1
David Crawshawe10e9132015-01-14 14:36:17 -0500147 MOVW R1, r1+16(FP)
Kai Backmandf88fc62010-08-06 16:57:49 -0700148 MOVW $0, R2
David Crawshawe10e9132015-01-14 14:36:17 -0500149 MOVW R2, r2+20(FP)
Kai Backmandf88fc62010-08-06 16:57:49 -0700150 RSB $0, R0, R0
David Crawshawe10e9132015-01-14 14:36:17 -0500151 MOVW R0, err+24(FP)
Kai Backmandf88fc62010-08-06 16:57:49 -0700152 RET
153ok1:
David Crawshawe10e9132015-01-14 14:36:17 -0500154 MOVW R0, r1+16(FP)
Kai Backman98fff8f2009-10-08 22:16:08 -0700155 MOVW $0, R0
David Crawshawe10e9132015-01-14 14:36:17 -0500156 MOVW R0, r2+20(FP)
157 MOVW R0, err+24(FP)
Kai Backmane5c884f2009-10-01 06:55:01 -0700158 RET
Russ Cox1142b602010-10-20 10:39:46 -0400159