diff --git a/VKernel/Kernel/intr/idt.vp b/VKernel/Kernel/intr/idt.vp index d049fd8..1e8ccf2 100644 --- a/VKernel/Kernel/intr/idt.vp +++ b/VKernel/Kernel/intr/idt.vp @@ -191,6 +191,38 @@ def isrCommonhandler(interrupt: int): viperlib.snprintf(&gp_buf, 140, "[GP] rip=0x%lx err=0x%lx rsp=0x%lx cr4=0x%lx cr0=0x%lx\n", gp_rip, gp_err, gp_rsp, gp_cr4, gp_cr0) serial.puts(gp_buf) + # [STK] rbp 链回溯(与 #PF 分支同款):直接打印崩溃帧 + 4 级调用链返回地址。 + # 内核态 rbp 在低地址,回溯安全;用户态 rbp(>=0x80000000)跳过,避免读用户栈嵌套 #PF。 + gfr0: uint64 = 0 + __asm__(f"""mov rax, [_fault_rbp] + mov {asmout(gfr0, ASM_DESCR.OUTPUT_REG)}, rax""", + op=[ASM_DESCR.CLOBBER_RAX]) + gp_stk_buf: [160]char + if gfr0 >= 0x80000000: + viperlib.snprintf(&gp_stk_buf, 160, "[STK] user rbp=0x%lx, chain skipped\n", gfr0) + serial.puts(gp_stk_buf) + else: + gfr1: uint64 = 0 + gfr2: uint64 = 0 + gfr3: uint64 = 0 + gfr4: uint64 = 0 + __asm__(f"""mov rax, [_fault_rbp] + mov rax, [rax + 8] + mov {asmout(gfr1, ASM_DESCR.OUTPUT_REG)}, rax + mov rax, [_fault_rbp] + mov rax, [rax] + mov {asmout(gfr2, ASM_DESCR.OUTPUT_REG)}, rax + mov rax, [rax + 8] + mov {asmout(gfr3, ASM_DESCR.OUTPUT_REG)}, rax + mov rax, [_fault_rbp] + mov rax, [rax] + mov rax, [rax] + mov rax, [rax + 8] + mov {asmout(gfr4, ASM_DESCR.OUTPUT_REG)}, rax""", + op=[ASM_DESCR.CLOBBER_RAX]) + viperlib.snprintf(&gp_stk_buf, 160, "[STK] rbp=0x%lx ret: 0x%lx 0x%lx 0x%lx 0x%lx\n", + gfr0, gfr1, gfr2, gfr3, gfr4) + serial.puts(gp_stk_buf) else: # 其他异常(#UD 等):打印 rip/rsp 定位执行位置(isr.s 已保存 _fault_rip) ex_rip: uint64 = 0