aboutsummaryrefslogtreecommitdiff
path: root/src/syscall/asm_linux_mipsx.s
blob: 04f90f6edf7c8d1da7aa7f99ce190cfaa1d91a49 (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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
// Copyright 2016 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.

//go:build linux && (mips || mipsle)

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

//
// System calls for mips, Linux
//

// func Syscall(trap uintptr, a1, a2, a3 uintptr) (r1, r2, err uintptr);
TEXT ·Syscall(SB),NOSPLIT,$0-28
	JAL	runtime·entersyscall(SB)
	MOVW	a1+4(FP), R4
	MOVW	a2+8(FP), R5
	MOVW	a3+12(FP), R6
	MOVW	R0, R7
	MOVW	trap+0(FP), R2	// syscall entry
	SYSCALL
	BEQ	R7, ok
	MOVW	$-1, R1
	MOVW	R1, r1+16(FP)	// r1
	MOVW	R0, r2+20(FP)	// r2
	MOVW	R2, err+24(FP)	// errno
	JAL	runtime·exitsyscall(SB)
	RET
ok:
	MOVW	R2, r1+16(FP)	// r1
	MOVW	R3, r2+20(FP)	// r2
	MOVW	R0, err+24(FP)	// errno
	JAL	runtime·exitsyscall(SB)
	RET

// func Syscall6(trap trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr);
// 5th and 6th arg go at sp+16, sp+20.
// Note that frame size of 20 means that 24 bytes gets reserved on stack.
TEXT ·Syscall6(SB),NOSPLIT,$20-40
	NO_LOCAL_POINTERS
	JAL	runtime·entersyscall(SB)
	MOVW	a1+4(FP), R4
	MOVW	a2+8(FP), R5
	MOVW	a3+12(FP), R6
	MOVW	a4+16(FP), R7
	MOVW	a5+20(FP), R8
	MOVW	a6+24(FP), R9
	MOVW	R8, 16(R29)
	MOVW	R9, 20(R29)
	MOVW	trap+0(FP), R2	// syscall entry
	SYSCALL
	BEQ	R7, ok6
	MOVW	$-1, R1
	MOVW	R1, r1+28(FP)	// r1
	MOVW	R0, r2+32(FP)	// r2
	MOVW	R2, err+36(FP)	// errno
	JAL	runtime·exitsyscall(SB)
	RET
ok6:
	MOVW	R2, r1+28(FP)	// r1
	MOVW	R3, r2+32(FP)	// r2
	MOVW	R0, err+36(FP)	// errno
	JAL	runtime·exitsyscall(SB)
	RET

// func Syscall9(trap trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2, err uintptr);
// Actually Syscall8 but the rest of the code expects it to be named Syscall9.
TEXT ·Syscall9(SB),NOSPLIT,$28-52
	NO_LOCAL_POINTERS
	JAL	runtime·entersyscall(SB)
	MOVW	a1+4(FP), R4
	MOVW	a2+8(FP), R5
	MOVW	a3+12(FP), R6
	MOVW	a4+16(FP), R7
	MOVW	a5+20(FP), R8
	MOVW	a6+24(FP), R9
	MOVW	a7+28(FP), R10
	MOVW	a8+32(FP), R11
	MOVW	R8, 16(R29)
	MOVW	R9, 20(R29)
	MOVW	R10, 24(R29)
	MOVW	R11, 28(R29)
	MOVW	trap+0(FP), R2	// syscall entry
	SYSCALL
	BEQ	R7, ok9
	MOVW	$-1, R1
	MOVW	R1, r1+40(FP)	// r1
	MOVW	R0, r2+44(FP)	// r2
	MOVW	R2, err+48(FP)	// errno
	JAL	runtime·exitsyscall(SB)
	RET
ok9:
	MOVW	R2, r1+40(FP)	// r1
	MOVW	R3, r2+44(FP)	// r2
	MOVW	R0, err+48(FP)	// errno
	JAL	runtime·exitsyscall(SB)
	RET

TEXT ·RawSyscall(SB),NOSPLIT,$24-28
	MOVW	a1+4(FP), R4
	MOVW	a2+8(FP), R5
	MOVW	a3+12(FP), R6
	MOVW	trap+0(FP), R2	// syscall entry
	SYSCALL
	BEQ	R7, ok1
	MOVW	$-1, R1
	MOVW	R1, r1+16(FP)	// r1
	MOVW	R0, r2+20(FP)	// r2
	MOVW	R2, err+24(FP)	// errno
	RET
ok1:
	MOVW	R2, r1+16(FP)	// r1
	MOVW	R3, r2+20(FP)	// r2
	MOVW	R0, err+24(FP)	// errno
	RET

TEXT ·RawSyscall6(SB),NOSPLIT,$20-40
	MOVW	a1+4(FP), R4
	MOVW	a2+8(FP), R5
	MOVW	a3+12(FP), R6
	MOVW	a4+16(FP), R7
	MOVW	a5+20(FP), R8
	MOVW	a6+24(FP), R9
	MOVW	R8, 16(R29)
	MOVW	R9, 20(R29)
	MOVW	trap+0(FP), R2	// syscall entry
	SYSCALL
	BEQ	R7, ok2
	MOVW	$-1, R1
	MOVW	R1, r1+28(FP)	// r1
	MOVW	R0, r2+32(FP)	// r2
	MOVW	R2, err+36(FP)	// errno
	RET
ok2:
	MOVW	R2, r1+28(FP)	// r1
	MOVW	R3, r2+32(FP)	// r2
	MOVW	R0, err+36(FP)	// errno
	RET

// func rawVforkSyscall(trap, a1 uintptr) (r1, err uintptr)
TEXT ·rawVforkSyscall(SB),NOSPLIT|NOFRAME,$0-16
	MOVW	a1+4(FP), R4
	MOVW	R0, R5
	MOVW	R0, R6
	MOVW	trap+0(FP), R2	// syscall entry
	SYSCALL
	BEQ	R7, ok
	MOVW	$-1, R1
	MOVW	R1, r1+8(FP)	// r1
	MOVW	R2, err+12(FP)	// errno
	RET
ok:
	MOVW	R2, r1+8(FP)	// r1
	MOVW	R0, err+12(FP)	// errno
	RET

TEXT ·rawSyscallNoError(SB),NOSPLIT,$20-24
	MOVW	a1+4(FP), R4
	MOVW	a2+8(FP), R5
	MOVW	a3+12(FP), R6
	MOVW	trap+0(FP), R2	// syscall entry
	SYSCALL
	MOVW	R2, r1+16(FP)	// r1
	MOVW	R3, r2+20(FP)	// r2
	RET