1// SPDX-License-Identifier: GPL-2.0+ OR BSD-2-Clause 2/* 3 * Copyright Heinrich Schuchardt <xypron.glpk@gmx.de> 4 */ 5 6 .text 7 .p2align 3 8 9#define GREG_LIST \ 10 REG_ONE(s0, 0); \ 11 REG_ONE(s1, 8); \ 12 REG_ONE(s2, 16); \ 13 REG_ONE(s3, 24); \ 14 REG_ONE(s4, 32); \ 15 REG_ONE(s5, 40); \ 16 REG_ONE(s6, 48); \ 17 REG_ONE(s7, 56); \ 18 REG_ONE(s8, 64); \ 19 REG_ONE(s9, 72); \ 20 REG_ONE(s10, 80); \ 21 REG_ONE(s11, 88); \ 22 REG_ONE(sp, 96); \ 23 REG_ONE(ra, 104); 24 25#define FREG_LIST \ 26 FREG_ONE(fs0, 112); \ 27 FREG_ONE(fs1, 120); \ 28 FREG_ONE(fs2, 128); \ 29 FREG_ONE(fs3, 136); \ 30 FREG_ONE(fs4, 144); \ 31 FREG_ONE(fs5, 152); \ 32 FREG_ONE(fs6, 160); \ 33 FREG_ONE(fs7, 168); \ 34 FREG_ONE(fs8, 176); \ 35 FREG_ONE(fs9, 184); \ 36 FREG_ONE(fs10, 192); \ 37 FREG_ONE(fs11, 200); 38 39#define REG_ONE(R, P) sd R, P(a0) 40#define FREG_ONE(R, P) fsd R, P(a0) 41 42 .globl setjmp 43 .type setjmp, @function 44 45setjmp: 46 GREG_LIST 47#ifndef __riscv_float_abi_soft 48 FREG_LIST 49#endif 50 li a0, 0 51 ret 52 53#undef REG_ONE 54#undef FREG_ONE 55 56#define REG_ONE(R, P) ld R, P(a0) 57#define FREG_ONE(R, P) fld R, P(a0) 58 59 .globl longjmp 60 .type longjmp, @function 61 62longjmp: 63 GREG_LIST 64#ifndef __riscv_float_abi_soft 65 FREG_LIST 66#endif 67 seqz a0, a1 68 add a0, a0, a1 69 ret 70 71#if defined(__ELF__) && defined(__linux__) 72 .section .note.GNU-stack,"",%progbits 73#endif 74