• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
26marl_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