|
23 | 23 | # For : RISC-V RV32 |
24 | 24 | # Toolchain : GNU C Compiler |
25 | 25 | #******************************************************************************************************** |
26 | | -# Note(s) : Hardware FP is not supported. |
27 | 26 | #******************************************************************************************************** |
28 | 27 |
|
29 | 28 | #******************************************************************************************************** |
|
71 | 70 | # a) Call OSTaskSwHook() then, |
72 | 71 | # b) Set OSRunning to TRUE, |
73 | 72 | # c) Set OSTCBHighRdyPtr->StkPtr = SP |
74 | | -# d) Restore x1-x31; There is no need to restore x0 since it is always zero. |
| 73 | +# d) Restore x1-x31 and f0-f31; There is no need to restore x0 since it is always zero. |
75 | 74 | # e) Enable interrupts (tasks will run with interrupts enabled). |
76 | 75 | # f) Switch to highest priority task. |
77 | 76 | #******************************************************************************************************** |
@@ -108,7 +107,7 @@ OSStartHighRdy: |
108 | 107 | # value stored in t0 is stored into mepc |
109 | 108 | csrw mepc, t0 |
110 | 109 |
|
111 | | -# Restore x1 to x31 registers |
| 110 | +# Restore x1 to x31 registers (base registers) |
112 | 111 | # load word from memory addres [(0 * 4) + sp] into ra register |
113 | 112 | lw ra, 0 * 4(sp) |
114 | 113 | lw t0, 4 * 4(sp) |
@@ -139,9 +138,43 @@ OSStartHighRdy: |
139 | 138 | lw t5, 29 * 4(sp) |
140 | 139 | lw t6, 30 * 4(sp) |
141 | 140 |
|
| 141 | + #Restore f0 to f31 registers (FP registers) |
| 142 | + flw f0, 32 * 4(sp) |
| 143 | + flw f1, 33 * 4(sp) |
| 144 | + flw f2, 34 * 4(sp) |
| 145 | + flw f3, 35 * 4(sp) |
| 146 | + flw f4, 36 * 4(sp) |
| 147 | + flw f5, 37 * 4(sp) |
| 148 | + flw f6, 38 * 4(sp) |
| 149 | + flw f7, 39 * 4(sp) |
| 150 | + flw f8, 40 * 4(sp) |
| 151 | + flw f9, 41 * 4(sp) |
| 152 | + flw f10, 42 * 4(sp) |
| 153 | + flw f11, 43 * 4(sp) |
| 154 | + flw f12, 44 * 4(sp) |
| 155 | + flw f13, 45 * 4(sp) |
| 156 | + flw f14, 46 * 4(sp) |
| 157 | + flw f15, 47 * 4(sp) |
| 158 | + flw f16, 48 * 4(sp) |
| 159 | + flw f17, 49 * 4(sp) |
| 160 | + flw f18, 50 * 4(sp) |
| 161 | + flw f19, 51 * 4(sp) |
| 162 | + flw f20, 52 * 4(sp) |
| 163 | + flw f21, 53 * 4(sp) |
| 164 | + flw f22, 54 * 4(sp) |
| 165 | + flw f23, 55 * 4(sp) |
| 166 | + flw f24, 56 * 4(sp) |
| 167 | + flw f25, 57 * 4(sp) |
| 168 | + flw f26, 58 * 4(sp) |
| 169 | + flw f27, 59 * 4(sp) |
| 170 | + flw f28, 60 * 4(sp) |
| 171 | + flw f29, 61 * 4(sp) |
| 172 | + flw f30, 62 * 4(sp) |
| 173 | + flw f31, 63 * 4(sp) |
| 174 | + |
142 | 175 | # Compensate for the stack pointer |
143 | | - # sp = sp + 32 * 4 |
144 | | - addi sp, sp, 32 * 4 |
| 176 | + # sp = sp + 64 * 4 |
| 177 | + addi sp, sp, 64 * 4 |
145 | 178 |
|
146 | 179 | # Use register t6 to jump to HIGHEST priority |
147 | 180 | csrr t6, mepc |
@@ -176,7 +209,7 @@ OSCtxSw: |
176 | 209 | .align 8 |
177 | 210 | ucos_intr_exception_handler: |
178 | 211 | # save regs to current sp |
179 | | - addi sp, sp, -4*32 |
| 212 | + addi sp, sp, -4*64 |
180 | 213 | # store contents of register ra into memory [(0 * 4) + sp] |
181 | 214 | sw ra, 0 * 4(sp) |
182 | 215 | sw t0, 4 * 4(sp) |
@@ -207,6 +240,40 @@ ucos_intr_exception_handler: |
207 | 240 | sw t5, 29 * 4(sp) |
208 | 241 | sw t6, 30 * 4(sp) |
209 | 242 |
|
| 243 | + # save f0 to f31 registers (FPU registers) |
| 244 | + fsw f0, 32 * 4(sp) |
| 245 | + fsw f1, 33 * 4(sp) |
| 246 | + fsw f2, 34 * 4(sp) |
| 247 | + fsw f3, 35 * 4(sp) |
| 248 | + fsw f4, 36 * 4(sp) |
| 249 | + fsw f5, 37 * 4(sp) |
| 250 | + fsw f6, 38 * 4(sp) |
| 251 | + fsw f7, 39 * 4(sp) |
| 252 | + fsw f8, 40 * 4(sp) |
| 253 | + fsw f9, 41 * 4(sp) |
| 254 | + fsw f10, 42 * 4(sp) |
| 255 | + fsw f11, 43 * 4(sp) |
| 256 | + fsw f12, 44 * 4(sp) |
| 257 | + fsw f13, 45 * 4(sp) |
| 258 | + fsw f14, 46 * 4(sp) |
| 259 | + fsw f15, 47 * 4(sp) |
| 260 | + fsw f16, 48 * 4(sp) |
| 261 | + fsw f17, 49 * 4(sp) |
| 262 | + fsw f18, 50 * 4(sp) |
| 263 | + fsw f19, 51 * 4(sp) |
| 264 | + fsw f20, 52 * 4(sp) |
| 265 | + fsw f21, 53 * 4(sp) |
| 266 | + fsw f22, 54 * 4(sp) |
| 267 | + fsw f23, 55 * 4(sp) |
| 268 | + fsw f24, 56 * 4(sp) |
| 269 | + fsw f25, 57 * 4(sp) |
| 270 | + fsw f26, 58 * 4(sp) |
| 271 | + fsw f27, 59 * 4(sp) |
| 272 | + fsw f28, 60 * 4(sp) |
| 273 | + fsw f29, 61 * 4(sp) |
| 274 | + fsw f30, 62 * 4(sp) |
| 275 | + fsw f31, 63 * 4(sp) |
| 276 | + |
210 | 277 | # If it is a ecall, do not add 4 in mepc |
211 | 278 | # otherwise add 4 in mepc |
212 | 279 | li t1, ARCH_CPU_MCAUSE_CAUSE_MASK |
@@ -262,7 +329,8 @@ run_ecall_handler: |
262 | 329 | # c) Get current ready thread TCB, OSTCBCurPtr = OSTCBHighRdyPtr; |
263 | 330 | # d) Get new process SP from TCB, SP = OSTCBHighRdyPtr->StkPtr; |
264 | 331 | # e) Retrieve the address at which exception happened. |
265 | | -# f) Restore x1-x31 from new process stack; x0 is always zero. |
| 332 | +# f) Restore x1-x31(base registers) and f0-f31(FP registers) |
| 333 | +# from new process stack; x0 is always zero. |
266 | 334 | # g) set MPIE = 1 to enable interrupt before returning. |
267 | 335 | # h) Perform exception return which will restore remaining context. |
268 | 336 | # |
@@ -321,8 +389,42 @@ Software_IRQHandler: |
321 | 389 | lw t5, 29 * 4(sp) |
322 | 390 | lw t6, 30 * 4(sp) |
323 | 391 |
|
| 392 | + # Restore f0 to f31 registers (FPU registers) |
| 393 | + flw f0, 32 * 4(sp) |
| 394 | + flw f1, 33 * 4(sp) |
| 395 | + flw f2, 34 * 4(sp) |
| 396 | + flw f3, 35 * 4(sp) |
| 397 | + flw f4, 36 * 4(sp) |
| 398 | + flw f5, 37 * 4(sp) |
| 399 | + flw f6, 38 * 4(sp) |
| 400 | + flw f7, 39 * 4(sp) |
| 401 | + flw f8, 40 * 4(sp) |
| 402 | + flw f9, 41 * 4(sp) |
| 403 | + flw f10, 42 * 4(sp) |
| 404 | + flw f11, 43 * 4(sp) |
| 405 | + flw f12, 44 * 4(sp) |
| 406 | + flw f13, 45 * 4(sp) |
| 407 | + flw f14, 46 * 4(sp) |
| 408 | + flw f15, 47 * 4(sp) |
| 409 | + flw f16, 48 * 4(sp) |
| 410 | + flw f17, 49 * 4(sp) |
| 411 | + flw f18, 50 * 4(sp) |
| 412 | + flw f19, 51 * 4(sp) |
| 413 | + flw f20, 52 * 4(sp) |
| 414 | + flw f21, 53 * 4(sp) |
| 415 | + flw f22, 54 * 4(sp) |
| 416 | + flw f23, 55 * 4(sp) |
| 417 | + flw f24, 56 * 4(sp) |
| 418 | + flw f25, 57 * 4(sp) |
| 419 | + flw f26, 58 * 4(sp) |
| 420 | + flw f27, 59 * 4(sp) |
| 421 | + flw f28, 60 * 4(sp) |
| 422 | + flw f29, 61 * 4(sp) |
| 423 | + flw f30, 62 * 4(sp) |
| 424 | + flw f31, 63 * 4(sp) |
| 425 | + |
324 | 426 | # Compensate for the stack pointer |
325 | | - addi sp, sp, 4 * 32 |
| 427 | + addi sp, sp, 4 * 64 |
326 | 428 |
|
327 | 429 | # Exception return will restore remaining context |
328 | 430 | # set MPIE = 1 |
|
0 commit comments