Преглед на файлове

[riscv64] fix bug on fpu context switch

jasonhu преди 4 години
родител
ревизия
fd60682163
променени са 2 файла, в които са добавени 184 реда и са изтрити 164 реда
  1. 92 82
      libcpu/risc-v/t-head/c906/stackframe.h
  2. 92 82
      libcpu/risc-v/virt64/stackframe.h

+ 92 - 82
libcpu/risc-v/t-head/c906/stackframe.h

@@ -52,52 +52,10 @@
 #endif /* ENABLE_FPU */
 
 .macro SAVE_ALL
+
 #ifdef ENABLE_FPU
-    /* save float registers */
+    /* reserve float registers */
     addi sp, sp, -CTX_FPU_REG_NR * REGBYTES
-
-    li  t0, SSTATUS_FS
-    csrs sstatus, t0
-    fsd f0,  FPU_CTX_F0_OFF(sp)
-    fsd f1,  FPU_CTX_F1_OFF(sp)
-    fsd f2,  FPU_CTX_F2_OFF(sp)
-    fsd f3,  FPU_CTX_F3_OFF(sp)
-    fsd f4,  FPU_CTX_F4_OFF(sp)
-    fsd f5,  FPU_CTX_F5_OFF(sp)
-    fsd f6,  FPU_CTX_F6_OFF(sp)
-    fsd f7,  FPU_CTX_F7_OFF(sp)
-    fsd f8,  FPU_CTX_F8_OFF(sp)
-    fsd f9,  FPU_CTX_F9_OFF(sp)
-    fsd f10, FPU_CTX_F10_OFF(sp)
-    fsd f11, FPU_CTX_F11_OFF(sp)
-    fsd f12, FPU_CTX_F12_OFF(sp)
-    fsd f13, FPU_CTX_F13_OFF(sp)
-    fsd f14, FPU_CTX_F14_OFF(sp)
-    fsd f15, FPU_CTX_F15_OFF(sp)
-    fsd f16, FPU_CTX_F16_OFF(sp)
-    fsd f17, FPU_CTX_F17_OFF(sp)
-    fsd f18, FPU_CTX_F18_OFF(sp)
-    fsd f19, FPU_CTX_F19_OFF(sp)
-    fsd f20, FPU_CTX_F20_OFF(sp)
-    fsd f21, FPU_CTX_F21_OFF(sp)
-    fsd f22, FPU_CTX_F22_OFF(sp)
-    fsd f23, FPU_CTX_F23_OFF(sp)
-    fsd f24, FPU_CTX_F24_OFF(sp)
-    fsd f25, FPU_CTX_F25_OFF(sp)
-    fsd f26, FPU_CTX_F26_OFF(sp)
-    fsd f27, FPU_CTX_F27_OFF(sp)
-    fsd f28, FPU_CTX_F28_OFF(sp)
-    fsd f29, FPU_CTX_F29_OFF(sp)
-    fsd f30, FPU_CTX_F30_OFF(sp)
-    fsd f31, FPU_CTX_F31_OFF(sp)
-
-    /* clr FS domain */
-    csrc sstatus, t0
-
-    /* clean status would clr sr_sd; */
-    li t0, SSTATUS_FS_CLEAN
-    csrs sstatus, t0
-
 #endif /* ENABLE_FPU */
 
     /* save general registers */
@@ -141,49 +99,59 @@
     STORE x31, 31 * REGBYTES(sp)
     csrr t0, sscratch
     STORE t0, 32 * REGBYTES(sp)
-.endm
 
-.macro RESTORE_ALL
-    /* restore general register */
+#ifdef ENABLE_FPU
+    /* backup sp and adjust sp to save float registers */
+    mv t1, sp
+    addi t1, t1, CTX_GENERAL_REG_NR * REGBYTES
 
-    /* resw ra to sepc */
-    LOAD x1,   0 * REGBYTES(sp)
-    csrw sepc, x1
+    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)
 
-    LOAD x1,   2 * REGBYTES(sp)
-    csrw sstatus, x1
+    /* clr FS domain */
+    csrc sstatus, t0
 
