Skip to content

Commit e538abc

Browse files
committed
feat : enable FPU in UCOS
This change enable the saving and restoring of FPU registers during context switch. [ISDK-60](https://iontra.atlassian.net/browse/ISDK-60) Signed-off-by: Gaurav <[email protected]>
1 parent 5be7f3b commit e538abc

File tree

1 file changed

+71
-4
lines changed

1 file changed

+71
-4
lines changed

Ports/RISC-V/RV32/GCC/os_cpu_a.S

Lines changed: 71 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
# For : RISC-V RV32
2424
# Toolchain : GNU C Compiler
2525
#********************************************************************************************************
26-
# Note(s) : Hardware FP is not supported.
2726
#********************************************************************************************************
2827

2928
#********************************************************************************************************
@@ -108,7 +107,7 @@ OSStartHighRdy:
108107
# value stored in t0 is stored into mepc
109108
csrw mepc, t0
110109

111-
# Restore x1 to x31 registers
110+
# Restore x1 to x31 registers (base registers)
112111
# load word from memory addres [(0 * 4) + sp] into ra register
113112
lw ra, 0 * 4(sp)
114113
lw t0, 4 * 4(sp)
@@ -176,7 +175,7 @@ OSCtxSw:
176175
.align 8
177176
ucos_intr_exception_handler:
178177
# save regs to current sp
179-
addi sp, sp, -4*32
178+
addi sp, sp, -4*64
180179
# store contents of register ra into memory [(0 * 4) + sp]
181180
sw ra, 0 * 4(sp)
182181
sw t0, 4 * 4(sp)
@@ -207,6 +206,40 @@ ucos_intr_exception_handler:
207206
sw t5, 29 * 4(sp)
208207
sw t6, 30 * 4(sp)
209208

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+
210243
# If it is a ecall, do not add 4 in mepc
211244
# otherwise add 4 in mepc
212245
li t1, ARCH_CPU_MCAUSE_CAUSE_MASK
@@ -321,8 +354,42 @@ Software_IRQHandler:
321354
lw t5, 29 * 4(sp)
322355
lw t6, 30 * 4(sp)
323356

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+
324391
# Compensate for the stack pointer
325-
addi sp, sp, 4 * 32
392+
addi sp, sp, 4 * 64
326393

327394
# Exception return will restore remaining context
328395
# set MPIE = 1

0 commit comments

Comments
 (0)