Skip to content

Commit 845c86b

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 845c86b

File tree

2 files changed

+115
-10
lines changed

2 files changed

+115
-10
lines changed

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

Lines changed: 110 additions & 8 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
#********************************************************************************************************
@@ -71,7 +70,7 @@
7170
# a) Call OSTaskSwHook() then,
7271
# b) Set OSRunning to TRUE,
7372
# 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.
7574
# e) Enable interrupts (tasks will run with interrupts enabled).
7675
# f) Switch to highest priority task.
7776
#********************************************************************************************************
@@ -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)
@@ -139,9 +138,43 @@ OSStartHighRdy:
139138
lw t5, 29 * 4(sp)
140139
lw t6, 30 * 4(sp)
141140

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+
142175
# 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
145178

146179
# Use register t6 to jump to HIGHEST priority
147180
csrr t6, mepc
@@ -176,7 +209,7 @@ OSCtxSw:
176209
.align 8
177210
ucos_intr_exception_handler:
178211
# save regs to current sp
179-
addi sp, sp, -4*32
212+
addi sp, sp, -4*64
180213
# store contents of register ra into memory [(0 * 4) + sp]
181214
sw ra, 0 * 4(sp)
182215
sw t0, 4 * 4(sp)
@@ -207,6 +240,40 @@ ucos_intr_exception_handler:
207240
sw t5, 29 * 4(sp)
208241
sw t6, 30 * 4(sp)
209242

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+
210277
# If it is a ecall, do not add 4 in mepc
211278
# otherwise add 4 in mepc
212279
li t1, ARCH_CPU_MCAUSE_CAUSE_MASK
@@ -262,7 +329,8 @@ run_ecall_handler:
262329
# c) Get current ready thread TCB, OSTCBCurPtr = OSTCBHighRdyPtr;
263330
# d) Get new process SP from TCB, SP = OSTCBHighRdyPtr->StkPtr;
264331
# 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.
266334
# g) set MPIE = 1 to enable interrupt before returning.
267335
# h) Perform exception return which will restore remaining context.
268336
#
@@ -321,8 +389,42 @@ Software_IRQHandler:
321389
lw t5, 29 * 4(sp)
322390
lw t6, 30 * 4(sp)
323391

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+
324426
# Compensate for the stack pointer
325-
addi sp, sp, 4 * 32
427+
addi sp, sp, 4 * 64
326428

327429
# Exception return will restore remaining context
328430
# set MPIE = 1

Ports/RISC-V/RV32/GCC/os_cpu_c.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -306,8 +306,12 @@ CPU_STK *OSTaskStkInit (OS_TASK_PTR p_task,
306306
p_stk = &p_stk_base[stk_size]; /* Load stack pointer and align it to 16-bytes */
307307
p_stk = (CPU_STK *)((CPU_STK)(p_stk) & 0xFFFFFFF0u);
308308

309+
/* make space for floating point registers */
310+
for(int i = 0; i < 32; i++) {
311+
*(--p_stk) = (CPU_STK)0;
312+
}
313+
/* make space for base registers */
309314
*(--p_stk) = (CPU_STK) p_task; /* Entry Point */
310-
311315
*(--p_stk) = (CPU_STK) 0x31313131uL; /* t6 */
312316
*(--p_stk) = (CPU_STK) 0x30303030uL; /* t5 */
313317
*(--p_stk) = (CPU_STK) 0x29292929uL; /* t4 */
@@ -344,7 +348,6 @@ CPU_STK *OSTaskStkInit (OS_TASK_PTR p_task,
344348
*(--p_stk) = (CPU_STK) 0x03030303uL; /* gp: Global pointer */
345349
*(--p_stk) = (CPU_STK) 0x02020202uL; /* sp: Stack pointer */
346350
*(--p_stk) = (CPU_STK) OS_TaskReturn; /* ra: return address */
347-
348351
return (p_stk);
349352
}
350353

0 commit comments

Comments
 (0)