-    LOAD x1,   1 * REGBYTES(sp)
+    /* clean status would clr sr_sd; */
+    li t0, SSTATUS_FS_CLEAN
+    csrs sstatus, t0
 
-    LOAD x3,   3 * REGBYTES(sp)
-    LOAD x4,   4 * REGBYTES(sp)
-    LOAD x5,   5 * REGBYTES(sp)
-    LOAD x6,   6 * REGBYTES(sp)
-    LOAD x7,   7 * REGBYTES(sp)
-    LOAD x8,   8 * REGBYTES(sp)
-    LOAD x9,   9 * REGBYTES(sp)
-    LOAD x10, 10 * REGBYTES(sp)
-    LOAD x11, 11 * REGBYTES(sp)
-    LOAD x12, 12 * REGBYTES(sp)
-    LOAD x13, 13 * REGBYTES(sp)
-    LOAD x14, 14 * REGBYTES(sp)
-    LOAD x15, 15 * REGBYTES(sp)
-    LOAD x16, 16 * REGBYTES(sp)
-    LOAD x17, 17 * REGBYTES(sp)
-    LOAD x18, 18 * REGBYTES(sp)
-    LOAD x19, 19 * REGBYTES(sp)
-    LOAD x20, 20 * REGBYTES(sp)
-    LOAD x21, 21 * REGBYTES(sp)
-    LOAD x22, 22 * REGBYTES(sp)
-    LOAD x23, 23 * REGBYTES(sp)
-    LOAD x24, 24 * REGBYTES(sp)
-    LOAD x25, 25 * REGBYTES(sp)
-    LOAD x26, 26 * REGBYTES(sp)
-    LOAD x27, 27 * REGBYTES(sp)
-    LOAD x28, 28 * REGBYTES(sp)
-    LOAD x29, 29 * REGBYTES(sp)
-    LOAD x30, 30 * REGBYTES(sp)
-    LOAD x31, 31 * REGBYTES(sp)
+#endif /* ENABLE_FPU */
+
+.endm
+
+.macro RESTORE_ALL
 
 #ifdef ENABLE_FPU
     /* restore float register  */
@@ -233,6 +201,48 @@
     csrs sstatus, t0
 
 #endif /* ENABLE_FPU */
+
+    /* restore general register */
+
+    /* resw ra to sepc */
+    LOAD x1,   0 * REGBYTES(sp)
+    csrw sepc, x1
+
+    LOAD x1,   2 * REGBYTES(sp)
+    csrw sstatus, x1
+
+    LOAD x1,   1 * REGBYTES(sp)
+
+    LOAD x3,   3 * REGBYTES(sp)
+    LOAD x4,   4 * REGBYTES(sp)
+    LOAD x5,   5 * REGBYTES(sp)
+    LOAD x6,   6 * REGBYTES(sp)
+    LOAD x7,   7 * REGBYTES(sp)
+    LOAD x8,   8 * REGBYTES(sp)
+    LOAD x9,   9 * REGBYTES(sp)
+    LOAD x10, 10 * REGBYTES(sp)
+    LOAD x11, 11 * REGBYTES(sp)
+    LOAD x12, 12 * REGBYTES(sp)
+    LOAD x13, 13 * REGBYTES(sp)
+    LOAD x14, 14 * REGBYTES(sp)
+    LOAD x15, 15 * REGBYTES(sp)
+    LOAD x16, 16 * REGBYTES(sp)
+    LOAD x17, 17 * REGBYTES(sp)
+    LOAD x18, 18 * REGBYTES(sp)
+    LOAD x19, 19 * REGBYTES(sp)
+    LOAD x20, 20 * REGBYTES(sp)
+    LOAD x21, 21 * REGBYTES(sp)
+    LOAD x22, 22 * REGBYTES(sp)
+    LOAD x23, 23 * REGBYTES(sp)
+    LOAD x24, 24 * REGBYTES(sp)
+    LOAD x25, 25 * REGBYTES(sp)
+    LOAD x26, 26 * REGBYTES(sp)
+    LOAD x27, 27 * REGBYTES(sp)
+    LOAD x28, 28 * REGBYTES(sp)
+    LOAD x29, 29 * REGBYTES(sp)
+    LOAD x30, 30 * REGBYTES(sp)
+    LOAD x31, 31 * REGBYTES(sp)
+
     /* restore user sp */
     LOAD sp, 32 * REGBYTES(sp)
 .endm

