Date: Sun, 23 Mar 2008 04:08:22 GMT From: John Birrell <jb@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 138330 for review Message-ID: <200803230408.m2N48MSY085146@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=138330 Change 138330 by jb@jb_freebsd1 on 2008/03/23 04:08:02 WIP Affected files ... .. //depot/projects/dtrace/src/sys/cddl/dev/dtrace/amd64/dtrace_isa.c#4 edit Differences ... ==== //depot/projects/dtrace/src/sys/cddl/dev/dtrace/amd64/dtrace_isa.c#4 (text+ko) ==== @@ -31,6 +31,7 @@ #include <sys/stack.h> #include <sys/pcpu.h> +#include <machine/frame.h> #include <machine/md_var.h> #include <machine/stack.h> @@ -41,7 +42,7 @@ extern uintptr_t kernbase; uintptr_t kernelbase = (uintptr_t) &kernbase; -struct frame { +struct xframe { greg_t fr_savfp; /* saved frame pointer */ greg_t fr_savpc; /* saved program counter */ }; @@ -100,29 +101,17 @@ } } -#ifdef DOODAD static int dtrace_getustack_common(uint64_t *pcstack, int pcstack_limit, uintptr_t pc, uintptr_t sp) { - klwp_t *lwp = ttolwp(curthread); - proc_t *p = curproc; - uintptr_t oldcontext = lwp->lwp_oldcontext; volatile uint16_t *flags = (volatile uint16_t *)&cpu_core[curcpu].cpuc_dtrace_flags; - size_t s1, s2; + struct amd64_frame *frame; int ret = 0; ASSERT(pcstack == NULL || pcstack_limit > 0); - if (p->p_model == DATAMODEL_NATIVE) { - s1 = sizeof (struct frame) + 2 * sizeof (long); - s2 = s1 + sizeof (siginfo_t); - } else { - s1 = sizeof (struct frame32) + 3 * sizeof (int); - s2 = s1 + sizeof (siginfo32_t); - } - while (pc != 0 && sp != 0) { ret++; if (pcstack != NULL) { @@ -132,38 +121,11 @@ break; } - if (oldcontext == sp + s1 || oldcontext == sp + s2) { - if (p->p_model == DATAMODEL_NATIVE) { - ucontext_t *ucp = (ucontext_t *)oldcontext; - greg_t *gregs = ucp->uc_mcontext.gregs; + frame = (struct amd64_frame *) sp; - sp = dtrace_fulword(&gregs[REG_FP]); - pc = dtrace_fulword(&gregs[REG_PC]); - - oldcontext = dtrace_fulword(&ucp->uc_link); - } else { - ucontext32_t *ucp = (ucontext32_t *)oldcontext; - greg32_t *gregs = ucp->uc_mcontext.gregs; + pc = dtrace_fulword(&frame->f_retaddr); + sp = dtrace_fulword(&frame->f_frame); - sp = dtrace_fuword32(&gregs[EBP]); - pc = dtrace_fuword32(&gregs[EIP]); - - oldcontext = dtrace_fuword32(&ucp->uc_link); - } - } else { - if (p->p_model == DATAMODEL_NATIVE) { - struct frame *fr = (struct frame *)sp; - - pc = dtrace_fulword(&fr->fr_savpc); - sp = dtrace_fulword(&fr->fr_savfp); - } else { - struct frame32 *fr = (struct frame32 *)sp; - - pc = dtrace_fuword32(&fr->fr_savpc); - sp = dtrace_fuword32(&fr->fr_savfp); - } - } - /* * This is totally bogus: if we faulted, we're going to clear * the fault and break. This is to deal with the apparently @@ -177,15 +139,12 @@ return (ret); } -#endif void dtrace_getupcstack(uint64_t *pcstack, int pcstack_limit) { -#ifdef DOODAD - klwp_t *lwp = ttolwp(curthread); proc_t *p = curproc; - struct regs *rp; + struct trapframe *tf; uintptr_t pc, sp; volatile uint16_t *flags = (volatile uint16_t *)&cpu_core[curcpu].cpuc_dtrace_flags; @@ -200,7 +159,7 @@ /* * If there's no user context we still need to zero the stack. */ - if (lwp == NULL || p == NULL || (rp = lwp->lwp_regs) == NULL) + if (p == NULL || (tf = curthread->td_frame) == NULL) goto zero; *pcstack++ = (uint64_t)p->p_pid; @@ -209,8 +168,8 @@ if (pcstack_limit <= 0) return; - pc = rp->r_pc; - sp = rp->r_fp; + pc = tf->tf_rip; + sp = tf->tf_rsp; if (DTRACE_CPUFLAG_ISSET(CPU_DTRACE_ENTRY)) { *pcstack++ = (uint64_t)pc; @@ -218,10 +177,7 @@ if (pcstack_limit <= 0) return; - if (p->p_model == DATAMODEL_NATIVE) - pc = dtrace_fulword((void *)rp->r_sp); - else - pc = dtrace_fuword32((void *)rp->r_sp); + pc = dtrace_fulword((void *) sp); } n = dtrace_getustack_common(pcstack, pcstack_limit, pc, sp); @@ -233,44 +189,35 @@ zero: while (pcstack_limit-- > 0) - *pcstack++ = NULL; -#endif + *pcstack++ = 0; } int dtrace_getustackdepth(void) { -#ifdef DOODAD - klwp_t *lwp = ttolwp(curthread); proc_t *p = curproc; - struct regs *rp; + struct trapframe *tf; uintptr_t pc, sp; int n = 0; - if (lwp == NULL || p == NULL || (rp = lwp->lwp_regs) == NULL) + if (p == NULL || (tf = curthread->td_frame) == NULL) return (0); if (DTRACE_CPUFLAG_ISSET(CPU_DTRACE_FAULT)) return (-1); - pc = rp->r_pc; - sp = rp->r_fp; + pc = tf->tf_rip; + sp = tf->tf_rsp; if (DTRACE_CPUFLAG_ISSET(CPU_DTRACE_ENTRY)) { n++; - if (p->p_model == DATAMODEL_NATIVE) - pc = dtrace_fulword((void *)rp->r_sp); - else - pc = dtrace_fuword32((void *)rp->r_sp); + pc = dtrace_fulword((void *) sp); } n += dtrace_getustack_common(NULL, 0, pc, sp); return (n); -#else -return 0; -#endif } void @@ -307,13 +254,8 @@ sp = rp->r_fp; oldcontext = lwp->lwp_oldcontext; - if (p->p_model == DATAMODEL_NATIVE) { - s1 = sizeof (struct frame) + 2 * sizeof (long); - s2 = s1 + sizeof (siginfo_t); - } else { - s1 = sizeof (struct frame32) + 3 * sizeof (int); - s2 = s1 + sizeof (siginfo32_t); - } + s1 = sizeof (struct xframe) + 2 * sizeof (long); + s2 = s1 + sizeof (siginfo_t); if (DTRACE_CPUFLAG_ISSET(CPU_DTRACE_ENTRY)) { *pcstack++ = (uint64_t)pc; @@ -336,35 +278,18 @@ break; if (oldcontext == sp + s1 || oldcontext == sp + s2) { - if (p->p_model == DATAMODEL_NATIVE) { - ucontext_t *ucp = (ucontext_t *)oldcontext; - greg_t *gregs = ucp->uc_mcontext.gregs; + ucontext_t *ucp = (ucontext_t *)oldcontext; + greg_t *gregs = ucp->uc_mcontext.gregs; - sp = dtrace_fulword(&gregs[REG_FP]); - pc = dtrace_fulword(&gregs[REG_PC]); + sp = dtrace_fulword(&gregs[REG_FP]); + pc = dtrace_fulword(&gregs[REG_PC]); - oldcontext = dtrace_fulword(&ucp->uc_link); - } else { - ucontext_t *ucp = (ucontext_t *)oldcontext; - greg_t *gregs = ucp->uc_mcontext.gregs; - - sp = dtrace_fuword32(&gregs[EBP]); - pc = dtrace_fuword32(&gregs[EIP]); - - oldcontext = dtrace_fuword32(&ucp->uc_link); - } + oldcontext = dtrace_fulword(&ucp->uc_link); } else { - if (p->p_model == DATAMODEL_NATIVE) { - struct frame *fr = (struct frame *)sp; + struct xframe *fr = (struct xframe *)sp; - pc = dtrace_fulword(&fr->fr_savpc); - sp = dtrace_fulword(&fr->fr_savfp); - } else { - struct frame32 *fr = (struct frame32 *)sp; - - pc = dtrace_fuword32(&fr->fr_savpc); - sp = dtrace_fuword32(&fr->fr_savfp); - } + pc = dtrace_fulword(&fr->fr_savpc); + sp = dtrace_fulword(&fr->fr_savfp); } /* @@ -390,7 +315,7 @@ { #ifdef DOODAD uintptr_t val; - struct frame *fp = (struct frame *)dtrace_getfp(); + struct xframe *fp = (struct xframe *)dtrace_getfp(); uintptr_t *stack; int i; #if defined(__amd64) @@ -402,7 +327,7 @@ #endif for (i = 1; i <= aframes; i++) { - fp = (struct frame *)(fp->fr_savfp); + fp = (struct xframe *)(fp->fr_savfp); if (fp->fr_savpc == (pc_t)dtrace_invop_callsite) { #if !defined(__amd64) @@ -486,12 +411,12 @@ { #ifdef DOODAD int depth = 0; - struct frame *frame; + struct xframe *frame; vm_offset_t ebp; aframes++; ebp = dtrace_getfp(); - frame = (struct frame *)ebp; + frame = (struct xframe *)ebp; depth++; for(;;) { if (!INKERNEL(frame)) @@ -499,12 +424,12 @@ if (!INKERNEL(frame->fr_savpc)) break; depth++; - if ((struct frame *)frame->fr_savfp < frame || + if ((struct xframe *)frame->fr_savfp < frame || (vm_offset_t)frame->fr_savfp >= (vm_offset_t)ebp + KSTACK_PAGES * PAGE_SIZE) break; - frame = (struct frame *)frame->fr_savfp; + frame = (struct xframe *)frame->fr_savfp; } if (depth < aframes) return 0;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200803230408.m2N48MSY085146>