Lines Matching full:etm

22 #include "cs-etm.h"
23 #include "cs-etm-decoder/cs-etm-decoder.h"
101 struct cs_etm_auxtrace *etm; member
117 static int cs_etm__process_timestamped_queues(struct cs_etm_auxtrace *etm);
118 static int cs_etm__process_timeless_queues(struct cs_etm_auxtrace *etm,
129 * encode the etm queue number as the upper 16 bit and the channel as
188 * The result is cached in etm->pid_fmt so this function only needs to be called
215 return etmq->etm->pid_fmt; in cs_etm__get_pid_fmt()
289 static int get_cpu_data_idx(struct cs_etm_auxtrace *etm, int cpu) in get_cpu_data_idx() argument
293 for (i = 0; i < etm->num_cpu; i++) { in get_cpu_data_idx()
294 if (etm->metadata[i][CS_ETM_CPU] == (u64)cpu) { in get_cpu_data_idx()
306 static u64 *get_cpu_data(struct cs_etm_auxtrace *etm, int cpu) in get_cpu_data() argument
308 int idx = get_cpu_data_idx(etm, cpu); in get_cpu_data()
310 return (idx != -1) ? etm->metadata[idx] : NULL; in get_cpu_data()
323 struct cs_etm_auxtrace *etm; in cs_etm__process_aux_output_hw_id() local
341 /* get access to the etm metadata */ in cs_etm__process_aux_output_hw_id()
342 etm = container_of(session->auxtrace, struct cs_etm_auxtrace, auxtrace); in cs_etm__process_aux_output_hw_id()
343 if (!etm || !etm->metadata) in cs_etm__process_aux_output_hw_id()
382 cpu_data = get_cpu_data(etm, cpu); in cs_etm__process_aux_output_hw_id()
479 struct cs_etm_auxtrace *etm = etmq->etm; in cs_etm__init_traceid_queue() local
483 queue = &etmq->etm->queues.queue_array[etmq->queue_nr]; in cs_etm__init_traceid_queue()
486 tidq->thread = machine__findnew_thread(&etm->session->machines.host, -1, in cs_etm__init_traceid_queue()
488 tidq->prev_packet_thread = machine__idle_thread(&etm->session->machines.host); in cs_etm__init_traceid_queue()
498 if (etm->synth_opts.last_branch) { in cs_etm__init_traceid_queue()
501 sz += etm->synth_opts.last_branch_sz * in cs_etm__init_traceid_queue()
533 struct cs_etm_auxtrace *etm = etmq->etm; in cs_etm__etmq_get_traceid_queue() local
535 if (etm->per_thread_decoding) in cs_etm__etmq_get_traceid_queue()
611 static void cs_etm__packet_swap(struct cs_etm_auxtrace *etm, in cs_etm__packet_swap() argument
616 if (etm->synth_opts.branches || etm->synth_opts.last_branch || in cs_etm__packet_swap()
617 etm->synth_opts.instructions) { in cs_etm__packet_swap()
653 struct cs_etm_auxtrace *etm, int t_idx, in cs_etm__set_trace_param_etmv3() argument
656 u64 **metadata = etm->metadata; in cs_etm__set_trace_param_etmv3()
664 struct cs_etm_auxtrace *etm, int t_idx, in cs_etm__set_trace_param_etmv4() argument
667 u64 **metadata = etm->metadata; in cs_etm__set_trace_param_etmv4()
679 struct cs_etm_auxtrace *etm, int t_idx, in cs_etm__set_trace_param_ete() argument
682 u64 **metadata = etm->metadata; in cs_etm__set_trace_param_ete()
695 struct cs_etm_auxtrace *etm, in cs_etm__init_trace_params() argument
708 m_idx = get_cpu_data_idx(etm, sample_cpu); in cs_etm__init_trace_params()
715 architecture = etm->metadata[m_idx][CS_ETM_MAGIC]; in cs_etm__init_trace_params()
719 etmidr = etm->metadata[m_idx][CS_ETM_ETMIDR]; in cs_etm__init_trace_params()
720 cs_etm__set_trace_param_etmv3(t_params, etm, t_idx, m_idx, etmidr); in cs_etm__init_trace_params()
723 cs_etm__set_trace_param_etmv4(t_params, etm, t_idx, m_idx); in cs_etm__init_trace_params()
726 cs_etm__set_trace_param_ete(t_params, etm, t_idx, m_idx); in cs_etm__init_trace_params()
790 struct cs_etm_auxtrace *etm = container_of(session->auxtrace, in cs_etm__flush_events() local
799 if (etm->timeless_decoding) { in cs_etm__flush_events()
804 return cs_etm__process_timeless_queues(etm, -1); in cs_etm__flush_events()
807 return cs_etm__process_timestamped_queues(etm); in cs_etm__flush_events()
919 return &etmq->etm->session->machines.host; in cs_etm__get_machine()
931 return machines__find_guest(&etmq->etm->session->machines, in cs_etm__get_machine()
938 return &etmq->etm->session->machines.host; in cs_etm__get_machine()
1025 …ui__warning_once("CS ETM Trace: Missing DSO. Use 'perf archive' or debuginfod to export data from … in cs_etm__mem_access()
1028 pr_err("CS ETM Trace: Debug data not found for address %#"PRIx64" in %s\n", in cs_etm__mem_access()
1041 static struct cs_etm_queue *cs_etm__alloc_queue(struct cs_etm_auxtrace *etm, in cs_etm__alloc_queue() argument
1051 int decoders = formatted ? etm->num_cpu : 1; in cs_etm__alloc_queue()
1067 if (cs_etm__init_trace_params(t_params, etm, formatted, sample_cpu, decoders)) in cs_etm__alloc_queue()
1104 static int cs_etm__setup_queue(struct cs_etm_auxtrace *etm, in cs_etm__setup_queue() argument
1115 etmq = cs_etm__alloc_queue(etm, formatted, sample_cpu); in cs_etm__setup_queue()
1121 etmq->etm = etm; in cs_etm__setup_queue()
1128 static int cs_etm__queue_first_cs_timestamp(struct cs_etm_auxtrace *etm, in cs_etm__queue_first_cs_timestamp() argument
1194 ret = auxtrace_heap__add(&etm->heap, cs_queue_nr, cs_timestamp); in cs_etm__queue_first_cs_timestamp()
1224 nr = etmq->etm->synth_opts.last_branch_sz - tidq->last_branch_pos; in cs_etm__copy_last_branch_rb()
1236 if (bs_src->nr >= etmq->etm->synth_opts.last_branch_sz) { in cs_etm__copy_last_branch_rb()
1317 tidq->last_branch_pos = etmq->etm->synth_opts.last_branch_sz; in cs_etm__update_last_branch_rb()
1332 if (bs->nr < etmq->etm->synth_opts.last_branch_sz) in cs_etm__update_last_branch_rb()
1351 queue = &etmq->etm->queues.queue_array[etmq->queue_nr]; in cs_etm__get_trace()
1368 int fd = perf_data__fd(etmq->etm->session->data); in cs_etm__get_trace()
1419 return !!etmq->etm->timeless_decoding; in cs_etm__etmq_is_timeless()
1453 struct cs_etm_auxtrace *etm = etmq->etm; in cs_etm__convert_sample_time() local
1455 if (etm->has_virtual_ts) in cs_etm__convert_sample_time()
1456 return tsc_to_perf_time(cs_timestamp, &etm->tc); in cs_etm__convert_sample_time()
1464 struct cs_etm_auxtrace *etm = etmq->etm; in cs_etm__resolve_sample_time() local
1467 if (!etm->timeless_decoding && etm->has_virtual_ts) in cs_etm__resolve_sample_time()
1470 return etm->latest_kernel_timestamp; in cs_etm__resolve_sample_time()
1478 struct cs_etm_auxtrace *etm = etmq->etm; in cs_etm__synth_instruction_sample() local
1486 /* Set time field based on etm auxtrace config. */ in cs_etm__synth_instruction_sample()
1492 sample.id = etmq->etm->instructions_id; in cs_etm__synth_instruction_sample()
1493 sample.stream_id = etmq->etm->instructions_id; in cs_etm__synth_instruction_sample()
1501 if (etm->synth_opts.last_branch) in cs_etm__synth_instruction_sample()
1504 if (etm->synth_opts.inject) { in cs_etm__synth_instruction_sample()
1506 etm->instructions_sample_type); in cs_etm__synth_instruction_sample()
1511 ret = perf_session__deliver_synth_event(etm->session, event, &sample); in cs_etm__synth_instruction_sample()
1515 "CS ETM Trace: failed to deliver instruction event, error %d\n", in cs_etm__synth_instruction_sample()
1522 * The cs etm packet encodes an instruction range between a branch target
1529 struct cs_etm_auxtrace *etm = etmq->etm; in cs_etm__synth_branch_sample() local
1546 /* Set time field based on etm auxtrace config. */ in cs_etm__synth_branch_sample()
1553 sample.id = etmq->etm->branches_id; in cs_etm__synth_branch_sample()
1554 sample.stream_id = etmq->etm->branches_id; in cs_etm__synth_branch_sample()
1566 if (etm->synth_opts.last_branch) { in cs_etm__synth_branch_sample()
1578 if (etm->synth_opts.inject) { in cs_etm__synth_branch_sample()
1580 etm->branches_sample_type); in cs_etm__synth_branch_sample()
1585 ret = perf_session__deliver_synth_event(etm->session, event, &sample); in cs_etm__synth_branch_sample()
1589 "CS ETM Trace: failed to deliver instruction event, error %d\n", in cs_etm__synth_branch_sample()
1624 static int cs_etm__synth_events(struct cs_etm_auxtrace *etm, in cs_etm__synth_events() argument
1635 if (evsel->core.attr.type == etm->pmu_type) { in cs_etm__synth_events()
1652 if (etm->timeless_decoding) in cs_etm__synth_events()
1671 if (etm->synth_opts.branches) { in cs_etm__synth_events()
1678 etm->branches_sample_type = attr.sample_type; in cs_etm__synth_events()
1679 etm->branches_id = id; in cs_etm__synth_events()
1684 if (etm->synth_opts.last_branch) { in cs_etm__synth_events()
1694 if (etm->synth_opts.instructions) { in cs_etm__synth_events()
1696 attr.sample_period = etm->synth_opts.period; in cs_etm__synth_events()
1697 etm->instructions_sample_period = attr.sample_period; in cs_etm__synth_events()
1701 etm->instructions_sample_type = attr.sample_type; in cs_etm__synth_events()
1702 etm->instructions_id = id; in cs_etm__synth_events()
1712 struct cs_etm_auxtrace *etm = etmq->etm; in cs_etm__sample() local
1726 if (etm->synth_opts.last_branch && in cs_etm__sample()
1731 if (etm->synth_opts.instructions && in cs_etm__sample()
1732 tidq->period_instructions >= etm->instructions_sample_period) { in cs_etm__sample()
1758 * every etm->instructions_sample_period instructions - as in cs_etm__sample()
1760 * last sample before the current etm packet, n+1 to n+3 in cs_etm__sample()
1761 * samples are generated from the current etm packet. in cs_etm__sample()
1764 * instructions in the current etm packet. in cs_etm__sample()
1768 * previous etm packet. This will always be less than in cs_etm__sample()
1769 * etm->instructions_sample_period. in cs_etm__sample()
1783 * etm->instructions_sample_period. in cs_etm__sample()
1785 u64 offset = etm->instructions_sample_period - instrs_prev; in cs_etm__sample()
1789 if (etm->synth_opts.last_branch) in cs_etm__sample()
1793 etm->instructions_sample_period) { in cs_etm__sample()
1804 etm->instructions_sample_period); in cs_etm__sample()
1808 offset += etm->instructions_sample_period; in cs_etm__sample()
1810 etm->instructions_sample_period; in cs_etm__sample()
1814 if (etm->synth_opts.branches) { in cs_etm__sample()
1833 cs_etm__packet_swap(etm, tidq); in cs_etm__sample()
1861 struct cs_etm_auxtrace *etm = etmq->etm; in cs_etm__flush() local
1867 if (etmq->etm->synth_opts.last_branch && in cs_etm__flush()
1868 etmq->etm->synth_opts.instructions && in cs_etm__flush()
1894 if (etm->synth_opts.branches && in cs_etm__flush()
1902 cs_etm__packet_swap(etm, tidq); in cs_etm__flush()
1905 if (etm->synth_opts.last_branch) in cs_etm__flush()
1925 if (etmq->etm->synth_opts.last_branch && in cs_etm__end_block()
1926 etmq->etm->synth_opts.instructions && in cs_etm__end_block()
2416 pr_err("CS ETM Trace: empty packet\n"); in cs_etm__process_traceid_queue()
2531 static int cs_etm__process_timeless_queues(struct cs_etm_auxtrace *etm, in cs_etm__process_timeless_queues() argument
2535 struct auxtrace_queues *queues = &etm->queues; in cs_etm__process_timeless_queues()
2538 struct auxtrace_queue *queue = &etm->queues.queue_array[i]; in cs_etm__process_timeless_queues()
2545 if (etm->per_thread_decoding) { in cs_etm__process_timeless_queues()
2561 static int cs_etm__process_timestamped_queues(struct cs_etm_auxtrace *etm) in cs_etm__process_timestamped_queues() argument
2575 for (i = 0; i < etm->queues.nr_queues; i++) { in cs_etm__process_timestamped_queues()
2576 etmq = etm->queues.queue_array[i].priv; in cs_etm__process_timestamped_queues()
2580 ret = cs_etm__queue_first_cs_timestamp(etm, etmq, i); in cs_etm__process_timestamped_queues()
2586 if (!etm->heap.heap_cnt) in cs_etm__process_timestamped_queues()
2590 cs_queue_nr = etm->heap.heap_array[0].queue_nr; in cs_etm__process_timestamped_queues()
2593 queue = &etm->queues.queue_array[queue_nr]; in cs_etm__process_timestamped_queues()
2600 auxtrace_heap__pop(&etm->heap); in cs_etm__process_timestamped_queues()
2667 ret = auxtrace_heap__add(&etm->heap, cs_queue_nr, cs_timestamp); in cs_etm__process_timestamped_queues()
2674 static int cs_etm__process_itrace_start(struct cs_etm_auxtrace *etm, in cs_etm__process_itrace_start() argument
2679 if (etm->timeless_decoding) in cs_etm__process_itrace_start()
2688 th = machine__findnew_thread(&etm->session->machines.host, in cs_etm__process_itrace_start()
2699 static int cs_etm__process_switch_cpu_wide(struct cs_etm_auxtrace *etm, in cs_etm__process_switch_cpu_wide() argument
2709 if (etm->timeless_decoding) in cs_etm__process_switch_cpu_wide()
2726 th = machine__findnew_thread(&etm->session->machines.host, in cs_etm__process_switch_cpu_wide()
2742 struct cs_etm_auxtrace *etm = container_of(session->auxtrace, in cs_etm__process_event() local
2750 pr_err("CoreSight ETM Trace requires ordered events\n"); in cs_etm__process_event()
2764 if (etm->per_thread_decoding && etm->timeless_decoding) in cs_etm__process_event()
2765 return cs_etm__process_timeless_queues(etm, in cs_etm__process_event()
2770 return cs_etm__process_itrace_start(etm, event); in cs_etm__process_event()
2773 return cs_etm__process_switch_cpu_wide(etm, event); in cs_etm__process_event()
2782 etm->latest_kernel_timestamp = sample->time; in cs_etm__process_event()
2792 static void dump_queued_data(struct cs_etm_auxtrace *etm, in dump_queued_data() argument
2802 for (i = 0; i < etm->queues.nr_queues; ++i) in dump_queued_data()
2803 list_for_each_entry(buf, &etm->queues.queue_array[i].head, list) in dump_queued_data()
2805 cs_etm__dump_event(etm->queues.queue_array[i].priv, buf); in dump_queued_data()
2812 struct cs_etm_auxtrace *etm = container_of(session->auxtrace, in cs_etm__process_auxtrace_event() local
2815 if (!etm->data_queued) { in cs_etm__process_auxtrace_event()
2831 err = auxtrace_queues__add_event(&etm->queues, session, in cs_etm__process_auxtrace_event()
2842 err = cs_etm__setup_queue(etm, &etm->queues.queue_array[idx], in cs_etm__process_auxtrace_event()
2849 cs_etm__dump_event(etm->queues.queue_array[idx].priv, buffer); in cs_etm__process_auxtrace_event()
2853 dump_queued_data(etm, &event->auxtrace); in cs_etm__process_auxtrace_event()
2858 static int cs_etm__setup_timeless_decoding(struct cs_etm_auxtrace *etm) in cs_etm__setup_timeless_decoding() argument
2861 struct evlist *evlist = etm->session->evlist; in cs_etm__setup_timeless_decoding()
2864 if (etm->synth_opts.timeless_decoding) { in cs_etm__setup_timeless_decoding()
2865 etm->timeless_decoding = true; in cs_etm__setup_timeless_decoding()
2873 if (cs_etm__evsel_is_auxtrace(etm->session, evsel)) { in cs_etm__setup_timeless_decoding()
2874 etm->timeless_decoding = in cs_etm__setup_timeless_decoding()
2879 pr_err("CS ETM: Couldn't find ETM evsel\n"); in cs_etm__setup_timeless_decoding()
2966 struct cs_etm_auxtrace *etm = container_of(session->auxtrace, in cs_etm__queue_aux_fragment() local
2995 etm->per_thread_decoding = true; in cs_etm__queue_aux_fragment()
2999 if (etm->per_thread_decoding) { in cs_etm__queue_aux_fragment()
3004 pr_err("CS ETM: Inconsistent per-thread/per-cpu mode.\n"); in cs_etm__queue_aux_fragment()
3039 pr_debug3("CS ETM: Queue buffer size: %#"PRI_lx64" offset: %#"PRI_lx64 in cs_etm__queue_aux_fragment()
3041 err = auxtrace_queues__add_event(&etm->queues, session, &auxtrace_fragment, in cs_etm__queue_aux_fragment()
3048 return cs_etm__setup_queue(etm, &etm->queues.queue_array[idx], in cs_etm__queue_aux_fragment()
3120 pr_err("CS ETM: Couldn't find auxtrace buffer for aux_offset: %#"PRI_lx64 in cs_etm__queue_aux_records_cb()
3137 * queueing them in cs_etm__process_auxtrace_event() if etm->data_queued is still in cs_etm__queue_aux_records()
3237 struct cs_etm_auxtrace *etm = NULL; in cs_etm__process_auxtrace_info_full() local
3290 …ui__error("CS ETM Trace: Unrecognised magic number %#"PRIx64". File could be from a newer version … in cs_etm__process_auxtrace_info_full()
3315 etm = zalloc(sizeof(*etm)); in cs_etm__process_auxtrace_info_full()
3317 if (!etm) { in cs_etm__process_auxtrace_info_full()
3327 etm->pid_fmt = cs_etm__init_pid_fmt(metadata[0]); in cs_etm__process_auxtrace_info_full()
3329 err = auxtrace_queues__init(&etm->queues); in cs_etm__process_auxtrace_info_full()
3334 etm->synth_opts = *session->itrace_synth_opts; in cs_etm__process_auxtrace_info_full()
3336 itrace_synth_opts__set_default(&etm->synth_opts, in cs_etm__process_auxtrace_info_full()
3338 etm->synth_opts.callchain = false; in cs_etm__process_auxtrace_info_full()
3341 etm->session = session; in cs_etm__process_auxtrace_info_full()
3343 etm->num_cpu = num_cpu; in cs_etm__process_auxtrace_info_full()
3344 etm->pmu_type = (unsigned int) ((ptr[CS_PMU_TYPE_CPUS] >> 32) & 0xffffffff); in cs_etm__process_auxtrace_info_full()
3345 etm->snapshot_mode = (ptr[CS_ETM_SNAPSHOT] != 0); in cs_etm__process_auxtrace_info_full()
3346 etm->metadata = metadata; in cs_etm__process_auxtrace_info_full()
3347 etm->auxtrace_type = auxtrace_info->type; in cs_etm__process_auxtrace_info_full()
3349 if (etm->synth_opts.use_timestamp) in cs_etm__process_auxtrace_info_full()
3359 etm->has_virtual_ts = true; in cs_etm__process_auxtrace_info_full()
3362 etm->has_virtual_ts = cs_etm__has_virtual_ts(metadata, num_cpu); in cs_etm__process_auxtrace_info_full()
3364 if (!etm->has_virtual_ts) in cs_etm__process_auxtrace_info_full()
3371 etm->auxtrace.process_event = cs_etm__process_event; in cs_etm__process_auxtrace_info_full()
3372 etm->auxtrace.process_auxtrace_event = cs_etm__process_auxtrace_event; in cs_etm__process_auxtrace_info_full()
3373 etm->auxtrace.flush_events = cs_etm__flush_events; in cs_etm__process_auxtrace_info_full()
3374 etm->auxtrace.free_events = cs_etm__free_events; in cs_etm__process_auxtrace_info_full()
3375 etm->auxtrace.free = cs_etm__free; in cs_etm__process_auxtrace_info_full()
3376 etm->auxtrace.evsel_is_auxtrace = cs_etm__evsel_is_auxtrace; in cs_etm__process_auxtrace_info_full()
3377 session->auxtrace = &etm->auxtrace; in cs_etm__process_auxtrace_info_full()
3379 err = cs_etm__setup_timeless_decoding(etm); in cs_etm__process_auxtrace_info_full()
3383 etm->tc.time_shift = tc->time_shift; in cs_etm__process_auxtrace_info_full()
3384 etm->tc.time_mult = tc->time_mult; in cs_etm__process_auxtrace_info_full()
3385 etm->tc.time_zero = tc->time_zero; in cs_etm__process_auxtrace_info_full()
3387 etm->tc.time_cycles = tc->time_cycles; in cs_etm__process_auxtrace_info_full()
3388 etm->tc.time_mask = tc->time_mask; in cs_etm__process_auxtrace_info_full()
3389 etm->tc.cap_user_time_zero = tc->cap_user_time_zero; in cs_etm__process_auxtrace_info_full()
3390 etm->tc.cap_user_time_short = tc->cap_user_time_short; in cs_etm__process_auxtrace_info_full()
3392 err = cs_etm__synth_events(etm, session); in cs_etm__process_auxtrace_info_full()
3440 etm->data_queued = etm->queues.populated; in cs_etm__process_auxtrace_info_full()
3444 auxtrace_queues__free(&etm->queues); in cs_etm__process_auxtrace_info_full()
3447 zfree(&etm); in cs_etm__process_auxtrace_info_full()