From owner-p4-projects@FreeBSD.ORG Wed Feb 29 19:42:49 2012 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 84C7D1065686; Wed, 29 Feb 2012 19:42:49 +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 46F51106568B for ; Wed, 29 Feb 2012 19:42:49 +0000 (UTC) (envelope-from gonzo@FreeBSD.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id 33D018FC15 for ; Wed, 29 Feb 2012 19:42:49 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id q1TJgnXd056742 for ; Wed, 29 Feb 2012 19:42:49 GMT (envelope-from gonzo@FreeBSD.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id q1TJgmOk056739 for perforce@freebsd.org; Wed, 29 Feb 2012 19:42:48 GMT (envelope-from gonzo@FreeBSD.org) Date: Wed, 29 Feb 2012 19:42:48 GMT Message-Id: <201202291942.q1TJgmOk056739@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to gonzo@FreeBSD.org using -f From: Oleksandr Tymoshenko To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 207100 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 29 Feb 2012 19:42:49 -0000 http://p4web.freebsd.org/@@207100?ac=10 Change 207100 by gonzo@gonzo_thinkpad on 2012/02/29 19:42:10 Remove references to fasttrap code. Postpone it to stage 2 Affected files ... .. //depot/projects/dtrace-mips/sys/cddl/dev/dtrace/mips/dtrace_subr.c#2 edit Differences ... ==== //depot/projects/dtrace-mips/sys/cddl/dev/dtrace/mips/dtrace_subr.c#2 (text+ko) ==== @@ -105,221 +105,6 @@ dtrace_xcall(DTRACE_CPUALL, (dtrace_xcall_t)dtrace_sync_func, NULL); } -#ifdef notyet -int (*dtrace_fasttrap_probe_ptr)(struct regs *); -int (*dtrace_pid_probe_ptr)(struct regs *); -int (*dtrace_return_probe_ptr)(struct regs *); - -void -dtrace_user_probe(struct regs *rp, caddr_t addr, processorid_t cpuid) -{ - krwlock_t *rwp; - proc_t *p = curproc; - extern void trap(struct regs *, caddr_t, processorid_t); - - if (USERMODE(rp->r_cs) || (rp->r_ps & PS_VM)) { - if (curthread->t_cred != p->p_cred) { - cred_t *oldcred = curthread->t_cred; - /* - * DTrace accesses t_cred in probe context. t_cred - * must always be either NULL, or point to a valid, - * allocated cred structure. - */ - curthread->t_cred = crgetcred(); - crfree(oldcred); - } - } - - if (rp->r_trapno == T_DTRACE_RET) { - uint8_t step = curthread->t_dtrace_step; - uint8_t ret = curthread->t_dtrace_ret; - uintptr_t npc = curthread->t_dtrace_npc; - - if (curthread->t_dtrace_ast) { - aston(curthread); - curthread->t_sig_check = 1; - } - - /* - * Clear all user tracing flags. - */ - curthread->t_dtrace_ft = 0; - - /* - * If we weren't expecting to take a return probe trap, kill - * the process as though it had just executed an unassigned - * trap instruction. - */ - if (step == 0) { - tsignal(curthread, SIGILL); - return; - } - - /* - * If we hit this trap unrelated to a return probe, we're - * just here to reset the AST flag since we deferred a signal - * until after we logically single-stepped the instruction we - * copied out. - */ - if (ret == 0) { - rp->r_pc = npc; - return; - } - - /* - * We need to wait until after we've called the - * dtrace_return_probe_ptr function pointer to set %pc. - */ - rwp = &CPU->cpu_ft_lock; - rw_enter(rwp, RW_READER); - if (dtrace_return_probe_ptr != NULL) - (void) (*dtrace_return_probe_ptr)(rp); - rw_exit(rwp); - rp->r_pc = npc; - - } else if (rp->r_trapno == T_DTRACE_PROBE) { - rwp = &CPU->cpu_ft_lock; - rw_enter(rwp, RW_READER); - if (dtrace_fasttrap_probe_ptr != NULL) - (void) (*dtrace_fasttrap_probe_ptr)(rp); - rw_exit(rwp); - - } else if (rp->r_trapno == T_BPTFLT) { - uint8_t instr; - rwp = &CPU->cpu_ft_lock; - - /* - * The DTrace fasttrap provider uses the breakpoint trap - * (int 3). We let DTrace take the first crack at handling - * this trap; if it's not a probe that DTrace knowns about, - * we call into the trap() routine to handle it like a - * breakpoint placed by a conventional debugger. - */ - rw_enter(rwp, RW_READER); - if (dtrace_pid_probe_ptr != NULL && - (*dtrace_pid_probe_ptr)(rp) == 0) { - rw_exit(rwp); - return; - } - rw_exit(rwp); - - /* - * If the instruction that caused the breakpoint trap doesn't - * look like an int 3 anymore, it may be that this tracepoint - * was removed just after the user thread executed it. In - * that case, return to user land to retry the instuction. - */ - if (fuword8((void *)(rp->r_pc - 1), &instr) == 0 && - instr != FASTTRAP_INSTR) { - rp->r_pc--; - return; - } - - trap(rp, addr, cpuid); - - } else { - trap(rp, addr, cpuid); - } -} - -void -dtrace_safe_synchronous_signal(void) -{ - kthread_t *t = curthread; - struct regs *rp = lwptoregs(ttolwp(t)); - size_t isz = t->t_dtrace_npc - t->t_dtrace_pc; - - ASSERT(t->t_dtrace_on); - - /* - * If we're not in the range of scratch addresses, we're not actually - * tracing user instructions so turn off the flags. If the instruction - * we copied out caused a synchonous trap, reset the pc back to its - * original value and turn off the flags. - */ - if (rp->r_pc < t->t_dtrace_scrpc || - rp->r_pc > t->t_dtrace_astpc + isz) { - t->t_dtrace_ft = 0; - } else if (rp->r_pc == t->t_dtrace_scrpc || - rp->r_pc == t->t_dtrace_astpc) { - rp->r_pc = t->t_dtrace_pc; - t->t_dtrace_ft = 0; - } -} - -int -dtrace_safe_defer_signal(void) -{ - kthread_t *t = curthread; - struct regs *rp = lwptoregs(ttolwp(t)); - size_t isz = t->t_dtrace_npc - t->t_dtrace_pc; - - ASSERT(t->t_dtrace_on); - - /* - * If we're not in the range of scratch addresses, we're not actually - * tracing user instructions so turn off the flags. - */ - if (rp->r_pc < t->t_dtrace_scrpc || - rp->r_pc > t->t_dtrace_astpc + isz) { - t->t_dtrace_ft = 0; - return (0); - } - - /* - * If we've executed the original instruction, but haven't performed - * the jmp back to t->t_dtrace_npc or the clean up of any registers - * used to emulate %rip-relative instructions in 64-bit mode, do that - * here and take the signal right away. We detect this condition by - * seeing if the program counter is the range [scrpc + isz, astpc). - */ - if (t->t_dtrace_astpc - rp->r_pc < - t->t_dtrace_astpc - t->t_dtrace_scrpc - isz) { -#ifdef __amd64 - /* - * If there is a scratch register and we're on the - * instruction immediately after the modified instruction, - * restore the value of that scratch register. - */ - if (t->t_dtrace_reg != 0 && - rp->r_pc == t->t_dtrace_scrpc + isz) { - switch (t->t_dtrace_reg) { - case REG_RAX: - rp->r_rax = t->t_dtrace_regv; - break; - case REG_RCX: - rp->r_rcx = t->t_dtrace_regv; - break; - case REG_R8: - rp->r_r8 = t->t_dtrace_regv; - break; - case REG_R9: - rp->r_r9 = t->t_dtrace_regv; - break; - } - } -#endif - rp->r_pc = t->t_dtrace_npc; - t->t_dtrace_ft = 0; - return (0); - } - - /* - * Otherwise, make sure we'll return to the kernel after executing - * the copied out instruction and defer the signal. - */ - if (!t->t_dtrace_step) { - ASSERT(rp->r_pc < t->t_dtrace_astpc); - rp->r_pc += t->t_dtrace_astpc - t->t_dtrace_scrpc; - t->t_dtrace_step = 1; - } - - t->t_dtrace_ast = 1; - - return (1); -} -#endif - static int64_t tgt_cpu_counter; static int64_t hst_cpu_counter; static int64_t counter_skew[MAXCPU];