summaryrefslogtreecommitdiffstats
path: root/src/syscall/asm_openbsd_arm.s
blob: 26fd791fdad692954b17814a709cbc5b3c8dd9bc (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
133
134
135
136
137
138
139
// Copyright 2013 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"

//
// System call support for ARM, OpenBSD
//

// func Syscall(trap int32, a1, a2, a3 int32) (r1, r2, err int32);
// func Syscall6(trap int32, a1, a2, a3, a4, a5, a6 int32) (r1, r2, err int32);
// func Syscall9(trap int32, a1, a2, a3, a4, a5, a6, a7, a8, a9 int64) (r1, r2, err int32)
// func RawSyscall(trap int32, a1, a2, a3 int32) (r1, r2, err int32);
// func RawSyscall6(trap int32, a1, a2, a3, a4, a5, a6 int32) (r1, r2, err int32);

// See comment in runtime/sys_openbsd_arm.s re this construction.
#define NOOP	MOVW    R0, R0
#define	INVOKE_SYSCALL	\
	SWI	$0;	\
	NOOP;		\
	NOOP

TEXT	·Syscall(SB),NOSPLIT,$0-28
	BL runtime·entersyscall(SB)
	MOVW trap+0(FP), R12		// syscall number
	MOVW a1+4(FP), R0		// arg 1
	MOVW a2+8(FP), R1		// arg 2
	MOVW a3+12(FP), R2		// arg 3
	INVOKE_SYSCALL
	MOVW $0, R2
	BCS error
	MOVW R0, r1+16(FP)		// ret 1
	MOVW R1, r2+20(FP)		// ret 2
	MOVW R2, err+24(FP)		// err
	BL runtime·exitsyscall(SB)
	RET
error:
	MOVW $-1, R3
	MOVW R3, r1+16(FP)		// ret 1
	MOVW R2, r2+20(FP)		// ret 2
	MOVW R0, err+24(FP)		// err
	BL runtime·exitsyscall(SB)
	RET

TEXT	·Syscall6(SB),NOSPLIT,$0-40
	BL runtime·entersyscall(SB)
	MOVW trap+0(FP), R12		// syscall number
	MOVW a1+4(FP), R0		// arg 1
	MOVW a2+8(FP), R1		// arg 2
	MOVW a3+12(FP), R2		// arg 3
	MOVW a4+16(FP), R3		// arg 4
	MOVW R13, R4
	MOVW $a5+20(FP), R13		// arg 5 to arg 6 are passed on stack
	INVOKE_SYSCALL
	MOVW R4, R13
	MOVW $0, R2
	BCS error6
	MOVW R0, r1+28(FP)		// ret 1
	MOVW R1, r2+32(FP)		// ret 2
	MOVW R2, err+36(FP)		// err
	BL runtime·exitsyscall(SB)
	RET
error6:
	MOVW $-1, R3
	MOVW R3, r1+28(FP)		// ret 1
	MOVW R2, r2+32(FP)		// ret 2
	MOVW R0, err+36(FP)		// err
	BL runtime·exitsyscall(SB)
	RET

TEXT	·Syscall9(SB),NOSPLIT,$0-52
	BL runtime·entersyscall(SB)
	MOVW num+0(FP), R12		// syscall number
	MOVW a1+4(FP), R0		// arg 1
	MOVW a2+8(FP), R1		// arg 2
	MOVW a3+12(FP), R2		// arg 3
	MOVW a4+16(FP), R3		// arg 4
	MOVW R13, R4
	MOVW $a5+20(FP), R13		// arg 5 to arg 9 are passed on stack
	INVOKE_SYSCALL
	MOVW R4, R13
	MOVW $0, R2
	BCS error9
	MOVW R0, r1+40(FP)		// ret 1
	MOVW R1, r2+44(FP)		// ret 2
	MOVW R2, err+48(FP)		// err
	BL runtime·exitsyscall(SB)
	RET
error9:
	MOVW $-1, R3
	MOVW R3, r1+40(FP)		// ret 1
	MOVW R2, r2+44(FP)		// ret 2
	MOVW R0, err+48(FP)		// err
	BL runtime·exitsyscall(SB)
	RET

TEXT	·RawSyscall(SB),NOSPLIT,$0-28
	MOVW trap+0(FP), R12		// syscall number
	MOVW a1+4(FP), R0		// arg 1
	MOVW a2+8(FP), R1		// arg 2
	MOVW a3+12(FP), R2		// arg 3
	INVOKE_SYSCALL
	MOVW $0, R2
	BCS errorr
	MOVW R0, r1+16(FP)		// ret 1
	MOVW R1, r2+20(FP)		// ret 2
	MOVW R2, err+24(FP)		// err
	RET
errorr:
	MOVW $-1, R3
	MOVW R3, r1+16(FP)		// ret 1
	MOVW R2, r2+20(FP)		// ret 2
	MOVW R0, err+24(FP)		// err
	RET

TEXT	·RawSyscall6(SB),NOSPLIT,$0-40
	MOVW trap+0(FP), R12		// syscall number
	MOVW a1+4(FP), R0		// arg 1
	MOVW a2+8(FP), R1		// arg 2
	MOVW a3+12(FP), R2		// arg 3
	MOVW a4+16(FP), R3		// arg 4
	MOVW R13, R4
	MOVW $a5+20(FP), R13		// arg 5 to arg 6 are passed on stack
	INVOKE_SYSCALL
	MOVW R4, R13
	MOVW $0, R2
	BCS errorr6
	MOVW R0, r1+28(FP)		// ret 1
	MOVW R1, r2+32(FP)		// ret 2
	MOVW R2, err+36(FP)		// err
	RET
errorr6:
	MOVW $-1, R3
	MOVW R3, r1+28(FP)		// ret 1
	MOVW R2, r2+32(FP)		// ret 2
	MOVW R0, err+36(FP)		// err
	RET