summaryrefslogtreecommitdiffstats
path: root/src/syscall/asm_plan9_arm.s
blob: d193614affba03b0abe4a339bff55f0a976110b9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

#include "textflag.h"
#include "funcdata.h"

#define SYS_ERRSTR 41	/* from zsysnum_plan9.go */
#define SYS_SEEK 39	/* from zsysnum_plan9.go */

// System call support for plan9 on arm

//func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err ErrorString)
TEXT	·Syscall(SB),NOSPLIT,$144-32
	NO_LOCAL_POINTERS
	BL		runtime·entersyscall(SB)
	MOVW	$a1+4(FP), R0	// move syscall args
	MOVW	$sysargs-144(SP), R1
	MOVM.IA	(R0), [R2-R4]
	MOVM.IA	[R2-R4], (R1)
	MOVW	trap+0(FP), R0	// syscall num
	SWI		$0
	MOVW	$0, R2
	MOVW	$r1+16(FP), R3
	MOVM.IA	[R0,R2], (R3)
	CMP		$-1, R0
	B.EQ	syscallerr
	BL		runtime·exitsyscall(SB)
	MOVW	$·emptystring+0(SB), R2
	B		syscallok
syscallerr:
	MOVW	$errbuf-128(SP), R2
	MOVW	$128, R3
	MOVM.IA	[R2,R3], (R1)
	MOVW	$SYS_ERRSTR, R0
	SWI		$0
	BL		runtime·exitsyscall(SB)
	BL		runtime·gostring(SB)
	MOVW	$str-140(SP), R2
syscallok:
	MOVW	$err+24(FP), R1
	MOVM.IA	(R2), [R3-R4]
	MOVM.IA	[R3-R4], (R1)
	RET


//func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err ErrorString)
// Actually Syscall5 but the rest of the code expects it to be named Syscall6.
TEXT	·Syscall6(SB),NOSPLIT,$144-44
	NO_LOCAL_POINTERS
	BL		runtime·entersyscall(SB)
	MOVW	$a1+4(FP), R0	// move syscall args
	MOVW	$sysargs-144(SP), R1
	MOVM.IA	(R0), [R2-R6]
	MOVM.IA	[R2-R6], (R1)
	MOVW	trap+0(FP), R0	// syscall num
	SWI		$0
	MOVW	$0, R2
	MOVW	$r1+28(FP), R3
	MOVM.IA.W	[R0,R2], (R3)
	CMP		$-1, R0
	B.EQ	syscall6err
	BL		runtime·exitsyscall(SB)
	MOVW	$·emptystring+0(SB), R2
	B		syscall6ok
syscall6err:
	MOVW	$errbuf-128(SP), R2
	MOVW	$128, R3
	MOVM.IA	[R2,R3], (R1)
	MOVW	$SYS_ERRSTR, R0
	SWI		$0
	BL		runtime·exitsyscall(SB)
	BL		runtime·gostring(SB)
	MOVW	$str-140(SP), R2
syscall6ok:
	MOVW	$err+36(FP), R1
	MOVM.IA	(R2), [R3-R4]
	MOVM.IA	[R3-R4], (R1)
	RET

//func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr)
TEXT ·RawSyscall(SB),NOSPLIT,$12-28
	MOVW	$a1+4(FP), R0	// move syscall args
	MOVW	$sysargs-12(SP), R1
	MOVM.IA	(R0), [R2-R4]
	MOVM.IA	[R2-R4], (R1)
	MOVW	trap+0(FP), R0	// syscall num
	SWI		$0
	MOVW	R0, r1+16(FP)
	MOVW	R0, r2+20(FP)
	MOVW	R0, err+24(FP)
	RET

//func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr)
// Actually RawSyscall5 but the rest of the code expects it to be named RawSyscall6.
TEXT	·RawSyscall6(SB),NOSPLIT,$20-40
	MOVW	$a1+4(FP), R0	// move syscall args
	MOVW	$sysargs-20(SP), R1
	MOVM.IA	(R0), [R2-R6]
	MOVM.IA	[R2-R6], (R1)
	MOVW	trap+0(FP), R0	// syscall num
	SWI		$0
	MOVW	R0, r1+28(FP)
	MOVW	R0, r2+32(FP)
	MOVW	R0, err+36(FP)
	RET

//func seek(placeholder uintptr, fd int, offset int64, whence int) (newoffset int64, err string)
TEXT ·seek(SB),NOSPLIT,$20-36
	NO_LOCAL_POINTERS
	MOVW	$newoffset_lo+20(FP), R6
	MOVW	R6, sysargs-20(SP)	// dest for return value
	MOVW	$fd+4(FP), R0		// move syscall args
	MOVW	$sysarg1-16(SP), R1
	MOVM.IA	(R0), [R2-R5]
	MOVM.IA	[R2-R5], (R1)
	MOVW	$SYS_SEEK, R0		// syscall num
	SWI		$0
	CMP		$-1, R0
	B.EQ	seekerr
	MOVW	$·emptystring+0(SB), R2
	B		seekok
seekerr:
	MOVW	R0, 0(R6)
	MOVW	R0, 4(R6)
	BL		·errstr(SB)
	MOVW	$ret-20(SP), R2
seekok:
	MOVW	$err+28(FP), R1
	MOVM.IA	(R2), [R3-R4]
	MOVM.IA	[R3-R4], (R1)
	RET