|
97 | 97 | .extern pxCriticalNesting |
98 | 98 | /*-----------------------------------------------------------*/ |
99 | 99 |
|
| 100 | + .macro portcontexSAVE_FPU_CONTEXT_INTERNAL |
| 101 | +/* Check if the FPU has been used, if it has not, skip the context save */ |
| 102 | +srl t1, t0, MSTATUS_FS_USED_OFFSET |
| 103 | +andi t1, t1, 1 |
| 104 | +beqz t1, 1f /* The FPU has not been used (FS either initial or clean), skip context save */ |
| 105 | +/* Store the fp registers */ |
| 106 | +store_f f0, portFPUREG_OFFSET(0)( sp ) |
| 107 | +store_f f1, portFPUREG_OFFSET(1)( sp ) |
| 108 | +store_f f2, portFPUREG_OFFSET(2)( sp ) |
| 109 | +store_f f3, portFPUREG_OFFSET(3)( sp ) |
| 110 | +store_f f4, portFPUREG_OFFSET(4)( sp ) |
| 111 | +store_f f5, portFPUREG_OFFSET(5)( sp ) |
| 112 | +store_f f6, portFPUREG_OFFSET(6)( sp ) |
| 113 | +store_f f7, portFPUREG_OFFSET(7)( sp ) |
| 114 | +store_f f8, portFPUREG_OFFSET(8)( sp ) |
| 115 | +store_f f9, portFPUREG_OFFSET(9)( sp ) |
| 116 | +store_f f10, portFPUREG_OFFSET(10)( sp ) |
| 117 | +store_f f11, portFPUREG_OFFSET(11)( sp ) |
| 118 | +store_f f12, portFPUREG_OFFSET(12)( sp ) |
| 119 | +store_f f13, portFPUREG_OFFSET(13)( sp ) |
| 120 | +store_f f14, portFPUREG_OFFSET(14)( sp ) |
| 121 | +store_f f15, portFPUREG_OFFSET(15)( sp ) |
| 122 | +store_f f16, portFPUREG_OFFSET(16)( sp ) |
| 123 | +store_f f17, portFPUREG_OFFSET(17)( sp ) |
| 124 | +store_f f18, portFPUREG_OFFSET(18)( sp ) |
| 125 | +store_f f19, portFPUREG_OFFSET(19)( sp ) |
| 126 | +store_f f20, portFPUREG_OFFSET(20)( sp ) |
| 127 | +store_f f21, portFPUREG_OFFSET(21)( sp ) |
| 128 | +store_f f22, portFPUREG_OFFSET(22)( sp ) |
| 129 | +store_f f23, portFPUREG_OFFSET(23)( sp ) |
| 130 | +store_f f24, portFPUREG_OFFSET(24)( sp ) |
| 131 | +store_f f25, portFPUREG_OFFSET(25)( sp ) |
| 132 | +store_f f26, portFPUREG_OFFSET(26)( sp ) |
| 133 | +store_f f27, portFPUREG_OFFSET(27)( sp ) |
| 134 | +store_f f28, portFPUREG_OFFSET(28)( sp ) |
| 135 | +store_f f29, portFPUREG_OFFSET(29)( sp ) |
| 136 | +store_f f30, portFPUREG_OFFSET(30)( sp ) |
| 137 | +store_f f31, portFPUREG_OFFSET(31)( sp ) |
| 138 | +csrr t0, fcsr |
| 139 | +store_x t0, portFPUREG_OFFSET(32)( sp ) |
| 140 | +/* Mark the FPU as clean */ |
| 141 | +li t1, ~MSTATUS_FS_MASK |
| 142 | +and t0, t0, t1 |
| 143 | +li t1, MSTATUS_FS_CLEAN |
| 144 | +or t0, t0, t1 |
| 145 | +csrw mstatus, t0 |
| 146 | +1: |
| 147 | + .endm |
| 148 | +/*-----------------------------------------------------------*/ |
| 149 | + |
| 150 | + .macro portasmRESTORE_FPU_CONTEXT_INTERNAL |
| 151 | +/* Restore fp registers from context */ |
| 152 | +load_f f0, portFPUREG_OFFSET(0)( sp ) |
| 153 | +load_f f1, portFPUREG_OFFSET(0)( sp ) |
| 154 | +load_f f1, portFPUREG_OFFSET(1)( sp ) |
| 155 | +load_f f2, portFPUREG_OFFSET(2)( sp ) |
| 156 | +load_f f3, portFPUREG_OFFSET(3)( sp ) |
| 157 | +load_f f4, portFPUREG_OFFSET(4)( sp ) |
| 158 | +load_f f5, portFPUREG_OFFSET(5)( sp ) |
| 159 | +load_f f6, portFPUREG_OFFSET(6)( sp ) |
| 160 | +load_f f7, portFPUREG_OFFSET(7)( sp ) |
| 161 | +load_f f8, portFPUREG_OFFSET(8)( sp ) |
| 162 | +load_f f9, portFPUREG_OFFSET(9)( sp ) |
| 163 | +load_f f10, portFPUREG_OFFSET(10)( sp ) |
| 164 | +load_f f11, portFPUREG_OFFSET(11)( sp ) |
| 165 | +load_f f12, portFPUREG_OFFSET(12)( sp ) |
| 166 | +load_f f13, portFPUREG_OFFSET(13)( sp ) |
| 167 | +load_f f14, portFPUREG_OFFSET(14)( sp ) |
| 168 | +load_f f15, portFPUREG_OFFSET(15)( sp ) |
| 169 | +load_f f16, portFPUREG_OFFSET(16)( sp ) |
| 170 | +load_f f17, portFPUREG_OFFSET(17)( sp ) |
| 171 | +load_f f18, portFPUREG_OFFSET(18)( sp ) |
| 172 | +load_f f19, portFPUREG_OFFSET(19)( sp ) |
| 173 | +load_f f20, portFPUREG_OFFSET(20)( sp ) |
| 174 | +load_f f21, portFPUREG_OFFSET(21)( sp ) |
| 175 | +load_f f22, portFPUREG_OFFSET(22)( sp ) |
| 176 | +load_f f23, portFPUREG_OFFSET(23)( sp ) |
| 177 | +load_f f24, portFPUREG_OFFSET(24)( sp ) |
| 178 | +load_f f25, portFPUREG_OFFSET(25)( sp ) |
| 179 | +load_f f26, portFPUREG_OFFSET(26)( sp ) |
| 180 | +load_f f27, portFPUREG_OFFSET(27)( sp ) |
| 181 | +load_f f28, portFPUREG_OFFSET(28)( sp ) |
| 182 | +load_f f29, portFPUREG_OFFSET(29)( sp ) |
| 183 | +load_f f30, portFPUREG_OFFSET(30)( sp ) |
| 184 | +load_f f31, portFPUREG_OFFSET(31)( sp ) |
| 185 | +load_x t0, portFPUREG_OFFSET(32)( sp ) |
| 186 | +csrw fcsr, t0 |
| 187 | +1: |
| 188 | + .endm |
| 189 | +/*-----------------------------------------------------------*/ |
| 190 | + |
100 | 191 | .macro portcontextSAVE_CONTEXT_INTERNAL |
101 | 192 | addi sp, sp, -portCONTEXT_SIZE |
102 | 193 | store_x x1, 1 * portWORD_SIZE( sp ) |
@@ -136,6 +227,9 @@ store_x t0, portCRITICAL_NESTING_OFFSET * portWORD_SIZE( sp ) /* Store the criti |
136 | 227 |
|
137 | 228 | csrr t0, mstatus /* Required for MPIE bit. */ |
138 | 229 | store_x t0, portMSTATUS_OFFSET * portWORD_SIZE( sp ) |
| 230 | +#ifdef portasmSTORE_FPU_CONTEXT |
| 231 | +portcontexSAVE_FPU_CONTEXT_INTERNAL |
| 232 | +#endif /* ifdef portasmSTORE_FPU_CONTEXT */ |
139 | 233 |
|
140 | 234 |
|
141 | 235 | portasmSAVE_ADDITIONAL_REGISTERS /* Defined in freertos_risc_v_chip_specific_extensions.h to save any registers unique to the RISC-V implementation. */ |
@@ -176,6 +270,10 @@ csrw mepc, t0 |
176 | 270 | /* Defined in freertos_risc_v_chip_specific_extensions.h to restore any registers unique to the RISC-V implementation. */ |
177 | 271 | portasmRESTORE_ADDITIONAL_REGISTERS |
178 | 272 |
|
| 273 | +#ifdef portasmSTORE_FPU_CONTEXT |
| 274 | + portasmRESTORE_FPU_CONTEXT_INTERNAL |
| 275 | +#endif /* ifdef portasmSTORE_FPU_CONTEXT */ |
| 276 | + |
179 | 277 | /* Load mstatus with the interrupt enable bits used by the task. */ |
180 | 278 | load_x t0, portMSTATUS_OFFSET * portWORD_SIZE( sp ) |
181 | 279 | csrw mstatus, t0 /* Required for MPIE bit. */ |
|
0 commit comments