浏览代码

[rv]修正signal退出后用户态sp少8的问题 (#9080)

heyuanjie87 10 月之前
父节点
当前提交
a5a89c439f

+ 2 - 1
components/lwp/arch/risc-v/rv64/lwp_gcc.S

@@ -107,6 +107,7 @@ arch_signal_quit:
     call arch_signal_ucontext_restore
     call arch_signal_ucontext_restore
 
 
     /* reset kernel sp to the stack */
     /* reset kernel sp to the stack */
+    addi sp, sp, CTX_REG_NR * REGBYTES
     STORE sp, FRAME_OFF_SP(a0)
     STORE sp, FRAME_OFF_SP(a0)
     /* return value is user sp */
     /* return value is user sp */
     mv sp, a0
     mv sp, a0
@@ -280,7 +281,7 @@ arch_syscall_exit:
     CLOSE_INTERRUPT
     CLOSE_INTERRUPT
 
 
     #if defined(ARCH_MM_MMU)
     #if defined(ARCH_MM_MMU)
-        LOAD s0, 2 * REGBYTES(sp)
+        LOAD s0, FRAME_OFF_SSTATUS(sp)
         andi s0, s0, 0x100
         andi s0, s0, 0x100
         bnez s0, dont_ret_to_user
         bnez s0, dont_ret_to_user
         j arch_ret_to_user
         j arch_ret_to_user

+ 2 - 0
libcpu/risc-v/virt64/context_gcc.S

@@ -44,9 +44,11 @@
     li      s10, (SSTATUS_SPP)
     li      s10, (SSTATUS_SPP)
     or      s11, s11, s10
     or      s11, s11, s10
     PUSH_8  s11
     PUSH_8  s11
+    addi    sp, sp, -8
 .endm
 .endm
 
 
 .macro RESTORE_CONTEXT
 .macro RESTORE_CONTEXT
+    addi    sp, sp, 8
     POP_8   s11
     POP_8   s11
     csrw    sstatus, s11
     csrw    sstatus, s11
     POP_8   s11
     POP_8   s11

+ 1 - 0
libcpu/risc-v/virt64/cpuport.c

@@ -52,6 +52,7 @@ void *_rt_hw_stack_init(rt_ubase_t *sp, rt_ubase_t ra, rt_ubase_t sstatus)
     (*--sp) = 0;                                /* s10 */
     (*--sp) = 0;                                /* s10 */
     (*--sp) = 0;                                /* s11 */
     (*--sp) = 0;                                /* s11 */
     (*--sp) = sstatus;                          /* sstatus */
     (*--sp) = sstatus;                          /* sstatus */
+    --sp; /* align to 16bytes */
 
 
     return (void *)sp;
     return (void *)sp;
 }
 }

+ 2 - 2
libcpu/risc-v/virt64/cpuport.h

@@ -23,8 +23,8 @@
 #error "Not supported XLEN"
 #error "Not supported XLEN"
 #endif
 #endif
 
 
-/* 33 general register */
-#define CTX_GENERAL_REG_NR  33
+/* 33 general register + 1 padding */
+#define CTX_GENERAL_REG_NR  34
 
 
 #ifdef ENABLE_FPU
 #ifdef ENABLE_FPU
 /* 32 fpu register */
 /* 32 fpu register */

+ 1 - 0
libcpu/risc-v/virt64/stack.h

@@ -47,6 +47,7 @@ struct rt_hw_stack_frame
     rt_ubase_t t5;         /* x30 - t5     - temporary register 5                */
     rt_ubase_t t5;         /* x30 - t5     - temporary register 5                */
     rt_ubase_t t6;         /* x31 - t6     - temporary register 6                */
     rt_ubase_t t6;         /* x31 - t6     - temporary register 6                */
     rt_ubase_t user_sp_exc_stack;    /* sscratch - user mode sp/exception stack  */
     rt_ubase_t user_sp_exc_stack;    /* sscratch - user mode sp/exception stack  */
+    rt_ubase_t __padding; /* align to 16bytes */
 #ifdef ENABLE_FPU
 #ifdef ENABLE_FPU
     rt_ubase_t f[CTX_FPU_REG_NR];      /* f0~f31 */
     rt_ubase_t f[CTX_FPU_REG_NR];      /* f0~f31 */
 #endif
 #endif