diff --git a/VKernel/Kernel/sched/sched.vp b/VKernel/Kernel/sched/sched.vp index 8a3719a..3801daa 100644 --- a/VKernel/Kernel/sched/sched.vp +++ b/VKernel/Kernel/sched/sched.vp @@ -340,21 +340,22 @@ def _do_switch(): mov rax, qword ptr [rip + _switch_old_fpu] fxsave [rax] # 按线程保存 ISR scratch(被抢占的 ISR 会跨越其它线程的 ISR) + lea rsi, [rip + _isr_scratch] mov eax, dword ptr [rip + _switch_old_tid] imul rax, rax, 48 lea rdx, [rip + _isr_scratch_tbl] add rdx, rax - mov rcx, qword ptr [rip + _isr_scratch] + mov rcx, qword ptr [rsi] mov qword ptr [rdx], rcx - mov rcx, qword ptr [rip + _isr_scratch + 8] + mov rcx, qword ptr [rsi + 8] mov qword ptr [rdx + 8], rcx - mov rcx, qword ptr [rip + _isr_scratch + 16] + mov rcx, qword ptr [rsi + 16] mov qword ptr [rdx + 16], rcx - mov rcx, qword ptr [rip + _isr_scratch + 24] + mov rcx, qword ptr [rsi + 24] mov qword ptr [rdx + 24], rcx - mov rcx, qword ptr [rip + _isr_scratch + 32] + mov rcx, qword ptr [rsi + 32] mov qword ptr [rdx + 32], rcx - mov rcx, qword ptr [rip + _isr_scratch + 40] + mov rcx, qword ptr [rsi + 40] mov qword ptr [rdx + 40], rcx mov rax, qword ptr [rip + _switch_old_rsp] mov qword ptr [rax], rsp @@ -364,22 +365,23 @@ def _do_switch(): mov rax, qword ptr [rip + _switch_new_fpu] fxrstor [rax] # 恢复切入线程的 scratch(不在 ISR 中时内容无意义,覆盖无害) + lea rsi, [rip + _isr_scratch] mov eax, dword ptr [rip + _switch_new_tid] imul rax, rax, 48 lea rdx, [rip + _isr_scratch_tbl] add rdx, rax mov rcx, qword ptr [rdx] - mov qword ptr [rip + _isr_scratch], rcx + mov qword ptr [rsi], rcx mov rcx, qword ptr [rdx + 8] - mov qword ptr [rip + _isr_scratch + 8], rcx + mov qword ptr [rsi + 8], rcx mov rcx, qword ptr [rdx + 16] - mov qword ptr [rip + _isr_scratch + 16], rcx + mov qword ptr [rsi + 16], rcx mov rcx, qword ptr [rdx + 24] - mov qword ptr [rip + _isr_scratch + 24], rcx + mov qword ptr [rsi + 24], rcx mov rcx, qword ptr [rdx + 32] - mov qword ptr [rip + _isr_scratch + 32], rcx + mov qword ptr [rsi + 32], rcx mov rcx, qword ptr [rdx + 40] - mov qword ptr [rip + _isr_scratch + 40], rcx + mov qword ptr [rsi + 40], rcx popfq pop r15 pop r14