Text file
src/runtime/sys_linux_s390x.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 // System calls and other system stuff for Linux s390x; see
6 // /usr/include/asm/unistd.h for the syscall number definitions.
7
8 #include "go_asm.h"
9 #include "go_tls.h"
10 #include "textflag.h"
11
12 #define SYS_exit 1
13 #define SYS_read 3
14 #define SYS_write 4
15 #define SYS_open 5
16 #define SYS_close 6
17 #define SYS_getpid 20
18 #define SYS_kill 37
19 #define SYS_brk 45
20 #define SYS_mmap 90
21 #define SYS_munmap 91
22 #define SYS_setitimer 104
23 #define SYS_clone 120
24 #define SYS_sched_yield 158
25 #define SYS_nanosleep 162
26 #define SYS_rt_sigreturn 173
27 #define SYS_rt_sigaction 174
28 #define SYS_rt_sigprocmask 175
29 #define SYS_sigaltstack 186
30 #define SYS_madvise 219
31 #define SYS_mincore 218
32 #define SYS_gettid 236
33 #define SYS_futex 238
34 #define SYS_sched_getaffinity 240
35 #define SYS_tgkill 241
36 #define SYS_exit_group 248
37 #define SYS_timer_create 254
38 #define SYS_timer_settime 255
39 #define SYS_timer_delete 258
40 #define SYS_clock_gettime 260
41 #define SYS_pipe2 325
42
43 TEXT runtime·exit(SB),NOSPLIT|NOFRAME,$0-4
44 MOVW code+0(FP), R2
45 MOVW $SYS_exit_group, R1
46 SYSCALL
47 RET
48
49 // func exitThread(wait *atomic.Uint32)
50 TEXT runtime·exitThread(SB),NOSPLIT|NOFRAME,$0-8
51 MOVD wait+0(FP), R1
52 // We're done using the stack.
53 MOVW $0, R2
54 MOVW R2, (R1)
55 MOVW $0, R2 // exit code
56 MOVW $SYS_exit, R1
57 SYSCALL
58 JMP 0(PC)
59
60 TEXT runtime·open(SB),NOSPLIT|NOFRAME,$0-20
61 MOVD name+0(FP), R2
62 MOVW mode+8(FP), R3
63 MOVW perm+12(FP), R4
64 MOVW $SYS_open, R1
65 SYSCALL
66 MOVD $-4095, R3
67 CMPUBLT R2, R3, 2(PC)
68 MOVW $-1, R2
69 MOVW R2, ret+16(FP)
70 RET
71
72 TEXT runtime·closefd(SB),NOSPLIT|NOFRAME,$0-12
73 MOVW fd+0(FP), R2
74 MOVW $SYS_close, R1
75 SYSCALL
76 MOVD $-4095, R3
77 CMPUBLT R2, R3, 2(PC)
78 MOVW $-1, R2
79 MOVW R2, ret+8(FP)
80 RET
81
82 TEXT runtime·write1(SB),NOSPLIT|NOFRAME,$0-28
83 MOVD fd+0(FP), R2
84 MOVD p+8(FP), R3
85 MOVW n+16(FP), R4
86 MOVW $SYS_write, R1
87 SYSCALL
88 MOVW R2, ret+24(FP)
89 RET
90
91 TEXT runtime·read(SB),NOSPLIT|NOFRAME,$0-28
92 MOVW fd+0(FP), R2
93 MOVD p+8(FP), R3
94 MOVW n+16(FP), R4
95 MOVW $SYS_read, R1
96 SYSCALL
97 MOVW R2, ret+24(FP)
98 RET
99
100 // func pipe2() (r, w int32, errno int32)
101 TEXT runtime·pipe2(SB),NOSPLIT|NOFRAME,$0-20
102 MOVD $r+8(FP), R2
103 MOVW flags+0(FP), R3
104 MOVW $SYS_pipe2, R1
105 SYSCALL
106 MOVW R2, errno+16(FP)
107 RET
108
109 TEXT runtime·usleep(SB),NOSPLIT,$16-4
110 MOVW usec+0(FP), R2
111 MOVD R2, R4
112 MOVW $1000000, R3
113 DIVD R3, R2
114 MOVD R2, 8(R15)
115 MULLD R2, R3 // Convert sec to usec and subtract
116 SUB R3, R4
117 MOVW $1000, R3
118 MULLD R3, R4 // Convert remaining usec into nsec.
119 MOVD R4, 16(R15)
120
121 // nanosleep(&ts, 0)
122 ADD $8, R15, R2
123 MOVW $0, R3
124 MOVW $SYS_nanosleep, R1
125 SYSCALL
126 RET
127
128 TEXT runtime·gettid(SB),NOSPLIT,$0-4
129 MOVW $SYS_gettid, R1
130 SYSCALL
131 MOVW R2, ret+0(FP)
132 RET
133
134 TEXT runtime·raise(SB),NOSPLIT|NOFRAME,$0
135 MOVW $SYS_getpid, R1
136 SYSCALL
137 MOVW R2, R10
138 MOVW $SYS_gettid, R1
139 SYSCALL
140 MOVW R2, R3 // arg 2 tid
141 MOVW R10, R2 // arg 1 pid
142 MOVW sig+0(FP), R4 // arg 2
143 MOVW $SYS_tgkill, R1
144 SYSCALL
145 RET
146
147 TEXT runtime·raiseproc(SB),NOSPLIT|NOFRAME,$0
148 MOVW $SYS_getpid, R1
149 SYSCALL
150 MOVW R2, R2 // arg 1 pid
151 MOVW sig+0(FP), R3 // arg 2
152 MOVW $SYS_kill, R1
153 SYSCALL
154 RET
155
156 TEXT ·getpid(SB),NOSPLIT|NOFRAME,$0-8
157 MOVW $SYS_getpid, R1
158 SYSCALL
159 MOVD R2, ret+0(FP)
160 RET
161
162 TEXT ·tgkill(SB),NOSPLIT|NOFRAME,$0-24
163 MOVD tgid+0(FP), R2
164 MOVD tid+8(FP), R3
165 MOVD sig+16(FP), R4
166 MOVW $SYS_tgkill, R1
167 SYSCALL
168 RET
169
170 TEXT runtime·setitimer(SB),NOSPLIT|NOFRAME,$0-24
171 MOVW mode+0(FP), R2
172 MOVD new+8(FP), R3
173 MOVD old+16(FP), R4
174 MOVW $SYS_setitimer, R1
175 SYSCALL
176 RET
177
178 TEXT runtime·timer_create(SB),NOSPLIT|NOFRAME,$0-28
179 MOVW clockid+0(FP), R2
180 MOVD sevp+8(FP), R3
181 MOVD timerid+16(FP), R4
182 MOVW $SYS_timer_create, R1
183 SYSCALL
184 MOVW R2, ret+24(FP)
185 RET
186
187 TEXT runtime·timer_settime(SB),NOSPLIT|NOFRAME,$0-28
188 MOVW timerid+0(FP), R2
189 MOVW flags+4(FP), R3
190 MOVD new+8(FP), R4
191 MOVD old+16(FP), R5
192 MOVW $SYS_timer_settime, R1
193 SYSCALL
194 MOVW R2, ret+24(FP)
195 RET
196
197 TEXT runtime·timer_delete(SB),NOSPLIT|NOFRAME,$0-12
198 MOVW timerid+0(FP), R2
199 MOVW $SYS_timer_delete, R1
200 SYSCALL
201 MOVW R2, ret+8(FP)
202 RET
203
204 TEXT runtime·mincore(SB),NOSPLIT|NOFRAME,$0-28
205 MOVD addr+0(FP), R2
206 MOVD n+8(FP), R3
207 MOVD dst+16(FP), R4
208 MOVW $SYS_mincore, R1
209 SYSCALL
210 MOVW R2, ret+24(FP)
211 RET
212
213 // func walltime() (sec int64, nsec int32)
214 TEXT runtime·walltime(SB),NOSPLIT,$32-12
215 MOVW $0, R2 // CLOCK_REALTIME
216 MOVD R15, R7 // Backup stack pointer
217
218 MOVD g_m(g), R6 //m
219
220 MOVD runtime·vdsoClockgettimeSym(SB), R9 // Check for VDSO availability
221 CMPBEQ R9, $0, fallback
222
223 MOVD m_vdsoPC(R6), R4
224 MOVD R4, 16(R15)
225 MOVD m_vdsoSP(R6), R4
226 MOVD R4, 24(R15)
227
228 MOVD R14, R8 // Backup return address
229 MOVD $ret-8(FP), R4 // caller's SP
230
231 MOVD R8, m_vdsoPC(R6)
232 MOVD R4, m_vdsoSP(R6)
233
234 MOVD m_curg(R6), R5
235 CMP g, R5
236 BNE noswitch
237
238 MOVD m_g0(R6), R4
239 MOVD (g_sched+gobuf_sp)(R4), R15 // Set SP to g0 stack
240
241 noswitch:
242 SUB $16, R15 // reserve 2x 8 bytes for parameters
243 MOVD $~7, R4 // align to 8 bytes because of gcc ABI
244 AND R4, R15
245 MOVD R15, R3 // R15 needs to be in R3 as expected by kernel_clock_gettime
246
247 MOVB runtime·iscgo(SB),R12
248 CMPBNE R12, $0, nosaveg
249
250 MOVD m_gsignal(R6), R12 // g.m.gsignal
251 CMPBEQ R12, $0, nosaveg
252
253 CMPBEQ g, R12, nosaveg
254 MOVD (g_stack+stack_lo)(R12), R12 // g.m.gsignal.stack.lo
255 MOVD g, (R12)
256
257 BL R9 // to vdso lookup
258
259 MOVD $0, (R12)
260
261 JMP finish
262
263 nosaveg:
264 BL R9 // to vdso lookup
265
266 finish:
267 MOVD 0(R15), R3 // sec
268 MOVD 8(R15), R5 // nsec
269 MOVD R7, R15 // Restore SP
270
271 // Restore vdsoPC, vdsoSP
272 // We don't worry about being signaled between the two stores.
273 // If we are not in a signal handler, we'll restore vdsoSP to 0,
274 // and no one will care about vdsoPC. If we are in a signal handler,
275 // we cannot receive another signal.
276 MOVD 24(R15), R12
277 MOVD R12, m_vdsoSP(R6)
278 MOVD 16(R15), R12
279 MOVD R12, m_vdsoPC(R6)
280
281 return:
282 // sec is in R3, nsec in R5
283 // return nsec in R3
284 MOVD R3, sec+0(FP)
285 MOVW R5, nsec+8(FP)
286 RET
287
288 // Syscall fallback
289 fallback:
290 MOVD $tp-16(SP), R3
291 MOVW $SYS_clock_gettime, R1
292 SYSCALL
293 LMG tp-16(SP), R2, R3
294 // sec is in R2, nsec in R3
295 MOVD R2, sec+0(FP)
296 MOVW R3, nsec+8(FP)
297 RET
298
299 TEXT runtime·nanotime1(SB),NOSPLIT,$32-8
300 MOVW $1, R2 // CLOCK_MONOTONIC
301
302 MOVD R15, R7 // Backup stack pointer
303
304 MOVD g_m(g), R6 //m
305
306 MOVD runtime·vdsoClockgettimeSym(SB), R9 // Check for VDSO availability
307 CMPBEQ R9, $0, fallback
308
309 MOVD m_vdsoPC(R6), R4
310 MOVD R4, 16(R15)
311 MOVD m_vdsoSP(R6), R4
312 MOVD R4, 24(R15)
313
314 MOVD R14, R8 // Backup return address
315 MOVD $ret-8(FP), R4 // caller's SP
316
317 MOVD R8, m_vdsoPC(R6)
318 MOVD R4, m_vdsoSP(R6)
319
320 MOVD m_curg(R6), R5
321 CMP g, R5
322 BNE noswitch
323
324 MOVD m_g0(R6), R4
325 MOVD (g_sched+gobuf_sp)(R4), R15 // Set SP to g0 stack
326
327 noswitch:
328 SUB $16, R15 // reserve 2x 8 bytes for parameters
329 MOVD $~7, R4 // align to 8 bytes because of gcc ABI
330 AND R4, R15
331 MOVD R15, R3 // R15 needs to be in R3 as expected by kernel_clock_gettime
332
333 MOVB runtime·iscgo(SB),R12
334 CMPBNE R12, $0, nosaveg
335
336 MOVD m_gsignal(R6), R12 // g.m.gsignal
337 CMPBEQ R12, $0, nosaveg
338
339 CMPBEQ g, R12, nosaveg
340 MOVD (g_stack+stack_lo)(R12), R12 // g.m.gsignal.stack.lo
341 MOVD g, (R12)
342
343 BL R9 // to vdso lookup
344
345 MOVD $0, (R12)
346
347 JMP finish
348
349 nosaveg:
350 BL R9 // to vdso lookup
351
352 finish:
353 MOVD 0(R15), R3 // sec
354 MOVD 8(R15), R5 // nsec
355 MOVD R7, R15 // Restore SP
356
357 // Restore vdsoPC, vdsoSP
358 // We don't worry about being signaled between the two stores.
359 // If we are not in a signal handler, we'll restore vdsoSP to 0,
360 // and no one will care about vdsoPC. If we are in a signal handler,
361 // we cannot receive another signal.
362
363 MOVD 24(R15), R12
364 MOVD R12, m_vdsoSP(R6)
365 MOVD 16(R15), R12
366 MOVD R12, m_vdsoPC(R6)
367
368 return:
369 // sec is in R3, nsec in R5
370 // return nsec in R3
371 MULLD $1000000000, R3
372 ADD R5, R3
373 MOVD R3, ret+0(FP)
374 RET
375
376 // Syscall fallback
377 fallback:
378 MOVD $tp-16(SP), R3
379 MOVD $SYS_clock_gettime, R1
380 SYSCALL
381 LMG tp-16(SP), R2, R3
382 MOVD R3, R5
383 MOVD R2, R3
384 JMP return
385
386 TEXT runtime·rtsigprocmask(SB),NOSPLIT|NOFRAME,$0-28
387 MOVW how+0(FP), R2
388 MOVD new+8(FP), R3
389 MOVD old+16(FP), R4
390 MOVW size+24(FP), R5
391 MOVW $SYS_rt_sigprocmask, R1
392 SYSCALL
393 MOVD $-4095, R3
394 CMPUBLT R2, R3, 2(PC)
395 MOVD R0, 0(R0) // crash
396 RET
397
398 TEXT runtime·rt_sigaction(SB),NOSPLIT|NOFRAME,$0-36
399 MOVD sig+0(FP), R2
400 MOVD new+8(FP), R3
401 MOVD old+16(FP), R4
402 MOVD size+24(FP), R5
403 MOVW $SYS_rt_sigaction, R1
404 SYSCALL
405 MOVW R2, ret+32(FP)
406 RET
407
408 TEXT runtime·sigfwd(SB),NOSPLIT,$0-32
409 MOVW sig+8(FP), R2
410 MOVD info+16(FP), R3
411 MOVD ctx+24(FP), R4
412 MOVD fn+0(FP), R5
413 BL R5
414 RET
415
416 TEXT runtime·sigtramp(SB),NOSPLIT|TOPFRAME,$160
417 // initialize essential registers (just in case)
418 XOR R0, R0
419
420 MOVD R6, 32(R15)
421 MOVD R7, 40(R15)
422 MOVD R8, 48(R15)
423 MOVD R9, 56(R15)
424 MOVD R10, 64(R15)
425 MOVD R11, 72(R15)
426 MOVD R12, 80(R15)
427 MOVD g, 88(R15)
428 FMOVD F8, 96(R15)
429 FMOVD F9, 104(R15)
430 FMOVD F10, 112(R15)
431 FMOVD F11, 120(R15)
432 FMOVD F12, 128(R15)
433 FMOVD F13, 136(R15)
434 FMOVD F14, 144(R15)
435 FMOVD F15, 152(R15)
436
437 // this might be called in external code context,
438 // where g is not set.
439 MOVB runtime·iscgo(SB), R6
440 CMPBEQ R6, $0, 2(PC)
441 BL runtime·load_g(SB)
442
443 MOVW R2, 8(R15)
444 MOVD R3, 16(R15)
445 MOVD R4, 24(R15)
446 MOVD $runtime·sigtrampgo(SB), R5
447 BL R5
448
449 MOVD 32(R15), R6
450 MOVD 40(R15), R7
451 MOVD 48(R15), R8
452 MOVD 56(R15), R9
453 MOVD 64(R15), R10
454 MOVD 72(R15), R11
455 MOVD 80(R15), R12
456 MOVD 88(R15), g
457 FMOVD 96(R15), F8
458 FMOVD 104(R15), F9
459 FMOVD 112(R15), F10
460 FMOVD 120(R15), F11
461 FMOVD 128(R15), F12
462 FMOVD 136(R15), F13
463 FMOVD 144(R15), F14
464 FMOVD 152(R15), F15
465 RET
466
467 TEXT runtime·cgoSigtramp(SB),NOSPLIT,$0
468 BR runtime·sigtramp(SB)
469
470 // func mmap(addr unsafe.Pointer, n uintptr, prot, flags, fd int32, off uint32) unsafe.Pointer
471 TEXT runtime·mmap(SB),NOSPLIT,$48-48
472 MOVD addr+0(FP), R2
473 MOVD n+8(FP), R3
474 MOVW prot+16(FP), R4
475 MOVW flags+20(FP), R5
476 MOVW fd+24(FP), R6
477 MOVWZ off+28(FP), R7
478
479 // s390x uses old_mmap, so the arguments need to be placed into
480 // a struct and a pointer to the struct passed to mmap.
481 MOVD R2, addr-48(SP)
482 MOVD R3, n-40(SP)
483 MOVD R4, prot-32(SP)
484 MOVD R5, flags-24(SP)
485 MOVD R6, fd-16(SP)
486 MOVD R7, off-8(SP)
487
488 MOVD $addr-48(SP), R2
489 MOVW $SYS_mmap, R1
490 SYSCALL
491 MOVD $-4095, R3
492 CMPUBLT R2, R3, ok
493 NEG R2
494 MOVD $0, p+32(FP)
495 MOVD R2, err+40(FP)
496 RET
497 ok:
498 MOVD R2, p+32(FP)
499 MOVD $0, err+40(FP)
500 RET
501
502 TEXT runtime·munmap(SB),NOSPLIT|NOFRAME,$0
503 MOVD addr+0(FP), R2
504 MOVD n+8(FP), R3
505 MOVW $SYS_munmap, R1
506 SYSCALL
507 MOVD $-4095, R3
508 CMPUBLT R2, R3, 2(PC)
509 MOVD R0, 0(R0) // crash
510 RET
511
512 TEXT runtime·madvise(SB),NOSPLIT|NOFRAME,$0
513 MOVD addr+0(FP), R2
514 MOVD n+8(FP), R3
515 MOVW flags+16(FP), R4
516 MOVW $SYS_madvise, R1
517 SYSCALL
518 MOVW R2, ret+24(FP)
519 RET
520
521 // int64 futex(int32 *uaddr, int32 op, int32 val,
522 // struct timespec *timeout, int32 *uaddr2, int32 val2);
523 TEXT runtime·futex(SB),NOSPLIT|NOFRAME,$0
524 MOVD addr+0(FP), R2
525 MOVW op+8(FP), R3
526 MOVW val+12(FP), R4
527 MOVD ts+16(FP), R5
528 MOVD addr2+24(FP), R6
529 MOVW val3+32(FP), R7
530 MOVW $SYS_futex, R1
531 SYSCALL
532 MOVW R2, ret+40(FP)
533 RET
534
535 // int32 clone(int32 flags, void *stk, M *mp, G *gp, void (*fn)(void));
536 TEXT runtime·clone(SB),NOSPLIT|NOFRAME,$0
537 MOVW flags+0(FP), R3
538 MOVD stk+8(FP), R2
539
540 // Copy mp, gp, fn off parent stack for use by child.
541 // Careful: Linux system call clobbers ???.
542 MOVD mp+16(FP), R7
543 MOVD gp+24(FP), R8
544 MOVD fn+32(FP), R9
545
546 MOVD R7, -8(R2)
547 MOVD R8, -16(R2)
548 MOVD R9, -24(R2)
549 MOVD $1234, R7
550 MOVD R7, -32(R2)
551
552 SYSCALL $SYS_clone
553
554 // In parent, return.
555 CMPBEQ R2, $0, 3(PC)
556 MOVW R2, ret+40(FP)
557 RET
558
559 // In child, on new stack.
560 // initialize essential registers
561 XOR R0, R0
562 MOVD -32(R15), R7
563 CMP R7, $1234
564 BEQ 2(PC)
565 MOVD R0, 0(R0)
566
567 // Initialize m->procid to Linux tid
568 SYSCALL $SYS_gettid
569
570 MOVD -24(R15), R9 // fn
571 MOVD -16(R15), R8 // g
572 MOVD -8(R15), R7 // m
573
574 CMPBEQ R7, $0, nog
575 CMP R8, $0
576 BEQ nog
577
578 MOVD R2, m_procid(R7)
579
580 // In child, set up new stack
581 MOVD R7, g_m(R8)
582 MOVD R8, g
583 //CALL runtime·stackcheck(SB)
584
585 nog:
586 // Call fn
587 BL R9
588
589 // It shouldn't return. If it does, exit that thread.
590 MOVW $111, R2
591 MOVW $SYS_exit, R1
592 SYSCALL
593 BR -2(PC) // keep exiting
594
595 TEXT runtime·sigaltstack(SB),NOSPLIT|NOFRAME,$0
596 MOVD new+0(FP), R2
597 MOVD old+8(FP), R3
598 MOVW $SYS_sigaltstack, R1
599 SYSCALL
600 MOVD $-4095, R3
601 CMPUBLT R2, R3, 2(PC)
602 MOVD R0, 0(R0) // crash
603 RET
604
605 TEXT runtime·osyield(SB),NOSPLIT|NOFRAME,$0
606 MOVW $SYS_sched_yield, R1
607 SYSCALL
608 RET
609
610 TEXT runtime·sched_getaffinity(SB),NOSPLIT|NOFRAME,$0
611 MOVD pid+0(FP), R2
612 MOVD len+8(FP), R3
613 MOVD buf+16(FP), R4
614 MOVW $SYS_sched_getaffinity, R1
615 SYSCALL
616 MOVW R2, ret+24(FP)
617 RET
618
619 // func sbrk0() uintptr
620 TEXT runtime·sbrk0(SB),NOSPLIT|NOFRAME,$0-8
621 // Implemented as brk(NULL).
622 MOVD $0, R2
623 MOVW $SYS_brk, R1
624 SYSCALL
625 MOVD R2, ret+0(FP)
626 RET
627
628 TEXT runtime·access(SB),$0-20
629 MOVD $0, 2(R0) // unimplemented, only needed for android; declared in stubs_linux.go
630 MOVW R0, ret+16(FP)
631 RET
632
633 TEXT runtime·connect(SB),$0-28
634 MOVD $0, 2(R0) // unimplemented, only needed for android; declared in stubs_linux.go
635 MOVW R0, ret+24(FP)
636 RET
637
638 TEXT runtime·socket(SB),$0-20
639 MOVD $0, 2(R0) // unimplemented, only needed for android; declared in stubs_linux.go
640 MOVW R0, ret+16(FP)
641 RET
642
643 // func vgetrandom1(buf *byte, length uintptr, flags uint32, state uintptr, stateSize uintptr) int
644 TEXT runtime·vgetrandom1(SB),NOSPLIT,$16-48
645 MOVD buf+0(FP), R2
646 MOVD length+8(FP), R3
647 MOVW flags+16(FP), R4
648 MOVD state+24(FP), R5
649 MOVD stateSize+32(FP), R6
650
651 MOVD R15, R7
652
653 MOVD runtime·vdsoGetrandomSym(SB), R1
654 MOVD g_m(g), R9
655
656 MOVD m_vdsoPC(R9), R12
657 MOVD R12, 8(R15)
658 MOVD m_vdsoSP(R9), R12
659 MOVD R12, 16(R15)
660 MOVD R14, m_vdsoPC(R9)
661 MOVD $buf+0(FP), R12
662 MOVD R12, m_vdsoSP(R9)
663
664 SUB $160, R15
665 MOVD $~7, R12
666 AND R12, R15
667
668 MOVB runtime·iscgo(SB), R12
669 CMPBNE R12, $0, nosaveg
670 MOVD m_gsignal(R9), R12
671 CMPBEQ R12, $0, nosaveg
672 CMPBEQ g, R12, nosaveg
673 MOVD (g_stack+stack_lo)(R12), R12
674 MOVD g, (R12)
675
676 BL R1
677
678 MOVD $0, (R12)
679 JMP restore
680
681 nosaveg:
682 BL R1
683
684 restore:
685 MOVD R7, R15
686 MOVD 16(R15), R12
687 MOVD R12, m_vdsoSP(R9)
688 MOVD 8(R15), R12
689 MOVD R12, m_vdsoPC(R9)
690 MOVD R2, ret+40(FP)
691 RET
692
View as plain text