From owner-p4-projects@FreeBSD.ORG Sun Mar 23 04:08:23 2008 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 1EC6A1065672; Sun, 23 Mar 2008 04:08:23 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id B6229106564A for ; Sun, 23 Mar 2008 04:08:22 +0000 (UTC) (envelope-from jb@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id A4DCD8FC17 for ; Sun, 23 Mar 2008 04:08:22 +0000 (UTC) (envelope-from jb@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id m2N48MU6085148 for ; Sun, 23 Mar 2008 04:08:22 GMT (envelope-from jb@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id m2N48MSY085146 for perforce@freebsd.org; Sun, 23 Mar 2008 04:08:22 GMT (envelope-from jb@freebsd.org) Date: Sun, 23 Mar 2008 04:08:22 GMT Message-Id: <200803230408.m2N48MSY085146@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to jb@freebsd.org using -f From: John Birrell To: Perforce Change Reviews Cc: Subject: PERFORCE change 138330 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 23 Mar 2008 04:08:23 -0000 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 #include +#include #include #include @@ -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;