debug(kernel): 保存并打印崩溃时 RAX(验证 cr2=rax-偏移 关系)

[STK] 显示崩溃帧 rbp=0x7d640 正常,但 cr2=0x0 需 rax=0x6f0——矛盾待解。isr.s 新增 _fault_rax,异常打印 [RAX] 行确认崩溃时 rax 真实值。
This commit is contained in:
TermiNexus committed 2026-08-29 18:00:13 +08:00
1 parent 084061f97e
commit 25af08ecf4
2 files changed
+17

No files matched your search

+14
View File
@@ -124,6 +124,13 @@ 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)
# [RAX] 崩溃时 rax(isr.s 保存):定位 cr2 与 rax 关系(rax-偏移=cr2)
f_rax: t.CUInt64T = 0
c.Asm(f"""mov {c.AsmOut(f_rax, t.ASM_DESCR.OUTPUT_REG)}, [_fault_rax]""",
op=[t.ASM_DESCR.CLOBBER_RAX])
rax_buf: t.CArray[t.CChar, 80]
viperlib.snprintf(c.Addr(rax_buf), 80, "[RAX] rax=0x%lx\n", f_rax)
serial.puts(rax_buf)
# [STK] rbp 链回溯(定位栈损坏源:崩溃帧 + 4 级调用链的返回地址)
fr0: t.CUInt64T = 0
fr1: t.CUInt64T = 0
@@ -177,6 +184,13 @@ def isrCommonhandler(interrupt: t.CInt):
ex_buf: t.CArray[t.CChar, 100]
viperlib.snprintf(c.Addr(ex_buf), 100, "[EX] int=%d rip=0x%lx rsp=0x%lx\n", interrupt, ex_rip, ex_rsp)
serial.puts(ex_buf)
# [RAX] 崩溃时 rax(isr.s 保存)
f_rax: t.CUInt64T = 0
c.Asm(f"""mov {c.AsmOut(f_rax, t.ASM_DESCR.OUTPUT_REG)}, [_fault_rax]""",
op=[t.ASM_DESCR.CLOBBER_RAX])
rax_buf: t.CArray[t.CChar, 80]
viperlib.snprintf(c.Addr(rax_buf), 80, "[RAX] rax=0x%lx\n", f_rax)
serial.puts(rax_buf)
# [STK] rbp 链回溯(与 #PF 分支一致,定位栈损坏源)
fr0: t.CUInt64T = 0
fr1: t.CUInt64T = 0
+3
View File
@@ -10,6 +10,7 @@
.comm _fault_err, 8, 8
.comm _fault_rsp, 8, 8
.comm _fault_rbp, 8, 8
.comm _fault_rax, 8, 8
.section .text
.intel_syntax noprefix
@@ -92,6 +93,7 @@ isr\num\()_frame_ready:
# Push all general-purpose registers
push rax
mov [_fault_rax], rax
push rbx
push rdx
push rsi
@@ -277,6 +279,7 @@ isr\num\()_frame_ready:
# Push all general-purpose registers
push rax
mov [_fault_rax], rax
push rbx
push rsi
push rdi