debug(kernel): #PF 打印 rbp 链回溯(崩溃帧 + 4 级返回地址)

devfs_directory.find 崩溃(cr2=0x0 写 NULL,rax=rsp=0x6f0 异常)说明调用链栈已被破坏。isr.s 新增 _fault_rbp 保存异常现场 rbp,idt.vp [PF] 分支打印 [STK] 链定位栈损坏源。
This commit is contained in:
TermiNexus committed 2026-08-29 17:50:32 +08:00
1 parent b1956ea722
commit a85f826adf
2 files changed
+28

No files matched your search

+25
View File
@@ -124,6 +124,31 @@ def isrCommonhandler(interrupt: t.CInt):
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)
# [STK] rbp 链回溯(定位栈损坏源:崩溃帧 + 4 级调用链的返回地址)
fr0: t.CUInt64T = 0
fr1: t.CUInt64T = 0
fr2: t.CUInt64T = 0
fr3: t.CUInt64T = 0
fr4: t.CUInt64T = 0
c.Asm(f"""mov rax, [_fault_rbp]
mov {c.AsmOut(fr0, t.ASM_DESCR.OUTPUT_REG)}, rax
mov rax, [rax + 8]
mov {c.AsmOut(fr1, t.ASM_DESCR.OUTPUT_REG)}, rax
mov rax, [_fault_rbp]
mov rax, [rax]
mov {c.AsmOut(fr2, t.ASM_DESCR.OUTPUT_REG)}, rax
mov rax, [rax + 8]
mov {c.AsmOut(fr3, t.ASM_DESCR.OUTPUT_REG)}, rax
mov rax, [_fault_rbp]
mov rax, [rax]
mov rax, [rax]
mov rax, [rax + 8]
mov {c.AsmOut(fr4, t.ASM_DESCR.OUTPUT_REG)}, rax""",
op=[t.ASM_DESCR.CLOBBER_RAX])
stk_buf: t.CArray[t.CChar, 160]
viperlib.snprintf(c.Addr(stk_buf), 160, "[STK] rbp=0x%lx ret: 0x%lx 0x%lx 0x%lx 0x%lx\n",
fr0, fr1, fr2, fr3, fr4)
serial.puts(stk_buf)
elif interrupt == 13:
gp_rip: t.CUInt64T = 0
gp_err: t.CUInt64T = 0
+3
View File
@@ -9,6 +9,7 @@
.comm _fault_rip, 8, 8
.comm _fault_err, 8, 8
.comm _fault_rsp, 8, 8
.comm _fault_rbp, 8, 8
.section .text
.intel_syntax noprefix
@@ -96,6 +97,7 @@ isr\num\()_frame_ready:
push rsi
push rdi
push rbp
mov [_fault_rbp], rbp
push r8
push r9
push r10
@@ -279,6 +281,7 @@ isr\num\()_frame_ready:
push rsi
push rdi
push rbp
mov [_fault_rbp], rbp
push r8
push r9
push r10