]> Cypherpunks.ru repositories - gostls13.git/blob - src/runtime/cgo/asm_riscv64.s
runtime/cgo: store M for C-created thread in pthread key
[gostls13.git] / src / runtime / cgo / asm_riscv64.s
1 // Copyright 2020 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 "textflag.h"
6
7 // Set the x_crosscall2_ptr C function pointer variable point to crosscall2.
8 // It's such a pointer chain: _crosscall2_ptr -> x_crosscall2_ptr -> crosscall2
9 TEXT ·set_crosscall2(SB),NOSPLIT,$0-0
10         MOV     _crosscall2_ptr(SB), X7
11         MOV     $crosscall2(SB), X8
12         MOV     X8, (X7)
13         RET
14
15 // Called by C code generated by cmd/cgo.
16 // func crosscall2(fn, a unsafe.Pointer, n int32, ctxt uintptr)
17 // Saves C callee-saved registers and calls cgocallback with three arguments.
18 // fn is the PC of a func(a unsafe.Pointer) function.
19 TEXT crosscall2(SB),NOSPLIT|NOFRAME,$0
20         /*
21          * Push arguments for fn (X10, X11, X13), along with all callee-save
22          * registers. Note that at procedure entry the first argument is at
23          * 8(X2).
24          */
25         ADD     $(-8*29), X2
26         MOV     X10, (8*1)(X2) // fn unsafe.Pointer
27         MOV     X11, (8*2)(X2) // a unsafe.Pointer
28         MOV     X13, (8*3)(X2) // ctxt uintptr
29         MOV     X8, (8*4)(X2)
30         MOV     X9, (8*5)(X2)
31         MOV     X18, (8*6)(X2)
32         MOV     X19, (8*7)(X2)
33         MOV     X20, (8*8)(X2)
34         MOV     X21, (8*9)(X2)
35         MOV     X22, (8*10)(X2)
36         MOV     X23, (8*11)(X2)
37         MOV     X24, (8*12)(X2)
38         MOV     X25, (8*13)(X2)
39         MOV     X26, (8*14)(X2)
40         MOV     g, (8*15)(X2)
41         MOV     X1, (8*16)(X2)
42         MOVD    F8, (8*17)(X2)
43         MOVD    F9, (8*18)(X2)
44         MOVD    F18, (8*19)(X2)
45         MOVD    F19, (8*20)(X2)
46         MOVD    F20, (8*21)(X2)
47         MOVD    F21, (8*22)(X2)
48         MOVD    F22, (8*23)(X2)
49         MOVD    F23, (8*24)(X2)
50         MOVD    F24, (8*25)(X2)
51         MOVD    F25, (8*26)(X2)
52         MOVD    F26, (8*27)(X2)
53         MOVD    F27, (8*28)(X2)
54
55         // Initialize Go ABI environment
56         CALL    runtime·load_g(SB)
57         CALL    runtime·cgocallback(SB)
58
59         MOV     (8*4)(X2), X8
60         MOV     (8*5)(X2), X9
61         MOV     (8*6)(X2), X18
62         MOV     (8*7)(X2), X19
63         MOV     (8*8)(X2), X20
64         MOV     (8*9)(X2), X21
65         MOV     (8*10)(X2), X22
66         MOV     (8*11)(X2), X23
67         MOV     (8*12)(X2), X24
68         MOV     (8*13)(X2), X25
69         MOV     (8*14)(X2), X26
70         MOV     (8*15)(X2), g
71         MOV     (8*16)(X2), X1
72         MOVD    (8*17)(X2), F8
73         MOVD    (8*18)(X2), F9
74         MOVD    (8*19)(X2), F18
75         MOVD    (8*20)(X2), F19
76         MOVD    (8*21)(X2), F20
77         MOVD    (8*22)(X2), F21
78         MOVD    (8*23)(X2), F22
79         MOVD    (8*24)(X2), F23
80         MOVD    (8*25)(X2), F24
81         MOVD    (8*26)(X2), F25
82         MOVD    (8*27)(X2), F26
83         MOVD    (8*28)(X2), F27
84         ADD     $(8*29), X2
85
86         RET