diff --git a/ostd/src/arch/loongarch/task/mod.rs b/ostd/src/arch/loongarch/task/mod.rs index 0e07f746f..9a25871fc 100644 --- a/ostd/src/arch/loongarch/task/mod.rs +++ b/ostd/src/arch/loongarch/task/mod.rs @@ -70,5 +70,5 @@ impl TaskContextApi for TaskContext { } unsafe extern "C" { - pub(crate) unsafe fn context_switch(cur: *mut TaskContext, nxt: *const TaskContext); + pub(crate) unsafe fn context_switch(nxt: *const TaskContext, cur: *mut TaskContext); } diff --git a/ostd/src/arch/loongarch/task/switch.S b/ostd/src/arch/loongarch/task/switch.S index 037bfccf4..4212e58fa 100644 --- a/ostd/src/arch/loongarch/task/switch.S +++ b/ostd/src/arch/loongarch/task/switch.S @@ -2,32 +2,32 @@ .text .global context_switch -context_switch: # (cur: *mut TaskContext, nxt: *TaskContext) +context_switch: # (nxt: *const TaskContext, cur: *mut TaskContext) # Save cur's register - st.d $sp, $a0, 0x0 - st.d $fp, $a0, 0x8 - st.d $s0, $a0, 0x10 - st.d $s1, $a0, 0x18 - st.d $s2, $a0, 0x20 - st.d $s3, $a0, 0x28 - st.d $s4, $a0, 0x30 - st.d $s5, $a0, 0x38 - st.d $s6, $a0, 0x40 - st.d $s7, $a0, 0x48 - st.d $s8, $a0, 0x50 - st.d $ra, $a0, 0x58 # return address + st.d $sp, $a1, 0x0 + st.d $fp, $a1, 0x8 + st.d $s0, $a1, 0x10 + st.d $s1, $a1, 0x18 + st.d $s2, $a1, 0x20 + st.d $s3, $a1, 0x28 + st.d $s4, $a1, 0x30 + st.d $s5, $a1, 0x38 + st.d $s6, $a1, 0x40 + st.d $s7, $a1, 0x48 + st.d $s8, $a1, 0x50 + st.d $ra, $a1, 0x58 # return address # Restore nxt's registers - ld.d $sp, $a1, 0x0 - ld.d $fp, $a1, 0x8 - ld.d $s0, $a1, 0x10 - ld.d $s1, $a1, 0x18 - ld.d $s2, $a1, 0x20 - ld.d $s3, $a1, 0x28 - ld.d $s4, $a1, 0x30 - ld.d $s5, $a1, 0x38 - ld.d $s6, $a1, 0x40 - ld.d $s7, $a1, 0x48 - ld.d $s8, $a1, 0x50 - ld.d $ra, $a1, 0x58 # return address + ld.d $sp, $a0, 0x0 + ld.d $fp, $a0, 0x8 + ld.d $s0, $a0, 0x10 + ld.d $s1, $a0, 0x18 + ld.d $s2, $a0, 0x20 + ld.d $s3, $a0, 0x28 + ld.d $s4, $a0, 0x30 + ld.d $s5, $a0, 0x38 + ld.d $s6, $a0, 0x40 + ld.d $s7, $a0, 0x48 + ld.d $s8, $a0, 0x50 + ld.d $ra, $a0, 0x58 # return address ret diff --git a/ostd/src/arch/riscv/task/mod.rs b/ostd/src/arch/riscv/task/mod.rs index f488f0899..c4408b9e5 100644 --- a/ostd/src/arch/riscv/task/mod.rs +++ b/ostd/src/arch/riscv/task/mod.rs @@ -74,5 +74,5 @@ impl TaskContextApi for TaskContext { } extern "C" { - pub(crate) fn context_switch(cur: *mut TaskContext, nxt: *const TaskContext); + pub(crate) fn context_switch(nxt: *const TaskContext, cur: *mut TaskContext); } diff --git a/ostd/src/arch/riscv/task/switch.S b/ostd/src/arch/riscv/task/switch.S index 69adab783..0bd113644 100644 --- a/ostd/src/arch/riscv/task/switch.S +++ b/ostd/src/arch/riscv/task/switch.S @@ -2,36 +2,36 @@ .text .global context_switch -context_switch: # (cur: *mut TaskContext, nxt: *TaskContext) +context_switch: # (nxt: *const TaskContext, cur: *mut TaskContext) # Save cur's register - sd ra, 0x68(a0) # return address - sd sp, 0x0(a0) - sd s0, 0x8(a0) - sd s1, 0x10(a0) - sd s2, 0x18(a0) - sd s3, 0x20(a0) - sd s4, 0x28(a0) - sd s5, 0x30(a0) - sd s6, 0x38(a0) - sd s7, 0x40(a0) - sd s8, 0x48(a0) - sd s9, 0x50(a0) - sd s10, 0x58(a0) - sd s11, 0x60(a0) + sd ra, 0x68(a1) # return address + sd sp, 0x0(a1) + sd s0, 0x8(a1) + sd s1, 0x10(a1) + sd s2, 0x18(a1) + sd s3, 0x20(a1) + sd s4, 0x28(a1) + sd s5, 0x30(a1) + sd s6, 0x38(a1) + sd s7, 0x40(a1) + sd s8, 0x48(a1) + sd s9, 0x50(a1) + sd s10, 0x58(a1) + sd s11, 0x60(a1) # Restore nxt's registers - ld ra, 0x68(a1) # return address - ld sp, 0x0(a1) - ld s0, 0x8(a1) - ld s1, 0x10(a1) - ld s2, 0x18(a1) - ld s3, 0x20(a1) - ld s4, 0x28(a1) - ld s5, 0x30(a1) - ld s6, 0x38(a1) - ld s7, 0x40(a1) - ld s8, 0x48(a1) - ld s9, 0x50(a1) - ld s10, 0x58(a1) - ld s11, 0x60(a1) + ld ra, 0x68(a0) # return address + ld sp, 0x0(a0) + ld s0, 0x8(a0) + ld s1, 0x10(a0) + ld s2, 0x18(a0) + ld s3, 0x20(a0) + ld s4, 0x28(a0) + ld s5, 0x30(a0) + ld s6, 0x38(a0) + ld s7, 0x40(a0) + ld s8, 0x48(a0) + ld s9, 0x50(a0) + ld s10, 0x58(a0) + ld s11, 0x60(a0) ret diff --git a/ostd/src/arch/x86/task/mod.rs b/ostd/src/arch/x86/task/mod.rs index f609ba52e..9fcd1d508 100644 --- a/ostd/src/arch/x86/task/mod.rs +++ b/ostd/src/arch/x86/task/mod.rs @@ -63,5 +63,5 @@ impl TaskContextApi for TaskContext { } extern "C" { - pub(crate) fn context_switch(cur: *mut TaskContext, nxt: *const TaskContext); + pub(crate) fn context_switch(nxt: *const TaskContext, cur: *mut TaskContext); } diff --git a/ostd/src/arch/x86/task/switch.S b/ostd/src/arch/x86/task/switch.S index 005d9dd96..ac7dae180 100644 --- a/ostd/src/arch/x86/task/switch.S +++ b/ostd/src/arch/x86/task/switch.S @@ -3,30 +3,30 @@ .text .global context_switch .code64 -context_switch: # (cur: *mut TaskContext, nxt: *TaskContext) +context_switch: # (nxt: *const TaskContext, cur: *mut TaskContext) # Save cur's register mov rax, [rsp] # return address - mov [rdi + 56], rax # 56 = offsetof(TaskContext, rip) - mov [rdi + 0], rsp - mov [rdi + 8], rbx - mov [rdi + 16], rbp - mov [rdi + 24], r12 - mov [rdi + 32], r13 - mov [rdi + 40], r14 - mov [rdi + 48], r15 + mov [rsi + 56], rax # 56 = offsetof(TaskContext, rip) + mov [rsi + 0], rsp + mov [rsi + 8], rbx + mov [rsi + 16], rbp + mov [rsi + 24], r12 + mov [rsi + 32], r13 + mov [rsi + 40], r14 + mov [rsi + 48], r15 rdfsbase r15 - mov [rdi + 64], r15 # 64 = offsetof(TaskContext, fsbase) + mov [rsi + 64], r15 # 64 = offsetof(TaskContext, fsbase) # Restore nxt's registers - mov r15, [rsi + 64] + mov r15, [rdi + 64] wrfsbase r15 - mov rsp, [rsi + 0] - mov rbx, [rsi + 8] - mov rbp, [rsi + 16] - mov r12, [rsi + 24] - mov r13, [rsi + 32] - mov r14, [rsi + 40] - mov r15, [rsi + 48] - mov rax, [rsi + 56] # restore return address + mov rsp, [rdi + 0] + mov rbx, [rdi + 8] + mov rbp, [rdi + 16] + mov r12, [rdi + 24] + mov r13, [rdi + 32] + mov r14, [rdi + 40] + mov r15, [rdi + 48] + mov rax, [rdi + 56] # restore return address mov [rsp], rax # for stack balance, must use mov instead of push ret diff --git a/ostd/src/task/processor.rs b/ostd/src/task/processor.rs index bc574178a..9cfca6b43 100644 --- a/ostd/src/task/processor.rs +++ b/ostd/src/task/processor.rs @@ -79,7 +79,7 @@ pub(super) fn switch_to_task(next_task: Arc) { unsafe { // This function may not return, for example, when the current task exits. So make sure // that all variables on the stack can be forgotten without causing resource leakage. - context_switch(current_task_ctx_ptr, next_task_ctx_ptr); + context_switch(next_task_ctx_ptr, current_task_ctx_ptr); } // SAFETY: The task is just switched back, `after_switching_to` hasn't been called yet.