fix(vkernel): 修 _tss.reserved0 位宽与 AP trampoline LME 指令编码
- 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 字节被当指令执行
This commit is contained in:
1 parent
a518f75b24
commit
c1dd55d606
2 files changed
+8
-2
No files matched your search
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in new issue
Block a user