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:
TermiNexus committed 2026-10-17 17:17:28 +08:00
1 parent 645e4015ca
commit 7d8a4ee6ff
1 file changed
+14 -12
+14 -12
View File
@@ -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