debug(intr): #GP/#PF 打印 faulting RSP

memmap 修复后栈写 #PF 消失,但 sched started 后出现 [GP] rip=0x134e1b
err=0x0——0x134e1b 是 serial.printf(变参)序言的 movaps(SSE 对齐存储),
说明调用方 RSP 未对齐。isr.s 新增 _fault_rsp 捕获(ISR_ERR 宏保存 faulting
RSP),idt.vp #GP/#PF 打印 rsp=0x%lx,定位 RSP 偏差来源。
This commit is contained in:
TermiNexus committed 2026-08-26 19:34:01 +08:00
1 parent 530c85d6a4
commit 4ff48efde9
2 files changed
+14 -6

No files matched your search

+10 -6
View File
@@ -116,20 +116,24 @@ def isrCommonhandler(interrupt: t.CInt):
op=[t.ASM_DESCR.CLOBBER_RAX])
fault_rip: t.CUInt64T = 0
fault_err: t.CUInt64T = 0
fault_rsp: t.CUInt64T = 0
c.Asm(f"""mov {c.AsmOut(fault_rip, t.ASM_DESCR.OUTPUT_REG)}, [_fault_rip]
mov {c.AsmOut(fault_err, t.ASM_DESCR.OUTPUT_REG)}, [_fault_err]""",
mov {c.AsmOut(fault_err, t.ASM_DESCR.OUTPUT_REG)}, [_fault_err]
mov {c.AsmOut(fault_rsp, t.ASM_DESCR.OUTPUT_REG)}, [_fault_rsp]""",
op=[t.ASM_DESCR.CLOBBER_RAX])
buf: t.CArray[t.CChar, 80]
viperlib.snprintf(c.Addr(buf), 80, "[PF] cr2=0x%lx rip=0x%lx err=0x%lx\n", cr2, fault_rip, fault_err)
buf: t.CArray[t.CChar, 100]
viperlib.snprintf(c.Addr(buf), 100, "[PF] cr2=0x%lx rip=0x%lx err=0x%lx rsp=0x%lx\n", cr2, fault_rip, fault_err, fault_rsp)
serial.puts(buf)
elif interrupt == 13:
gp_rip: t.CUInt64T = 0
gp_err: t.CUInt64T = 0
gp_rsp: t.CUInt64T = 0
c.Asm(f"""mov {c.AsmOut(gp_rip, t.ASM_DESCR.OUTPUT_REG)}, [_fault_rip]
mov {c.AsmOut(gp_err, t.ASM_DESCR.OUTPUT_REG)}, [_fault_err]""",
mov {c.AsmOut(gp_err, t.ASM_DESCR.OUTPUT_REG)}, [_fault_err]
mov {c.AsmOut(gp_rsp, t.ASM_DESCR.OUTPUT_REG)}, [_fault_rsp]""",
op=[t.ASM_DESCR.CLOBBER_RAX])
gp_buf: t.CArray[t.CChar, 80]
viperlib.snprintf(c.Addr(gp_buf), 80, "[GP] rip=0x%lx err=0x%lx\n", gp_rip, gp_err)
gp_buf: t.CArray[t.CChar, 100]
viperlib.snprintf(c.Addr(gp_buf), 100, "[GP] rip=0x%lx err=0x%lx rsp=0x%lx\n", gp_rip, gp_err, gp_rsp)
serial.puts(gp_buf)
s: sched.Scheduler | t.CPtr = sched._sched_ptr
# 如果调度器未初始化,直接进入安全停机状态
+4
View File
@@ -8,6 +8,7 @@
.comm _fs_lock, 4, 4
.comm _fault_rip, 8, 8
.comm _fault_err, 8, 8
.comm _fault_rsp, 8, 8
.section .text
.intel_syntax noprefix
@@ -238,6 +239,8 @@ isr\num\()_from_kernel:
mov r10, [rsp + 24] # RFLAGS
xor r11, r11 # SS = 0
xor rax, rax # RSP = 0
lea rcx, [rsp + 32] # faulting RSP = entry_rsp + 32 (err + RIP + CS + RFLAGS)
mov [_fault_rsp], rcx
add rsp, 32 # remove 4 CPU-pushed qwords (error + 3 frame)
jmp isr\num\()_frame_ready
@@ -250,6 +253,7 @@ isr\num\()_from_user:
mov r10, [rsp + 24] # RFLAGS
mov rax, [rsp + 32] # RSP (user)
mov r11, [rsp + 40] # SS (user)
mov [_fault_rsp], rax # faulting RSP = user RSP
mov gs:[0x0], rax # save user RSP
add rsp, 48 # remove 6 CPU-pushed qwords (error + 5 frame)