From 7b084803f517c0717bf7cd72bd3b05c2d0d79550 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Wed, 26 Aug 2026 19:36:50 +0800 Subject: [PATCH] =?UTF-8?q?fix(cpu):=20=E5=90=AF=E5=8A=A8=E6=97=A9?= =?UTF-8?q?=E6=9C=9F=E5=90=AF=E7=94=A8=20SSE/FPU=EF=BC=8C=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=20movaps=20#GP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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__ 开头调用。 --- VKernel/Kernel/drivers/core/cpu/cpu.vp | 23 +++++++++++++++++++++++ VKernel/Kernel/main.vp | 3 +++ 2 files changed, 26 insertions(+) diff --git a/VKernel/Kernel/drivers/core/cpu/cpu.vp b/VKernel/Kernel/drivers/core/cpu/cpu.vp index 650bfc3..dcec637 100644 --- a/VKernel/Kernel/drivers/core/cpu/cpu.vp +++ b/VKernel/Kernel/drivers/core/cpu/cpu.vp @@ -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]) diff --git a/VKernel/Kernel/main.vp b/VKernel/Kernel/main.vp index c6f82e5..c227fd2 100644 --- a/VKernel/Kernel/main.vp +++ b/VKernel/Kernel/main.vp @@ -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。