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:
1 parent
449f2dbc37
commit
66eb70b131
1 file changed
+32
@@ -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
|
||||
|
||||
Reference in new issue
Block a user