1// 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
5#include "textflag.h"
6#include "funcdata.h"
7
8#define SYS_ERRSTR 41	/* from zsysnum_plan9.go */
9#define SYS_SEEK 39	/* from zsysnum_plan9.go */
10
11// System call support for plan9 on arm
12
13//func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err ErrorString)
14TEXT	·Syscall(SB),NOSPLIT,$144-32
15	NO_LOCAL_POINTERS
16	BL		runtime·entersyscall(SB)
17	MOVW	$a1+4(FP), R0	// move syscall args
18	MOVW	$sysargs-144(SP), R1
19	MOVM.IA	(R0), [R2-R4]
20	MOVM.IA	[R2-R4], (R1)
21	MOVW	trap+0(FP), R0	// syscall num
22	SWI		$0
23	MOVW	$0, R2
24	MOVW	$r1+16(FP), R3
25	MOVM.IA	[R0,R2], (R3)
26	CMP		$-1, R0
27	B.EQ	syscallerr
28	BL		runtime·exitsyscall(SB)
29	MOVWemptystring+0(SB), R2
30	B		syscallok
31syscallerr:
32	MOVW	$errbuf-128(SP), R2
33	MOVW	$128, R3
34	MOVM.IA	[R2,R3], (R1)
35	MOVW	$SYS_ERRSTR, R0
36	SWI		$0
37	BL		runtime·exitsyscall(SB)
38	BL		runtime·gostring(SB)
39	MOVW	$str-140(SP), R2
40syscallok:
41	MOVW	$err+24(FP), R1
42	MOVM.IA	(R2), [R3-R4]
43	MOVM.IA	[R3-R4], (R1)
44	RET
45
46
47//func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err ErrorString)
48// Actually Syscall5 but the rest of the code expects it to be named Syscall6.
49TEXT	·Syscall6(SB),NOSPLIT,$144-44
50	NO_LOCAL_POINTERS
51	BL		runtime·entersyscall(SB)
52	MOVW	$a1+4(FP), R0	// move syscall args
53	MOVW	$sysargs-144(SP), R1
54	MOVM.IA	(R0), [R2-R6]
55	MOVM.IA	[R2-R6], (R1)
56	MOVW	trap+0(FP), R0	// syscall num
57	SWI		$0
58	MOVW	$0, R2
59	MOVW	$r1+28(FP), R3
60	MOVM.IA.W	[R0,R2], (R3)
61	CMP		$-1, R0
62	B.EQ	syscall6err
63	BL		runtime·exitsyscall(SB)
64	MOVWemptystring+0(SB), R2
65	B		syscall6ok
66syscall6err:
67	MOVW	$errbuf-128(SP), R2
68	MOVW	$128, R3
69	MOVM.IA	[R2,R3], (R1)
70	MOVW	$SYS_ERRSTR, R0
71	SWI		$0
72	BL		runtime·exitsyscall(SB)
73	BL		runtime·gostring(SB)
74	MOVW	$str-140(SP), R2
75syscall6ok:
76	MOVW	$err+36(FP), R1
77	MOVM.IA	(R2), [R3-R4]
78	MOVM.IA	[R3-R4], (R1)
79	RET
80
81//func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr)
82TEXT ·RawSyscall(SB),NOSPLIT,$12-28
83	MOVW	$a1+4(FP), R0	// move syscall args
84	MOVW	$sysargs-12(SP), R1
85	MOVM.IA	(R0), [R2-R4]
86	MOVM.IA	[R2-R4], (R1)
87	MOVW	trap+0(FP), R0	// syscall num
88	SWI		$0
89	MOVW	R0, r1+16(FP)
90	MOVW	R0, r2+20(FP)
91	MOVW	R0, err+24(FP)
92	RET
93
94//func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr)
95// Actually RawSyscall5 but the rest of the code expects it to be named RawSyscall6.
96TEXT	·RawSyscall6(SB),NOSPLIT,$20-40
97	MOVW	$a1+4(FP), R0	// move syscall args
98	MOVW	$sysargs-20(SP), R1
99	MOVM.IA	(R0), [R2-R6]
100	MOVM.IA	[R2-R6], (R1)
101	MOVW	trap+0(FP), R0	// syscall num
102	SWI		$0
103	MOVW	R0, r1+28(FP)
104	MOVW	R0, r2+32(FP)
105	MOVW	R0, err+36(FP)
106	RET
107
108//func seek(placeholder uintptr, fd int, offset int64, whence int) (newoffset int64, err string)
109TEXT ·seek(SB),NOSPLIT,$20-36
110	NO_LOCAL_POINTERS
111	MOVW	$newoffset_lo+20(FP), R6
112	MOVW	R6, sysargs-20(SP)	// dest for return value
113	MOVW	$fd+4(FP), R0		// move syscall args
114	MOVW	$sysarg1-16(SP), R1
115	MOVM.IA	(R0), [R2-R5]
116	MOVM.IA	[R2-R5], (R1)
117	MOVW	$SYS_SEEK, R0		// syscall num
118	SWI		$0
119	CMP		$-1, R0
120	B.EQ	seekerr
121	MOVWemptystring+0(SB), R2
122	B		seekok
123seekerr:
124	MOVW	R0, 0(R6)
125	MOVW	R0, 4(R6)
126	BL		·errstr(SB)
127	MOVW	$ret-20(SP), R2
128seekok:
129	MOVW	$err+28(FP), R1
130	MOVM.IA	(R2), [R3-R4]
131	MOVM.IA	[R3-R4], (R1)
132	RET
133