summaryrefslogtreecommitdiff
path: root/core/riscv-rv32i/switch.S
diff options
context:
space:
mode:
authorDino Li <Dino.Li@ite.com.tw>2020-05-05 11:50:47 +0800
committerCommit Bot <commit-bot@chromium.org>2020-05-13 15:46:23 +0000
commitffa5571e4d7de4dc96ba36f5069e3ff150bde071 (patch)
tree4c95daf590aefe2b193fe67dbb63c811accf1d6f /core/riscv-rv32i/switch.S
parent0b034696389e0c6a9aa8b1397a49cf8548ccee05 (diff)
downloadchrome-ec-ffa5571e4d7de4dc96ba36f5069e3ff150bde071.tar.gz
risc-v: add comments about not needing 16-byte stack frame alignment
Since we are not actually executing on a stack frame that is not 16-byte aligned, we are following the guidance (linked below). Add comments for future developers to explain why. Also, saving system stack pointer in the switch to function since the isr function takes special care to not over write the stack pointer when we are already using the system stack. According to documentation, the stack frame should be 128-bit aligned upon entering function boundaries. "In the standard RISC-V calling convention, the stack pointer sp is always 16-byte aligned" from https://riscv.org/specifications/isa-spec-pdf/ "The stack grows downwards (towards lower addresses) and the stack pointer shall be aligned to a 128-bit boundary upon procedure entry" from https://github.com/riscv/riscv-elf-psabi-doc/blob/master/riscv-elf.md See also documentation issues discussing this https://github.com/riscv/riscv-elf-psabi-doc/issues/21 BRANCH=none BUG=none TEST=ITE RISC-V FPU implementation still works Signed-off-by: Jett Rink <jettrink@chromium.org> Change-Id: I3460e6ee2b68c7793c72517e7d2d9bc645aaea65 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2173119 Tested-by: Dino Li <Dino.Li@ite.com.tw> Reviewed-by: Aseda Aboagye <aaboagye@chromium.org>
Diffstat (limited to 'core/riscv-rv32i/switch.S')
-rw-r--r--core/riscv-rv32i/switch.S13
1 files changed, 12 insertions, 1 deletions
diff --git a/core/riscv-rv32i/switch.S b/core/riscv-rv32i/switch.S
index cfff3e8bc3..b31e75076a 100644
--- a/core/riscv-rv32i/switch.S
+++ b/core/riscv-rv32i/switch.S
@@ -43,6 +43,8 @@ __switch_task:
beq a0, t0, __irq_exit
/* save our new scheduled task */
sw a0, 0(t1)
+ /* save our current location in system stack so we can restore at end */
+ add t3, sp, zero
/* restore current process stack pointer */
csrr sp, mscratch
/* get the task program counter saved at exception entry */
@@ -76,10 +78,18 @@ __switch_task:
fsw fs0, -13*4(sp)
/* save program counter on the current process stack */
sw t5, -25*4(sp)
+ /*
+ * Note: we never execute on this stack frame, so it does not need to
+ * be 16-byte aligned.
+ */
addi sp, sp, -25*4
#else
/* save program counter on the current process stack */
sw t5, -13*4(sp)
+ /*
+ * Note: we never execute on this stack frame, so it does not need to
+ * be 16-byte aligned.
+ */
addi sp, sp, -13*4
#endif
/* save the task stack pointer in its context */
@@ -128,7 +138,8 @@ __switch_task:
* __irq_exit will restore sp from scratch register again before mret.
*/
csrw mscratch, sp
- la sp, stack_end
+ /* restore system stack */
+ add sp, t3, zero
j __irq_exit
/**