diff options
| author | Konstantin Belousov <kib@FreeBSD.org> | 2026-03-04 03:22:26 +0000 |
|---|---|---|
| committer | Konstantin Belousov <kib@FreeBSD.org> | 2026-03-05 23:53:57 +0000 |
| commit | 272ea451199462dffd55dd580532eb28ddc92174 (patch) | |
| tree | 56cb2abfc31a9e5cfc44811081f7e3137f54f5a8 | |
| parent | 3e8a9995e9541a0bdd707f111e51ef46a544ee3e (diff) | |
amd64: print userspace fsbase and gsbase for uprintf_signal
| -rw-r--r-- | sys/amd64/amd64/trap.c | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/sys/amd64/amd64/trap.c b/sys/amd64/amd64/trap.c index d07fbc223193..d173f57e2e4f 100644 --- a/sys/amd64/amd64/trap.c +++ b/sys/amd64/amd64/trap.c @@ -182,15 +182,32 @@ trap_uprintf_signal(struct thread *td, struct trapframe *frame, register_t addr, int signo, int ucode) { struct proc *p; + struct pcb *pcb; + register_t fsbase, gsbase, r; if (!uprintf_signal) return; p = td->td_proc; + pcb = td->td_pcb; + if ((cpu_stdext_feature & CPUID_STDEXT_FSGSBASE) != 0) { + r = intr_disable(); + if ((pcb->pcb_flags & PCB_FULL_IRET) == 0) { + fsbase = rdfsbase(); + gsbase = rdmsr(MSR_KGSBASE); + } else { + fsbase = pcb->pcb_fsbase; + gsbase = pcb->pcb_gsbase; + } + intr_restore(r); + } else { + fsbase = pcb->pcb_fsbase; + gsbase = pcb->pcb_gsbase; + } uprintf("pid %d comm %s: signal %d err %#lx code %d type %d " - "addr %#lx rsp %#lx rip %#lx rax %#lx " + "addr %#lx rsp %#lx rip %#lx rax %#lx fsb %#lx gsb %#lx " "<%02x %02x %02x %02x %02x %02x %02x %02x>\n", p->p_pid, p->p_comm, signo, frame->tf_err, ucode, frame->tf_trapno, - addr, frame->tf_rsp, frame->tf_rip, frame->tf_rax, + addr, frame->tf_rsp, frame->tf_rip, frame->tf_rax, fsbase, gsbase, fubyte((void *)(frame->tf_rip + 0)), fubyte((void *)(frame->tf_rip + 1)), fubyte((void *)(frame->tf_rip + 2)), |
