Changeset View
Changeset View
Standalone View
Standalone View
sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c
- This file is larger than 256 KB, so syntax highlighting is disabled by default.
Show First 20 Lines • Show All 7,365 Lines • ▼ Show 20 Lines | #endif | ||||
mstate.dtms_probe = probe; | mstate.dtms_probe = probe; | ||||
mstate.dtms_strtok = 0; | mstate.dtms_strtok = 0; | ||||
mstate.dtms_arg[0] = arg0; | mstate.dtms_arg[0] = arg0; | ||||
mstate.dtms_arg[1] = arg1; | mstate.dtms_arg[1] = arg1; | ||||
mstate.dtms_arg[2] = arg2; | mstate.dtms_arg[2] = arg2; | ||||
mstate.dtms_arg[3] = arg3; | mstate.dtms_arg[3] = arg3; | ||||
mstate.dtms_arg[4] = arg4; | mstate.dtms_arg[4] = arg4; | ||||
/* | |||||
* Munge captured registers into logical argument order by reinjecting | |||||
* optimized-out constant values. | |||||
* | |||||
* At probe registration time, fbt computes a bitmask of constval | |||||
* arguments. Most of the time, this will be zero, and we can hint | |||||
* that to the compiler. | |||||
*/ | |||||
if (__predict_false(probe->dtpr_constvalmask != 0)) { | |||||
dtrace_provider_t *pv; | |||||
ssize_t i, skip; | |||||
pv = probe->dtpr_provider; | |||||
skip = __builtin_popcount(probe->dtpr_constvalmask); | |||||
for (i = nitems(mstate.dtms_arg) - 1; i >= 0; i--) { | |||||
if (skip == 0) | |||||
break; | |||||
if ((probe->dtpr_constvalmask & (1 << i)) == 0) { | |||||
mstate.dtms_arg[i] = mstate.dtms_arg[i - skip]; | |||||
continue; | |||||
} | |||||
skip--; | |||||
if (pv->dtpv_pops.dtps_getargval == NULL) { | |||||
mstate.dtms_arg[i] = UINT64_MAX; | |||||
continue; | |||||
} | |||||
mstate.dtms_arg[i] = pv->dtpv_pops.dtps_getargval( | |||||
pv->dtpv_arg, id, probe->dtpr_arg, i, | |||||
probe->dtpr_aframes); | |||||
} | |||||
} | |||||
flags = (volatile uint16_t *)&cpu_core[cpuid].cpuc_dtrace_flags; | flags = (volatile uint16_t *)&cpu_core[cpuid].cpuc_dtrace_flags; | ||||
for (ecb = probe->dtpr_ecb; ecb != NULL; ecb = ecb->dte_next) { | for (ecb = probe->dtpr_ecb; ecb != NULL; ecb = ecb->dte_next) { | ||||
dtrace_predicate_t *pred = ecb->dte_predicate; | dtrace_predicate_t *pred = ecb->dte_predicate; | ||||
dtrace_state_t *state = ecb->dte_state; | dtrace_state_t *state = ecb->dte_state; | ||||
dtrace_buffer_t *buf = &state->dts_buffer[cpuid]; | dtrace_buffer_t *buf = &state->dts_buffer[cpuid]; | ||||
dtrace_buffer_t *aggbuf = &state->dts_aggbuffer[cpuid]; | dtrace_buffer_t *aggbuf = &state->dts_aggbuffer[cpuid]; | ||||
dtrace_vstate_t *vstate = &state->dts_vstate; | dtrace_vstate_t *vstate = &state->dts_vstate; | ||||
▲ Show 20 Lines • Show All 1,803 Lines • ▼ Show 20 Lines | #endif | ||||
ASSERT(dtrace_probes[id - 1] == NULL); | ASSERT(dtrace_probes[id - 1] == NULL); | ||||
dtrace_probes[id - 1] = probe; | dtrace_probes[id - 1] = probe; | ||||
if (provider != dtrace_provider) | if (provider != dtrace_provider) | ||||
mutex_exit(&dtrace_lock); | mutex_exit(&dtrace_lock); | ||||
return (id); | return (id); | ||||
} | |||||
void | |||||
dtrace_probe_set_constvalmask(dtrace_provider_id_t id, uint8_t mask) | |||||
{ | |||||
dtrace_probe_t *probe; | |||||
mutex_enter(&dtrace_lock); | |||||
if (id == 0 || id > dtrace_nprobes) | |||||
goto out; | |||||
probe = (dtrace_probes[id - 1]); | |||||
probe->dtpr_constvalmask = mask; | |||||
out: | |||||
mutex_exit(&dtrace_lock); | |||||
} | } | ||||
static dtrace_probe_t * | static dtrace_probe_t * | ||||
dtrace_probe_lookup_id(dtrace_id_t id) | dtrace_probe_lookup_id(dtrace_id_t id) | ||||
{ | { | ||||
ASSERT(MUTEX_HELD(&dtrace_lock)); | ASSERT(MUTEX_HELD(&dtrace_lock)); | ||||
if (id == 0 || id > dtrace_nprobes) | if (id == 0 || id > dtrace_nprobes) | ||||
▲ Show 20 Lines • Show All 9,224 Lines • Show Last 20 Lines |