+ 92 - 82
libcpu/risc-v/virt64/stackframe.h

@@ -52,52 +52,10 @@
 #endif /* ENABLE_FPU */
 
 .macro SAVE_ALL
+
 #ifdef ENABLE_FPU
-    /* save float registers */
+    /* reserve float registers */
     addi sp, sp, -CTX_FPU_REG_NR * REGBYTES
-
-    li  t0, SSTATUS_FS
-    csrs sstatus, t0
-    fsd f0,  FPU_CTX_F0_OFF(sp)
-    fsd f1,  FPU_CTX_F1_OFF(sp)
-    fsd f2,  FPU_CTX_F2_OFF(sp)
-    fsd f3,  FPU_CTX_F3_OFF(sp)
-    fsd f4,  FPU_CTX_F4_OFF(sp)
-    fsd f5,  FPU_CTX_F5_OFF(sp)
-    fsd f6,  FPU_CTX_F6_OFF(sp)
-    fsd f7,  FPU_CTX_F7_OFF(sp)
-    fsd f8,  FPU_CTX_F8_OFF(sp)
-    fsd f9,  FPU_CTX_F9_OFF(sp)
-    fsd f10, FPU_CTX_F10_OFF(sp)
-    fsd f11, FPU_CTX_F11_OFF(sp)
-    fsd f12, FPU_CTX_F12_OFF(sp)
-    fsd f13, FPU_CTX_F13_OFF(sp)
-    fsd f14, FPU_CTX_F14_OFF(sp)
-    fsd f15, FPU_CTX_F15_OFF(sp)
-    fsd f16, FPU_CTX_F16_OFF(sp)
-    fsd f17, FPU_CTX_F17_OFF(sp)
-    fsd f18, FPU_CTX_F18_OFF(sp)
-    fsd f19, FPU_CTX_F19_OFF(sp)
-    fsd f20, FPU_CTX_F20_OFF(sp)
-    fsd f21, FPU_CTX_F21_OFF(sp)
-    fsd f22, FPU_CTX_F22_OFF(sp)
-    fsd f23, FPU_CTX_F23_OFF(sp)
-    fsd f24, FPU_CTX_F24_OFF(sp)
-    fsd f25, FPU_CTX_F25_OFF(sp)
-    fsd f26, FPU_CTX_F26_OFF(sp)
-    fsd f27, FPU_CTX_F27_OFF(sp)
-    fsd f28, FPU_CTX_F28_OFF(sp)
-    fsd f29, FPU_CTX_F29_OFF(sp)
-    fsd f30, FPU_CTX_F30_OFF(sp)
-    fsd f31, FPU_CTX_F31_OFF(sp)
-
-    /* clr FS domain */
-    csrc sstatus, t0
-
-    /* clean status would clr sr_sd; */
-    li t0, SSTATUS_FS_CLEAN
-    csrs sstatus, t0
-
 #endif /* ENABLE_FPU */
 
     /* save general registers */
@@ -141,49 +99,59 @@
     STORE x31, 31 * REGBYTES(sp)
     csrr t0, sscratch
     STORE t0, 32 * REGBYTES(sp)
-.endm
 
-.macro RESTORE_ALL
-    /* restore general register */
+#ifdef ENABLE_FPU
+    /* backup sp and adjust sp to save float registers */
+    mv t1, sp
+    addi t1, t1, CTX_GENERAL_REG_NR * REGBYTES
 
-    /* resw ra to sepc */
-    LOAD x1,   0 * REGBYTES(sp)
-    csrw sepc, x1
+    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)
 
-    LOAD x1,   2 * REGBYTES(sp)
-    csrw sstatus, x1
+    /* clr FS domain */
+    csrc sstatus, t0
 
-    LOAD x1,   1 * REGBYTES(sp)
+    /* clean status would clr sr_sd; */
+    li t0, SSTATUS_FS_CLEAN
+    csrs sstatus, t0
 
