1/* Save and set current context. 2 Copyright (C) 2009-2022 Free Software Foundation, Inc. 3 This file is part of the GNU C Library. 4 5 The GNU C Library is free software; you can redistribute it and/or 6 modify it under the terms of the GNU Lesser General Public 7 License as published by the Free Software Foundation; either 8 version 2.1 of the License, or (at your option) any later version. 9 10 The GNU C Library is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 Lesser General Public License for more details. 14 15 You should have received a copy of the GNU Lesser General Public 16 License along with the GNU C Library. If not, see 17 <https://www.gnu.org/licenses/>. */ 18 19#include "ucontext-macros.h" 20 21/* int swapcontext (ucontext_t *oucp, const ucontext_t *ucp) */ 22 23LEAF (__swapcontext) 24 mv t0, a1 /* Save ucp into t0. */ 25 26 SAVE_INT_REG (ra, 0, a0) 27 SAVE_INT_REG (ra, 1, a0) 28 SAVE_INT_REG (sp, 2, a0) 29 SAVE_INT_REG (s0, 8, a0) 30 SAVE_INT_REG (s1, 9, a0) 31 SAVE_INT_REG (x0, 10, a0) /* return 0 by overwriting a0. */ 32 SAVE_INT_REG (s2, 18, a0) 33 SAVE_INT_REG (s3, 19, a0) 34 SAVE_INT_REG (s4, 20, a0) 35 SAVE_INT_REG (s5, 21, a0) 36 SAVE_INT_REG (s6, 22, a0) 37 SAVE_INT_REG (s7, 23, a0) 38 SAVE_INT_REG (s8, 24, a0) 39 SAVE_INT_REG (s9, 25, a0) 40 SAVE_INT_REG (s10, 26, a0) 41 SAVE_INT_REG (s11, 27, a0) 42 43#ifndef __riscv_float_abi_soft 44 frsr a1 45 46 SAVE_FP_REG (fs0, 8, a0) 47 SAVE_FP_REG (fs1, 9, a0) 48 SAVE_FP_REG (fs2, 18, a0) 49 SAVE_FP_REG (fs3, 19, a0) 50 SAVE_FP_REG (fs4, 20, a0) 51 SAVE_FP_REG (fs5, 21, a0) 52 SAVE_FP_REG (fs6, 22, a0) 53 SAVE_FP_REG (fs7, 23, a0) 54 SAVE_FP_REG (fs8, 24, a0) 55 SAVE_FP_REG (fs9, 25, a0) 56 SAVE_FP_REG (fs10, 26, a0) 57 SAVE_FP_REG (fs11, 27, a0) 58 59 sw a1, MCONTEXT_FSR(a0) 60#endif /* __riscv_float_abi_soft */ 61 62/* rt_sigprocmask (SIG_SETMASK, &ucp->uc_sigmask, &oucp->uc_sigmask, _NSIG8) */ 63 li a3, _NSIG8 64 add a2, a0, UCONTEXT_SIGMASK 65 add a1, t0, UCONTEXT_SIGMASK 66 li a0, SIG_SETMASK 67 68 li a7, SYS_ify (rt_sigprocmask) 69 scall 70 71 bltz a0, 99f 72 73#ifndef __riscv_float_abi_soft 74 lw t1, MCONTEXT_FSR(t0) 75 76 RESTORE_FP_REG (fs0, 8, t0) 77 RESTORE_FP_REG (fs1, 9, t0) 78 RESTORE_FP_REG (fs2, 18, t0) 79 RESTORE_FP_REG (fs3, 19, t0) 80 RESTORE_FP_REG (fs4, 20, t0) 81 RESTORE_FP_REG (fs5, 21, t0) 82 RESTORE_FP_REG (fs6, 22, t0) 83 RESTORE_FP_REG (fs7, 23, t0) 84 RESTORE_FP_REG (fs8, 24, t0) 85 RESTORE_FP_REG (fs9, 25, t0) 86 RESTORE_FP_REG (fs10, 26, t0) 87 RESTORE_FP_REG (fs11, 27, t0) 88 89 fssr t1 90#endif /* __riscv_float_abi_soft */ 91 92 /* Note the contents of argument registers will be random 93 unless makecontext() has been called. */ 94 RESTORE_INT_REG (t1, 0, t0) 95 RESTORE_INT_REG (ra, 1, t0) 96 RESTORE_INT_REG (sp, 2, t0) 97 RESTORE_INT_REG (s0, 8, t0) 98 RESTORE_INT_REG (s1, 9, t0) 99 RESTORE_INT_REG (a0, 10, t0) 100 RESTORE_INT_REG (a1, 11, t0) 101 RESTORE_INT_REG (a2, 12, t0) 102 RESTORE_INT_REG (a3, 13, t0) 103 RESTORE_INT_REG (a4, 14, t0) 104 RESTORE_INT_REG (a5, 15, t0) 105 RESTORE_INT_REG (a6, 16, t0) 106 RESTORE_INT_REG (a7, 17, t0) 107 RESTORE_INT_REG (s2, 18, t0) 108 RESTORE_INT_REG (s3, 19, t0) 109 RESTORE_INT_REG (s4, 20, t0) 110 RESTORE_INT_REG (s5, 21, t0) 111 RESTORE_INT_REG (s6, 22, t0) 112 RESTORE_INT_REG (s7, 23, t0) 113 RESTORE_INT_REG (s8, 24, t0) 114 RESTORE_INT_REG (s9, 25, t0) 115 RESTORE_INT_REG (s10, 26, t0) 116 RESTORE_INT_REG (s11, 27, t0) 117 118 jr t1 119 120 12199: j __syscall_error 122 123PSEUDO_END (__swapcontext) 124 125weak_alias (__swapcontext, swapcontext) 126