Swap `context_switch` arguments

This commit is contained in:
Ruihan Li 2025-08-13 08:03:02 +08:00 committed by Tate, Hongliang Tian
parent 226ea2865c
commit 2d3cfb53e0
7 changed files with 77 additions and 77 deletions

View File

@ -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);
}

View File

@ -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

View File

@ -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);
}

View File

@ -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

View File

@ -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);
}

View File

@ -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

View File

@ -79,7 +79,7 @@ pub(super) fn switch_to_task(next_task: Arc<Task>) {
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.