1/*
2   Distributed under the Boost Software License, Version 1.0.
3      (See accompanying file LICENSE_1_0.txt or copy at
4          http://www.boost.org/LICENSE_1_0.txt)
5*/
6/*******************************************************
7 *                                                     *
8 *  -------------------------------------------------  *
9 *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
10 *  -------------------------------------------------  *
11 *  | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c|  *
12 *  -------------------------------------------------  *
13 *  |    fs0    |    fs1    |    fs2    |    fs3    |  *
14 *  -------------------------------------------------  *
15 *  -------------------------------------------------  *
16 *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
17 *  -------------------------------------------------  *
18 *  | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c|  *
19 *  -------------------------------------------------  *
20 *  |    fs4    |    fs5    |    fs6    |    fs7    |  *
21 *  -------------------------------------------------  *
22 *  -------------------------------------------------  *
23 *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
24 *  -------------------------------------------------  *
25 *  | 0x40| 0x44| 0x48| 0x4c| 0x50| 0x54| 0x58| 0x5c|  *
26 *  -------------------------------------------------  *
27 *  |    fs8    |    fs9    |    fs10   |    fs11   |  *
28 *  -------------------------------------------------  *
29 *  -------------------------------------------------  *
30 *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
31 *  -------------------------------------------------  *
32 *  | 0x60| 0x64| 0x68| 0x6c| 0x70| 0x74| 0x78| 0x7c|  *
33 *  -------------------------------------------------  *
34 *  |    s0     |    s1     |    s2     |    s3     |  *
35 *  -------------------------------------------------  *
36 *  -------------------------------------------------  *
37 *  |  32 |  33 |  34 |  35 |  36 |  37 |  38 |  39 |  *
38 *  -------------------------------------------------  *
39 *  | 0x80| 0x84| 0x88| 0x8c| 0x90| 0x94| 0x98| 0x9c|  *
40 *  -------------------------------------------------  *
41 *  |    s4     |    s5     |    s6     |     s7    |  *
42 *  -------------------------------------------------  *
43 *  -------------------------------------------------  *
44 *  |  40 |  41 |  42 | 43  |  44 | 45  |  46 | 47  |  *
45 *  -------------------------------------------------  *
46 *  | 0xa0| 0xa4| 0xa8| 0xac| 0xb0| 0xb4| 0xb8| 0xbc|  *
47 *  -------------------------------------------------  *
48 *  |     s8    |     s9    |    s10    |    s11    |  *
49 *  -------------------------------------------------  *
50 *  -------------------------------------------------  *
51 *  |  48 |  49 |  50 | 51  |     |     |     |     |  *
52 *  -------------------------------------------------  *
53 *  | 0xc0| 0xc4| 0xc8| 0xcc|     |     |     |     |  *
54 *  -------------------------------------------------  *
55 *  |     ra    |     pc    |           |           |  *
56 *  -------------------------------------------------  *
57 *                                                     *
58 *******************************************************/
59
60.file "jump_riscv64_sysv_elf_gas.S"
61.text
62.align  1
63.global jump_fcontext
64.type   jump_fcontext, %function
65jump_fcontext:
66    # prepare stack for GP + FPU
67    addi  sp, sp, -0xd0
68
69    # save fs0 - fs11
70    fsd  fs0, 0x00(sp)
71    fsd  fs1, 0x08(sp)
72    fsd  fs2, 0x10(sp)
73    fsd  fs3, 0x18(sp)
74    fsd  fs4, 0x20(sp)
75    fsd  fs5, 0x28(sp)
76    fsd  fs6, 0x30(sp)
77    fsd  fs7, 0x38(sp)
78    fsd  fs8, 0x40(sp)
79    fsd  fs9, 0x48(sp)
80    fsd  fs10, 0x50(sp)
81    fsd  fs11, 0x58(sp)
82
83    # save s0-s11, ra
84    sd  s0, 0x60(sp)
85    sd  s1, 0x68(sp)
86    sd  s2, 0x70(sp)
87    sd  s3, 0x78(sp)
88    sd  s4, 0x80(sp)
89    sd  s5, 0x88(sp)
90    sd  s6, 0x90(sp)
91    sd  s7, 0x98(sp)
92    sd  s8, 0xa0(sp)
93    sd  s9, 0xa8(sp)
94    sd  s10, 0xb0(sp)
95    sd  s11, 0xb8(sp)
96    sd  ra, 0xc0(sp)
97
98    # save RA as PC
99    sd  ra, 0xc8(sp)
100
101    # store SP (pointing to context-data) in A2
102    mv  a2, sp
103
104    # restore SP (pointing to context-data) from A0
105    mv  sp, a0
106
107    # load fs0 - fs11
108    fld  fs0, 0x00(sp)
109    fld  fs1, 0x08(sp)
110    fld  fs2, 0x10(sp)
111    fld  fs3, 0x18(sp)
112    fld  fs4, 0x20(sp)
113    fld  fs5, 0x28(sp)
114    fld  fs6, 0x30(sp)
115    fld  fs7, 0x38(sp)
116    fld  fs8, 0x40(sp)
117    fld  fs9, 0x48(sp)
118    fld  fs10, 0x50(sp)
119    fld  fs11, 0x58(sp)
120
121    # load s0-s11,ra
122    ld  s0, 0x60(sp)
123    ld  s1, 0x68(sp)
124    ld  s2, 0x70(sp)
125    ld  s3, 0x78(sp)
126    ld  s4, 0x80(sp)
127    ld  s5, 0x88(sp)
128    ld  s6, 0x90(sp)
129    ld  s7, 0x98(sp)
130    ld  s8, 0xa0(sp)
131    ld  s9, 0xa8(sp)
132    ld  s10, 0xb0(sp)
133    ld  s11, 0xb8(sp)
134    ld  ra, 0xc0(sp)
135
136    # return transfer_t from jump
137    # pass transfer_t as first arg in context function
138    # a0 == FCTX, a1 == DATA
139    mv a0, a2
140
141    # load pc
142    ld  a2, 0xc8(sp)
143
144    # restore stack from GP + FPU
145    addi  sp, sp, 0xd0
146
147    jr a2
148.size   jump_fcontext,.-jump_fcontext
149# Mark that we don't need executable stack.
150.section .note.GNU-stack,"",%progbits
151