Swap `context_switch` arguments
This commit is contained in:
parent
226ea2865c
commit
2d3cfb53e0
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
Loading…
Reference in New Issue