feat(vkernel): #GP 分支补 rbp 链回溯(与 #PF 分支同款)

#GP 此前只打印 rip/err/rsp/cr4/cr0,看不到调用链;#PF 与“其他异常”分支早已有
[STK] rbp 回溯。现给 #GP 补上同样的 5 级回溯(rbp + 4 个返回地址),
内核态 rbp 低地址直接回溯,用户态(>=0x80000000)跳过以免读用户栈嵌套 #PF。

用于定位当前 “paging.init 的 MakePTWritable 页表遍历读到坏表项 → #GP
rip=0x11a7be” 的调用来源。
This commit is contained in:
TermiNexus committed 2026-10-14 13:46:57 +08:00
1 parent 449f2dbc37
commit 66eb70b131
1 file changed
+32
+32
View File
@@ -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