Lines Matching full:etm

22 #include "cs-etm.h"
23 #include "cs-etm-decoder/cs-etm-decoder.h"
83 struct cs_etm_auxtrace *etm; member
99 static int cs_etm__process_queues(struct cs_etm_auxtrace *etm);
100 static int cs_etm__process_timeless_queues(struct cs_etm_auxtrace *etm,
111 * encode the etm queue number as the upper 16 bit and the channel as
278 struct cs_etm_auxtrace *etm = etmq->etm; in cs_etm__init_traceid_queue() local
282 queue = &etmq->etm->queues.queue_array[etmq->queue_nr]; in cs_etm__init_traceid_queue()
295 if (etm->synth_opts.last_branch) { in cs_etm__init_traceid_queue()
298 sz += etm->synth_opts.last_branch_sz * in cs_etm__init_traceid_queue()
330 struct cs_etm_auxtrace *etm = etmq->etm; in cs_etm__etmq_get_traceid_queue() local
332 if (etm->timeless_decoding) in cs_etm__etmq_get_traceid_queue()
408 static void cs_etm__packet_swap(struct cs_etm_auxtrace *etm, in cs_etm__packet_swap() argument
413 if (etm->sample_branches || etm->synth_opts.last_branch || in cs_etm__packet_swap()
414 etm->sample_instructions) { in cs_etm__packet_swap()
439 struct cs_etm_auxtrace *etm, int idx, in cs_etm__set_trace_param_etmv3() argument
442 u64 **metadata = etm->metadata; in cs_etm__set_trace_param_etmv3()
450 struct cs_etm_auxtrace *etm, int idx) in cs_etm__set_trace_param_etmv4() argument
452 u64 **metadata = etm->metadata; in cs_etm__set_trace_param_etmv4()
464 struct cs_etm_auxtrace *etm, int idx) in cs_etm__set_trace_param_ete() argument
466 u64 **metadata = etm->metadata; in cs_etm__set_trace_param_ete()
479 struct cs_etm_auxtrace *etm, in cs_etm__init_trace_params() argument
487 architecture = etm->metadata[i][CS_ETM_MAGIC]; in cs_etm__init_trace_params()
491 etmidr = etm->metadata[i][CS_ETM_ETMIDR]; in cs_etm__init_trace_params()
492 cs_etm__set_trace_param_etmv3(t_params, etm, i, etmidr); in cs_etm__init_trace_params()
495 cs_etm__set_trace_param_etmv4(t_params, etm, i); in cs_etm__init_trace_params()
498 cs_etm__set_trace_param_ete(t_params, etm, i); in cs_etm__init_trace_params()
562 struct cs_etm_auxtrace *etm = container_of(session->auxtrace, in cs_etm__flush_events() local
571 if (etm->timeless_decoding) in cs_etm__flush_events()
572 return cs_etm__process_timeless_queues(etm, -1); in cs_etm__flush_events()
574 return cs_etm__process_queues(etm); in cs_etm__flush_events()
680 machine = etmq->etm->machine; in cs_etm__cpu_mode()
711 machine = etmq->etm->machine; in cs_etm__mem_access()
721 thread = etmq->etm->unknown_thread; in cs_etm__mem_access()
738 …ui__warning_once("CS ETM Trace: Missing DSO. Use 'perf archive' or debuginfod to export data from … in cs_etm__mem_access()
741 pr_err("CS ETM Trace: Debug data not found for address %#"PRIx64" in %s\n", in cs_etm__mem_access()
752 static struct cs_etm_queue *cs_etm__alloc_queue(struct cs_etm_auxtrace *etm, in cs_etm__alloc_queue() argument
762 int decoders = formatted ? etm->num_cpu : 1; in cs_etm__alloc_queue()
778 if (cs_etm__init_trace_params(t_params, etm, decoders)) in cs_etm__alloc_queue()
815 static int cs_etm__setup_queue(struct cs_etm_auxtrace *etm, in cs_etm__setup_queue() argument
825 etmq = cs_etm__alloc_queue(etm, formatted); in cs_etm__setup_queue()
831 etmq->etm = etm; in cs_etm__setup_queue()
838 static int cs_etm__queue_first_cs_timestamp(struct cs_etm_auxtrace *etm, in cs_etm__queue_first_cs_timestamp() argument
904 ret = auxtrace_heap__add(&etm->heap, cs_queue_nr, cs_timestamp); in cs_etm__queue_first_cs_timestamp()
934 nr = etmq->etm->synth_opts.last_branch_sz - tidq->last_branch_pos; in cs_etm__copy_last_branch_rb()
946 if (bs_src->nr >= etmq->etm->synth_opts.last_branch_sz) { in cs_etm__copy_last_branch_rb()
1027 tidq->last_branch_pos = etmq->etm->synth_opts.last_branch_sz; in cs_etm__update_last_branch_rb()
1042 if (bs->nr < etmq->etm->synth_opts.last_branch_sz) in cs_etm__update_last_branch_rb()
1061 queue = &etmq->etm->queues.queue_array[etmq->queue_nr]; in cs_etm__get_trace()
1078 int fd = perf_data__fd(etmq->etm->session->data); in cs_etm__get_trace()
1096 static void cs_etm__set_pid_tid_cpu(struct cs_etm_auxtrace *etm, in cs_etm__set_pid_tid_cpu() argument
1100 tidq->thread = machine__find_thread(etm->machine, -1, in cs_etm__set_pid_tid_cpu()
1111 struct cs_etm_auxtrace *etm = etmq->etm; in cs_etm__etmq_set_tid() local
1121 err = machine__set_current_tid(etm->machine, cpu, tid, tid); in cs_etm__etmq_set_tid()
1128 cs_etm__set_pid_tid_cpu(etm, tidq); in cs_etm__etmq_set_tid()
1134 return !!etmq->etm->timeless_decoding; in cs_etm__etmq_is_timeless()
1171 struct cs_etm_auxtrace *etm = etmq->etm; in cs_etm__synth_instruction_sample() local
1179 if (!etm->timeless_decoding) in cs_etm__synth_instruction_sample()
1180 sample.time = etm->latest_kernel_timestamp; in cs_etm__synth_instruction_sample()
1184 sample.id = etmq->etm->instructions_id; in cs_etm__synth_instruction_sample()
1185 sample.stream_id = etmq->etm->instructions_id; in cs_etm__synth_instruction_sample()
1193 if (etm->synth_opts.last_branch) in cs_etm__synth_instruction_sample()
1196 if (etm->synth_opts.inject) { in cs_etm__synth_instruction_sample()
1198 etm->instructions_sample_type); in cs_etm__synth_instruction_sample()
1203 ret = perf_session__deliver_synth_event(etm->session, event, &sample); in cs_etm__synth_instruction_sample()
1207 "CS ETM Trace: failed to deliver instruction event, error %d\n", in cs_etm__synth_instruction_sample()
1214 * The cs etm packet encodes an instruction range between a branch target
1221 struct cs_etm_auxtrace *etm = etmq->etm; in cs_etm__synth_branch_sample() local
1237 if (!etm->timeless_decoding) in cs_etm__synth_branch_sample()
1238 sample.time = etm->latest_kernel_timestamp; in cs_etm__synth_branch_sample()
1243 sample.id = etmq->etm->branches_id; in cs_etm__synth_branch_sample()
1244 sample.stream_id = etmq->etm->branches_id; in cs_etm__synth_branch_sample()
1256 if (etm->synth_opts.last_branch) { in cs_etm__synth_branch_sample()
1268 if (etm->synth_opts.inject) { in cs_etm__synth_branch_sample()
1270 etm->branches_sample_type); in cs_etm__synth_branch_sample()
1275 ret = perf_session__deliver_synth_event(etm->session, event, &sample); in cs_etm__synth_branch_sample()
1279 "CS ETM Trace: failed to deliver instruction event, error %d\n", in cs_etm__synth_branch_sample()
1314 static int cs_etm__synth_events(struct cs_etm_auxtrace *etm, in cs_etm__synth_events() argument
1325 if (evsel->core.attr.type == etm->pmu_type) { in cs_etm__synth_events()
1342 if (etm->timeless_decoding) in cs_etm__synth_events()
1361 if (etm->synth_opts.branches) { in cs_etm__synth_events()
1368 etm->sample_branches = true; in cs_etm__synth_events()
1369 etm->branches_sample_type = attr.sample_type; in cs_etm__synth_events()
1370 etm->branches_id = id; in cs_etm__synth_events()
1375 if (etm->synth_opts.last_branch) { in cs_etm__synth_events()
1385 if (etm->synth_opts.instructions) { in cs_etm__synth_events()
1387 attr.sample_period = etm->synth_opts.period; in cs_etm__synth_events()
1388 etm->instructions_sample_period = attr.sample_period; in cs_etm__synth_events()
1392 etm->sample_instructions = true; in cs_etm__synth_events()
1393 etm->instructions_sample_type = attr.sample_type; in cs_etm__synth_events()
1394 etm->instructions_id = id; in cs_etm__synth_events()
1404 struct cs_etm_auxtrace *etm = etmq->etm; in cs_etm__sample() local
1418 if (etm->synth_opts.last_branch && in cs_etm__sample()
1423 if (etm->sample_instructions && in cs_etm__sample()
1424 tidq->period_instructions >= etm->instructions_sample_period) { in cs_etm__sample()
1450 * every etm->instructions_sample_period instructions - as in cs_etm__sample()
1452 * last sample before the current etm packet, n+1 to n+3 in cs_etm__sample()
1453 * samples are generated from the current etm packet. in cs_etm__sample()
1456 * instructions in the current etm packet. in cs_etm__sample()
1460 * previous etm packet. This will always be less than in cs_etm__sample()
1461 * etm->instructions_sample_period. in cs_etm__sample()
1475 * etm->instructions_sample_period. in cs_etm__sample()
1477 u64 offset = etm->instructions_sample_period - instrs_prev; in cs_etm__sample()
1481 if (etm->synth_opts.last_branch) in cs_etm__sample()
1485 etm->instructions_sample_period) { in cs_etm__sample()
1496 etm->instructions_sample_period); in cs_etm__sample()
1500 offset += etm->instructions_sample_period; in cs_etm__sample()
1502 etm->instructions_sample_period; in cs_etm__sample()
1506 if (etm->sample_branches) { in cs_etm__sample()
1525 cs_etm__packet_swap(etm, tidq); in cs_etm__sample()
1553 struct cs_etm_auxtrace *etm = etmq->etm; in cs_etm__flush() local
1559 if (etmq->etm->synth_opts.last_branch && in cs_etm__flush()
1585 if (etm->sample_branches && in cs_etm__flush()
1593 cs_etm__packet_swap(etm, tidq); in cs_etm__flush()
1596 if (etm->synth_opts.last_branch) in cs_etm__flush()
1616 if (etmq->etm->synth_opts.last_branch && in cs_etm__end_block()
2106 pr_err("CS ETM Trace: empty packet\n"); in cs_etm__process_traceid_queue()
2176 static int cs_etm__process_timeless_queues(struct cs_etm_auxtrace *etm, in cs_etm__process_timeless_queues() argument
2180 struct auxtrace_queues *queues = &etm->queues; in cs_etm__process_timeless_queues()
2183 struct auxtrace_queue *queue = &etm->queues.queue_array[i]; in cs_etm__process_timeless_queues()
2197 cs_etm__set_pid_tid_cpu(etm, tidq); in cs_etm__process_timeless_queues()
2205 static int cs_etm__process_queues(struct cs_etm_auxtrace *etm) in cs_etm__process_queues() argument
2219 for (i = 0; i < etm->queues.nr_queues; i++) { in cs_etm__process_queues()
2220 etmq = etm->queues.queue_array[i].priv; in cs_etm__process_queues()
2224 ret = cs_etm__queue_first_cs_timestamp(etm, etmq, i); in cs_etm__process_queues()
2230 if (!etm->heap.heap_cnt) in cs_etm__process_queues()
2234 cs_queue_nr = etm->heap.heap_array[0].queue_nr; in cs_etm__process_queues()
2237 queue = &etm->queues.queue_array[queue_nr]; in cs_etm__process_queues()
2244 auxtrace_heap__pop(&etm->heap); in cs_etm__process_queues()
2311 ret = auxtrace_heap__add(&etm->heap, cs_queue_nr, cs_timestamp); in cs_etm__process_queues()
2318 static int cs_etm__process_itrace_start(struct cs_etm_auxtrace *etm, in cs_etm__process_itrace_start() argument
2323 if (etm->timeless_decoding) in cs_etm__process_itrace_start()
2330 th = machine__findnew_thread(etm->machine, in cs_etm__process_itrace_start()
2341 static int cs_etm__process_switch_cpu_wide(struct cs_etm_auxtrace *etm, in cs_etm__process_switch_cpu_wide() argument
2351 if (etm->timeless_decoding) in cs_etm__process_switch_cpu_wide()
2366 th = machine__findnew_thread(etm->machine, in cs_etm__process_switch_cpu_wide()
2383 struct cs_etm_auxtrace *etm = container_of(session->auxtrace, in cs_etm__process_event() local
2391 pr_err("CoreSight ETM Trace requires ordered events\n"); in cs_etm__process_event()
2405 if (etm->timeless_decoding && in cs_etm__process_event()
2407 return cs_etm__process_timeless_queues(etm, in cs_etm__process_event()
2411 return cs_etm__process_itrace_start(etm, event); in cs_etm__process_event()
2413 return cs_etm__process_switch_cpu_wide(etm, event); in cs_etm__process_event()
2415 if (!etm->timeless_decoding && event->header.type == PERF_RECORD_AUX) { in cs_etm__process_event()
2421 etm->latest_kernel_timestamp = sample_kernel_timestamp; in cs_etm__process_event()
2427 static void dump_queued_data(struct cs_etm_auxtrace *etm, in dump_queued_data() argument
2437 for (i = 0; i < etm->queues.nr_queues; ++i) in dump_queued_data()
2438 list_for_each_entry(buf, &etm->queues.queue_array[i].head, list) in dump_queued_data()
2440 cs_etm__dump_event(etm->queues.queue_array[i].priv, buf); in dump_queued_data()
2447 struct cs_etm_auxtrace *etm = container_of(session->auxtrace, in cs_etm__process_auxtrace_event() local
2450 if (!etm->data_queued) { in cs_etm__process_auxtrace_event()
2466 err = auxtrace_queues__add_event(&etm->queues, session, in cs_etm__process_auxtrace_event()
2477 err = cs_etm__setup_queue(etm, &etm->queues.queue_array[idx], in cs_etm__process_auxtrace_event()
2484 cs_etm__dump_event(etm->queues.queue_array[idx].priv, buffer); in cs_etm__process_auxtrace_event()
2488 dump_queued_data(etm, &event->auxtrace); in cs_etm__process_auxtrace_event()
2493 static bool cs_etm__is_timeless_decoding(struct cs_etm_auxtrace *etm) in cs_etm__is_timeless_decoding() argument
2496 struct evlist *evlist = etm->session->evlist; in cs_etm__is_timeless_decoding()
2500 if (etm->synth_opts.timeless_decoding) in cs_etm__is_timeless_decoding()
2733 struct cs_etm_auxtrace *etm = container_of(session->auxtrace, in cs_etm__queue_aux_fragment() local
2791 pr_debug3("CS ETM: Queue buffer size: %#"PRI_lx64" offset: %#"PRI_lx64 in cs_etm__queue_aux_fragment()
2793 err = auxtrace_queues__add_event(&etm->queues, session, &auxtrace_fragment, in cs_etm__queue_aux_fragment()
2800 return cs_etm__setup_queue(etm, &etm->queues.queue_array[idx], in cs_etm__queue_aux_fragment()
2861 pr_err("CS ETM: Couldn't find auxtrace buffer for aux_offset: %#"PRI_lx64 in cs_etm__queue_aux_records_cb()
2878 * queueing them in cs_etm__process_auxtrace_event() if etm->data_queued is still in cs_etm__queue_aux_records()
2890 struct cs_etm_auxtrace *etm = NULL; in cs_etm__process_auxtrace_info() local
2931 /* Extract header information - see cs-etm.h for format */ in cs_etm__process_auxtrace_info()
2985 …ui__error("CS ETM Trace: Unrecognised magic number %#"PRIx64". File could be from a newer version … in cs_etm__process_auxtrace_info()
3029 etm = zalloc(sizeof(*etm)); in cs_etm__process_auxtrace_info()
3031 if (!etm) { in cs_etm__process_auxtrace_info()
3036 err = auxtrace_queues__init(&etm->queues); in cs_etm__process_auxtrace_info()
3041 etm->synth_opts = *session->itrace_synth_opts; in cs_etm__process_auxtrace_info()
3043 itrace_synth_opts__set_default(&etm->synth_opts, in cs_etm__process_auxtrace_info()
3045 etm->synth_opts.callchain = false; in cs_etm__process_auxtrace_info()
3048 etm->session = session; in cs_etm__process_auxtrace_info()
3049 etm->machine = &session->machines.host; in cs_etm__process_auxtrace_info()
3051 etm->num_cpu = num_cpu; in cs_etm__process_auxtrace_info()
3052 etm->pmu_type = pmu_type; in cs_etm__process_auxtrace_info()
3053 etm->snapshot_mode = (hdr[CS_ETM_SNAPSHOT] != 0); in cs_etm__process_auxtrace_info()
3054 etm->metadata = metadata; in cs_etm__process_auxtrace_info()
3055 etm->auxtrace_type = auxtrace_info->type; in cs_etm__process_auxtrace_info()
3056 etm->timeless_decoding = cs_etm__is_timeless_decoding(etm); in cs_etm__process_auxtrace_info()
3058 etm->auxtrace.process_event = cs_etm__process_event; in cs_etm__process_auxtrace_info()
3059 etm->auxtrace.process_auxtrace_event = cs_etm__process_auxtrace_event; in cs_etm__process_auxtrace_info()
3060 etm->auxtrace.flush_events = cs_etm__flush_events; in cs_etm__process_auxtrace_info()
3061 etm->auxtrace.free_events = cs_etm__free_events; in cs_etm__process_auxtrace_info()
3062 etm->auxtrace.free = cs_etm__free; in cs_etm__process_auxtrace_info()
3063 etm->auxtrace.evsel_is_auxtrace = cs_etm__evsel_is_auxtrace; in cs_etm__process_auxtrace_info()
3064 session->auxtrace = &etm->auxtrace; in cs_etm__process_auxtrace_info()
3066 etm->unknown_thread = thread__new(999999999, 999999999); in cs_etm__process_auxtrace_info()
3067 if (!etm->unknown_thread) { in cs_etm__process_auxtrace_info()
3076 INIT_LIST_HEAD(&etm->unknown_thread->node); in cs_etm__process_auxtrace_info()
3078 err = thread__set_comm(etm->unknown_thread, "unknown", 0); in cs_etm__process_auxtrace_info()
3082 if (thread__init_maps(etm->unknown_thread, etm->machine)) { in cs_etm__process_auxtrace_info()
3091 err = cs_etm__synth_events(etm, session); in cs_etm__process_auxtrace_info()
3099 etm->data_queued = etm->queues.populated; in cs_etm__process_auxtrace_info()
3104 if (!etm->data_queued) in cs_etm__process_auxtrace_info()
3105 pr_warning("CS ETM warning: Coresight decode and TRBE support requires random file access.\n" in cs_etm__process_auxtrace_info()
3111 thread__zput(etm->unknown_thread); in cs_etm__process_auxtrace_info()
3113 auxtrace_queues__free(&etm->queues); in cs_etm__process_auxtrace_info()
3116 zfree(&etm); in cs_etm__process_auxtrace_info()