1 | // Copyright 2021 The Marl Authors. |
2 | // |
3 | // Licensed under the Apache License, Version 2.0 (the "License"); |
4 | // you may not use this file except in compliance with the License. |
5 | // You may obtain a copy of the License at |
6 | // |
7 | // https://www.apache.org/licenses/LICENSE-2.0 |
8 | // |
9 | // Unless required by applicable law or agreed to in writing, software |
10 | // distributed under the License is distributed on an "AS IS" BASIS, |
11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
12 | // See the License for the specific language governing permissions and |
13 | // limitations under the License. |
14 | |
15 | #if defined(__riscv) && __riscv_xlen == 64 |
16 | |
17 | #define MARL_BUILD_ASM 1 |
18 | #include "osfiber_asm_rv64.h" |
19 | |
20 | // void marl_fiber_swap(marl_fiber_context* from, const marl_fiber_context* to) |
21 | // a0: from |
22 | // a1: to |
23 | .text |
24 | .global marl_fiber_swap |
25 | .align 4 |
26 | marl_fiber_swap: |
27 | |
28 | // Save context 'from' |
29 | |
30 | // Store callee-preserved registers |
31 | sd s0, MARL_REG_s0(a0) |
32 | sd s1, MARL_REG_s1(a0) |
33 | sd s2, MARL_REG_s2(a0) |
34 | sd s3, MARL_REG_s3(a0) |
35 | sd s4, MARL_REG_s4(a0) |
36 | sd s5, MARL_REG_s5(a0) |
37 | sd s6, MARL_REG_s6(a0) |
38 | sd s7, MARL_REG_s7(a0) |
39 | sd s8, MARL_REG_s8(a0) |
40 | sd s9, MARL_REG_s9(a0) |
41 | sd s10, MARL_REG_s10(a0) |
42 | sd s11, MARL_REG_s11(a0) |
43 | |
44 | fsd fs0, MARL_REG_fs0(a0) |
45 | fsd fs1, MARL_REG_fs1(a0) |
46 | fsd fs2, MARL_REG_fs2(a0) |
47 | fsd fs3, MARL_REG_fs3(a0) |
48 | fsd fs4, MARL_REG_fs4(a0) |
49 | fsd fs5, MARL_REG_fs5(a0) |
50 | fsd fs6, MARL_REG_fs6(a0) |
51 | fsd fs7, MARL_REG_fs7(a0) |
52 | fsd fs8, MARL_REG_fs8(a0) |
53 | fsd fs9, MARL_REG_fs9(a0) |
54 | fsd fs10, MARL_REG_fs10(a0) |
55 | fsd fs11, MARL_REG_fs11(a0) |
56 | |
57 | sd sp, MARL_REG_sp(a0) |
58 | // On RISC-V ra is caller-saved |
59 | // but we need ra to jump to the trampoline |
60 | sd ra, MARL_REG_ra(a0) |
61 | |
62 | move t0, a1 // Store a1 in temporary register |
63 | |
64 | // Recover callee-preserved registers |
65 | ld s0, MARL_REG_s0(t0) |
66 | ld s1, MARL_REG_s1(t0) |
67 | ld s2, MARL_REG_s2(t0) |
68 | ld s3, MARL_REG_s3(t0) |
69 | ld s4, MARL_REG_s4(t0) |
70 | ld s5, MARL_REG_s5(t0) |
71 | ld s6, MARL_REG_s6(t0) |
72 | ld s7, MARL_REG_s7(t0) |
73 | ld s8, MARL_REG_s8(t0) |
74 | ld s9, MARL_REG_s9(t0) |
75 | ld s10, MARL_REG_s10(t0) |
76 | ld s11, MARL_REG_s11(t0) |
77 | |
78 | fld fs0, MARL_REG_fs0(t0) |
79 | fld fs1, MARL_REG_fs1(t0) |
80 | fld fs2, MARL_REG_fs2(t0) |
81 | fld fs3, MARL_REG_fs3(t0) |
82 | fld fs4, MARL_REG_fs4(t0) |
83 | fld fs5, MARL_REG_fs5(t0) |
84 | fld fs6, MARL_REG_fs6(t0) |
85 | fld fs7, MARL_REG_fs7(t0) |
86 | fld fs8, MARL_REG_fs8(t0) |
87 | fld fs9, MARL_REG_fs9(t0) |
88 | fld fs10, MARL_REG_fs10(t0) |
89 | fld fs11, MARL_REG_fs11(t0) |
90 | |
91 | ld sp, MARL_REG_sp(t0) |
92 | ld ra, MARL_REG_ra(t0) |
93 | |
94 | // Recover arguments |
95 | ld a0, MARL_REG_a0(t0) |
96 | ld a1, MARL_REG_a1(t0) |
97 | |
98 | jr ra // Jump to the trampoline |
99 | |
100 | #endif // defined(__riscv) && __riscv_xlen == 64 |
101 | |