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