修复不稳定的问题
This commit is contained in:
+30
-28
@@ -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
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user