|
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 | #********************************************************************************************************
|
@@ -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)
|
@@ -176,7 +175,7 @@ OSCtxSw:
|
176 | 175 | .align 8
|
177 | 176 | ucos_intr_exception_handler:
|
178 | 177 | # save regs to current sp
|
179 |
| - addi sp, sp, -4*32 |
| 178 | + addi sp, sp, -4*64 |
180 | 179 | # store contents of register ra into memory [(0 * 4) + sp]
|
181 | 180 | sw ra, 0 * 4(sp)
|
182 | 181 | sw t0, 4 * 4(sp)
|
@@ -207,6 +206,40 @@ ucos_intr_exception_handler:
|
207 | 206 | sw t5, 29 * 4(sp)
|
208 | 207 | sw t6, 30 * 4(sp)
|
209 | 208 |
|
| 209 | + # save f0 to f31 registers (FPU registers) |
| 210 | + fsw f0, 32 * 4(sp) |
| 211 | + fsw f1, 33 * 4(sp) |
| 212 | + fsw f2, 34 * 4(sp) |
| 213 | + fsw f3, 35 * 4(sp) |
| 214 | + fsw f4, 36 * 4(sp) |
| 215 | + fsw f5, 37 * 4(sp) |
| 216 | + fsw f6, 38 * 4(sp) |
| 217 | + fsw f7, 39 * 4(sp) |
| 218 | + fsw f8, 40 * 4(sp) |
| 219 | + fsw f9, 41 * 4(sp) |
| 220 | + fsw f10, 42 * 4(sp) |
| 221 | + fsw f11, 43 * 4(sp) |
| 222 | + fsw f12, 44 * 4(sp) |
| 223 | + fsw f13, 45 * 4(sp) |
| 224 | + fsw f14, 46 * 4(sp) |
| 225 | + fsw f15, 47 * 4(sp) |
| 226 | + fsw f16, 48 * 4(sp) |
| 227 | + fsw f17, 49 * 4(sp) |
| 228 | + fsw f18, 50 * 4(sp) |
| 229 | + fsw f19, 51 * 4(sp) |
| 230 | + fsw f20, 52 * 4(sp) |
| 231 | + fsw f21, 53 * 4(sp) |
| 232 | + fsw f22, 54 * 4(sp) |
| 233 | + fsw f23, 55 * 4(sp) |
| 234 | + fsw f24, 56 * 4(sp) |
| 235 | + fsw f25, 57 * 4(sp) |
| 236 | + fsw f26, 58 * 4(sp) |
| 237 | + fsw f27, 59 * 4(sp) |
| 238 | + fsw f28, 60 * 4(sp) |
| 239 | + fsw f29, 61 * 4(sp) |
| 240 | + fsw f30, 62 * 4(sp) |
| 241 | + fsw f31, 63 * 4(sp) |
| 242 | + |
210 | 243 | # If it is a ecall, do not add 4 in mepc
|
211 | 244 | # otherwise add 4 in mepc
|
212 | 245 | li t1, ARCH_CPU_MCAUSE_CAUSE_MASK
|
@@ -321,8 +354,42 @@ Software_IRQHandler:
|
321 | 354 | lw t5, 29 * 4(sp)
|
322 | 355 | lw t6, 30 * 4(sp)
|
323 | 356 |
|
| 357 | + # Restore f0 to f31 registers (FPU registers) |
| 358 | + flw f0, 32 * 4(sp) |
| 359 | + flw f1, 33 * 4(sp) |
| 360 | + flw f2, 34 * 4(sp) |
| 361 | + flw f3, 35 * 4(sp) |
| 362 | + flw f4, 36 * 4(sp) |
| 363 | + flw f5, 37 * 4(sp) |
| 364 | + flw f6, 38 * 4(sp) |
| 365 | + flw f7, 39 * 4(sp) |
| 366 | + flw f8, 40 * 4(sp) |
| 367 | + flw f9, 41 * 4(sp) |
| 368 | + flw f10, 42 * 4(sp) |
| 369 | + flw f11, 43 * 4(sp) |
| 370 | + flw f12, 44 * 4(sp) |
| 371 | + flw f13, 45 * 4(sp) |
| 372 | + flw f14, 46 * 4(sp) |
| 373 | + flw f15, 47 * 4(sp) |
| 374 | + flw f16, 48 * 4(sp) |
| 375 | + flw f17, 49 * 4(sp) |
| 376 | + flw f18, 50 * 4(sp) |
| 377 | + flw f19, 51 * 4(sp) |
| 378 | + flw f20, 52 * 4(sp) |
| 379 | + flw f21, 53 * 4(sp) |
| 380 | + flw f22, 54 * 4(sp) |
| 381 | + flw f23, 55 * 4(sp) |
| 382 | + flw f24, 56 * 4(sp) |
| 383 | + flw f25, 57 * 4(sp) |
| 384 | + flw f26, 58 * 4(sp) |
| 385 | + flw f27, 59 * 4(sp) |
| 386 | + flw f28, 60 * 4(sp) |
| 387 | + flw f29, 61 * 4(sp) |
| 388 | + flw f30, 62 * 4(sp) |
| 389 | + flw f31, 63 * 4(sp) |
| 390 | + |
324 | 391 | # Compensate for the stack pointer
|
325 |
| - addi sp, sp, 4 * 32 |
| 392 | + addi sp, sp, 4 * 64 |
326 | 393 |
|
327 | 394 | # Exception return will restore remaining context
|
328 | 395 | # set MPIE = 1
|
|
0 commit comments