Text file
src/syscall/asm_linux_mipsx.s
Documentation: syscall
1 // Copyright 2016 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 //go:build linux && (mips || mipsle)
6 // +build linux
7 // +build mips mipsle
8
9 #include "textflag.h"
10 #include "funcdata.h"
11
12 //
13 // System calls for mips, Linux
14 //
15
16 // func Syscall(trap uintptr, a1, a2, a3 uintptr) (r1, r2, err uintptr);
17 TEXT ·Syscall(SB),NOSPLIT,$0-28
18 JAL runtime·entersyscall(SB)
19 MOVW a1+4(FP), R4
20 MOVW a2+8(FP), R5
21 MOVW a3+12(FP), R6
22 MOVW R0, R7
23 MOVW trap+0(FP), R2 // syscall entry
24 SYSCALL
25 BEQ R7, ok
26 MOVW $-1, R1
27 MOVW R1, r1+16(FP) // r1
28 MOVW R0, r2+20(FP) // r2
29 MOVW R2, err+24(FP) // errno
30 JAL runtime·exitsyscall(SB)
31 RET
32 ok:
33 MOVW R2, r1+16(FP) // r1
34 MOVW R3, r2+20(FP) // r2
35 MOVW R0, err+24(FP) // errno
36 JAL runtime·exitsyscall(SB)
37 RET
38
39 // func Syscall6(trap trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr);
40 // 5th and 6th arg go at sp+16, sp+20.
41 // Note that frame size of 20 means that 24 bytes gets reserved on stack.
42 TEXT ·Syscall6(SB),NOSPLIT,$20-40
43 NO_LOCAL_POINTERS
44 JAL runtime·entersyscall(SB)
45 MOVW a1+4(FP), R4
46 MOVW a2+8(FP), R5
47 MOVW a3+12(FP), R6
48 MOVW a4+16(FP), R7
49 MOVW a5+20(FP), R8
50 MOVW a6+24(FP), R9
51 MOVW R8, 16(R29)
52 MOVW R9, 20(R29)
53 MOVW trap+0(FP), R2 // syscall entry
54 SYSCALL
55 BEQ R7, ok6
56 MOVW $-1, R1
57 MOVW R1, r1+28(FP) // r1
58 MOVW R0, r2+32(FP) // r2
59 MOVW R2, err+36(FP) // errno
60 JAL runtime·exitsyscall(SB)
61 RET
62 ok6:
63 MOVW R2, r1+28(FP) // r1
64 MOVW R3, r2+32(FP) // r2
65 MOVW R0, err+36(FP) // errno
66 JAL runtime·exitsyscall(SB)
67 RET
68
69 // func Syscall9(trap trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2, err uintptr);
70 // Actually Syscall8 but the rest of the code expects it to be named Syscall9.
71 TEXT ·Syscall9(SB),NOSPLIT,$28-52
72 NO_LOCAL_POINTERS
73 JAL runtime·entersyscall(SB)
74 MOVW a1+4(FP), R4
75 MOVW a2+8(FP), R5
76 MOVW a3+12(FP), R6
77 MOVW a4+16(FP), R7
78 MOVW a5+20(FP), R8
79 MOVW a6+24(FP), R9
80 MOVW a7+28(FP), R10
81 MOVW a8+32(FP), R11
82 MOVW R8, 16(R29)
83 MOVW R9, 20(R29)
84 MOVW R10, 24(R29)
85 MOVW R11, 28(R29)
86 MOVW trap+0(FP), R2 // syscall entry
87 SYSCALL
88 BEQ R7, ok9
89 MOVW $-1, R1
90 MOVW R1, r1+40(FP) // r1
91 MOVW R0, r2+44(FP) // r2
92 MOVW R2, err+48(FP) // errno
93 JAL runtime·exitsyscall(SB)
94 RET
95 ok9:
96 MOVW R2, r1+40(FP) // r1
97 MOVW R3, r2+44(FP) // r2
98 MOVW R0, err+48(FP) // errno
99 JAL runtime·exitsyscall(SB)
100 RET
101
102 TEXT ·RawSyscall(SB),NOSPLIT,$24-28
103 MOVW a1+4(FP), R4
104 MOVW a2+8(FP), R5
105 MOVW a3+12(FP), R6
106 MOVW trap+0(FP), R2 // syscall entry
107 SYSCALL
108 BEQ R7, ok1
109 MOVW $-1, R1
110 MOVW R1, r1+16(FP) // r1
111 MOVW R0, r2+20(FP) // r2
112 MOVW R2, err+24(FP) // errno
113 RET
114 ok1:
115 MOVW R2, r1+16(FP) // r1
116 MOVW R3, r2+20(FP) // r2
117 MOVW R0, err+24(FP) // errno
118 RET
119
120 TEXT ·RawSyscall6(SB),NOSPLIT,$20-40
121 MOVW a1+4(FP), R4
122 MOVW a2+8(FP), R5
123 MOVW a3+12(FP), R6
124 MOVW a4+16(FP), R7
125 MOVW a5+20(FP), R8
126 MOVW a6+24(FP), R9
127 MOVW R8, 16(R29)
128 MOVW R9, 20(R29)
129 MOVW trap+0(FP), R2 // syscall entry
130 SYSCALL
131 BEQ R7, ok2
132 MOVW $-1, R1
133 MOVW R1, r1+28(FP) // r1
134 MOVW R0, r2+32(FP) // r2
135 MOVW R2, err+36(FP) // errno
136 RET
137 ok2:
138 MOVW R2, r1+28(FP) // r1
139 MOVW R3, r2+32(FP) // r2
140 MOVW R0, err+36(FP) // errno
141 RET
142
143 // func rawVforkSyscall(trap, a1 uintptr) (r1, err uintptr)
144 TEXT ·rawVforkSyscall(SB),NOSPLIT|NOFRAME,$0-16
145 MOVW a1+4(FP), R4
146 MOVW R0, R5
147 MOVW R0, R6
148 MOVW trap+0(FP), R2 // syscall entry
149 SYSCALL
150 BEQ R7, ok
151 MOVW $-1, R1
152 MOVW R1, r1+8(FP) // r1
153 MOVW R2, err+12(FP) // errno
154 RET
155 ok:
156 MOVW R2, r1+8(FP) // r1
157 MOVW R0, err+12(FP) // errno
158 RET
159
160 TEXT ·rawSyscallNoError(SB),NOSPLIT,$20-24
161 MOVW a1+4(FP), R4
162 MOVW a2+8(FP), R5
163 MOVW a3+12(FP), R6
164 MOVW trap+0(FP), R2 // syscall entry
165 SYSCALL
166 MOVW R2, r1+16(FP) // r1
167 MOVW R3, r2+20(FP) // r2
168 RET
169
View as plain text