PERFORCE change 207100 for review

Oleksandr Tymoshenko gonzo at FreeBSD.org
Wed Feb 29 19:42:49 UTC 2012


http://p4web.freebsd.org/@@207100?ac=10

Change 207100 by gonzo at 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];


More information about the p4-projects mailing list