summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormarkj <markj@FreeBSD.org>2015-05-10 22:27:48 +0000
committermarkj <markj@FreeBSD.org>2015-05-10 22:27:48 +0000
commit6ede9cbbeff7e308607ab3cb6c72e5739d56ea14 (patch)
treee665f290604415d086d05ec17a545f23d920bf67
parent9a6d755918d6c0209303eaa55fef98a018919a7d (diff)
downloadFreeBSD-src-6ede9cbbeff7e308607ab3cb6c72e5739d56ea14.zip
FreeBSD-src-6ede9cbbeff7e308607ab3cb6c72e5739d56ea14.tar.gz
Remove some commented-out upstream code for handling traps from usermode
DTrace probes. This handling is already done in trap() on i386 and amd64.
-rw-r--r--sys/cddl/dev/dtrace/amd64/dtrace_subr.c108
-rw-r--r--sys/cddl/dev/dtrace/i386/dtrace_subr.c116
2 files changed, 0 insertions, 224 deletions
diff --git a/sys/cddl/dev/dtrace/amd64/dtrace_subr.c b/sys/cddl/dev/dtrace/amd64/dtrace_subr.c
index 805add2..7f2ec7e 100644
--- a/sys/cddl/dev/dtrace/amd64/dtrace_subr.c
+++ b/sys/cddl/dev/dtrace/amd64/dtrace_subr.c
@@ -142,114 +142,6 @@ dtrace_sync(void)
}
#ifdef notyet
-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_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)
{
diff --git a/sys/cddl/dev/dtrace/i386/dtrace_subr.c b/sys/cddl/dev/dtrace/i386/dtrace_subr.c
index 4073317..814019e 100644
--- a/sys/cddl/dev/dtrace/i386/dtrace_subr.c
+++ b/sys/cddl/dev/dtrace/i386/dtrace_subr.c
@@ -143,122 +143,6 @@ dtrace_sync(void)
}
#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)
{
OpenPOWER on IntegriCloud