From 4296d2a19eeb053bf05a1eb6ec7bea65cfbdf2cf Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Thu, 27 Aug 2026 01:33:19 +0800 Subject: [PATCH] =?UTF-8?q?fix(asm-inline):=20cmos=5Fread=20=E8=A3=B8=20in?= =?UTF-8?q?/out=20al=20=E8=A1=A5=20CLOBBER=5FRAX=20+=20=E6=98=BE=E5=BC=8F?= =?UTF-8?q?=20mov=EF=BC=9Brdmsr=20out=20=E7=BB=91=E5=AE=9A=E4=B8=8E=20clob?= =?UTF-8?q?ber=20=E5=86=B2=E7=AA=81=EF=BC=88lo/hi=20=E8=AF=BB=E4=B8=8D?= =?UTF-8?q?=E5=88=B0=20EAX/EDX=EF=BC=89=E6=94=B9=E6=98=BE=E5=BC=8F=20mov?= =?UTF-8?q?=E2=80=94=E2=80=94=E5=90=8C=E7=B1=BB=20EAX=20=E7=A0=B4=E5=9D=8F?= =?UTF-8?q?=E6=A0=B9=E5=9B=A0=EF=BC=8C=E6=AE=8B=E7=95=99=E9=97=B4=E6=AD=87?= =?UTF-8?q?=E6=80=A7=E6=95=B0=E6=8D=AE=E6=8D=9F=E5=9D=8F=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- VKernel/Kernel/intr/syscall.vp | 6 +++++- VKernel/Kernel/mm/mm.vp | 16 ++++++++++++---- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/VKernel/Kernel/intr/syscall.vp b/VKernel/Kernel/intr/syscall.vp index d77cd3f..860ed3d 100644 --- a/VKernel/Kernel/intr/syscall.vp +++ b/VKernel/Kernel/intr/syscall.vp @@ -62,8 +62,12 @@ def wrmsr(msr: t.CUInt32T, val: t.CUInt64T): def rdmsr(msr: t.CUInt32T) -> t.CUInt64T: lo: t.CUInt32T hi: t.CUInt32T + # rdmsr 固定写 EDX:EAX;out 绑定 + CLOBBER_RAX/RDX 冲突会导致 lo/hi + # 分配到非 EAX/EDX 读到垃圾。显式 mov 到输出寄存器(与 asm.inb 修复同模式)。 c.Asm(f"""mov ecx, {c.AsmInp(msr, t.ASM_DESCR.REG_ANY)} - rdmsr""", + rdmsr + mov {c.AsmOut(lo, t.ASM_DESCR.OUTPUT_REG)}, eax + mov {c.AsmOut(hi, t.ASM_DESCR.OUTPUT_REG)}, edx""", out=[c.AsmOut(lo, t.ASM_DESCR.OUTPUT_REG), c.AsmOut(hi, t.ASM_DESCR.OUTPUT_REG)], op=[t.ASM_DESCR.CLOBBER_RCX, t.ASM_DESCR.CLOBBER_RAX, t.ASM_DESCR.CLOBBER_RDX]) return t.CUInt64T(lo) | (t.CUInt64T(hi) << 32) diff --git a/VKernel/Kernel/mm/mm.vp b/VKernel/Kernel/mm/mm.vp index 50f56e5..633dbff 100644 --- a/VKernel/Kernel/mm/mm.vp +++ b/VKernel/Kernel/mm/mm.vp @@ -764,10 +764,18 @@ def vm_free(VirtAddr: t.CUInt64T): # CMOS读取函数 def cmos_read(reg: t.CUInt8T) -> t.CUInt8T: - c.Asm(f"mov al, {c.AsmInp(reg)}\nout 0x70, al") - val: t.CUInt8T - c.Asm(f"in al, 0x71\nmov {c.AsmOut(val)}, al") - return val + # in/out al 会改 EAX,必须 CLOBBER_RAX;显式 mov 到输出寄存器 + #(与 asm.inb/inw 修复同模式,避免调用方 EAX 被静默破坏)。 + c.Asm(f"""mov eax, {c.AsmInp(t.CUInt32T(reg), t.ASM_DESCR.REG_ANY)} + out 0x70, al""", + op=[t.ASM_DESCR.CLOBBER_RAX]) + val32: t.CUInt32T + c.Asm(f"""in al, 0x71 + movzx eax, al + mov {c.AsmOut(val32, t.ASM_DESCR.OUTPUT_REG)}, eax""", + out=[c.AsmOut(val32, t.ASM_DESCR.OUTPUT_REG)], + op=[t.ASM_DESCR.CLOBBER_RAX]) + return t.CUInt8T(val32) # 内存大小测试函数 def detect_memory_size() -> t.CUInt64T: