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
|
// 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.
// +build linux
// +build 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
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
|