修复不稳定的问题

This commit is contained in:
2026-05-22 20:53:29 +08:00
parent 80e32d4fb8
commit ab11821c0c
2 changed files with 42 additions and 39 deletions
+30 -28
View File
@@ -49,38 +49,39 @@ typedef struct {
os_uintptr_t mepc; /* zero, 用于 epc 保存 */ os_uintptr_t mepc; /* zero, 用于 epc 保存 */
os_uintptr_t ra; /* 返回地址 */ os_uintptr_t ra; /* 返回地址 */
os_uintptr_t mstatus; /* 栈指针, 用于mstatus */ os_uintptr_t mstatus; /* 栈指针, 用于mstatus */
os_uintptr_t gp; /* 全局指针 */ os_uintptr_t x3; /* 全局指针 */
os_uintptr_t tp; /* 线程指针 */ os_uintptr_t x4; /* 线程指针 */
os_uintptr_t t0; /* 临时寄存器0 */ os_uintptr_t x5; /* 临时寄存器0 */
os_uintptr_t t1; /* 临时寄存器1 */ os_uintptr_t x6; /* 临时寄存器1 */
os_uintptr_t t2; /* 临时寄存器2 */ os_uintptr_t x7; /* 临时寄存器2 */
os_uintptr_t s0; /* s0/fp */ os_uintptr_t x8; /* s0/fp */
os_uintptr_t s1; /* 保存寄存器1 */ os_uintptr_t x9; /* 保存寄存器1 */
os_uintptr_t a0; /* 函数参数/返回值 */ os_uintptr_t a0; /* 函数参数/返回值 */
os_uintptr_t a1; /* 函数参数 */ os_uintptr_t x11; /* 函数参数 */
os_uintptr_t a2; /* 函数参数 */ os_uintptr_t x12; /* 函数参数 */
os_uintptr_t a3; /* 函数参数 */ os_uintptr_t x13; /* 函数参数 */
os_uintptr_t a4; /* 函数参数 */ os_uintptr_t x14; /* 函数参数 */
os_uintptr_t a5; /* 函数参数 */ os_uintptr_t x15; /* 函数参数 */
os_uintptr_t a6; /* 函数参数 */ os_uintptr_t x16; /* 函数参数 */
os_uintptr_t a7; /* 函数参数 */ os_uintptr_t x17; /* 函数参数 */
os_uintptr_t s2; /* 保存寄存器 */ os_uintptr_t x18; /* 保存寄存器 */
os_uintptr_t s3; /* 保存寄存器 */ os_uintptr_t x19; /* 保存寄存器 */
os_uintptr_t s4; /* 保存寄存器 */ os_uintptr_t x20; /* 保存寄存器 */
os_uintptr_t s5; /* 保存寄存器 */ os_uintptr_t x21; /* 保存寄存器 */
os_uintptr_t s6; /* 保存寄存器 */ os_uintptr_t x22; /* 保存寄存器 */
os_uintptr_t s7; /* 保存寄存器 */ os_uintptr_t x23; /* 保存寄存器 */
os_uintptr_t s8; /* 保存寄存器 */ os_uintptr_t x24; /* 保存寄存器 */
os_uintptr_t s9; /* 保存寄存器 */ os_uintptr_t x25; /* 保存寄存器 */
os_uintptr_t s10; /* 保存寄存器 */ os_uintptr_t x26; /* 保存寄存器 */
os_uintptr_t s11; /* 保存寄存器 */ os_uintptr_t x27; /* 保存寄存器 */
os_uintptr_t t3; /* 临时寄存器 */ os_uintptr_t x28; /* 临时寄存器 */
os_uintptr_t t4; /* 临时寄存器 */ os_uintptr_t x29; /* 临时寄存器 */
os_uintptr_t t5; /* 临时寄存器 */ os_uintptr_t x30; /* 临时寄存器 */
os_uintptr_t t6; /* 临时寄存器 */ os_uintptr_t x31; /* 临时寄存器 */
}os_stack_frame_t; }os_stack_frame_t;
#define STACK_FRAME_SIZE sizeof(os_stack_frame_t) #define STACK_FRAME_SIZE sizeof(os_stack_frame_t)
#define MSTATUS_MPIE (1<<7)
os_stack_t os_port_cpu_stack_init(os_task_entry_t entry, void* param os_stack_t os_port_cpu_stack_init(os_task_entry_t entry, void* param
, void* stack_base, os_size_t stack_size, void(*exit_entry)(void)){ , void* stack_base, os_size_t stack_size, void(*exit_entry)(void)){
@@ -93,6 +94,7 @@ os_stack_t os_port_cpu_stack_init(os_task_entry_t entry, void* param
((os_uintptr_t*)(p_frame))[i] = 0x5ac0ffee; ((os_uintptr_t*)(p_frame))[i] = 0x5ac0ffee;
} }
p_frame->mstatus = MSTATUS_MPIE;
p_frame->mepc = (os_uintptr_t)entry; p_frame->mepc = (os_uintptr_t)entry;
p_frame->a0 = (os_uintptr_t)param; p_frame->a0 = (os_uintptr_t)param;
p_frame->ra = (os_uintptr_t)exit_entry; p_frame->ra = (os_uintptr_t)exit_entry;
+12 -11
View File
@@ -5,17 +5,14 @@
SW_Handler: SW_Handler:
/* save all from thread context */ /* save all from thread context */
addi sp, sp, -32 * 4 addi sp, sp, -32 * 4
sw x5, 5 * 4(sp) /* t0, 使 */ sw t0, 5 * 4(sp) /* t0, 使 */
csrr t0, mstatus /* mstatus */ li t0, 0x80 /* mstatus */
sw t0, 2 * 4(sp) /* x2 */ sw t0, 2 * 4(sp) /* x2 */
li t0,0x1800 /* M-Mode */ li t0, 0x1800 /* M-Mode */
csrw mstatus, t0 csrw mstatus, t0
csrr t0, mepc /* mepc x0 */
sw t0, 0 * 4(sp)
sw x1, 1 * 4(sp) /* return address */ sw x1, 1 * 4(sp) /* return address */
sw x4, 4 * 4(sp) /* tp */ sw x4, 4 * 4(sp) /* tp */
sw x6, 6 * 4(sp) sw x6, 6 * 4(sp)
@@ -45,6 +42,9 @@ SW_Handler:
sw x30, 30 * 4(sp) sw x30, 30 * 4(sp)
sw x31, 31 * 4(sp) sw x31, 31 * 4(sp)
csrr t0, mepc /* mepc x0 */
sw t0, 0 * 4(sp)
la s0, g_os_port_switch_from_sp /* */ la s0, g_os_port_switch_from_sp /* */
lw s1, 0(s0) lw s1, 0(s0)
sw sp, 0(s1) sw sp, 0(s1)
@@ -63,6 +63,8 @@ SW_Handler:
lw x1, 1 * 4(sp) /* return address */ lw x1, 1 * 4(sp) /* return address */
li t0, 0x1800
csrs mstatus, t0
lw t0, 2*4(sp) /* mstatus */ lw t0, 2*4(sp) /* mstatus */
csrs mstatus, t0 /* MPIE = 1 */ csrs mstatus, t0 /* MPIE = 1 */
@@ -115,14 +117,13 @@ os_port_context_restore:
addi t0, t0, -512 addi t0, t0, -512
csrw mscratch,t0 csrw mscratch,t0
/* keep machine mode */ /* 关闭中断 */
li t0, 0x1800 li t0, 0x1800
csrw mstatus, t0 csrw mstatus, t0
/* ---------- 收尾工作 ---------- */ /* ---------- 收尾工作 ---------- */
jal os_port_on_switch_success jal os_port_on_switch_success
/* ---- Load target sp ---- */ /* ---- Load target sp ---- */
lw sp, (a0) /* to sp */ lw sp, (a0) /* to sp */
@@ -131,6 +132,9 @@ os_port_context_restore:
lw a0, 0 * 4(sp) lw a0, 0 * 4(sp)
csrw mepc, a0 csrw mepc, a0
lw a0, 2*4(sp) /* MPIE */
csrs mstatus, a0
lw x1, 1 * 4(sp) /* */ lw x1, 1 * 4(sp) /* */
lw x4, 4 * 4(sp) lw x4, 4 * 4(sp)
lw x5, 5 * 4(sp) lw x5, 5 * 4(sp)
@@ -161,9 +165,6 @@ os_port_context_restore:
lw x30, 30 * 4(sp) lw x30, 30 * 4(sp)
lw x31, 31 * 4(sp) lw x31, 31 * 4(sp)
lw t0, 2*4(sp)
csrs mstatus, t0
addi sp, sp, 32 * 4 addi sp, sp, 32 * 4
mret mret