debug(intr): #GP/#PF 打印 faulting RSP
memmap 修复后栈写 #PF 消失,但 sched started 后出现 [GP] rip=0x134e1b err=0x0——0x134e1b 是 serial.printf(变参)序言的 movaps(SSE 对齐存储), 说明调用方 RSP 未对齐。isr.s 新增 _fault_rsp 捕获(ISR_ERR 宏保存 faulting RSP),idt.vp #GP/#PF 打印 rsp=0x%lx,定位 RSP 偏差来源。
This commit is contained in:
1 parent
530c85d6a4
commit
4ff48efde9
2 files changed
+14
-6
No files matched your search
@@ -116,20 +116,24 @@ def isrCommonhandler(interrupt: t.CInt):
|
||||
op=[t.ASM_DESCR.CLOBBER_RAX])
|
||||
fault_rip: t.CUInt64T = 0
|
||||
fault_err: t.CUInt64T = 0
|
||||
fault_rsp: t.CUInt64T = 0
|
||||
c.Asm(f"""mov {c.AsmOut(fault_rip, t.ASM_DESCR.OUTPUT_REG)}, [_fault_rip]
|
||||
mov {c.AsmOut(fault_err, t.ASM_DESCR.OUTPUT_REG)}, [_fault_err]""",
|
||||
mov {c.AsmOut(fault_err, t.ASM_DESCR.OUTPUT_REG)}, [_fault_err]
|
||||
mov {c.AsmOut(fault_rsp, t.ASM_DESCR.OUTPUT_REG)}, [_fault_rsp]""",
|
||||
op=[t.ASM_DESCR.CLOBBER_RAX])
|
||||
buf: t.CArray[t.CChar, 80]
|
||||
viperlib.snprintf(c.Addr(buf), 80, "[PF] cr2=0x%lx rip=0x%lx err=0x%lx\n", cr2, fault_rip, fault_err)
|
||||
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)
|
||||
elif interrupt == 13:
|
||||
gp_rip: t.CUInt64T = 0
|
||||
gp_err: t.CUInt64T = 0
|
||||
gp_rsp: t.CUInt64T = 0
|
||||
c.Asm(f"""mov {c.AsmOut(gp_rip, t.ASM_DESCR.OUTPUT_REG)}, [_fault_rip]
|
||||
mov {c.AsmOut(gp_err, t.ASM_DESCR.OUTPUT_REG)}, [_fault_err]""",
|
||||
mov {c.AsmOut(gp_err, t.ASM_DESCR.OUTPUT_REG)}, [_fault_err]
|
||||
mov {c.AsmOut(gp_rsp, t.ASM_DESCR.OUTPUT_REG)}, [_fault_rsp]""",
|
||||
op=[t.ASM_DESCR.CLOBBER_RAX])
|
||||
gp_buf: t.CArray[t.CChar, 80]
|
||||
viperlib.snprintf(c.Addr(gp_buf), 80, "[GP] rip=0x%lx err=0x%lx\n", gp_rip, gp_err)
|
||||
gp_buf: t.CArray[t.CChar, 100]
|
||||
viperlib.snprintf(c.Addr(gp_buf), 100, "[GP] rip=0x%lx err=0x%lx rsp=0x%lx\n", gp_rip, gp_err, gp_rsp)
|
||||
serial.puts(gp_buf)
|
||||
s: sched.Scheduler | t.CPtr = sched._sched_ptr
|
||||
# 如果调度器未初始化,直接进入安全停机状态
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
.comm _fs_lock, 4, 4
|
||||
.comm _fault_rip, 8, 8
|
||||
.comm _fault_err, 8, 8
|
||||
.comm _fault_rsp, 8, 8
|
||||
|
||||
.section .text
|
||||
.intel_syntax noprefix
|
||||
@@ -238,6 +239,8 @@ isr\num\()_from_kernel:
|
||||
mov r10, [rsp + 24] # RFLAGS
|
||||
xor r11, r11 # SS = 0
|
||||
xor rax, rax # RSP = 0
|
||||
lea rcx, [rsp + 32] # faulting RSP = entry_rsp + 32 (err + RIP + CS + RFLAGS)
|
||||
mov [_fault_rsp], rcx
|
||||
add rsp, 32 # remove 4 CPU-pushed qwords (error + 3 frame)
|
||||
jmp isr\num\()_frame_ready
|
||||
|
||||
@@ -250,6 +253,7 @@ isr\num\()_from_user:
|
||||
mov r10, [rsp + 24] # RFLAGS
|
||||
mov rax, [rsp + 32] # RSP (user)
|
||||
mov r11, [rsp + 40] # SS (user)
|
||||
mov [_fault_rsp], rax # faulting RSP = user RSP
|
||||
mov gs:[0x0], rax # save user RSP
|
||||
add rsp, 48 # remove 6 CPU-pushed qwords (error + 5 frame)
|
||||
|
||||
|
||||
Reference in new issue
Block a user