fix(sched): 内联汇编改用 lea + 间接寻址,绕开 [rip + sym + 偏移] 不被集成汇编器接受
llc 集成汇编器对 mov qword ptr [rip + _isr_scratch + 8], rcx 这种'RIP 相对符号 + 常量偏移'的直接寻址报 invalid operand(把整条指令识别成缺源操作数)。改为先 lea rsi, [rip + _isr_scratch](lea 形式此前已验证可用),再按 [rsi + N] / [rdx + N] 访问,共 12 处(保存 6 + 恢复 6)。rsi/rdx 都在 _do_switch 的 push 列表内,切栈后写入会被随后的 pop 恢复,不影响新线程寄存器。
This commit is contained in:
1 parent
645e4015ca
commit
7d8a4ee6ff
1 file changed
+14
-12
@@ -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
|
||||
|
||||
Reference in new issue
Block a user