Lines Matching full:etm

22 #include "cs-etm.h"
23 #include "cs-etm-decoder/cs-etm-decoder.h"
107 struct cs_etm_auxtrace *etm;
129 static int cs_etm__process_timestamped_queues(struct cs_etm_auxtrace *etm);
130 static int cs_etm__process_timeless_queues(struct cs_etm_auxtrace *etm,
135 static u64 *get_cpu_data(struct cs_etm_auxtrace *etm, int cpu);
144 * encode the etm queue number as the upper 16 bit and the channel as
204 * The result is cached in etm->pid_fmt so this function only needs to be called
231 return etmq->etm->pid_fmt;
256 if (etmq->etm->per_thread_decoding)
284 static struct cs_etm_queue *cs_etm__get_queue(struct cs_etm_auxtrace *etm, int cpu)
286 if (etm->per_thread_decoding)
287 return etm->queues.queue_array[0].priv;
289 return etm->queues.queue_array[cpu].priv;
292 static int cs_etm__map_trace_id_v0(struct cs_etm_auxtrace *etm, u8 trace_chan_id,
301 etmq = cs_etm__get_queue(etm, cpu_metadata[CS_ETM_CPU]);
310 for (unsigned int i = 0; i < etm->queues.nr_queues; ++i) {
313 etmq = etm->queues.queue_array[i].priv;
323 static int cs_etm__process_trace_id_v0(struct cs_etm_auxtrace *etm, int cpu,
330 cpu_data = get_cpu_data(etm, cpu);
334 err = cs_etm__map_trace_id_v0(etm, trace_chan_id, cpu_data);
345 static int cs_etm__process_trace_id_v0_1(struct cs_etm_auxtrace *etm, int cpu,
348 struct cs_etm_queue *etmq = cs_etm__get_queue(etm, cpu);
359 if (!etmq->etm->per_thread_decoding && etmq->sink_id != SINK_UNSET &&
368 for (unsigned int i = 0; i < etm->queues.nr_queues; ++i) {
369 struct cs_etm_queue *other_etmq = etm->queues.queue_array[i].priv;
391 cpu_data = get_cpu_data(etm, cpu);
449 static int get_cpu_data_idx(struct cs_etm_auxtrace *etm, int cpu)
453 for (i = 0; i < etm->num_cpu; i++) {
454 if (etm->metadata[i][CS_ETM_CPU] == (u64)cpu) {
466 static u64 *get_cpu_data(struct cs_etm_auxtrace *etm, int cpu)
468 int idx = get_cpu_data_idx(etm, cpu);
470 return (idx != -1) ? etm->metadata[idx] : NULL;
483 struct cs_etm_auxtrace *etm;
495 pr_err("CS ETM Trace: PERF_RECORD_AUX_OUTPUT_HW_ID version %d not supported. Please update Perf.\n",
500 /* get access to the etm metadata */
501 etm = container_of(session->auxtrace, struct cs_etm_auxtrace, auxtrace);
502 if (!etm || !etm->metadata)
522 err = cs_etm__process_trace_id_v0(etm, cpu, hw_id);
526 err = cs_etm__process_trace_id_v0_1(etm, cpu, hw_id);
612 struct cs_etm_auxtrace *etm = etmq->etm;
616 queue = &etmq->etm->queues.queue_array[etmq->queue_nr];
619 tidq->thread = machine__findnew_thread(&etm->session->machines.host, -1,
621 tidq->prev_packet_thread = machine__idle_thread(&etm->session->machines.host);
631 if (etm->synth_opts.last_branch) {
634 sz += etm->synth_opts.last_branch_sz *
666 struct cs_etm_auxtrace *etm = etmq->etm;
668 if (etm->per_thread_decoding)
744 static void cs_etm__packet_swap(struct cs_etm_auxtrace *etm,
749 if (etm->synth_opts.branches || etm->synth_opts.last_branch ||
750 etm->synth_opts.instructions) {
907 struct cs_etm_auxtrace *etm = container_of(session->auxtrace,
916 if (etm->timeless_decoding) {
921 return cs_etm__process_timeless_queues(etm, -1);
924 return cs_etm__process_timestamped_queues(etm);
1040 return &etmq->etm->session->machines.host;
1052 return machines__find_guest(&etmq->etm->session->machines,
1059 return &etmq->etm->session->machines.host;
1146 ui__warning_once("CS ETM Trace: Missing DSO. Use 'perf archive' or debuginfod to export data from the traced system.\n"
1149 pr_err("CS ETM Trace: Debug data not found for address %#"PRIx64" in %s\n",
1190 static int cs_etm__setup_queue(struct cs_etm_auxtrace *etm,
1205 etmq->etm = etm;
1214 static int cs_etm__queue_first_cs_timestamp(struct cs_etm_auxtrace *etm,
1280 ret = auxtrace_heap__add(&etm->heap, cs_queue_nr, cs_timestamp);
1310 nr = etmq->etm->synth_opts.last_branch_sz - tidq->last_branch_pos;
1322 if (bs_src->nr >= etmq->etm->synth_opts.last_branch_sz) {
1407 tidq->last_branch_pos = etmq->etm->synth_opts.last_branch_sz;
1422 if (bs->nr < etmq->etm->synth_opts.last_branch_sz)
1441 queue = &etmq->etm->queues.queue_array[etmq->queue_nr];
1458 int fd = perf_data__fd(etmq->etm->session->data);
1509 return !!etmq->etm->timeless_decoding;
1543 struct cs_etm_auxtrace *etm = etmq->etm;
1545 if (etm->has_virtual_ts)
1546 return tsc_to_perf_time(cs_timestamp, &etm->tc);
1554 struct cs_etm_auxtrace *etm = etmq->etm;
1557 if (!etm->timeless_decoding && etm->has_virtual_ts)
1560 return etm->latest_kernel_timestamp;
1568 struct cs_etm_auxtrace *etm = etmq->etm;
1577 /* Set time field based on etm auxtrace config. */
1583 sample.id = etmq->etm->instructions_id;
1584 sample.stream_id = etmq->etm->instructions_id;
1592 if (etm->synth_opts.last_branch)
1595 if (etm->synth_opts.inject) {
1597 etm->instructions_sample_type);
1602 ret = perf_session__deliver_synth_event(etm->session, event, &sample);
1606 "CS ETM Trace: failed to deliver instruction event, error %d\n",
1614 * The cs etm packet encodes an instruction range between a branch target
1621 struct cs_etm_auxtrace *etm = etmq->etm;
1638 /* Set time field based on etm auxtrace config. */
1645 sample.id = etmq->etm->branches_id;
1646 sample.stream_id = etmq->etm->branches_id;
1658 if (etm->synth_opts.last_branch) {
1670 if (etm->synth_opts.inject) {
1672 etm->branches_sample_type);
1677 ret = perf_session__deliver_synth_event(etm->session, event, &sample);
1681 "CS ETM Trace: failed to deliver instruction event, error %d\n",
1687 static int cs_etm__synth_events(struct cs_etm_auxtrace *etm,
1698 if (evsel->core.attr.type == etm->pmu_type) {
1715 if (etm->timeless_decoding)
1734 if (etm->synth_opts.branches) {
1741 etm->branches_sample_type = attr.sample_type;
1742 etm->branches_id = id;
1747 if (etm->synth_opts.last_branch) {
1757 if (etm->synth_opts.instructions) {
1759 attr.sample_period = etm->synth_opts.period;
1760 etm->instructions_sample_period = attr.sample_period;
1764 etm->instructions_sample_type = attr.sample_type;
1765 etm->instructions_id = id;
1775 struct cs_etm_auxtrace *etm = etmq->etm;
1789 if (etm->synth_opts.last_branch &&
1794 if (etm->synth_opts.instructions &&
1795 tidq->period_instructions >= etm->instructions_sample_period) {
1821 * every etm->instructions_sample_period instructions - as
1823 * last sample before the current etm packet, n+1 to n+3
1824 * samples are generated from the current etm packet.
1827 * instructions in the current etm packet.
1831 * previous etm packet. This will always be less than
1832 * etm->instructions_sample_period.
1846 * etm->instructions_sample_period.
1848 u64 offset = etm->instructions_sample_period - instrs_prev;
1852 if (etm->synth_opts.last_branch)
1856 etm->instructions_sample_period) {
1867 etm->instructions_sample_period);
1871 offset += etm->instructions_sample_period;
1873 etm->instructions_sample_period;
1877 if (etm->synth_opts.branches) {
1896 cs_etm__packet_swap(etm, tidq);
1924 struct cs_etm_auxtrace *etm = etmq->etm;
1930 if (etmq->etm->synth_opts.last_branch &&
1931 etmq->etm->synth_opts.instructions &&
1957 if (etm->synth_opts.branches &&
1965 cs_etm__packet_swap(etm, tidq);
1968 if (etm->synth_opts.last_branch)
1988 if (etmq->etm->synth_opts.last_branch &&
1989 etmq->etm->synth_opts.instructions &&
2479 pr_err("CS ETM Trace: empty packet\n");
2588 static int cs_etm__process_timeless_queues(struct cs_etm_auxtrace *etm,
2592 struct auxtrace_queues *queues = &etm->queues;
2595 struct auxtrace_queue *queue = &etm->queues.queue_array[i];
2602 if (etm->per_thread_decoding) {
2618 static int cs_etm__process_timestamped_queues(struct cs_etm_auxtrace *etm)
2632 for (i = 0; i < etm->queues.nr_queues; i++) {
2633 etmq = etm->queues.queue_array[i].priv;
2637 ret = cs_etm__queue_first_cs_timestamp(etm, etmq, i);
2643 if (!etm->heap.heap_cnt)
2647 cs_queue_nr = etm->heap.heap_array[0].queue_nr;
2650 queue = &etm->queues.queue_array[queue_nr];
2657 auxtrace_heap__pop(&etm->heap);
2724 ret = auxtrace_heap__add(&etm->heap, cs_queue_nr, cs_timestamp);
2727 for (i = 0; i < etm->queues.nr_queues; i++) {
2730 etmq = etm->queues.queue_array[i].priv;
2748 static int cs_etm__process_itrace_start(struct cs_etm_auxtrace *etm,
2753 if (etm->timeless_decoding)
2762 th = machine__findnew_thread(&etm->session->machines.host,
2773 static int cs_etm__process_switch_cpu_wide(struct cs_etm_auxtrace *etm,
2783 if (etm->timeless_decoding)
2800 th = machine__findnew_thread(&etm->session->machines.host,
2816 struct cs_etm_auxtrace *etm = container_of(session->auxtrace,
2824 pr_err("CoreSight ETM Trace requires ordered events\n");
2838 if (etm->per_thread_decoding && etm->timeless_decoding)
2839 return cs_etm__process_timeless_queues(etm,
2844 return cs_etm__process_itrace_start(etm, event);
2847 return cs_etm__process_switch_cpu_wide(etm, event);
2856 etm->latest_kernel_timestamp = sample->time;
2866 static void dump_queued_data(struct cs_etm_auxtrace *etm,
2876 for (i = 0; i < etm->queues.nr_queues; ++i)
2877 list_for_each_entry(buf, &etm->queues.queue_array[i].head, list)
2879 cs_etm__dump_event(etm->queues.queue_array[i].priv, buf);
2886 struct cs_etm_auxtrace *etm = container_of(session->auxtrace,
2889 if (!etm->data_queued) {
2905 err = auxtrace_queues__add_event(&etm->queues, session,
2912 cs_etm__dump_event(etm->queues.queue_array[idx].priv, buffer);
2916 dump_queued_data(etm, &event->auxtrace);
2921 static int cs_etm__setup_timeless_decoding(struct cs_etm_auxtrace *etm)
2924 struct evlist *evlist = etm->session->evlist;
2927 if (etm->synth_opts.timeless_decoding) {
2928 etm->timeless_decoding = true;
2936 if (cs_etm__evsel_is_auxtrace(etm->session, evsel)) {
2937 etm->timeless_decoding =
2942 pr_err("CS ETM: Couldn't find ETM evsel\n");
3028 struct cs_etm_auxtrace *etm = container_of(session->auxtrace,
3057 etm->per_thread_decoding = true;
3061 if (etm->per_thread_decoding) {
3066 pr_err("CS ETM: Inconsistent per-thread/per-cpu mode.\n");
3092 struct cs_etm_queue *etmq = etm->queues.queue_array[auxtrace_event->idx].priv;
3103 pr_debug3("CS ETM: Queue buffer size: %#"PRI_lx64" offset: %#"PRI_lx64
3105 err = auxtrace_queues__add_event(&etm->queues, session, &auxtrace_fragment,
3189 pr_err("CS ETM: Couldn't find auxtrace buffer for aux_offset: %#"PRI_lx64
3209 * queueing them in cs_etm__process_auxtrace_event() if etm->data_queued is still
3247 static int cs_etm__map_trace_ids_metadata(struct cs_etm_auxtrace *etm, int num_cpu,
3270 err = cs_etm__map_trace_id_v0(etm, trace_chan_id, metadata[i]);
3337 static int cs_etm__create_decoders(struct cs_etm_auxtrace *etm)
3339 struct auxtrace_queues *queues = &etm->queues;
3365 struct cs_etm_auxtrace *etm = NULL;
3407 ui__error("CS ETM Trace: Unrecognised magic number %#"PRIx64". File could be from a newer version of perf.\n",
3435 etm = zalloc(sizeof(*etm));
3437 if (!etm) {
3447 etm->pid_fmt = cs_etm__init_pid_fmt(metadata[0]);
3449 err = auxtrace_queues__init_nr(&etm->queues, max_cpu + 1);
3453 for (unsigned int j = 0; j < etm->queues.nr_queues; ++j) {
3454 err = cs_etm__setup_queue(etm, &etm->queues.queue_array[j], j);
3460 etm->synth_opts = *session->itrace_synth_opts;
3462 itrace_synth_opts__set_default(&etm->synth_opts,
3464 etm->synth_opts.callchain = false;
3467 etm->session = session;
3469 etm->num_cpu = num_cpu;
3470 etm->pmu_type = (unsigned int) ((ptr[CS_PMU_TYPE_CPUS] >> 32) & 0xffffffff);
3471 etm->snapshot_mode = (ptr[CS_ETM_SNAPSHOT] != 0);
3472 etm->metadata = metadata;
3473 etm->auxtrace_type = auxtrace_info->type;
3475 if (etm->synth_opts.use_timestamp)
3485 etm->has_virtual_ts = true;
3488 etm->has_virtual_ts = cs_etm__has_virtual_ts(metadata, num_cpu);
3490 if (!etm->has_virtual_ts)
3497 etm->auxtrace.process_event = cs_etm__process_event;
3498 etm->auxtrace.process_auxtrace_event = cs_etm__process_auxtrace_event;
3499 etm->auxtrace.flush_events = cs_etm__flush_events;
3500 etm->auxtrace.free_events = cs_etm__free_events;
3501 etm->auxtrace.free = cs_etm__free;
3502 etm->auxtrace.evsel_is_auxtrace = cs_etm__evsel_is_auxtrace;
3503 session->auxtrace = &etm->auxtrace;
3505 err = cs_etm__setup_timeless_decoding(etm);
3509 etm->tc.time_shift = tc->time_shift;
3510 etm->tc.time_mult = tc->time_mult;
3511 etm->tc.time_zero = tc->time_zero;
3513 etm->tc.time_cycles = tc->time_cycles;
3514 etm->tc.time_mask = tc->time_mask;
3515 etm->tc.cap_user_time_zero = tc->cap_user_time_zero;
3516 etm->tc.cap_user_time_short = tc->cap_user_time_short;
3518 err = cs_etm__synth_events(etm, session);
3557 err = cs_etm__map_trace_ids_metadata(etm, num_cpu, metadata);
3562 err = cs_etm__create_decoders(etm);
3566 etm->data_queued = etm->queues.populated;
3570 auxtrace_queues__free(&etm->queues);
3573 zfree(&etm);