fix(cpu): 启动早期启用 SSE/FPU,修复 movaps #GP
faulting RSP=0x7d760 16 对齐证明非栈对齐问题,movaps #GP(err=0) 真因是 CR4.OSFXSR 未置位(SSE 未启用)。OVMF 启动后 SSE 默认关闭,变参函数传 float/double 保存 xmm 寄存器时触发。新增 cpu.enable_sse(CR0 清 EM 置 MP + CR4 OSFXSR|OSXMMEXCPT + fninit),main.vp __init__ 开头调用。
This commit is contained in:
1 parent
4ff48efde9
commit
7b084803f5
2 files changed
+26
No files matched your search
@@ -344,3 +344,26 @@ class _CPUObject:
|
||||
def set_kernel_rsp0(rsp0: t.CUInt64T):
|
||||
global _per_cpu
|
||||
_per_cpu.kernel_rsp0 = rsp0
|
||||
|
||||
# 启用 SSE/FPU:CR4.OSFXSR(bit9)|OSXMMEXCPT(bit10) 置位、CR0 清 EM(bit2) 置 MP(bit1)。
|
||||
# OVMF/UEFI 启动后 CR4.OSFXSR 未置位,任何 movaps 都 #GP(err=0)——变参函数
|
||||
# 传 float/double 时保存 xmm 寄存器触发(serial.printf / snprintf("%.2f") 崩溃根因)。
|
||||
def enable_sse():
|
||||
cr0_v: t.CUInt64T = 0
|
||||
c.Asm(f"""mov rax, cr0
|
||||
mov {c.AsmOut(cr0_v, t.ASM_DESCR.OUTPUT_REG)}, rax""",
|
||||
op=[t.ASM_DESCR.CLOBBER_RAX])
|
||||
cr0_v = cr0_v & ~t.CUInt64T(4) # 清 EM(禁止 FPU 仿真)
|
||||
cr0_v = cr0_v | t.CUInt64T(2) # 置 MP(监控协处理器)
|
||||
c.Asm(f"""mov rax, {c.AsmInp(cr0_v, t.ASM_DESCR.REG_ANY)}
|
||||
mov cr0, rax""",
|
||||
op=[t.ASM_DESCR.CLOBBER_RAX])
|
||||
cr4_v: t.CUInt64T = 0
|
||||
c.Asm(f"""mov rax, cr4
|
||||
mov {c.AsmOut(cr4_v, t.ASM_DESCR.OUTPUT_REG)}, rax""",
|
||||
op=[t.ASM_DESCR.CLOBBER_RAX])
|
||||
cr4_v = cr4_v | t.CUInt64T(0x600) # OSFXSR | OSXMMEXCPT
|
||||
c.Asm(f"""mov rax, {c.AsmInp(cr4_v, t.ASM_DESCR.REG_ANY)}
|
||||
mov cr4, rax""",
|
||||
op=[t.ASM_DESCR.CLOBBER_RAX])
|
||||
c.Asm("fninit", op=[t.ASM_DESCR.CLOBBER_MEMORY])
|
||||
@@ -47,6 +47,9 @@ class ViperKernel:
|
||||
def __init__(self):
|
||||
global BootInfo
|
||||
self.BootInfo = BootInfo
|
||||
# 启用 SSE/FPU:OVMF 启动后 CR4.OSFXSR 未置位,movaps 会 #GP——
|
||||
# 变参函数传 float/double 保存 xmm 寄存器触发(sched started 后崩溃根因)。
|
||||
cpu.enable_sse()
|
||||
# 注意:此处不能再写 `BootInfo: bootinfo.bootinfo | t.CPtr = self.BootInfo`
|
||||
# 局部重声明全局名——编译器会创建局部 alloca 却不写入(赋值落全局),
|
||||
# 后续 BootInfo.X 读未初始化局部 → 全 0 → memmap 永不可用。直接用 global。
|
||||
|
||||
Reference in new issue
Block a user