From 66eb70b131cb574e4bc690f8098dc7707c4f82a4 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Wed, 14 Oct 2026 13:46:57 +0800 Subject: [PATCH] =?UTF-8?q?feat(vkernel):=20#GP=20=E5=88=86=E6=94=AF?= =?UTF-8?q?=E8=A1=A5=20rbp=20=E9=93=BE=E5=9B=9E=E6=BA=AF=EF=BC=88=E4=B8=8E?= =?UTF-8?q?=20#PF=20=E5=88=86=E6=94=AF=E5=90=8C=E6=AC=BE=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #GP 此前只打印 rip/err/rsp/cr4/cr0,看不到调用链;#PF 与“其他异常”分支早已有 [STK] rbp 回溯。现给 #GP 补上同样的 5 级回溯(rbp + 4 个返回地址), 内核态 rbp 低地址直接回溯,用户态(>=0x80000000)跳过以免读用户栈嵌套 #PF。 用于定位当前 “paging.init 的 MakePTWritable 页表遍历读到坏表项 → #GP rip=0x11a7be” 的调用来源。 --- VKernel/Kernel/intr/idt.vp | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) 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