Lines Matching refs:dpr
98 dt_proc_bpcreate(dt_proc_t *dpr, uintptr_t addr, dt_bkpt_f *func, void *data) in dt_proc_bpcreate() argument
100 struct ps_prochandle *P = dpr->dpr_proc; in dt_proc_bpcreate()
103 assert(MUTEX_HELD(&dpr->dpr_lock)); in dt_proc_bpcreate()
105 if ((dbp = dt_zalloc(dpr->dpr_hdl, sizeof (dt_bkpt_t))) != NULL) { in dt_proc_bpcreate()
113 dt_list_append(&dpr->dpr_bps, dbp); in dt_proc_bpcreate()
120 dt_proc_bpdestroy(dt_proc_t *dpr, int delbkpts) in dt_proc_bpdestroy() argument
122 int state = Pstate(dpr->dpr_proc); in dt_proc_bpdestroy()
125 assert(MUTEX_HELD(&dpr->dpr_lock)); in dt_proc_bpdestroy()
127 for (dbp = dt_list_next(&dpr->dpr_bps); dbp != NULL; dbp = nbp) { in dt_proc_bpdestroy()
130 (void) Pdelbkpt(dpr->dpr_proc, in dt_proc_bpdestroy()
134 dt_list_delete(&dpr->dpr_bps, dbp); in dt_proc_bpdestroy()
135 dt_free(dpr->dpr_hdl, dbp); in dt_proc_bpdestroy()
140 dt_proc_bpmatch(dtrace_hdl_t *dtp, dt_proc_t *dpr) in dt_proc_bpmatch() argument
142 const lwpstatus_t *psp = &Pstatus(dpr->dpr_proc)->pr_lwp; in dt_proc_bpmatch()
145 assert(MUTEX_HELD(&dpr->dpr_lock)); in dt_proc_bpmatch()
147 for (dbp = dt_list_next(&dpr->dpr_bps); in dt_proc_bpmatch()
155 (int)dpr->dpr_pid, (ulong_t)psp->pr_reg[R_PC]); in dt_proc_bpmatch()
160 (int)dpr->dpr_pid, (ulong_t)dbp->dbp_addr, ++dbp->dbp_hits); in dt_proc_bpmatch()
162 dbp->dbp_func(dtp, dpr, dbp->dbp_data); in dt_proc_bpmatch()
163 (void) Pxecbkpt(dpr->dpr_proc, dbp->dbp_instr); in dt_proc_bpmatch()
167 dt_proc_bpenable(dt_proc_t *dpr) in dt_proc_bpenable() argument
171 assert(MUTEX_HELD(&dpr->dpr_lock)); in dt_proc_bpenable()
173 for (dbp = dt_list_next(&dpr->dpr_bps); in dt_proc_bpenable()
175 if (!dbp->dbp_active && Psetbkpt(dpr->dpr_proc, in dt_proc_bpenable()
184 dt_proc_bpdisable(dt_proc_t *dpr) in dt_proc_bpdisable() argument
188 assert(MUTEX_HELD(&dpr->dpr_lock)); in dt_proc_bpdisable()
190 for (dbp = dt_list_next(&dpr->dpr_bps); in dt_proc_bpdisable()
192 if (dbp->dbp_active && Pdelbkpt(dpr->dpr_proc, in dt_proc_bpdisable()
201 dt_proc_notify(dtrace_hdl_t *dtp, dt_proc_hash_t *dph, dt_proc_t *dpr, in dt_proc_notify() argument
208 (int)dpr->dpr_pid, msg); in dt_proc_notify()
210 dprn->dprn_dpr = dpr; in dt_proc_notify()
234 dt_proc_stop(dt_proc_t *dpr, uint8_t why) in dt_proc_stop() argument
236 assert(MUTEX_HELD(&dpr->dpr_lock)); in dt_proc_stop()
239 if (dpr->dpr_stop & why) { in dt_proc_stop()
240 dpr->dpr_stop |= DT_PROC_STOP_IDLE; in dt_proc_stop()
241 dpr->dpr_stop &= ~why; in dt_proc_stop()
243 (void) pthread_cond_broadcast(&dpr->dpr_cv); in dt_proc_stop()
250 dt_proc_bpdisable(dpr); in dt_proc_stop()
252 while (dpr->dpr_stop & DT_PROC_STOP_IDLE) in dt_proc_stop()
253 (void) pthread_cond_wait(&dpr->dpr_cv, &dpr->dpr_lock); in dt_proc_stop()
255 dt_proc_bpenable(dpr); in dt_proc_stop()
261 dt_proc_bpmain(dtrace_hdl_t *dtp, dt_proc_t *dpr, const char *fname) in dt_proc_bpmain() argument
263 dt_dprintf("pid %d: breakpoint at %s()\n", (int)dpr->dpr_pid, fname); in dt_proc_bpmain()
264 dt_proc_stop(dpr, DT_PROC_STOP_MAIN); in dt_proc_bpmain()
268 dt_proc_rdevent(dtrace_hdl_t *dtp, dt_proc_t *dpr, const char *evname) in dt_proc_rdevent() argument
273 if ((err = rd_event_getmsg(dpr->dpr_rtld, &rdm)) != RD_OK) { in dt_proc_rdevent()
275 (int)dpr->dpr_pid, evname, rd_errstr(err)); in dt_proc_rdevent()
280 (int)dpr->dpr_pid, evname, rdm.type, rdm.u.state); in dt_proc_rdevent()
287 Pupdate_syms(dpr->dpr_proc); in dt_proc_rdevent()
288 if (dt_pid_create_probes_module(dtp, dpr) != 0) in dt_proc_rdevent()
289 dt_proc_notify(dtp, dtp->dt_procs, dpr, in dt_proc_rdevent()
290 dpr->dpr_errmsg); in dt_proc_rdevent()
294 Pupdate_syms(dpr->dpr_proc); in dt_proc_rdevent()
295 dt_proc_stop(dpr, DT_PROC_STOP_PREINIT); in dt_proc_rdevent()
298 Pupdate_syms(dpr->dpr_proc); in dt_proc_rdevent()
299 dt_proc_stop(dpr, DT_PROC_STOP_POSTINIT); in dt_proc_rdevent()
305 dt_proc_rdwatch(dt_proc_t *dpr, rd_event_e event, const char *evname) in dt_proc_rdwatch() argument
310 if ((err = rd_event_addr(dpr->dpr_rtld, event, &rdn)) != RD_OK) { in dt_proc_rdwatch()
312 (int)dpr->dpr_pid, evname, rd_errstr(err)); in dt_proc_rdwatch()
318 (int)dpr->dpr_pid, evname, rdn.type); in dt_proc_rdwatch()
322 (void) dt_proc_bpcreate(dpr, rdn.u.bptaddr, in dt_proc_rdwatch()
331 dt_proc_attach(dt_proc_t *dpr, int exec) in dt_proc_attach() argument
333 const pstatus_t *psp = Pstatus(dpr->dpr_proc); in dt_proc_attach()
337 assert(MUTEX_HELD(&dpr->dpr_lock)); in dt_proc_attach()
343 dt_proc_bpdestroy(dpr, B_FALSE); in dt_proc_attach()
344 Preset_maps(dpr->dpr_proc); in dt_proc_attach()
347 if ((dpr->dpr_rtld = Prd_agent(dpr->dpr_proc)) != NULL && in dt_proc_attach()
348 (err = rd_event_enable(dpr->dpr_rtld, B_TRUE)) == RD_OK) { in dt_proc_attach()
349 dt_proc_rdwatch(dpr, RD_PREINIT, "RD_PREINIT"); in dt_proc_attach()
350 dt_proc_rdwatch(dpr, RD_POSTINIT, "RD_POSTINIT"); in dt_proc_attach()
351 dt_proc_rdwatch(dpr, RD_DLACTIVITY, "RD_DLACTIVITY"); in dt_proc_attach()
354 (int)dpr->dpr_pid, dpr->dpr_rtld ? rd_errstr(err) : in dt_proc_attach()
358 Pupdate_maps(dpr->dpr_proc); in dt_proc_attach()
360 if (Pxlookup_by_name(dpr->dpr_proc, LM_ID_BASE, in dt_proc_attach()
362 (void) dt_proc_bpcreate(dpr, (uintptr_t)sym.st_value, in dt_proc_attach()
366 (int)dpr->dpr_pid, strerror(errno)); in dt_proc_attach()
391 dt_proc_waitrun(dt_proc_t *dpr) in dt_proc_waitrun() argument
393 struct ps_prochandle *P = dpr->dpr_proc; in dt_proc_waitrun()
403 assert(MUTEX_HELD(&dpr->dpr_lock)); in dt_proc_waitrun()
415 (void) pthread_mutex_unlock(&dpr->dpr_lock); in dt_proc_waitrun()
417 while (!dpr->dpr_quit) { in dt_proc_waitrun()
421 (void) pthread_mutex_lock(&dpr->dpr_lock); in dt_proc_waitrun()
437 (void) pthread_mutex_unlock(&dpr->dpr_lock); in dt_proc_waitrun()
441 (void) pthread_mutex_lock(&dpr->dpr_lock); in dt_proc_waitrun()
466 dt_proc_t *dpr = datap->dpcd_proc; in dt_proc_control() local
468 struct ps_prochandle *P = dpr->dpr_proc; in dt_proc_control()
471 int pid = dpr->dpr_pid; in dt_proc_control()
489 (void) pthread_mutex_lock(&dpr->dpr_lock); in dt_proc_control()
516 dt_proc_attach(dpr, B_FALSE); /* enable rtld breakpoints */ in dt_proc_control()
523 dt_proc_stop(dpr, DT_PROC_STOP_CREATE); in dt_proc_control()
525 dt_proc_stop(dpr, DT_PROC_STOP_GRAB); in dt_proc_control()
529 (int)dpr->dpr_pid, strerror(errno)); in dt_proc_control()
532 (void) pthread_mutex_unlock(&dpr->dpr_lock); in dt_proc_control()
543 while (!dpr->dpr_quit) { in dt_proc_control()
549 (void) pthread_mutex_lock(&dpr->dpr_lock); in dt_proc_control()
552 (void) pthread_mutex_unlock(&dpr->dpr_lock); in dt_proc_control()
575 dt_proc_waitrun(dpr); in dt_proc_control()
576 (void) pthread_mutex_unlock(&dpr->dpr_lock); in dt_proc_control()
590 dt_proc_bpmatch(dtp, dpr); in dt_proc_control()
593 dt_proc_bpdisable(dpr); in dt_proc_control()
596 dt_proc_bpenable(dpr); in dt_proc_control()
599 dt_proc_attach(dpr, B_TRUE); in dt_proc_control()
609 dpr->dpr_quit = B_TRUE; in dt_proc_control()
615 dpr->dpr_quit = B_TRUE; in dt_proc_control()
622 (int)dpr->dpr_pid, strerror(errno)); in dt_proc_control()
625 (void) pthread_mutex_unlock(&dpr->dpr_lock); in dt_proc_control()
633 dt_proc_notify(dtp, dph, dpr, NULL); in dt_proc_control()
640 (void) pthread_mutex_lock(&dpr->dpr_lock); in dt_proc_control()
642 dt_proc_bpdestroy(dpr, B_TRUE); in dt_proc_control()
643 dpr->dpr_done = B_TRUE; in dt_proc_control()
644 dpr->dpr_tid = 0; in dt_proc_control()
646 (void) pthread_cond_broadcast(&dpr->dpr_cv); in dt_proc_control()
647 (void) pthread_mutex_unlock(&dpr->dpr_lock); in dt_proc_control()
654 dt_proc_error(dtrace_hdl_t *dtp, dt_proc_t *dpr, const char *format, ...) in dt_proc_error() argument
662 if (dpr->dpr_proc != NULL) in dt_proc_error()
663 Prelease(dpr->dpr_proc, 0); in dt_proc_error()
665 dt_free(dtp, dpr); in dt_proc_error()
675 dt_proc_t *dpr, **dpp = &dph->dph_hash[pid & (dph->dph_hashlen - 1)]; in dt_proc_lookup() local
677 for (dpr = *dpp; dpr != NULL; dpr = dpr->dpr_hash) { in dt_proc_lookup()
678 if (dpr->dpr_pid == pid) in dt_proc_lookup()
681 dpp = &dpr->dpr_hash; in dt_proc_lookup()
684 assert(dpr != NULL); in dt_proc_lookup()
685 assert(dpr->dpr_proc == P); in dt_proc_lookup()
688 *dpp = dpr->dpr_hash; /* remove from pid hash chain */ in dt_proc_lookup()
690 return (dpr); in dt_proc_lookup()
696 dt_proc_t *dpr = dt_proc_lookup(dtp, P, B_FALSE); in dt_proc_destroy() local
701 assert(dpr != NULL); in dt_proc_destroy()
708 if (!(Pstatus(dpr->dpr_proc)->pr_flags & (PR_KLC | PR_RLC))) { in dt_proc_destroy()
709 dt_dprintf("abandoning pid %d\n", (int)dpr->dpr_pid); in dt_proc_destroy()
711 } else if (Pstatus(dpr->dpr_proc)->pr_flags & PR_KLC) { in dt_proc_destroy()
712 dt_dprintf("killing pid %d\n", (int)dpr->dpr_pid); in dt_proc_destroy()
715 dt_dprintf("releasing pid %d\n", (int)dpr->dpr_pid); in dt_proc_destroy()
719 if (dpr->dpr_tid) { in dt_proc_destroy()
734 (void) pthread_mutex_lock(&dpr->dpr_lock); in dt_proc_destroy()
735 dpr->dpr_quit = B_TRUE; in dt_proc_destroy()
736 (void) _lwp_kill(dpr->dpr_tid, SIGCANCEL); in dt_proc_destroy()
742 if (dpr->dpr_stop & DT_PROC_STOP_IDLE) { in dt_proc_destroy()
743 dt_proc_bpenable(dpr); in dt_proc_destroy()
744 dpr->dpr_stop &= ~DT_PROC_STOP_IDLE; in dt_proc_destroy()
745 (void) pthread_cond_broadcast(&dpr->dpr_cv); in dt_proc_destroy()
748 while (!dpr->dpr_done) in dt_proc_destroy()
749 (void) pthread_cond_wait(&dpr->dpr_cv, &dpr->dpr_lock); in dt_proc_destroy()
751 (void) pthread_mutex_unlock(&dpr->dpr_lock); in dt_proc_destroy()
764 if (npr->dprn_dpr == dpr) { in dt_proc_destroy()
778 if (dpr->dpr_cacheable) { in dt_proc_destroy()
783 dt_list_delete(&dph->dph_lrulist, dpr); in dt_proc_destroy()
784 Prelease(dpr->dpr_proc, rflag); in dt_proc_destroy()
785 dt_free(dtp, dpr); in dt_proc_destroy()
789 dt_proc_create_thread(dtrace_hdl_t *dtp, dt_proc_t *dpr, uint_t stop) in dt_proc_create_thread() argument
796 (void) pthread_mutex_lock(&dpr->dpr_lock); in dt_proc_create_thread()
797 dpr->dpr_stop |= stop; /* set bit for initial rendezvous */ in dt_proc_create_thread()
807 data.dpcd_proc = dpr; in dt_proc_create_thread()
810 err = pthread_create(&dpr->dpr_tid, &a, dt_proc_control, &data); in dt_proc_create_thread()
822 while (!dpr->dpr_done && !(dpr->dpr_stop & DT_PROC_STOP_IDLE)) in dt_proc_create_thread()
823 (void) pthread_cond_wait(&dpr->dpr_cv, &dpr->dpr_lock); in dt_proc_create_thread()
831 if (dpr->dpr_done) { in dt_proc_create_thread()
832 const psinfo_t *prp = Ppsinfo(dpr->dpr_proc); in dt_proc_create_thread()
834 int pid = dpr->dpr_pid; in dt_proc_create_thread()
836 if (Pstate(dpr->dpr_proc) == PS_LOST) { in dt_proc_create_thread()
837 (void) dt_proc_error(dpr->dpr_hdl, dpr, in dt_proc_create_thread()
841 (void) dt_proc_error(dpr->dpr_hdl, dpr, in dt_proc_create_thread()
845 (void) dt_proc_error(dpr->dpr_hdl, dpr, in dt_proc_create_thread()
853 (void) dt_proc_error(dpr->dpr_hdl, dpr, in dt_proc_create_thread()
855 (int)dpr->dpr_pid, strerror(err)); in dt_proc_create_thread()
858 (void) pthread_mutex_unlock(&dpr->dpr_lock); in dt_proc_create_thread()
868 dt_proc_t *dpr; in dt_proc_create() local
871 if ((dpr = dt_zalloc(dtp, sizeof (dt_proc_t))) == NULL) in dt_proc_create()
874 (void) pthread_mutex_init(&dpr->dpr_lock, NULL); in dt_proc_create()
875 (void) pthread_cond_init(&dpr->dpr_cv, NULL); in dt_proc_create()
877 dpr->dpr_proc = Pxcreate(file, argv, dtp->dt_proc_env, &err, NULL, 0); in dt_proc_create()
878 if (dpr->dpr_proc == NULL) { in dt_proc_create()
879 return (dt_proc_error(dtp, dpr, in dt_proc_create()
883 dpr->dpr_hdl = dtp; in dt_proc_create()
884 dpr->dpr_pid = Pstatus(dpr->dpr_proc)->pr_pid; in dt_proc_create()
886 (void) Punsetflags(dpr->dpr_proc, PR_RLC); in dt_proc_create()
887 (void) Psetflags(dpr->dpr_proc, PR_KLC); in dt_proc_create()
889 if (dt_proc_create_thread(dtp, dpr, dtp->dt_prcmode) != 0) in dt_proc_create()
892 dpr->dpr_hash = dph->dph_hash[dpr->dpr_pid & (dph->dph_hashlen - 1)]; in dt_proc_create()
893 dph->dph_hash[dpr->dpr_pid & (dph->dph_hashlen - 1)] = dpr; in dt_proc_create()
894 dt_list_prepend(&dph->dph_lrulist, dpr); in dt_proc_create()
896 dt_dprintf("created pid %d\n", (int)dpr->dpr_pid); in dt_proc_create()
897 dpr->dpr_refs++; in dt_proc_create()
899 return (dpr->dpr_proc); in dt_proc_create()
907 dt_proc_t *dpr, *opr; in dt_proc_grab() local
915 for (dpr = dph->dph_hash[h]; dpr != NULL; dpr = dpr->dpr_hash) { in dt_proc_grab()
916 if (dpr->dpr_pid == pid && !dpr->dpr_stale) { in dt_proc_grab()
923 if (dpr->dpr_rdonly && !(flags & PGRAB_RDONLY)) { in dt_proc_grab()
925 dpr->dpr_stale = B_TRUE; in dt_proc_grab()
926 dpr->dpr_cacheable = B_FALSE; in dt_proc_grab()
932 dt_list_delete(&dph->dph_lrulist, dpr); in dt_proc_grab()
933 dt_list_prepend(&dph->dph_lrulist, dpr); in dt_proc_grab()
934 dpr->dpr_refs++; in dt_proc_grab()
935 return (dpr->dpr_proc); in dt_proc_grab()
939 if ((dpr = dt_zalloc(dtp, sizeof (dt_proc_t))) == NULL) in dt_proc_grab()
942 (void) pthread_mutex_init(&dpr->dpr_lock, NULL); in dt_proc_grab()
943 (void) pthread_cond_init(&dpr->dpr_cv, NULL); in dt_proc_grab()
945 if ((dpr->dpr_proc = Pgrab(pid, flags, &err)) == NULL) { in dt_proc_grab()
946 return (dt_proc_error(dtp, dpr, in dt_proc_grab()
950 dpr->dpr_hdl = dtp; in dt_proc_grab()
951 dpr->dpr_pid = pid; in dt_proc_grab()
953 (void) Punsetflags(dpr->dpr_proc, PR_KLC); in dt_proc_grab()
954 (void) Psetflags(dpr->dpr_proc, PR_RLC); in dt_proc_grab()
978 dpr->dpr_cacheable = B_TRUE; in dt_proc_grab()
979 dpr->dpr_rdonly = B_TRUE; in dt_proc_grab()
983 } else if (dt_proc_create_thread(dtp, dpr, DT_PROC_STOP_GRAB) != 0) in dt_proc_grab()
986 dpr->dpr_hash = dph->dph_hash[h]; in dt_proc_grab()
987 dph->dph_hash[h] = dpr; in dt_proc_grab()
988 dt_list_prepend(&dph->dph_lrulist, dpr); in dt_proc_grab()
991 dpr->dpr_refs++; in dt_proc_grab()
993 return (dpr->dpr_proc); in dt_proc_grab()
999 dt_proc_t *dpr = dt_proc_lookup(dtp, P, B_FALSE); in dt_proc_release() local
1002 assert(dpr != NULL); in dt_proc_release()
1003 assert(dpr->dpr_refs != 0); in dt_proc_release()
1005 if (--dpr->dpr_refs == 0 && in dt_proc_release()
1006 (!dpr->dpr_cacheable || dph->dph_lrucnt > dph->dph_lrulim)) in dt_proc_release()
1013 dt_proc_t *dpr = dt_proc_lookup(dtp, P, B_FALSE); in dt_proc_continue() local
1015 (void) pthread_mutex_lock(&dpr->dpr_lock); in dt_proc_continue()
1017 if (dpr->dpr_stop & DT_PROC_STOP_IDLE) { in dt_proc_continue()
1018 dpr->dpr_stop &= ~DT_PROC_STOP_IDLE; in dt_proc_continue()
1019 (void) pthread_cond_broadcast(&dpr->dpr_cv); in dt_proc_continue()
1022 (void) pthread_mutex_unlock(&dpr->dpr_lock); in dt_proc_continue()
1028 dt_proc_t *dpr = dt_proc_lookup(dtp, P, B_FALSE); in dt_proc_lock() local
1029 int err = pthread_mutex_lock(&dpr->dpr_lock); in dt_proc_lock()
1036 dt_proc_t *dpr = dt_proc_lookup(dtp, P, B_FALSE); in dt_proc_unlock() local
1037 int err = pthread_mutex_unlock(&dpr->dpr_lock); in dt_proc_unlock()
1097 dt_proc_t *dpr; in dt_proc_fini() local
1100 while ((dpr = dt_list_next(&dph->dph_lrulist)) != NULL) in dt_proc_fini()
1101 dt_proc_destroy(dtp, dpr->dpr_proc); in dt_proc_fini()