Text file
src/runtime/sys_plan9_arm.s
Documentation: runtime
1// Copyright 2015 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#include "go_asm.h"
6#include "go_tls.h"
7#include "textflag.h"
8
9// from ../syscall/zsysnum_plan9.go
10
11#define SYS_SYSR1 0
12#define SYS_BIND 2
13#define SYS_CHDIR 3
14#define SYS_CLOSE 4
15#define SYS_DUP 5
16#define SYS_ALARM 6
17#define SYS_EXEC 7
18#define SYS_EXITS 8
19#define SYS_FAUTH 10
20#define SYS_SEGBRK 12
21#define SYS_OPEN 14
22#define SYS_OSEEK 16
23#define SYS_SLEEP 17
24#define SYS_RFORK 19
25#define SYS_PIPE 21
26#define SYS_CREATE 22
27#define SYS_FD2PATH 23
28#define SYS_BRK_ 24
29#define SYS_REMOVE 25
30#define SYS_NOTIFY 28
31#define SYS_NOTED 29
32#define SYS_SEGATTACH 30
33#define SYS_SEGDETACH 31
34#define SYS_SEGFREE 32
35#define SYS_SEGFLUSH 33
36#define SYS_RENDEZVOUS 34
37#define SYS_UNMOUNT 35
38#define SYS_SEMACQUIRE 37
39#define SYS_SEMRELEASE 38
40#define SYS_SEEK 39
41#define SYS_FVERSION 40
42#define SYS_ERRSTR 41
43#define SYS_STAT 42
44#define SYS_FSTAT 43
45#define SYS_WSTAT 44
46#define SYS_FWSTAT 45
47#define SYS_MOUNT 46
48#define SYS_AWAIT 47
49#define SYS_PREAD 50
50#define SYS_PWRITE 51
51#define SYS_TSEMACQUIRE 52
52#define SYS_NSEC 53
53
54//func open(name *byte, mode, perm int32) int32
55TEXT runtime·open(SB),NOSPLIT,$0-16
56 MOVW $SYS_OPEN, R0
57 SWI $0
58 MOVW R0, ret+12(FP)
59 RET
60
61//func pread(fd int32, buf unsafe.Pointer, nbytes int32, offset int64) int32
62TEXT runtime·pread(SB),NOSPLIT,$0-24
63 MOVW $SYS_PREAD, R0
64 SWI $0
65 MOVW R0, ret+20(FP)
66 RET
67
68//func pwrite(fd int32, buf unsafe.Pointer, nbytes int32, offset int64) int32
69TEXT runtime·pwrite(SB),NOSPLIT,$0-24
70 MOVW $SYS_PWRITE, R0
71 SWI $0
72 MOVW R0, ret+20(FP)
73 RET
74
75//func seek(fd int32, offset int64, whence int32) int64
76TEXT runtime·seek(SB),NOSPLIT,$0-24
77 MOVW $ret_lo+16(FP), R0
78 MOVW 0(R13), R1
79 MOVW R0, 0(R13)
80 MOVW.W R1, -4(R13)
81 MOVW $SYS_SEEK, R0
82 SWI $0
83 MOVW.W R1, 4(R13)
84 CMP $-1, R0
85 MOVW.EQ R0, ret_lo+16(FP)
86 MOVW.EQ R0, ret_hi+20(FP)
87 RET
88
89//func closefd(fd int32) int32
90TEXT runtime·closefd(SB),NOSPLIT,$0-8
91 MOVW $SYS_CLOSE, R0
92 SWI $0
93 MOVW R0, ret+4(FP)
94 RET
95
96//func dupfd(old, new int32) int32
97TEXT runtime·dupfd(SB),NOSPLIT,$0-12
98 MOVW $SYS_DUP, R0
99 SWI $0
100 MOVW R0, ret+8(FP)
101 RET
102
103//func exits(msg *byte)
104TEXT runtime·exits(SB),NOSPLIT,$0-4
105 MOVW $SYS_EXITS, R0
106 SWI $0
107 RET
108
109//func brk_(addr unsafe.Pointer) int32
110TEXT runtime·brk_(SB),NOSPLIT,$0-8
111 MOVW $SYS_BRK_, R0
112 SWI $0
113 MOVW R0, ret+4(FP)
114 RET
115
116//func sleep(ms int32) int32
117TEXT runtime·sleep(SB),NOSPLIT,$0-8
118 MOVW $SYS_SLEEP, R0
119 SWI $0
120 MOVW R0, ret+4(FP)
121 RET
122
123//func plan9_semacquire(addr *uint32, block int32) int32
124TEXT runtime·plan9_semacquire(SB),NOSPLIT,$0-12
125 MOVW $SYS_SEMACQUIRE, R0
126 SWI $0
127 MOVW R0, ret+8(FP)
128 RET
129
130//func plan9_tsemacquire(addr *uint32, ms int32) int32
131TEXT runtime·plan9_tsemacquire(SB),NOSPLIT,$0-12
132 MOVW $SYS_TSEMACQUIRE, R0
133 SWI $0
134 MOVW R0, ret+8(FP)
135 RET
136
137// func timesplit(u uint64) (sec int64, nsec int32)
138TEXT runtime·timesplit(SB),NOSPLIT,$0
139 MOVW u_lo+0(FP), R1 // R1:R2 = nsec
140 MOVW u_hi+4(FP), R2
141
142 // multiply nanoseconds by reciprocal of 10**9 (scaled by 2**61)
143 // to get seconds (96 bit scaled result)
144 MOVW $0x89705f41, R3 // 2**61 * 10**-9
145 MULLU R1,R3,(R6,R5) // R5:R6:R7 = R1:R2 * R3
146 MOVW $0,R7
147 MULALU R2,R3,(R7,R6)
148
149 // unscale by discarding low 32 bits, shifting the rest by 29
150 MOVW R6>>29,R6 // R6:R7 = (R5:R6:R7 >> 61)
151 ORR R7<<3,R6
152 MOVW R7>>29,R7
153
154 // subtract (10**9 * sec) from nsec to get nanosecond remainder
155 MOVW $1000000000, R5 // 10**9
156 MULLU R6,R5,(R9,R8) // R8:R9 = R6:R7 * R5
157 MULA R7,R5,R9,R9
158 SUB.S R8,R1 // R1:R2 -= R8:R9
159 SBC R9,R2
160
161 // because reciprocal was a truncated repeating fraction, quotient
162 // may be slightly too small -- adjust to make remainder < 10**9
163 CMP R5,R1 // if remainder > 10**9
164 SUB.HS R5,R1 // remainder -= 10**9
165 ADD.HS $1,R6 // sec += 1
166
167 MOVW R6,sec_lo+8(FP)
168 MOVW R7,sec_hi+12(FP)
169 MOVW R1,nsec+16(FP)
170 RET
171
172//func notify(fn unsafe.Pointer) int32
173TEXT runtime·notify(SB),NOSPLIT,$0-8
174 MOVW $SYS_NOTIFY, R0
175 SWI $0
176 MOVW R0, ret+4(FP)
177 RET
178
179//func noted(mode int32) int32
180TEXT runtime·noted(SB),NOSPLIT,$0-8
181 MOVW $SYS_NOTED, R0
182 SWI $0
183 MOVW R0, ret+4(FP)
184 RET
185
186//func plan9_semrelease(addr *uint32, count int32) int32
187TEXT runtime·plan9_semrelease(SB),NOSPLIT,$0-12
188 MOVW $SYS_SEMRELEASE, R0
189 SWI $0
190 MOVW R0, ret+8(FP)
191 RET
192
193//func rfork(flags int32) int32
194TEXT runtime·rfork(SB),NOSPLIT,$0-8
195 MOVW $SYS_RFORK, R0
196 SWI $0
197 MOVW R0, ret+4(FP)
198 RET
199
200//func tstart_plan9(newm *m)
201TEXT runtime·tstart_plan9(SB),NOSPLIT,$4-4
202 MOVW newm+0(FP), R1
203 MOVW m_g0(R1), g
204
205 // Layout new m scheduler stack on os stack.
206 MOVW R13, R0
207 MOVW R0, g_stack+stack_hi(g)
208 SUB $(64*1024), R0
209 MOVW R0, (g_stack+stack_lo)(g)
210 MOVW R0, g_stackguard0(g)
211 MOVW R0, g_stackguard1(g)
212
213 // Initialize procid from TOS struct.
214 MOVW _tos(SB), R0
215 MOVW 48(R0), R0
216 MOVW R0, m_procid(R1) // save pid as m->procid
217
218 BL runtime·mstart(SB)
219
220 // Exit the thread.
221 MOVW $0, R0
222 MOVW R0, 4(R13)
223 CALL runtime·exits(SB)
224 JMP 0(PC)
225
226//func sigtramp(ureg, note unsafe.Pointer)
227TEXT runtime·sigtramp(SB),NOSPLIT,$0-8
228 // check that g and m exist
229 CMP $0, g
230 BEQ 4(PC)
231 MOVW g_m(g), R0
232 CMP $0, R0
233 BNE 2(PC)
234 BL runtime·badsignal2(SB) // will exit
235
236 // save args
237 MOVW ureg+0(FP), R1
238 MOVW note+4(FP), R2
239
240 // change stack
241 MOVW m_gsignal(R0), R3
242 MOVW (g_stack+stack_hi)(R3), R13
243
244 // make room for args, retval and g
245 SUB $24, R13
246
247 // save g
248 MOVW g, R3
249 MOVW R3, 20(R13)
250
251 // g = m->gsignal
252 MOVW m_gsignal(R0), g
253
254 // load args and call sighandler
255 ADD $4,R13,R5
256 MOVM.IA [R1-R3], (R5)
257 BL runtime·sighandler(SB)
258 MOVW 16(R13), R0 // retval
259
260 // restore g
261 MOVW 20(R13), g
262
263 // call noted(R0)
264 MOVW R0, 4(R13)
265 BL runtime·noted(SB)
266 RET
267
268//func sigpanictramp()
269TEXT runtime·sigpanictramp(SB),NOSPLIT,$0-0
270 MOVW.W R0, -4(R13)
271 B runtime·sigpanic(SB)
272
273//func setfpmasks()
274// Only used by the 64-bit runtime.
275TEXT runtime·setfpmasks(SB),NOSPLIT,$0
276 RET
277
278#define ERRMAX 128 /* from os_plan9.h */
279
280// func errstr() string
281// Only used by package syscall.
282// Grab error string due to a syscall made
283// in entersyscall mode, without going
284// through the allocator (issue 4994).
285// See ../syscall/asm_plan9_arm.s:/·Syscall/
286TEXT runtime·errstr(SB),NOSPLIT,$0-8
287 MOVW g_m(g), R0
288 MOVW (m_mOS+mOS_errstr)(R0), R1
289 MOVW R1, ret_base+0(FP)
290 MOVW $ERRMAX, R2
291 MOVW R2, ret_len+4(FP)
292 MOVW $SYS_ERRSTR, R0
293 SWI $0
294 MOVW R1, R2
295 MOVBU 0(R2), R0
296 CMP $0, R0
297 BEQ 3(PC)
298 ADD $1, R2
299 B -4(PC)
300 SUB R1, R2
301 MOVW R2, ret_len+4(FP)
302 RET
303
304TEXT ·publicationBarrier(SB),NOSPLIT|NOFRAME,$0-0
305 B runtime·armPublicationBarrier(SB)
306
307// never called (cgo not supported)
308TEXT runtime·read_tls_fallback(SB),NOSPLIT|NOFRAME,$0
309 MOVW $0, R0
310 MOVW R0, (R0)
311 RET
View as plain text