|
@@ -1,5 +1,5 @@
|
|
|
/*
|
|
|
- * Copyright (c) 2006-2021, RT-Thread Development Team
|
|
|
+ * Copyright (c) 2006-2024, RT-Thread Development Team
|
|
|
*
|
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
|
*
|
|
@@ -8,61 +8,59 @@
|
|
|
* 2021-02-02 lizhirui first version
|
|
|
* 2021-02-11 lizhirui fixed gp save/store bug
|
|
|
* 2021-11-18 JasonHu add fpu registers save/restore
|
|
|
+ * 2022-10-22 Shell Support kernel mode RVV
|
|
|
*/
|
|
|
|
|
|
#ifndef __STACKFRAME_H__
|
|
|
#define __STACKFRAME_H__
|
|
|
|
|
|
+#include <rtconfig.h>
|
|
|
+#include "encoding.h"
|
|
|
+#include "ext_context.h"
|
|
|
+
|
|
|
+/* bytes of register width */
|
|
|
+#ifdef ARCH_CPU_64BIT
|
|
|
+#define STORE sd
|
|
|
+#define LOAD ld
|
|
|
+#define FSTORE fsd
|
|
|
+#define FLOAD fld
|
|
|
+#define REGBYTES 8
|
|
|
+#else
|
|
|
+// error here, not portable
|
|
|
+#error "Not supported XLEN"
|
|
|
+#endif
|
|
|
+
|
|
|
+/* 33 general register + 1 padding */
|
|
|
+#define CTX_GENERAL_REG_NR 34
|
|
|
+
|
|
|
+/* all context registers */
|
|
|
+#define CTX_REG_NR (CTX_GENERAL_REG_NR + CTX_FPU_REG_NR + CTX_VECTOR_REG_NR)
|
|
|
+
|
|
|
#define BYTES(idx) ((idx) * REGBYTES)
|
|
|
#define FRAME_OFF_SSTATUS BYTES(2)
|
|
|
#define FRAME_OFF_SP BYTES(32)
|
|
|
#define FRAME_OFF_GP BYTES(3)
|
|
|
|
|
|
-#include "cpuport.h"
|
|
|
-#include "encoding.h"
|
|
|
-
|
|
|
-#ifdef ARCH_RISCV_FPU
|
|
|
-#define FPU_CTX_F0_OFF 0 /* offsetof(fpu_context_t, fpustatus.f[0]) - offsetof(fpu_context_t, fpustatus.f[0]) */
|
|
|
-#define FPU_CTX_F1_OFF 8 /* offsetof(fpu_context_t, fpustatus.f[1]) - offsetof(fpu_context_t, fpustatus.f[0]) */
|
|
|
-#define FPU_CTX_F2_OFF 16 /* offsetof(fpu_context_t, fpustatus.f[2]) - offsetof(fpu_context_t, fpustatus.f[0]) */
|
|
|
-#define FPU_CTX_F3_OFF 24 /* offsetof(fpu_context_t, fpustatus.f[3]) - offsetof(fpu_context_t, fpustatus.f[0]) */
|
|
|
-#define FPU_CTX_F4_OFF 32 /* offsetof(fpu_context_t, fpustatus.f[4]) - offsetof(fpu_context_t, fpustatus.f[0]) */
|
|
|
-#define FPU_CTX_F5_OFF 40 /* offsetof(fpu_context_t, fpustatus.f[5]) - offsetof(fpu_context_t, fpustatus.f[0]) */
|
|
|
-#define FPU_CTX_F6_OFF 48 /* offsetof(fpu_context_t, fpustatus.f[6]) - offsetof(fpu_context_t, fpustatus.f[0]) */
|
|
|
-#define FPU_CTX_F7_OFF 56 /* offsetof(fpu_context_t, fpustatus.f[7]) - offsetof(fpu_context_t, fpustatus.f[0]) */
|
|
|
-#define FPU_CTX_F8_OFF 64 /* offsetof(fpu_context_t, fpustatus.f[8]) - offsetof(fpu_context_t, fpustatus.f[0]) */
|
|
|
-#define FPU_CTX_F9_OFF 72 /* offsetof(fpu_context_t, fpustatus.f[9]) - offsetof(fpu_context_t, fpustatus.f[0]) */
|
|
|
-#define FPU_CTX_F10_OFF 80 /* offsetof(fpu_context_t, fpustatus.f[10]) - offsetof(fpu_context_t, fpustatus.f[0]) */
|
|
|
-#define FPU_CTX_F11_OFF 88 /* offsetof(fpu_context_t, fpustatus.f[11]) - offsetof(fpu_context_t, fpustatus.f[0]) */
|
|
|
-#define FPU_CTX_F12_OFF 96 /* offsetof(fpu_context_t, fpustatus.f[12]) - offsetof(fpu_context_t, fpustatus.f[0]) */
|
|
|
-#define FPU_CTX_F13_OFF 104 /* offsetof(fpu_context_t, fpustatus.f[13]) - offsetof(fpu_context_t, fpustatus.f[0]) */
|
|
|
-#define FPU_CTX_F14_OFF 112 /* offsetof(fpu_context_t, fpustatus.f[14]) - offsetof(fpu_context_t, fpustatus.f[0]) */
|
|
|
-#define FPU_CTX_F15_OFF 120 /* offsetof(fpu_context_t, fpustatus.f[15]) - offsetof(fpu_context_t, fpustatus.f[0]) */
|
|
|
-#define FPU_CTX_F16_OFF 128 /* offsetof(fpu_context_t, fpustatus.f[16]) - offsetof(fpu_context_t, fpustatus.f[0]) */
|
|
|
-#define FPU_CTX_F17_OFF 136 /* offsetof(fpu_context_t, fpustatus.f[17]) - offsetof(fpu_context_t, fpustatus.f[0]) */
|
|
|
-#define FPU_CTX_F18_OFF 144 /* offsetof(fpu_context_t, fpustatus.f[18]) - offsetof(fpu_context_t, fpustatus.f[0]) */
|
|
|
-#define FPU_CTX_F19_OFF 152 /* offsetof(fpu_context_t, fpustatus.f[19]) - offsetof(fpu_context_t, fpustatus.f[0]) */
|
|
|
-#define FPU_CTX_F20_OFF 160 /* offsetof(fpu_context_t, fpustatus.f[20]) - offsetof(fpu_context_t, fpustatus.f[0]) */
|
|
|
-#define FPU_CTX_F21_OFF 168 /* offsetof(fpu_context_t, fpustatus.f[21]) - offsetof(fpu_context_t, fpustatus.f[0]) */
|
|
|
-#define FPU_CTX_F22_OFF 176 /* offsetof(fpu_context_t, fpustatus.f[22]) - offsetof(fpu_context_t, fpustatus.f[0]) */
|
|
|
-#define FPU_CTX_F23_OFF 184 /* offsetof(fpu_context_t, fpustatus.f[23]) - offsetof(fpu_context_t, fpustatus.f[0]) */
|
|
|
-#define FPU_CTX_F24_OFF 192 /* offsetof(fpu_context_t, fpustatus.f[24]) - offsetof(fpu_context_t, fpustatus.f[0]) */
|
|
|
-#define FPU_CTX_F25_OFF 200 /* offsetof(fpu_context_t, fpustatus.f[25]) - offsetof(fpu_context_t, fpustatus.f[0]) */
|
|
|
-#define FPU_CTX_F26_OFF 208 /* offsetof(fpu_context_t, fpustatus.f[26]) - offsetof(fpu_context_t, fpustatus.f[0]) */
|
|
|
-#define FPU_CTX_F27_OFF 216 /* offsetof(fpu_context_t, fpustatus.f[27]) - offsetof(fpu_context_t, fpustatus.f[0]) */
|
|
|
-#define FPU_CTX_F28_OFF 224 /* offsetof(fpu_context_t, fpustatus.f[28]) - offsetof(fpu_context_t, fpustatus.f[0]) */
|
|
|
-#define FPU_CTX_F29_OFF 232 /* offsetof(fpu_context_t, fpustatus.f[29]) - offsetof(fpu_context_t, fpustatus.f[0]) */
|
|
|
-#define FPU_CTX_F30_OFF 240 /* offsetof(fpu_context_t, fpustatus.f[30]) - offsetof(fpu_context_t, fpustatus.f[0]) */
|
|
|
-#define FPU_CTX_F31_OFF 248 /* offsetof(fpu_context_t, fpustatus.f[31]) - offsetof(fpu_context_t, fpustatus.f[0]) */
|
|
|
-#endif /* ARCH_RISCV_FPU */
|
|
|
-
|
|
|
-/**
|
|
|
- * The register `tp` always save/restore when context switch,
|
|
|
- * we call `lwp_user_setting_save` when syscall enter,
|
|
|
- * call `lwp_user_setting_restore` when syscall exit
|
|
|
- * and modify context stack after `lwp_user_setting_restore` called
|
|
|
- * so that the `tp` can be the correct thread area value.
|
|
|
- */
|
|
|
+/* switch frame */
|
|
|
+#define RT_HW_SWITCH_CONTEXT_SSTATUS 0
|
|
|
+#define RT_HW_SWITCH_CONTEXT_S11 1
|
|
|
+#define RT_HW_SWITCH_CONTEXT_S10 2
|
|
|
+#define RT_HW_SWITCH_CONTEXT_S9 3
|
|
|
+#define RT_HW_SWITCH_CONTEXT_S8 4
|
|
|
+#define RT_HW_SWITCH_CONTEXT_S7 5
|
|
|
+#define RT_HW_SWITCH_CONTEXT_S6 6
|
|
|
+#define RT_HW_SWITCH_CONTEXT_S5 7
|
|
|
+#define RT_HW_SWITCH_CONTEXT_S4 8
|
|
|
+#define RT_HW_SWITCH_CONTEXT_S3 9
|
|
|
+#define RT_HW_SWITCH_CONTEXT_S2 10
|
|
|
+#define RT_HW_SWITCH_CONTEXT_S1 11
|
|
|
+#define RT_HW_SWITCH_CONTEXT_S0 12
|
|
|
+#define RT_HW_SWITCH_CONTEXT_RA 13
|
|
|
+#define RT_HW_SWITCH_CONTEXT_TP 14
|
|
|
+#define RT_HW_SWITCH_CONTEXT_ALIGNMENT 15 // Padding for alignment
|
|
|
+#define RT_HW_SWITCH_CONTEXT_SIZE 16 // Total size of the structure
|
|
|
+
|
|
|
+#ifdef __ASSEMBLY__
|
|
|
|
|
|
.macro SAVE_ALL
|
|
|
|
|
@@ -70,16 +68,20 @@
|
|
|
/* reserve float registers */
|
|
|
addi sp, sp, -CTX_FPU_REG_NR * REGBYTES
|
|
|
#endif /* ARCH_RISCV_FPU */
|
|
|
+#ifdef ARCH_RISCV_VECTOR
|
|
|
+ /* reserve float registers */
|
|
|
+ addi sp, sp, -CTX_VECTOR_REG_NR * REGBYTES
|
|
|
+#endif /* ARCH_RISCV_VECTOR */
|
|
|
|
|
|
/* save general registers */
|
|
|
addi sp, sp, -CTX_GENERAL_REG_NR * REGBYTES
|
|
|
STORE x1, 1 * REGBYTES(sp)
|
|
|
|
|
|
csrr x1, sstatus
|
|
|
- STORE x1, 2 * REGBYTES(sp)
|
|
|
+ STORE x1, FRAME_OFF_SSTATUS(sp)
|
|
|
|
|
|
csrr x1, sepc
|
|
|
- STORE x1, 0 * REGBYTES(sp)
|
|
|
+ STORE x1, 0 * REGBYTES(sp)
|
|
|
|
|
|
STORE x3, 3 * REGBYTES(sp)
|
|
|
STORE x4, 4 * REGBYTES(sp) /* save tp */
|
|
@@ -120,38 +122,38 @@
|
|
|
|
|
|
li t0, SSTATUS_FS
|
|
|
csrs sstatus, t0
|
|
|
- fsd f0, FPU_CTX_F0_OFF(t1)
|
|
|
- fsd f1, FPU_CTX_F1_OFF(t1)
|
|
|
- fsd f2, FPU_CTX_F2_OFF(t1)
|
|
|
- fsd f3, FPU_CTX_F3_OFF(t1)
|
|
|
- fsd f4, FPU_CTX_F4_OFF(t1)
|
|
|
- fsd f5, FPU_CTX_F5_OFF(t1)
|
|
|
- fsd f6, FPU_CTX_F6_OFF(t1)
|
|
|
- fsd f7, FPU_CTX_F7_OFF(t1)
|
|
|
- fsd f8, FPU_CTX_F8_OFF(t1)
|
|
|
- fsd f9, FPU_CTX_F9_OFF(t1)
|
|
|
- fsd f10, FPU_CTX_F10_OFF(t1)
|
|
|
- fsd f11, FPU_CTX_F11_OFF(t1)
|
|
|
- fsd f12, FPU_CTX_F12_OFF(t1)
|
|
|
- fsd f13, FPU_CTX_F13_OFF(t1)
|
|
|
- fsd f14, FPU_CTX_F14_OFF(t1)
|
|
|
- fsd f15, FPU_CTX_F15_OFF(t1)
|
|
|
- fsd f16, FPU_CTX_F16_OFF(t1)
|
|
|
- fsd f17, FPU_CTX_F17_OFF(t1)
|
|
|
- fsd f18, FPU_CTX_F18_OFF(t1)
|
|
|
- fsd f19, FPU_CTX_F19_OFF(t1)
|
|
|
- fsd f20, FPU_CTX_F20_OFF(t1)
|
|
|
- fsd f21, FPU_CTX_F21_OFF(t1)
|
|
|
- fsd f22, FPU_CTX_F22_OFF(t1)
|
|
|
- fsd f23, FPU_CTX_F23_OFF(t1)
|
|
|
- fsd f24, FPU_CTX_F24_OFF(t1)
|
|
|
- fsd f25, FPU_CTX_F25_OFF(t1)
|
|
|
- fsd f26, FPU_CTX_F26_OFF(t1)
|
|
|
- fsd f27, FPU_CTX_F27_OFF(t1)
|
|
|
- fsd f28, FPU_CTX_F28_OFF(t1)
|
|
|
- fsd f29, FPU_CTX_F29_OFF(t1)
|
|
|
- fsd f30, FPU_CTX_F30_OFF(t1)
|
|
|
- fsd f31, FPU_CTX_F31_OFF(t1)
|
|
|
+ FSTORE f0, FPU_CTX_F0_OFF(t1)
|
|
|
+ FSTORE f1, FPU_CTX_F1_OFF(t1)
|
|
|
+ FSTORE f2, FPU_CTX_F2_OFF(t1)
|
|
|
+ FSTORE f3, FPU_CTX_F3_OFF(t1)
|
|
|
+ FSTORE f4, FPU_CTX_F4_OFF(t1)
|
|
|
+ FSTORE f5, FPU_CTX_F5_OFF(t1)
|
|
|
+ FSTORE f6, FPU_CTX_F6_OFF(t1)
|
|
|
+ FSTORE f7, FPU_CTX_F7_OFF(t1)
|
|
|
+ FSTORE f8, FPU_CTX_F8_OFF(t1)
|
|
|
+ FSTORE f9, FPU_CTX_F9_OFF(t1)
|
|
|
+ FSTORE f10, FPU_CTX_F10_OFF(t1)
|
|
|
+ FSTORE f11, FPU_CTX_F11_OFF(t1)
|
|
|
+ FSTORE f12, FPU_CTX_F12_OFF(t1)
|
|
|
+ FSTORE f13, FPU_CTX_F13_OFF(t1)
|
|
|
+ FSTORE f14, FPU_CTX_F14_OFF(t1)
|
|
|
+ FSTORE f15, FPU_CTX_F15_OFF(t1)
|
|
|
+ FSTORE f16, FPU_CTX_F16_OFF(t1)
|
|
|
+ FSTORE f17, FPU_CTX_F17_OFF(t1)
|
|
|
+ FSTORE f18, FPU_CTX_F18_OFF(t1)
|
|
|
+ FSTORE f19, FPU_CTX_F19_OFF(t1)
|
|
|
+ FSTORE f20, FPU_CTX_F20_OFF(t1)
|
|
|
+ FSTORE f21, FPU_CTX_F21_OFF(t1)
|
|
|
+ FSTORE f22, FPU_CTX_F22_OFF(t1)
|
|
|
+ FSTORE f23, FPU_CTX_F23_OFF(t1)
|
|
|
+ FSTORE f24, FPU_CTX_F24_OFF(t1)
|
|
|
+ FSTORE f25, FPU_CTX_F25_OFF(t1)
|
|
|
+ FSTORE f26, FPU_CTX_F26_OFF(t1)
|
|
|
+ FSTORE f27, FPU_CTX_F27_OFF(t1)
|
|
|
+ FSTORE f28, FPU_CTX_F28_OFF(t1)
|
|
|
+ FSTORE f29, FPU_CTX_F29_OFF(t1)
|
|
|
+ FSTORE f30, FPU_CTX_F30_OFF(t1)
|
|
|
+ FSTORE f31, FPU_CTX_F31_OFF(t1)
|
|
|
|
|
|
/* clr FS domain */
|
|
|
csrc sstatus, t0
|
|
@@ -162,49 +164,77 @@
|
|
|
|
|
|
#endif /* ARCH_RISCV_FPU */
|
|
|
|
|
|
+#ifdef ARCH_RISCV_VECTOR
|
|
|
+ csrr t0, sstatus
|
|
|
+ andi t0, t0, SSTATUS_VS
|
|
|
+ beqz t0, 0f
|
|
|
+
|
|
|
+ /* push vector frame */
|
|
|
+ addi t1, sp, (CTX_GENERAL_REG_NR + CTX_FPU_REG_NR) * REGBYTES
|
|
|
+
|
|
|
+ SAVE_VECTOR t1
|
|
|
+0:
|
|
|
+#endif /* ARCH_RISCV_VECTOR */
|
|
|
.endm
|
|
|
|
|
|
+/**
|
|
|
+ * @brief Restore All General Registers, for interrupt handling
|
|
|
+ *
|
|
|
+ */
|
|
|
.macro RESTORE_ALL
|
|
|
|
|
|
+#ifdef ARCH_RISCV_VECTOR
|
|
|
+ // skip on close
|
|
|
+ ld t0, 2 * REGBYTES(sp)
|
|
|
+ // cannot use vector on initial
|
|
|
+ andi t0, t0, SSTATUS_VS_CLEAN
|
|
|
+ beqz t0, 0f
|
|
|
+
|
|
|
+ /* push vector frame */
|
|
|
+ addi t1, sp, (CTX_GENERAL_REG_NR + CTX_FPU_REG_NR) * REGBYTES
|
|
|
+
|
|
|
+ RESTORE_VECTOR t1
|
|
|
+0:
|
|
|
+#endif /* ARCH_RISCV_VECTOR */
|
|
|
+
|
|
|
#ifdef ARCH_RISCV_FPU
|
|
|
/* restore float register */
|
|
|
- mv t2, sp
|
|
|
- addi t2, t2, CTX_GENERAL_REG_NR * REGBYTES /* skip all normal reg */
|
|
|
+ addi t2, sp, CTX_GENERAL_REG_NR * REGBYTES
|
|
|
|
|
|
li t0, SSTATUS_FS
|
|
|
csrs sstatus, t0
|
|
|
- fld f0, FPU_CTX_F0_OFF(t2)
|
|
|
- fld f1, FPU_CTX_F1_OFF(t2)
|
|
|
- fld f2, FPU_CTX_F2_OFF(t2)
|
|
|
- fld f3, FPU_CTX_F3_OFF(t2)
|
|
|
- fld f4, FPU_CTX_F4_OFF(t2)
|
|
|
- fld f5, FPU_CTX_F5_OFF(t2)
|
|
|
- fld f6, FPU_CTX_F6_OFF(t2)
|
|
|
- fld f7, FPU_CTX_F7_OFF(t2)
|
|
|
- fld f8, FPU_CTX_F8_OFF(t2)
|
|
|
- fld f9, FPU_CTX_F9_OFF(t2)
|
|
|
- fld f10, FPU_CTX_F10_OFF(t2)
|
|
|
- fld f11, FPU_CTX_F11_OFF(t2)
|
|
|
- fld f12, FPU_CTX_F12_OFF(t2)
|
|
|
- fld f13, FPU_CTX_F13_OFF(t2)
|
|
|
- fld f14, FPU_CTX_F14_OFF(t2)
|
|
|
- fld f15, FPU_CTX_F15_OFF(t2)
|
|
|
- fld f16, FPU_CTX_F16_OFF(t2)
|
|
|
- fld f17, FPU_CTX_F17_OFF(t2)
|
|
|
- fld f18, FPU_CTX_F18_OFF(t2)
|
|
|
- fld f19, FPU_CTX_F19_OFF(t2)
|
|
|
- fld f20, FPU_CTX_F20_OFF(t2)
|
|
|
- fld f21, FPU_CTX_F21_OFF(t2)
|
|
|
- fld f22, FPU_CTX_F22_OFF(t2)
|
|
|
- fld f23, FPU_CTX_F23_OFF(t2)
|
|
|
- fld f24, FPU_CTX_F24_OFF(t2)
|
|
|
- fld f25, FPU_CTX_F25_OFF(t2)
|
|
|
- fld f26, FPU_CTX_F26_OFF(t2)
|
|
|
- fld f27, FPU_CTX_F27_OFF(t2)
|
|
|
- fld f28, FPU_CTX_F28_OFF(t2)
|
|
|
- fld f29, FPU_CTX_F29_OFF(t2)
|
|
|
- fld f30, FPU_CTX_F30_OFF(t2)
|
|
|
- fld f31, FPU_CTX_F31_OFF(t2)
|
|
|
+ FLOAD f0, FPU_CTX_F0_OFF(t2)
|
|
|
+ FLOAD f1, FPU_CTX_F1_OFF(t2)
|
|
|
+ FLOAD f2, FPU_CTX_F2_OFF(t2)
|
|
|
+ FLOAD f3, FPU_CTX_F3_OFF(t2)
|
|
|
+ FLOAD f4, FPU_CTX_F4_OFF(t2)
|
|
|
+ FLOAD f5, FPU_CTX_F5_OFF(t2)
|
|
|
+ FLOAD f6, FPU_CTX_F6_OFF(t2)
|
|
|
+ FLOAD f7, FPU_CTX_F7_OFF(t2)
|
|
|
+ FLOAD f8, FPU_CTX_F8_OFF(t2)
|
|
|
+ FLOAD f9, FPU_CTX_F9_OFF(t2)
|
|
|
+ FLOAD f10, FPU_CTX_F10_OFF(t2)
|
|
|
+ FLOAD f11, FPU_CTX_F11_OFF(t2)
|
|
|
+ FLOAD f12, FPU_CTX_F12_OFF(t2)
|
|
|
+ FLOAD f13, FPU_CTX_F13_OFF(t2)
|
|
|
+ FLOAD f14, FPU_CTX_F14_OFF(t2)
|
|
|
+ FLOAD f15, FPU_CTX_F15_OFF(t2)
|
|
|
+ FLOAD f16, FPU_CTX_F16_OFF(t2)
|
|
|
+ FLOAD f17, FPU_CTX_F17_OFF(t2)
|
|
|
+ FLOAD f18, FPU_CTX_F18_OFF(t2)
|
|
|
+ FLOAD f19, FPU_CTX_F19_OFF(t2)
|
|
|
+ FLOAD f20, FPU_CTX_F20_OFF(t2)
|
|
|
+ FLOAD f21, FPU_CTX_F21_OFF(t2)
|
|
|
+ FLOAD f22, FPU_CTX_F22_OFF(t2)
|
|
|
+ FLOAD f23, FPU_CTX_F23_OFF(t2)
|
|
|
+ FLOAD f24, FPU_CTX_F24_OFF(t2)
|
|
|
+ FLOAD f25, FPU_CTX_F25_OFF(t2)
|
|
|
+ FLOAD f26, FPU_CTX_F26_OFF(t2)
|
|
|
+ FLOAD f27, FPU_CTX_F27_OFF(t2)
|
|
|
+ FLOAD f28, FPU_CTX_F28_OFF(t2)
|
|
|
+ FLOAD f29, FPU_CTX_F29_OFF(t2)
|
|
|
+ FLOAD f30, FPU_CTX_F30_OFF(t2)
|
|
|
+ FLOAD f31, FPU_CTX_F31_OFF(t2)
|
|
|
|
|
|
/* clr FS domain */
|
|
|
csrc sstatus, t0
|
|
@@ -216,9 +246,11 @@
|
|
|
#endif /* ARCH_RISCV_FPU */
|
|
|
|
|
|
/* restore general register */
|
|
|
+ addi t0, sp, CTX_REG_NR * REGBYTES
|
|
|
+ csrw sscratch, t0
|
|
|
|
|
|
/* resw ra to sepc */
|
|
|
- LOAD x1, 0 * REGBYTES(sp)
|
|
|
+ LOAD x1, 0 * REGBYTES(sp)
|
|
|
csrw sepc, x1
|
|
|
|
|
|
LOAD x1, 2 * REGBYTES(sp)
|
|
@@ -275,4 +307,6 @@
|
|
|
csrci sstatus, 2
|
|
|
.endm
|
|
|
|
|
|
-#endif
|
|
|
+#endif /* __ASSEMBLY__ */
|
|
|
+
|
|
|
+#endif /* __STACKFRAME_H__ */
|