diff --git a/VKernel/Kernel/intr/idt.vp b/VKernel/Kernel/intr/idt.vp index eb001eb..d00ed2d 100644 --- a/VKernel/Kernel/intr/idt.vp +++ b/VKernel/Kernel/intr/idt.vp @@ -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 diff --git a/VKernel/Kernel/intr/isr.s b/VKernel/Kernel/intr/isr.s index 5ddfb5d..a710b14 100644 --- a/VKernel/Kernel/intr/isr.s +++ b/VKernel/Kernel/intr/isr.s @@ -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