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