diff --git a/CPU/QingKeV3/os_port.c b/CPU/QingKeV3/os_port.c index 869ea3c..b8b498b 100644 --- a/CPU/QingKeV3/os_port.c +++ b/CPU/QingKeV3/os_port.c @@ -49,38 +49,39 @@ typedef struct { os_uintptr_t mepc; /* zero, 用于 epc 保存 */ os_uintptr_t ra; /* 返回地址 */ os_uintptr_t mstatus; /* 栈指针, 用于mstatus */ - os_uintptr_t gp; /* 全局指针 */ - os_uintptr_t tp; /* 线程指针 */ - os_uintptr_t t0; /* 临时寄存器0 */ - os_uintptr_t t1; /* 临时寄存器1 */ - os_uintptr_t t2; /* 临时寄存器2 */ - os_uintptr_t s0; /* s0/fp */ - os_uintptr_t s1; /* 保存寄存器1 */ + os_uintptr_t x3; /* 全局指针 */ + os_uintptr_t x4; /* 线程指针 */ + os_uintptr_t x5; /* 临时寄存器0 */ + os_uintptr_t x6; /* 临时寄存器1 */ + os_uintptr_t x7; /* 临时寄存器2 */ + os_uintptr_t x8; /* s0/fp */ + os_uintptr_t x9; /* 保存寄存器1 */ os_uintptr_t a0; /* 函数参数/返回值 */ - os_uintptr_t a1; /* 函数参数 */ - os_uintptr_t a2; /* 函数参数 */ - os_uintptr_t a3; /* 函数参数 */ - os_uintptr_t a4; /* 函数参数 */ - os_uintptr_t a5; /* 函数参数 */ - os_uintptr_t a6; /* 函数参数 */ - os_uintptr_t a7; /* 函数参数 */ - os_uintptr_t s2; /* 保存寄存器 */ - os_uintptr_t s3; /* 保存寄存器 */ - os_uintptr_t s4; /* 保存寄存器 */ - os_uintptr_t s5; /* 保存寄存器 */ - os_uintptr_t s6; /* 保存寄存器 */ - os_uintptr_t s7; /* 保存寄存器 */ - os_uintptr_t s8; /* 保存寄存器 */ - os_uintptr_t s9; /* 保存寄存器 */ - os_uintptr_t s10; /* 保存寄存器 */ - os_uintptr_t s11; /* 保存寄存器 */ - os_uintptr_t t3; /* 临时寄存器 */ - os_uintptr_t t4; /* 临时寄存器 */ - os_uintptr_t t5; /* 临时寄存器 */ - os_uintptr_t t6; /* 临时寄存器 */ + os_uintptr_t x11; /* 函数参数 */ + os_uintptr_t x12; /* 函数参数 */ + os_uintptr_t x13; /* 函数参数 */ + os_uintptr_t x14; /* 函数参数 */ + os_uintptr_t x15; /* 函数参数 */ + os_uintptr_t x16; /* 函数参数 */ + os_uintptr_t x17; /* 函数参数 */ + os_uintptr_t x18; /* 保存寄存器 */ + os_uintptr_t x19; /* 保存寄存器 */ + os_uintptr_t x20; /* 保存寄存器 */ + os_uintptr_t x21; /* 保存寄存器 */ + os_uintptr_t x22; /* 保存寄存器 */ + os_uintptr_t x23; /* 保存寄存器 */ + os_uintptr_t x24; /* 保存寄存器 */ + os_uintptr_t x25; /* 保存寄存器 */ + os_uintptr_t x26; /* 保存寄存器 */ + os_uintptr_t x27; /* 保存寄存器 */ + os_uintptr_t x28; /* 临时寄存器 */ + os_uintptr_t x29; /* 临时寄存器 */ + os_uintptr_t x30; /* 临时寄存器 */ + os_uintptr_t x31; /* 临时寄存器 */ }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 , 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; } + p_frame->mstatus = MSTATUS_MPIE; p_frame->mepc = (os_uintptr_t)entry; p_frame->a0 = (os_uintptr_t)param; p_frame->ra = (os_uintptr_t)exit_entry; diff --git a/CPU/QingKeV3/os_port_gnu.S b/CPU/QingKeV3/os_port_gnu.S index 760cfd3..2b4c104 100644 --- a/CPU/QingKeV3/os_port_gnu.S +++ b/CPU/QingKeV3/os_port_gnu.S @@ -5,17 +5,14 @@ SW_Handler: /* save all from thread context */ 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 位置 */ - li t0,0x1800 /* 关闭中断,并进入 M-Mode 模式 */ + li t0, 0x1800 /* 关闭中断,并进入 M-Mode 模式 */ csrw mstatus, t0 - csrr t0, mepc /* 额外保存 mepc 到 x0 位置 */ - sw t0, 0 * 4(sp) - sw x1, 1 * 4(sp) /* return address */ sw x4, 4 * 4(sp) /* tp */ sw x6, 6 * 4(sp) @@ -45,6 +42,9 @@ SW_Handler: sw x30, 30 * 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 /* 更新旧任务栈指针 */ lw s1, 0(s0) sw sp, 0(s1) @@ -63,6 +63,8 @@ SW_Handler: lw x1, 1 * 4(sp) /* 加载 return address */ + li t0, 0x1800 + csrs mstatus, t0 lw t0, 2*4(sp) /* 将栈里面的 mstatus 恢复 */ csrs mstatus, t0 /* 设置 MPIE = 1 */ @@ -115,14 +117,13 @@ os_port_context_restore: addi t0, t0, -512 csrw mscratch,t0 - /* keep machine mode */ + /* 关闭中断 */ li t0, 0x1800 csrw mstatus, t0 /* ---------- 收尾工作 ---------- */ jal os_port_on_switch_success - /* ---- Load target sp ---- */ lw sp, (a0) /* 将 to 的指针加载到 sp */ @@ -131,6 +132,9 @@ os_port_context_restore: lw a0, 0 * 4(sp) csrw mepc, a0 + lw a0, 2*4(sp) /* 恢复 MPIE */ + csrs mstatus, a0 + lw x1, 1 * 4(sp) /* 返回地址 */ lw x4, 4 * 4(sp) lw x5, 5 * 4(sp) @@ -161,9 +165,6 @@ os_port_context_restore: lw x30, 30 * 4(sp) lw x31, 31 * 4(sp) - lw t0, 2*4(sp) - csrs mstatus, t0 - addi sp, sp, 32 * 4 mret