Skip to content

Commit a5a89c4

Browse files
authored
[rv]修正signal退出后用户态sp少8的问题 (RT-Thread#9080)
1 parent 5e04d8b commit a5a89c4

File tree

5 files changed

+8
-3
lines changed

5 files changed

+8
-3
lines changed

components/lwp/arch/risc-v/rv64/lwp_gcc.S

+2-1
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ arch_signal_quit:
107107
call arch_signal_ucontext_restore
108108

109109
/* reset kernel sp to the stack */
110+
addi sp, sp, CTX_REG_NR * REGBYTES
110111
STORE sp, FRAME_OFF_SP(a0)
111112
/* return value is user sp */
112113
mv sp, a0
@@ -280,7 +281,7 @@ arch_syscall_exit:
280281
CLOSE_INTERRUPT
281282

282283
#if defined(ARCH_MM_MMU)
283-
LOAD s0, 2 * REGBYTES(sp)
284+
LOAD s0, FRAME_OFF_SSTATUS(sp)
284285
andi s0, s0, 0x100
285286
bnez s0, dont_ret_to_user
286287
j arch_ret_to_user

libcpu/risc-v/virt64/context_gcc.S

+2
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,11 @@
4444
li s10, (SSTATUS_SPP)
4545
or s11, s11, s10
4646
PUSH_8 s11
47+
addi sp, sp, -8
4748
.endm
4849

4950
.macro RESTORE_CONTEXT
51+
addi sp, sp, 8
5052
POP_8 s11
5153
csrw sstatus, s11
5254
POP_8 s11

libcpu/risc-v/virt64/cpuport.c

+1
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ void *_rt_hw_stack_init(rt_ubase_t *sp, rt_ubase_t ra, rt_ubase_t sstatus)
5252
(*--sp) = 0; /* s10 */
5353
(*--sp) = 0; /* s11 */
5454
(*--sp) = sstatus; /* sstatus */
55+
--sp; /* align to 16bytes */
5556

5657
return (void *)sp;
5758
}

libcpu/risc-v/virt64/cpuport.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@
2323
#error "Not supported XLEN"
2424
#endif
2525

26-
/* 33 general register */
27-
#define CTX_GENERAL_REG_NR 33
26+
/* 33 general register + 1 padding */
27+
#define CTX_GENERAL_REG_NR 34
2828

2929
#ifdef ENABLE_FPU
3030
/* 32 fpu register */

libcpu/risc-v/virt64/stack.h

+1
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ struct rt_hw_stack_frame
4747
rt_ubase_t t5; /* x30 - t5 - temporary register 5 */
4848
rt_ubase_t t6; /* x31 - t6 - temporary register 6 */
4949
rt_ubase_t user_sp_exc_stack; /* sscratch - user mode sp/exception stack */
50+
rt_ubase_t __padding; /* align to 16bytes */
5051
#ifdef ENABLE_FPU
5152
rt_ubase_t f[CTX_FPU_REG_NR]; /* f0~f31 */
5253
#endif

0 commit comments

Comments
 (0)