From c1dd55d6061f3ef0b26cade31b613770ea1aef81 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Fri, 11 Sep 2026 15:50:14 +0800 Subject: [PATCH] =?UTF-8?q?fix(vkernel):=20=E4=BF=AE=20=5Ftss.reserved0=20?= =?UTF-8?q?=E4=BD=8D=E5=AE=BD=E4=B8=8E=20AP=20trampoline=20LME=20=E6=8C=87?= =?UTF-8?q?=E4=BB=A4=E7=BC=96=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - N6 cpu.vp: _tss.reserved0 uint64→uint32, TSS 108B→104B, RSP0 归位偏移 4, 对齐 gdt.tss_buf - N7 apic.vp: 置 LME 由 0x83 C8(imm8) 改 0x81 C8(imm32), 否则后 4 字节被当指令执行 --- VKernel/Kernel/drivers/core/cpu/apic.vp | 4 +++- VKernel/Kernel/drivers/core/cpu/cpu.vp | 6 +++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/VKernel/Kernel/drivers/core/cpu/apic.vp b/VKernel/Kernel/drivers/core/cpu/apic.vp index eb7b729..748afbc 100644 --- a/VKernel/Kernel/drivers/core/cpu/apic.vp +++ b/VKernel/Kernel/drivers/core/cpu/apic.vp @@ -152,7 +152,9 @@ _trampoline_bin: t.CArray[uint8, AP_TRAMPOLINE_LEN] = [ 0x0F, 0x22, 0xD8, # mov cr3, eax 0xB9, 0x80, 0x00, 0x00, 0xC0, # mov ecx, 0xC0000080 (EFER) 0x0F, 0x32, # rdmsr - 0x83, 0xC8, 0x00, 0x01, 0x00, 0x00, # or eax, 0x100 (LME) + # 0x83 C8 只能编码 1 字节立即数;0x100 须用 0x81 C8 imm32(6 字节)。 + # 原写 0x83 会把后 4 字节 00 01 00 00 当作下一条指令执行(N7)。 + 0x81, 0xC8, 0x00, 0x01, 0x00, 0x00, # or eax, 0x100 (LME) 0x0F, 0x79, # wrmsr 0x0F, 0x20, 0xC0, # mov eax, cr0 0x0D, 0x00, 0x00, 0x00, 0x80, # or eax, 0x80000000 (PG) diff --git a/VKernel/Kernel/drivers/core/cpu/cpu.vp b/VKernel/Kernel/drivers/core/cpu/cpu.vp index f3b2e1d..c9bfc4f 100644 --- a/VKernel/Kernel/drivers/core/cpu/cpu.vp +++ b/VKernel/Kernel/drivers/core/cpu/cpu.vp @@ -49,7 +49,11 @@ class cpu_info(t.CStruct): @c.Attribute(t.attr.packed) class _tss: - reserved0: uint64 + # x86_64 TSS 布局:偏移 0 为 4 字节保留字段(对齐 gdt.vp:32 的 + # "reserved0(4) rsp0(8) ..." 与 tss_buf: t.CArray[uint8, 104])。 + # 此前写作 uint64 使 RSP0 落在偏移 8、结构体 108B —— 与硬件 104B 布局 + # 及 gdt 的 tss_buf(104B) 不一致(N6)。 + reserved0: uint32 rsp0: uint64 rsp1: uint64 rsp2: uint64