summaryrefslogtreecommitdiff
path: root/libcpu
diff options
context:
space:
mode:
authorheyuanjie87 <[email protected]>2024-06-24 21:36:32 +0800
committerGitHub <[email protected]>2024-06-24 21:36:32 +0800
commita5a89c439f905f68fee98f7b329b348a1c2171b3 (patch)
tree520c1736efc5f4ffadf8ff636aa1058d8ba71aee /libcpu
parent5e04d8b3c17c29ef85a8fab7e338847736b388ce (diff)
[rv]修正signal退出后用户态sp少8的问题 (#9080)
Diffstat (limited to 'libcpu')
-rw-r--r--libcpu/risc-v/virt64/context_gcc.S2
-rw-r--r--libcpu/risc-v/virt64/cpuport.c1
-rw-r--r--libcpu/risc-v/virt64/cpuport.h4
-rw-r--r--libcpu/risc-v/virt64/stack.h1
4 files changed, 6 insertions, 2 deletions
diff --git a/libcpu/risc-v/virt64/context_gcc.S b/libcpu/risc-v/virt64/context_gcc.S
index 733d15890c..486a787e61 100644
--- a/libcpu/risc-v/virt64/context_gcc.S
+++ b/libcpu/risc-v/virt64/context_gcc.S
@@ -44,9 +44,11 @@
li s10, (SSTATUS_SPP)
or s11, s11, s10
PUSH_8 s11
+ addi sp, sp, -8
.endm
.macro RESTORE_CONTEXT
+ addi sp, sp, 8
POP_8 s11
csrw sstatus, s11
POP_8 s11
diff --git a/libcpu/risc-v/virt64/cpuport.c b/libcpu/risc-v/virt64/cpuport.c
index 126ec9f825..92394bcc22 100644
--- a/libcpu/risc-v/virt64/cpuport.c
+++ b/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; /* s11 */
(*--sp) = sstatus; /* sstatus */
+ --sp; /* align to 16bytes */
return (void *)sp;
}
diff --git a/libcpu/risc-v/virt64/cpuport.h b/libcpu/risc-v/virt64/cpuport.h
index 92a3af32d7..8caccd100c 100644
--- a/libcpu/risc-v/virt64/cpuport.h
+++ b/libcpu/risc-v/virt64/cpuport.h
@@ -23,8 +23,8 @@
#error "Not supported XLEN"
#endif
-/* 33 general register */
-#define CTX_GENERAL_REG_NR 33
+/* 33 general register + 1 padding */
+#define CTX_GENERAL_REG_NR 34
#ifdef ENABLE_FPU
/* 32 fpu register */
diff --git a/libcpu/risc-v/virt64/stack.h b/libcpu/risc-v/virt64/stack.h
index d619d3fd35..4899c6f2c8 100644
--- a/libcpu/risc-v/virt64/stack.h
+++ b/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 t6; /* x31 - t6 - temporary register 6 */
rt_ubase_t user_sp_exc_stack; /* sscratch - user mode sp/exception stack */
+ rt_ubase_t __padding; /* align to 16bytes */
#ifdef ENABLE_FPU
rt_ubase_t f[CTX_FPU_REG_NR]; /* f0~f31 */
#endif