lin
2025-04-23 399353eb5dc7e9c1db94cc97c380dc7f66c51a4c
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