Lines Matching +full:open +full:- +full:pic

60 static int cpc_valid_event(cpc_t *cpc, uint_t pic, const char *ev);
87 if (syscall(SYS_cpc, -1, -1, -1, -1, -1) != -1) { in cpc_open()
105 cpc->cpc_npic = syscall(SYS_cpc, CPC_NPIC, -1, 0, 0, 0); in cpc_open()
106 cpc->cpc_caps = syscall(SYS_cpc, CPC_CAPS, -1, 0, 0, 0); in cpc_open()
108 if (syscall(SYS_cpc, CPC_IMPL_NAME, -1, &cpc->cpc_cciname, 0, 0) != 0) in cpc_open()
110 if (syscall(SYS_cpc, CPC_CPUREF, -1, &cpc->cpc_cpuref, 0, 0) != 0) in cpc_open()
114 if ((cpc->cpc_attrlist = cpc_get_list(CPC_LIST_ATTRS, 0)) == NULL) { in cpc_open()
119 if ((cpc->cpc_evlist = malloc(cpc->cpc_npic * sizeof (char *))) == in cpc_open()
121 free(cpc->cpc_attrlist); in cpc_open()
126 for (i = 0; i < cpc->cpc_npic; i++) { in cpc_open()
127 if ((cpc->cpc_evlist[i] = cpc_get_list(CPC_LIST_EVENTS, i)) == in cpc_open()
131 if (i != cpc->cpc_npic) { in cpc_open()
133 free(cpc->cpc_evlist[j]); in cpc_open()
134 free(cpc->cpc_evlist); in cpc_open()
135 free(cpc->cpc_attrlist); in cpc_open()
140 cpc->cpc_sets = NULL; in cpc_open()
141 cpc->cpc_bufs = NULL; in cpc_open()
142 cpc->cpc_errfn = NULL; in cpc_open()
143 (void) mutex_init(&cpc->cpc_lock, USYNC_THREAD, NULL); in cpc_open()
152 * - Hardware is unbound
153 * - Sets are all destroyed
154 * - Bufs are all freed
159 while (cpc->cpc_sets != NULL) { in cpc_close()
160 if (cpc->cpc_sets->cs_state != CS_UNBOUND) in cpc_close()
161 (void) cpc_unbind(cpc, cpc->cpc_sets); in cpc_close()
162 (void) cpc_set_destroy(cpc, cpc->cpc_sets); in cpc_close()
165 while (cpc->cpc_bufs != NULL) in cpc_close()
166 (void) cpc_buf_destroy(cpc, cpc->cpc_bufs); in cpc_close()
182 for (csp = cpc->cpc_sets; csp != NULL; csp = csp->cs_next) { in cpc_terminate()
183 if (csp->cs_pctx != NULL) in cpc_terminate()
184 pctx_terminate(csp->cs_pctx); in cpc_terminate()
200 set->cs_request = NULL; in cpc_set_create()
201 set->cs_nreqs = 0; in cpc_set_create()
202 set->cs_state = CS_UNBOUND; in cpc_set_create()
203 set->cs_fd = -1; in cpc_set_create()
204 set->cs_pctx = NULL; in cpc_set_create()
205 set->cs_id = -1; in cpc_set_create()
206 set->cs_thr = 0; in cpc_set_create()
209 set->cs_next = cpc->cpc_sets; in cpc_set_create()
210 cpc->cpc_sets = set; in cpc_set_create()
227 for (csp = prev = cpc->cpc_sets; csp != NULL; csp = csp->cs_next) { in cpc_set_destroy()
235 return (-1); in cpc_set_destroy()
237 if (csp == cpc->cpc_sets) in cpc_set_destroy()
238 cpc->cpc_sets = csp->cs_next; in cpc_set_destroy()
239 prev->cs_next = csp->cs_next; in cpc_set_destroy()
242 if (csp->cs_state != CS_UNBOUND) in cpc_set_destroy()
248 if (csp->cs_pctx != NULL) { in cpc_set_destroy()
249 pctx_release(csp->cs_pctx); in cpc_set_destroy()
250 csp->cs_pctx = NULL; in cpc_set_destroy()
253 for (req = csp->cs_request; req != NULL; req = next) { in cpc_set_destroy()
254 next = req->cr_next; in cpc_set_destroy()
256 if (req->cr_nattrs != 0) in cpc_set_destroy()
257 free(req->cr_attr); in cpc_set_destroy()
278 if (cpc_set_valid(cpc, set) != 0 || set->cs_state != CS_UNBOUND) { in cpc_set_add_request()
280 return (-1); in cpc_set_add_request()
289 return (-1); in cpc_set_add_request()
294 return (-1); in cpc_set_add_request()
297 (void) strncpy(req->cr_event, event, CPC_MAX_EVENT_LEN); in cpc_set_add_request()
298 req->cr_preset = preset; in cpc_set_add_request()
299 req->cr_flags = flags; in cpc_set_add_request()
300 req->cr_nattrs = nattrs; in cpc_set_add_request()
301 req->cr_index = set->cs_nreqs; in cpc_set_add_request()
302 req->cr_attr = NULL; in cpc_set_add_request()
317 * the pic can count the requested event. in cpc_set_add_request()
326 req->cr_event) == 0) { in cpc_set_add_request()
333 if ((req->cr_attr = malloc(nattrs * sizeof (kcpc_attr_t))) in cpc_set_add_request()
336 return (-1); in cpc_set_add_request()
340 req->cr_attr[i].ka_val = attrs[i].ca_val; in cpc_set_add_request()
341 (void) strncpy(req->cr_attr[i].ka_name, in cpc_set_add_request()
345 req->cr_attr = NULL; in cpc_set_add_request()
347 req->cr_next = set->cs_request; in cpc_set_add_request()
348 set->cs_request = req; in cpc_set_add_request()
349 set->cs_nreqs++; in cpc_set_add_request()
351 return (req->cr_index); in cpc_set_add_request()
356 return (-1); in cpc_set_add_request()
373 buf->cb_size = set->cs_nreqs * sizeof (uint64_t); in cpc_buf_create()
374 if ((buf->cb_data = malloc(buf->cb_size)) == NULL) { in cpc_buf_create()
379 bzero(buf->cb_data, buf->cb_size); in cpc_buf_create()
381 buf->cb_hrtime = 0; in cpc_buf_create()
382 buf->cb_tick = 0; in cpc_buf_create()
385 buf->cb_next = cpc->cpc_bufs; in cpc_buf_create()
386 cpc->cpc_bufs = buf; in cpc_buf_create()
402 for (cbp = prev = cpc->cpc_bufs; cbp != NULL; cbp = cbp->cb_next) { in cpc_buf_destroy()
410 return (-1); in cpc_buf_destroy()
412 if (cbp == cpc->cpc_bufs) in cpc_buf_destroy()
413 cpc->cpc_bufs = cbp->cb_next; in cpc_buf_destroy()
414 prev->cb_next = cbp->cb_next; in cpc_buf_destroy()
417 free(cbp->cb_data); in cpc_buf_destroy()
430 int subcode = -1; in cpc_bind_curlwp()
434 * fast path of an app doing SIGEMT-based profiling as they restart the in cpc_bind_curlwp()
437 if (CPC_SET_VALID_FLAGS(flags) == 0 || set->cs_nreqs <= 0) { in cpc_bind_curlwp()
439 return (-1); in cpc_bind_curlwp()
444 return (-1); in cpc_bind_curlwp()
447 ret = syscall(SYS_cpc, CPC_BIND, -1, packed_set, packsize, &subcode); in cpc_bind_curlwp()
451 if (subcode != -1) in cpc_bind_curlwp()
453 return (-1); in cpc_bind_curlwp()
456 set->cs_thr = thr_self(); in cpc_bind_curlwp()
457 set->cs_state = CS_BOUND_CURLWP; in cpc_bind_curlwp()
468 int subcode = -1; in cpc_bind_pctx()
473 if (flags != 0 || cpc_set_valid(cpc, set) != 0 || set->cs_nreqs <= 0) { in cpc_bind_pctx()
475 return (-1); in cpc_bind_pctx()
480 return (-1); in cpc_bind_pctx()
484 (void *)&subcode, -1); in cpc_bind_pctx()
489 set->cs_pctx = pctx; in cpc_bind_pctx()
490 set->cs_id = id; in cpc_bind_pctx()
491 set->cs_state = CS_BOUND_PCTX; in cpc_bind_pctx()
492 } else if (subcode != -1) in cpc_bind_pctx()
508 int subcode = -1; in cpc_bind_cpu()
513 if (flags != 0 || cpc_set_valid(cpc, set) != 0 || set->cs_nreqs <= 0) { in cpc_bind_cpu()
515 return (-1); in cpc_bind_cpu()
518 if (processor_bind(P_LWPID, P_MYID, id, &set->cs_obind) == -1) { in cpc_bind_cpu()
520 return (-1); in cpc_bind_cpu()
523 if ((fd = open(CPUDRV_SHARED, O_RDWR)) < 0) { in cpc_bind_cpu()
525 (void) processor_bind(P_LWPID, P_MYID, set->cs_obind, NULL); in cpc_bind_cpu()
527 return (-1); in cpc_bind_cpu()
535 if (set->cs_fd != -1) in cpc_bind_cpu()
536 (void) close(set->cs_fd); in cpc_bind_cpu()
537 set->cs_fd = fd; in cpc_bind_cpu()
541 (void) processor_bind(P_LWPID, P_MYID, set->cs_obind, NULL); in cpc_bind_cpu()
543 return (-1); in cpc_bind_cpu()
554 (void) processor_bind(P_LWPID, P_MYID, set->cs_obind, NULL); in cpc_bind_cpu()
555 if (subcode != -1) in cpc_bind_cpu()
558 return (-1); in cpc_bind_cpu()
563 set->cs_thr = thr_self(); in cpc_bind_cpu()
564 set->cs_state = CS_BOUND_CPU; in cpc_bind_cpu()
573 return (syscall(SYS_cpc, CPC_PRESET, -1, index, in cpc_request_preset()
581 return (syscall(SYS_cpc, CPC_RESTART, -1, 0, 0, 0)); in cpc_set_restart()
593 return (-1); in cpc_unbind()
596 switch (set->cs_state) { in cpc_unbind()
599 return (-1); in cpc_unbind()
601 ret = syscall(SYS_cpc, CPC_RELE, -1, 0, 0, 0); in cpc_unbind()
605 ret = ioctl(set->cs_fd, CPCIO_RELE, NULL); in cpc_unbind()
607 (void) close(set->cs_fd); in cpc_unbind()
608 set->cs_fd = -1; in cpc_unbind()
609 (void) processor_bind(P_LWPID, P_MYID, set->cs_obind, NULL); in cpc_unbind()
612 if (set->cs_pctx != NULL) { in cpc_unbind()
613 ret = __pctx_cpc(set->cs_pctx, cpc, CPC_RELE, in cpc_unbind()
614 set->cs_id, 0, 0, 0, 0); in cpc_unbind()
620 set->cs_thr = 0; in cpc_unbind()
621 set->cs_id = -1; in cpc_unbind()
622 set->cs_state = CS_UNBOUND; in cpc_unbind()
639 if (set->cs_state == CS_UNBOUND || in cpc_set_sample()
640 buf->cb_size != set->cs_nreqs * sizeof (uint64_t)) { in cpc_set_sample()
642 return (-1); in cpc_set_sample()
645 switch (set->cs_state) { in cpc_set_sample()
647 return (syscall(SYS_cpc, CPC_SAMPLE, -1, buf->cb_data, in cpc_set_sample()
648 &buf->cb_hrtime, &buf->cb_tick)); in cpc_set_sample()
650 args.udata1 = buf->cb_data; in cpc_set_sample()
651 args.udata2 = &buf->cb_hrtime; in cpc_set_sample()
652 args.udata3 = &buf->cb_tick; in cpc_set_sample()
653 return (ioctl(set->cs_fd, CPCIO_SAMPLE, &args)); in cpc_set_sample()
655 return (__pctx_cpc(set->cs_pctx, cpc, CPC_SAMPLE, set->cs_id, in cpc_set_sample()
656 buf->cb_data, &buf->cb_hrtime, &buf->cb_tick, in cpc_set_sample()
657 buf->cb_size)); in cpc_set_sample()
661 return (-1); in cpc_set_sample()
670 if (a->cb_size != ds->cb_size || b->cb_size != ds->cb_size) in cpc_buf_sub()
673 ds->cb_hrtime = (a->cb_hrtime > b->cb_hrtime) ? in cpc_buf_sub()
674 a->cb_hrtime : b->cb_hrtime; in cpc_buf_sub()
675 ds->cb_tick = a->cb_tick - b->cb_tick; in cpc_buf_sub()
677 for (i = 0; i < ds->cb_size / sizeof (uint64_t); i++) in cpc_buf_sub()
678 ds->cb_data[i] = a->cb_data[i] - b->cb_data[i]; in cpc_buf_sub()
687 if (a->cb_size != ds->cb_size || b->cb_size != ds->cb_size) in cpc_buf_add()
690 ds->cb_hrtime = (a->cb_hrtime > b->cb_hrtime) ? in cpc_buf_add()
691 a->cb_hrtime : b->cb_hrtime; in cpc_buf_add()
692 ds->cb_tick = a->cb_tick + b->cb_tick; in cpc_buf_add()
694 for (i = 0; i < ds->cb_size / sizeof (uint64_t); i++) in cpc_buf_add()
695 ds->cb_data[i] = a->cb_data[i] + b->cb_data[i]; in cpc_buf_add()
702 if (ds->cb_size != src->cb_size) in cpc_buf_copy()
705 bcopy(src->cb_data, ds->cb_data, ds->cb_size); in cpc_buf_copy()
706 ds->cb_hrtime = src->cb_hrtime; in cpc_buf_copy()
707 ds->cb_tick = src->cb_tick; in cpc_buf_copy()
714 bzero(buf->cb_data, buf->cb_size); in cpc_buf_zero()
715 buf->cb_hrtime = 0; in cpc_buf_zero()
716 buf->cb_tick = 0; in cpc_buf_zero()
726 *val = buf->cb_data[index]; in cpc_buf_get()
735 buf->cb_data[index] = val; in cpc_buf_set()
744 return (buf->cb_hrtime); in cpc_buf_hrtime()
751 return (buf->cb_tick); in cpc_buf_tick()
766 if (syscall(SYS_cpc, szcmd, -1, &size, arg, 0) != 0) in cpc_get_list()
772 if (syscall(SYS_cpc, which, -1, list, arg, 0) != 0) { in cpc_get_list()
790 for (rp = set->cs_request; rp != NULL; rp = rp->cr_next) { in cpc_walk_requests()
794 if (rp->cr_nattrs != 0) in cpc_walk_requests()
795 if ((attrs = malloc(rp->cr_nattrs * in cpc_walk_requests()
798 for (i = 0; i < rp->cr_nattrs; i++) { in cpc_walk_requests()
799 attrs[i].ca_name = rp->cr_attr[i].ka_name; in cpc_walk_requests()
800 attrs[i].ca_val = rp->cr_attr[i].ka_val; in cpc_walk_requests()
803 action(arg, rp->cr_index, rp->cr_event, rp->cr_preset, in cpc_walk_requests()
804 rp->cr_flags, rp->cr_nattrs, attrs); in cpc_walk_requests()
806 if (rp->cr_nattrs != 0) in cpc_walk_requests()
832 if ((list[i] = strdup(cpc->cpc_evlist[i])) == NULL) in cpc_walk_events_impl()
848 if (__cpc_strhash_add(hash, p) == -1) in cpc_walk_events_impl()
856 if (__cpc_strhash_add(hash, p) == -1) in cpc_walk_events_impl()
898 if (picno >= cpc->cpc_npic) { in cpc_walk_events_pic_impl()
903 if ((list = strdup(cpc->cpc_evlist[picno])) == NULL) in cpc_walk_events_pic_impl()
907 * List now points to a comma-separated list of events supported by in cpc_walk_events_pic_impl()
908 * the designated pic. in cpc_walk_events_pic_impl()
960 if ((list = strdup(cpc->cpc_attrlist)) == NULL) in cpc_walk_attrs()
970 * List now points to a comma-separated list of attributes supported by in cpc_walk_attrs()
988 return (syscall(SYS_cpc, CPC_ENABLE, -1, 0, 0, 0)); in cpc_enable()
995 return (syscall(SYS_cpc, CPC_DISABLE, -1, 0, 0, 0)); in cpc_disable()
1002 return (cpc->cpc_npic); in cpc_npic()
1009 return (cpc->cpc_caps); in cpc_caps()
1015 return (cpc->cpc_cciname); in cpc_cciname()
1021 return (cpc->cpc_cpuref); in cpc_cpuref()
1027 cpc->cpc_errfn = fn; in cpc_seterrhndlr()
1058 * If subcode is -1, there is no specific description for this error. in cpc_err()
1060 if (subcode == -1) in cpc_err()
1072 if (cpc->cpc_errfn != NULL) in cpc_err()
1073 cpc->cpc_errfn(fn, subcode, str, ap); in cpc_err()
1099 for (set = cpc->cpc_sets; set != NULL; set = set->cs_next) in cpc_invalidate_pctx()
1100 if (set->cs_pctx == pctx) in cpc_invalidate_pctx()
1101 set->cs_pctx = NULL; in cpc_invalidate_pctx()
1117 for (csp = cpc->cpc_sets; csp != NULL; csp = csp->cs_next) in cpc_set_valid()
1122 return (-1); in cpc_set_valid()
1130 (void) mutex_lock(&cpc->cpc_lock); in cpc_lock()
1137 (void) mutex_unlock(&cpc->cpc_lock); in cpc_unlock()
1151 if (strcmp(((struct priv *)arg)->name, ev) == 0) in ev_walker()
1152 ((struct priv *)arg)->found = 1; in ev_walker()
1158 if (strcmp(((struct priv *)arg)->name, at) == 0) in at_walker()
1159 ((struct priv *)arg)->found = 1; in at_walker()
1163 cpc_valid_event(cpc_t *cpc, uint_t pic, const char *ev) in cpc_valid_event() argument
1170 cpc_walk_events_pic(cpc, pic, &pr, ev_walker); in cpc_valid_event()
1174 cpc_walk_generic_events_pic(cpc, pic, &pr, ev_walker); in cpc_valid_event()
1189 * Success - this is a valid raw code in hex, decimal, or octal. in cpc_valid_event()