Просмотр исходного кода

[lwp/riscv] signal handing fixups:
remove close interrupt; fix setting of sp in kernel

wangxiaoyao 3 лет назад
Родитель
Сommit
e4b8460455

+ 3 - 3
bsp/qemu-virt64-riscv/.config

@@ -16,7 +16,7 @@ CONFIG_RT_THREAD_PRIORITY_32=y
 # CONFIG_RT_THREAD_PRIORITY_256 is not set
 CONFIG_RT_THREAD_PRIORITY_MAX=32
 CONFIG_RT_TICK_PER_SECOND=100
-# CONFIG_RT_USING_OVERFLOW_CHECK is not set
+CONFIG_RT_USING_OVERFLOW_CHECK=y
 CONFIG_RT_USING_HOOK=y
 CONFIG_RT_USING_IDLE_HOOK=y
 CONFIG_RT_IDLE_HOOK_LIST_SIZE=4
@@ -102,12 +102,12 @@ CONFIG_RT_USING_MSH=y
 CONFIG_FINSH_USING_MSH=y
 CONFIG_FINSH_THREAD_NAME="tshell"
 CONFIG_FINSH_USING_HISTORY=y
-CONFIG_FINSH_HISTORY_LINES=5
+CONFIG_FINSH_HISTORY_LINES=10
 CONFIG_FINSH_USING_SYMTAB=y
 CONFIG_FINSH_USING_DESCRIPTION=y
 # CONFIG_FINSH_ECHO_DISABLE_DEFAULT is not set
 CONFIG_FINSH_THREAD_PRIORITY=20
-CONFIG_FINSH_THREAD_STACK_SIZE=4096
+CONFIG_FINSH_THREAD_STACK_SIZE=16384
 CONFIG_FINSH_CMD_SIZE=80
 # CONFIG_FINSH_USING_AUTH is not set
 CONFIG_FINSH_ARG_MAX=10

+ 3 - 2
bsp/qemu-virt64-riscv/rtconfig.h

@@ -12,6 +12,7 @@
 #define RT_THREAD_PRIORITY_32
 #define RT_THREAD_PRIORITY_MAX 32
 #define RT_TICK_PER_SECOND 100
+#define RT_USING_OVERFLOW_CHECK
 #define RT_USING_HOOK
 #define RT_USING_IDLE_HOOK
 #define RT_IDLE_HOOK_LIST_SIZE 4
@@ -71,11 +72,11 @@
 #define FINSH_USING_MSH
 #define FINSH_THREAD_NAME "tshell"
 #define FINSH_USING_HISTORY
-#define FINSH_HISTORY_LINES 5
+#define FINSH_HISTORY_LINES 10
 #define FINSH_USING_SYMTAB
 #define FINSH_USING_DESCRIPTION
 #define FINSH_THREAD_PRIORITY 20
-#define FINSH_THREAD_STACK_SIZE 4096
+#define FINSH_THREAD_STACK_SIZE 16384
 #define FINSH_CMD_SIZE 80
 #define FINSH_ARG_MAX 10
 

+ 51 - 21
components/lwp/arch/risc-v/rv64/lwp_gcc.S

@@ -59,15 +59,13 @@ arch_crt_start_umode:
     mv ra, a0//return address
     mv a0, s0//args
 
-    csrw sscratch, a3
+    csrw sscratch, s3
     sret//enter user mode
 
 .global arch_ret_to_user
 arch_ret_to_user:
     call lwp_signal_check
     beqz a0, ret_to_user_exit
-    RESTORE_ALL
-    csrw sscratch, zero
     // now sp is user sp
     J user_do_signal
 
@@ -142,14 +140,18 @@ arch_signal_quit:
     sret
 
 user_do_signal:
-    //now sp is user sp
-    //save context to user sp
+    csrw sscratch, sp
+    RESTORE_ALL
+    // now sp is user sp
+    // and in interrupt close
     SAVE_ALL
-    //ensure original user sp correct
+
+    // save user sp in SAVE_ALL frame
     mv t0, sp
     addi t0, t0, CTX_REG_NR * REGBYTES
-    STORE t0, CTX_REG_NR * REGBYTES(sp)
-    OPEN_INTERRUPT
+    STORE t0, 32 * REGBYTES(sp)
+
+    // save lwp_sigreturn in user memory
     mv s0, sp
     la t0, lwp_sigreturn//t0 = src
     la t1, lwp_sigreturn_end
@@ -165,25 +167,53 @@ lwp_sigreturn_copy_loop:
     mv t1, t2
     bnez t1, lwp_sigreturn_copy_loop
 
-    mv a0, sp//sp
-    li a1, 0//pc
-    li a2, 0//flag
+    // restore kernel stack
+    csrrw sp, sscratch, s0
+
+    /**
+     * a0: user sp
+     * a1: user_pc (not used)
+     * a2: user_flag (not used)
+     */ 
+    csrr a0, sscratch
+    mv a1, zero
+    mv a2, zero
     call lwp_signal_backup
-    //a0 = signal id
-    mv sp, s0//update new sp
-    mv s2, a0//signal id backup
-    call lwp_sighandler_get//need a0 returned by lwp_signal_backup
-    mv ra, s0//lwp_sigreturn func addr
-    mv s1, s0//if func = 0,s1 = lwp_sigreturn func
+    // a0 <- signal id
+
+    // restore kernel sp to initial, and load `sp` to user stack
+
+    // s2 <- signal id(a0)
+    mv s2, a0
+    call lwp_sighandler_get
+    // a0 <- signal_handler
+
+    // ra <- lwp_sigreturn
+    mv ra, s0
+
+    mv s1, s0
     beqz a0, skip_user_signal_handler
+    // a0 <- signal_handler
     mv s1, a0
 
 skip_user_signal_handler:
-    li t0, 0x100
-    csrc sstatus, t0
+    // enter user mode and enable interrupt when return to user mode
+    li t0, SSTATUS_SPP
+    csrc sstatus, t0 
+    li t0, SSTATUS_SPIE
+    csrs sstatus, t0
+
+    /**
+     * sp <- user sp
+     * sscratch <- kernel sp
+     */
+    csrrw sp, sscratch, sp
+
+    // sepc <- signal_handler
     csrw sepc, s1
-    mv a0, s2//signal id as arg 0
-    sret//enter lwp signal handler
+    // a0 <- signal id
+    mv a0, s2
+    sret
 
 .align 3
 lwp_debugreturn: