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