-    LOAD x3,   3 * REGBYTES(sp)
-    LOAD x4,   4 * REGBYTES(sp)
-    LOAD x5,   5 * REGBYTES(sp)
-    LOAD x6,   6 * REGBYTES(sp)
-    LOAD x7,   7 * REGBYTES(sp)
-    LOAD x8,   8 * REGBYTES(sp)
-    LOAD x9,   9 * REGBYTES(sp)
-    LOAD x10, 10 * REGBYTES(sp)
-    LOAD x11, 11 * REGBYTES(sp)
-    LOAD x12, 12 * REGBYTES(sp)
-    LOAD x13, 13 * REGBYTES(sp)
-    LOAD x14, 14 * REGBYTES(sp)
-    LOAD x15, 15 * REGBYTES(sp)
-    LOAD x16, 16 * REGBYTES(sp)
-    LOAD x17, 17 * REGBYTES(sp)
-    LOAD x18, 18 * REGBYTES(sp)
-    LOAD x19, 19 * REGBYTES(sp)
-    LOAD x20, 20 * REGBYTES(sp)
-    LOAD x21, 21 * REGBYTES(sp)
-    LOAD x22, 22 * REGBYTES(sp)
-    LOAD x23, 23 * REGBYTES(sp)
-    LOAD x24, 24 * REGBYTES(sp)
-    LOAD x25, 25 * REGBYTES(sp)
-    LOAD x26, 26 * REGBYTES(sp)
-    LOAD x27, 27 * REGBYTES(sp)
-    LOAD x28, 28 * REGBYTES(sp)
-    LOAD x29, 29 * REGBYTES(sp)
-    LOAD x30, 30 * REGBYTES(sp)
-    LOAD x31, 31 * REGBYTES(sp)
+#endif /* ENABLE_FPU */
+
+.endm
+
+.macro RESTORE_ALL
 
 #ifdef ENABLE_FPU
     /* restore float register  */
@@ -233,6 +201,48 @@
     csrs sstatus, t0
 
 #endif /* ENABLE_FPU */
+
+    /* restore general register */
+
+    /* resw ra to sepc */
+    LOAD x1,   0 * REGBYTES(sp)
+    csrw sepc, x1
+
+    LOAD x1,   2 * REGBYTES(sp)
+    csrw sstatus, x1
+
+    LOAD x1,   1 * REGBYTES(sp)
+
+    LOAD x3,   3 * REGBYTES(sp)
+    LOAD x4,   4 * REGBYTES(sp)
+    LOAD x5,   5 * REGBYTES(sp)
+    LOAD x6,   6 * REGBYTES(sp)
+    LOAD x7,   7 * REGBYTES(sp)
+    LOAD x8,   8 * REGBYTES(sp)
+    LOAD x9,   9 * REGBYTES(sp)
+    LOAD x10, 10 * REGBYTES(sp)
+    LOAD x11, 11 * REGBYTES(sp)
+    LOAD x12, 12 * REGBYTES(sp)
+    LOAD x13, 13 * REGBYTES(sp)
+    LOAD x14, 14 * REGBYTES(sp)
+    LOAD x15, 15 * REGBYTES(sp)
+    LOAD x16, 16 * REGBYTES(sp)
+    LOAD x17, 17 * REGBYTES(sp)
+    LOAD x18, 18 * REGBYTES(sp)
+    LOAD x19, 19 * REGBYTES(sp)
+    LOAD x20, 20 * REGBYTES(sp)
+    LOAD x21, 21 * REGBYTES(sp)
+    LOAD x22, 22 * REGBYTES(sp)
+    LOAD x23, 23 * REGBYTES(sp)
+    LOAD x24, 24 * REGBYTES(sp)
+    LOAD x25, 25 * REGBYTES(sp)
+    LOAD x26, 26 * REGBYTES(sp)
+    LOAD x27, 27 * REGBYTES(sp)
+    LOAD x28, 28 * REGBYTES(sp)
+    LOAD x29, 29 * REGBYTES(sp)
+    LOAD x30, 30 * REGBYTES(sp)
+    LOAD x31, 31 * REGBYTES(sp)
+
     /* restore user sp */
     LOAD sp, 32 * REGBYTES(sp)
 .endm