Lines Matching refs:dpr
100 dt_proc_bpcreate(dt_proc_t *dpr, uintptr_t addr, dt_bkpt_f *func, void *data) in dt_proc_bpcreate() argument
102 struct ps_prochandle *P = dpr->dpr_proc; in dt_proc_bpcreate()
105 assert(DT_MUTEX_HELD(&dpr->dpr_lock)); in dt_proc_bpcreate()
107 if ((dbp = dt_zalloc(dpr->dpr_hdl, sizeof (dt_bkpt_t))) != NULL) { in dt_proc_bpcreate()
115 dt_list_append(&dpr->dpr_bps, dbp); in dt_proc_bpcreate()
122 dt_proc_bpdestroy(dt_proc_t *dpr, int delbkpts) in dt_proc_bpdestroy() argument
124 int state = Pstate(dpr->dpr_proc); in dt_proc_bpdestroy()
127 assert(DT_MUTEX_HELD(&dpr->dpr_lock)); in dt_proc_bpdestroy()
129 for (dbp = dt_list_next(&dpr->dpr_bps); dbp != NULL; dbp = nbp) { in dt_proc_bpdestroy()
132 (void) Pdelbkpt(dpr->dpr_proc, in dt_proc_bpdestroy()
136 dt_list_delete(&dpr->dpr_bps, dbp); in dt_proc_bpdestroy()
137 dt_free(dpr->dpr_hdl, dbp); in dt_proc_bpdestroy()
142 dt_proc_bpmatch(dtrace_hdl_t *dtp, dt_proc_t *dpr) in dt_proc_bpmatch() argument
147 assert(DT_MUTEX_HELD(&dpr->dpr_lock)); in dt_proc_bpmatch()
149 proc_regget(dpr->dpr_proc, REG_PC, &pc); in dt_proc_bpmatch()
152 for (dbp = dt_list_next(&dpr->dpr_bps); in dt_proc_bpmatch()
160 (int)dpr->dpr_pid, pc); in dt_proc_bpmatch()
165 (int)dpr->dpr_pid, (ulong_t)dbp->dbp_addr, ++dbp->dbp_hits); in dt_proc_bpmatch()
167 dbp->dbp_func(dtp, dpr, dbp->dbp_data); in dt_proc_bpmatch()
168 (void) Pxecbkpt(dpr->dpr_proc, dbp->dbp_instr); in dt_proc_bpmatch()
172 dt_proc_bpenable(dt_proc_t *dpr) in dt_proc_bpenable() argument
176 assert(DT_MUTEX_HELD(&dpr->dpr_lock)); in dt_proc_bpenable()
178 for (dbp = dt_list_next(&dpr->dpr_bps); in dt_proc_bpenable()
180 if (!dbp->dbp_active && Psetbkpt(dpr->dpr_proc, in dt_proc_bpenable()
189 dt_proc_bpdisable(dt_proc_t *dpr) in dt_proc_bpdisable() argument
193 assert(DT_MUTEX_HELD(&dpr->dpr_lock)); in dt_proc_bpdisable()
195 for (dbp = dt_list_next(&dpr->dpr_bps); in dt_proc_bpdisable()
197 if (dbp->dbp_active && Pdelbkpt(dpr->dpr_proc, in dt_proc_bpdisable()
206 dt_proc_notify(dtrace_hdl_t *dtp, dt_proc_hash_t *dph, dt_proc_t *dpr, in dt_proc_notify() argument
213 (int)dpr->dpr_pid, msg); in dt_proc_notify()
215 dprn->dprn_dpr = dpr; in dt_proc_notify()
239 dt_proc_stop(dt_proc_t *dpr, uint8_t why) in dt_proc_stop() argument
241 assert(DT_MUTEX_HELD(&dpr->dpr_lock)); in dt_proc_stop()
244 if (dpr->dpr_stop & why) { in dt_proc_stop()
245 dpr->dpr_stop |= DT_PROC_STOP_IDLE; in dt_proc_stop()
246 dpr->dpr_stop &= ~why; in dt_proc_stop()
248 (void) pthread_cond_broadcast(&dpr->dpr_cv); in dt_proc_stop()
255 dt_proc_bpdisable(dpr); in dt_proc_stop()
257 while (dpr->dpr_stop & DT_PROC_STOP_IDLE) in dt_proc_stop()
258 (void) pthread_cond_wait(&dpr->dpr_cv, &dpr->dpr_lock); in dt_proc_stop()
260 dt_proc_bpenable(dpr); in dt_proc_stop()
266 dt_proc_bpmain(dtrace_hdl_t *dtp, dt_proc_t *dpr, const char *fname) in dt_proc_bpmain() argument
268 dt_dprintf("pid %d: breakpoint at %s()\n", (int)dpr->dpr_pid, fname); in dt_proc_bpmain()
269 dt_proc_stop(dpr, DT_PROC_STOP_MAIN); in dt_proc_bpmain()
273 dt_proc_rdevent(dtrace_hdl_t *dtp, dt_proc_t *dpr, const char *evname) in dt_proc_rdevent() argument
278 if ((err = rd_event_getmsg(dpr->dpr_rtld, &rdm)) != RD_OK) { in dt_proc_rdevent()
280 (int)dpr->dpr_pid, evname, rd_errstr(err)); in dt_proc_rdevent()
285 (int)dpr->dpr_pid, evname, rdm.type, rdm.u.state); in dt_proc_rdevent()
292 Pupdate_syms(dpr->dpr_proc); in dt_proc_rdevent()
293 if (dt_pid_create_probes_module(dtp, dpr) != 0) in dt_proc_rdevent()
294 dt_proc_notify(dtp, dtp->dt_procs, dpr, in dt_proc_rdevent()
295 dpr->dpr_errmsg); in dt_proc_rdevent()
299 Pupdate_syms(dpr->dpr_proc); in dt_proc_rdevent()
300 dt_proc_stop(dpr, DT_PROC_STOP_PREINIT); in dt_proc_rdevent()
303 Pupdate_syms(dpr->dpr_proc); in dt_proc_rdevent()
304 dt_proc_stop(dpr, DT_PROC_STOP_POSTINIT); in dt_proc_rdevent()
310 dt_proc_rdwatch(dt_proc_t *dpr, rd_event_e event, const char *evname) in dt_proc_rdwatch() argument
315 if ((err = rd_event_addr(dpr->dpr_rtld, event, &rdn)) != RD_OK) { in dt_proc_rdwatch()
317 (int)dpr->dpr_pid, evname, rd_errstr(err)); in dt_proc_rdwatch()
323 (int)dpr->dpr_pid, evname, rdn.type); in dt_proc_rdwatch()
327 (void) dt_proc_bpcreate(dpr, rdn.u.bptaddr, in dt_proc_rdwatch()
337 dt_proc_attach(dt_proc_t *dpr, int exec) in dt_proc_attach() argument
342 assert(DT_MUTEX_HELD(&dpr->dpr_lock)); in dt_proc_attach()
346 dt_proc_bpdestroy(dpr, B_FALSE); in dt_proc_attach()
348 if ((dpr->dpr_rtld = Prd_agent(dpr->dpr_proc)) != NULL && in dt_proc_attach()
349 (err = rd_event_enable(dpr->dpr_rtld, B_TRUE)) == RD_OK) { in dt_proc_attach()
350 dt_proc_rdwatch(dpr, RD_POSTINIT, "RD_POSTINIT"); in dt_proc_attach()
353 (int)dpr->dpr_pid, dpr->dpr_rtld ? rd_errstr(err) : in dt_proc_attach()
357 Pupdate_maps(dpr->dpr_proc); in dt_proc_attach()
359 if (Pxlookup_by_name(dpr->dpr_proc, LM_ID_BASE, in dt_proc_attach()
361 (void) dt_proc_bpcreate(dpr, (uintptr_t)sym.st_value, in dt_proc_attach()
365 (int)dpr->dpr_pid, strerror(errno)); in dt_proc_attach()
391 dt_proc_t *dpr = datap->dpcd_proc; in dt_proc_control() local
393 struct ps_prochandle *P = dpr->dpr_proc; in dt_proc_control()
394 int pid = dpr->dpr_pid; in dt_proc_control()
410 (void) pthread_mutex_lock(&dpr->dpr_lock); in dt_proc_control()
412 dt_proc_attach(dpr, B_FALSE); /* enable rtld breakpoints */ in dt_proc_control()
419 if (dpr->dpr_close == DT_CLOSE_KILL) in dt_proc_control()
420 dt_proc_stop(dpr, DT_PROC_STOP_CREATE); in dt_proc_control()
422 dt_proc_stop(dpr, DT_PROC_STOP_GRAB); in dt_proc_control()
426 (int)dpr->dpr_pid, strerror(errno)); in dt_proc_control()
429 (void) pthread_mutex_unlock(&dpr->dpr_lock); in dt_proc_control()
440 while (!dpr->dpr_quit) { in dt_proc_control()
448 (void) pthread_mutex_lock(&dpr->dpr_lock); in dt_proc_control()
467 dt_proc_bpmatch(dtp, dpr); in dt_proc_control()
470 dt_proc_bpdisable(dpr); in dt_proc_control()
473 dt_proc_bpenable(dpr); in dt_proc_control()
476 dt_proc_attach(dpr, B_TRUE); in dt_proc_control()
483 dpr->dpr_quit = B_TRUE; in dt_proc_control()
489 dpr->dpr_quit = B_TRUE; in dt_proc_control()
495 if (dpr->dpr_quit && dpr->dpr_close == DT_CLOSE_KILL) { in dt_proc_control()
505 "%s\n", (int)dpr->dpr_pid, strerror(errno)); in dt_proc_control()
509 (void) pthread_mutex_unlock(&dpr->dpr_lock); in dt_proc_control()
517 dt_proc_notify(dtp, dph, dpr, NULL); in dt_proc_control()
524 (void) pthread_mutex_lock(&dpr->dpr_lock); in dt_proc_control()
526 dt_proc_bpdestroy(dpr, B_TRUE); in dt_proc_control()
527 dpr->dpr_done = B_TRUE; in dt_proc_control()
528 dpr->dpr_tid = 0; in dt_proc_control()
530 (void) pthread_cond_broadcast(&dpr->dpr_cv); in dt_proc_control()
531 (void) pthread_mutex_unlock(&dpr->dpr_lock); in dt_proc_control()
538 dt_proc_error(dtrace_hdl_t *dtp, dt_proc_t *dpr, const char *format, ...) in dt_proc_error() argument
546 if (dpr->dpr_proc != NULL) in dt_proc_error()
547 Prelease(dpr->dpr_proc, 0); in dt_proc_error()
549 dt_free(dtp, dpr); in dt_proc_error()
559 dt_proc_t *dpr, **dpp = &dph->dph_hash[pid & (dph->dph_hashlen - 1)]; in dt_proc_lookup() local
561 for (dpr = *dpp; dpr != NULL; dpr = dpr->dpr_hash) { in dt_proc_lookup()
562 if (dpr->dpr_pid == pid) in dt_proc_lookup()
565 dpp = &dpr->dpr_hash; in dt_proc_lookup()
568 assert(dpr != NULL); in dt_proc_lookup()
569 assert(dpr->dpr_proc == P); in dt_proc_lookup()
572 *dpp = dpr->dpr_hash; /* remove from pid hash chain */ in dt_proc_lookup()
574 return (dpr); in dt_proc_lookup()
580 dt_proc_t *dpr = dt_proc_lookup(dtp, P, B_FALSE); in dt_proc_destroy() local
585 assert(dpr != NULL); in dt_proc_destroy()
587 switch (dpr->dpr_close) { in dt_proc_destroy()
589 dt_dprintf("killing pid %d\n", (int)dpr->dpr_pid); in dt_proc_destroy()
593 dt_dprintf("releasing pid %d\n", (int)dpr->dpr_pid); in dt_proc_destroy()
598 if (dpr->dpr_tid) { in dt_proc_destroy()
613 (void) pthread_mutex_lock(&dpr->dpr_lock); in dt_proc_destroy()
614 dpr->dpr_quit = B_TRUE; in dt_proc_destroy()
615 pthread_kill(dpr->dpr_tid, SIGTHR); in dt_proc_destroy()
621 if (dpr->dpr_stop & DT_PROC_STOP_IDLE) { in dt_proc_destroy()
622 dt_proc_bpenable(dpr); in dt_proc_destroy()
623 dpr->dpr_stop &= ~DT_PROC_STOP_IDLE; in dt_proc_destroy()
624 (void) pthread_cond_broadcast(&dpr->dpr_cv); in dt_proc_destroy()
627 while (!dpr->dpr_done) in dt_proc_destroy()
628 (void) pthread_cond_wait(&dpr->dpr_cv, &dpr->dpr_lock); in dt_proc_destroy()
630 (void) pthread_mutex_unlock(&dpr->dpr_lock); in dt_proc_destroy()
643 if (npr->dprn_dpr == dpr) { in dt_proc_destroy()
657 if (dpr->dpr_cacheable) { in dt_proc_destroy()
662 dt_list_delete(&dph->dph_lrulist, dpr); in dt_proc_destroy()
663 Prelease(dpr->dpr_proc, rflag); in dt_proc_destroy()
664 dt_free(dtp, dpr); in dt_proc_destroy()
668 dt_proc_create_thread(dtrace_hdl_t *dtp, dt_proc_t *dpr, uint_t stop) in dt_proc_create_thread() argument
675 (void) pthread_mutex_lock(&dpr->dpr_lock); in dt_proc_create_thread()
676 dpr->dpr_stop |= stop; /* set bit for initial rendezvous */ in dt_proc_create_thread()
686 data.dpcd_proc = dpr; in dt_proc_create_thread()
689 err = pthread_create(&dpr->dpr_tid, &a, dt_proc_control, &data); in dt_proc_create_thread()
701 while (!dpr->dpr_done && !(dpr->dpr_stop & DT_PROC_STOP_IDLE)) in dt_proc_create_thread()
702 (void) pthread_cond_wait(&dpr->dpr_cv, &dpr->dpr_lock); in dt_proc_create_thread()
710 if (dpr->dpr_done) { in dt_proc_create_thread()
711 int stat = proc_getwstat(dpr->dpr_proc); in dt_proc_create_thread()
712 int pid = proc_getpid(dpr->dpr_proc); in dt_proc_create_thread()
713 if (proc_state(dpr->dpr_proc) == PS_LOST) { in dt_proc_create_thread()
714 (void) dt_proc_error(dpr->dpr_hdl, dpr, in dt_proc_create_thread()
718 (void) dt_proc_error(dpr->dpr_hdl, dpr, in dt_proc_create_thread()
722 (void) dt_proc_error(dpr->dpr_hdl, dpr, in dt_proc_create_thread()
730 (void) dt_proc_error(dpr->dpr_hdl, dpr, in dt_proc_create_thread()
732 (int)dpr->dpr_pid, strerror(err)); in dt_proc_create_thread()
736 (void) pthread_mutex_unlock(&dpr->dpr_lock); in dt_proc_create_thread()
747 dt_proc_t *dpr; in dt_proc_create() local
750 if ((dpr = dt_zalloc(dtp, sizeof (dt_proc_t))) == NULL) in dt_proc_create()
753 (void) pthread_mutex_init(&dpr->dpr_lock, NULL); in dt_proc_create()
754 (void) pthread_cond_init(&dpr->dpr_cv, NULL); in dt_proc_create()
757 &dpr->dpr_proc)) != 0) { in dt_proc_create()
758 return (dt_proc_error(dtp, dpr, in dt_proc_create()
762 dpr->dpr_hdl = dtp; in dt_proc_create()
763 dpr->dpr_pid = proc_getpid(dpr->dpr_proc); in dt_proc_create()
764 dpr->dpr_close = DT_CLOSE_KILL; in dt_proc_create()
766 if (dt_proc_create_thread(dtp, dpr, dtp->dt_prcmode) != 0) in dt_proc_create()
769 dpr->dpr_hash = dph->dph_hash[dpr->dpr_pid & (dph->dph_hashlen - 1)]; in dt_proc_create()
770 dph->dph_hash[dpr->dpr_pid & (dph->dph_hashlen - 1)] = dpr; in dt_proc_create()
771 dt_list_prepend(&dph->dph_lrulist, dpr); in dt_proc_create()
773 dt_dprintf("created pid %d\n", (int)dpr->dpr_pid); in dt_proc_create()
774 dpr->dpr_refs++; in dt_proc_create()
776 return (dpr->dpr_proc); in dt_proc_create()
784 dt_proc_t *dpr, *opr; in dt_proc_grab() local
792 for (dpr = dph->dph_hash[h]; dpr != NULL; dpr = dpr->dpr_hash) { in dt_proc_grab()
793 if (dpr->dpr_pid == pid && !dpr->dpr_stale) { in dt_proc_grab()
800 if (dpr->dpr_rdonly && !(flags & PGRAB_RDONLY)) { in dt_proc_grab()
802 dpr->dpr_stale = B_TRUE; in dt_proc_grab()
803 dpr->dpr_cacheable = B_FALSE; in dt_proc_grab()
809 dt_list_delete(&dph->dph_lrulist, dpr); in dt_proc_grab()
810 dt_list_prepend(&dph->dph_lrulist, dpr); in dt_proc_grab()
811 dpr->dpr_refs++; in dt_proc_grab()
812 return (dpr->dpr_proc); in dt_proc_grab()
816 if ((dpr = dt_zalloc(dtp, sizeof (dt_proc_t))) == NULL) in dt_proc_grab()
819 (void) pthread_mutex_init(&dpr->dpr_lock, NULL); in dt_proc_grab()
820 (void) pthread_cond_init(&dpr->dpr_cv, NULL); in dt_proc_grab()
822 if ((err = proc_attach(pid, flags, &dpr->dpr_proc)) != 0) { in dt_proc_grab()
823 return (dt_proc_error(dtp, dpr, in dt_proc_grab()
827 dpr->dpr_hdl = dtp; in dt_proc_grab()
828 dpr->dpr_pid = pid; in dt_proc_grab()
829 dpr->dpr_close = DT_CLOSE_RUN; in dt_proc_grab()
853 dpr->dpr_cacheable = B_TRUE; in dt_proc_grab()
854 dpr->dpr_rdonly = B_TRUE; in dt_proc_grab()
858 } else if (dt_proc_create_thread(dtp, dpr, DT_PROC_STOP_GRAB) != 0) in dt_proc_grab()
861 dpr->dpr_hash = dph->dph_hash[h]; in dt_proc_grab()
862 dph->dph_hash[h] = dpr; in dt_proc_grab()
863 dt_list_prepend(&dph->dph_lrulist, dpr); in dt_proc_grab()
866 dpr->dpr_refs++; in dt_proc_grab()
868 return (dpr->dpr_proc); in dt_proc_grab()
874 dt_proc_t *dpr = dt_proc_lookup(dtp, P, B_FALSE); in dt_proc_release() local
877 assert(dpr != NULL); in dt_proc_release()
878 assert(dpr->dpr_refs != 0); in dt_proc_release()
880 if (--dpr->dpr_refs == 0 && in dt_proc_release()
881 (!dpr->dpr_cacheable || dph->dph_lrucnt > dph->dph_lrulim)) in dt_proc_release()
888 dt_proc_t *dpr = dt_proc_lookup(dtp, P, B_FALSE); in dt_proc_continue() local
890 (void) pthread_mutex_lock(&dpr->dpr_lock); in dt_proc_continue()
892 if (dpr->dpr_stop & DT_PROC_STOP_IDLE) { in dt_proc_continue()
893 dpr->dpr_stop &= ~DT_PROC_STOP_IDLE; in dt_proc_continue()
894 (void) pthread_cond_broadcast(&dpr->dpr_cv); in dt_proc_continue()
897 (void) pthread_mutex_unlock(&dpr->dpr_lock); in dt_proc_continue()
903 dt_proc_t *dpr = dt_proc_lookup(dtp, P, B_FALSE); in dt_proc_lock() local
904 int err = pthread_mutex_lock(&dpr->dpr_lock); in dt_proc_lock()
911 dt_proc_t *dpr = dt_proc_lookup(dtp, P, B_FALSE); in dt_proc_unlock() local
912 int err = pthread_mutex_unlock(&dpr->dpr_lock); in dt_proc_unlock()
971 dt_proc_t *dpr; in dt_proc_fini() local
974 while ((dpr = dt_list_next(&dph->dph_lrulist)) != NULL) in dt_proc_fini()
975 dt_proc_destroy(dtp, dpr->dpr_proc); in dt_proc_fini()