• Home
  • Raw
  • Download

Lines Matching full:etm

19 #include "cs-etm.h"
20 #include "cs-etm-decoder/cs-etm-decoder.h"
70 struct cs_etm_auxtrace *etm; member
93 static int cs_etm__update_queues(struct cs_etm_auxtrace *etm);
94 static int cs_etm__process_timeless_queues(struct cs_etm_auxtrace *etm,
110 static void cs_etm__dump_event(struct cs_etm_auxtrace *etm, in cs_etm__dump_event() argument
122 ". ... CoreSight ETM Trace data: size %zu bytes\n", in cs_etm__dump_event()
126 t_params = zalloc(sizeof(*t_params) * etm->num_cpu); in cs_etm__dump_event()
127 for (i = 0; i < etm->num_cpu; i++) { in cs_etm__dump_event()
129 t_params[i].etmv4.reg_idr0 = etm->metadata[i][CS_ETMV4_TRCIDR0]; in cs_etm__dump_event()
130 t_params[i].etmv4.reg_idr1 = etm->metadata[i][CS_ETMV4_TRCIDR1]; in cs_etm__dump_event()
131 t_params[i].etmv4.reg_idr2 = etm->metadata[i][CS_ETMV4_TRCIDR2]; in cs_etm__dump_event()
132 t_params[i].etmv4.reg_idr8 = etm->metadata[i][CS_ETMV4_TRCIDR8]; in cs_etm__dump_event()
134 etm->metadata[i][CS_ETMV4_TRCCONFIGR]; in cs_etm__dump_event()
136 etm->metadata[i][CS_ETMV4_TRCTRACEIDR]; in cs_etm__dump_event()
147 decoder = cs_etm_decoder__new(etm->num_cpu, &d_params, t_params); in cs_etm__dump_event()
173 struct cs_etm_auxtrace *etm = container_of(session->auxtrace, in cs_etm__flush_events() local
182 if (!etm->timeless_decoding) in cs_etm__flush_events()
185 ret = cs_etm__update_queues(etm); in cs_etm__flush_events()
190 return cs_etm__process_timeless_queues(etm, -1, MAX_TIMESTAMP - 1); in cs_etm__flush_events()
254 machine = etmq->etm->machine; in cs_etm__cpu_mode()
256 if (address >= etmq->etm->kernel_start) { in cs_etm__cpu_mode()
284 machine = etmq->etm->machine; in cs_etm__mem_access()
291 thread = etmq->etm->unknown_thread; in cs_etm__mem_access()
313 static struct cs_etm_queue *cs_etm__alloc_queue(struct cs_etm_auxtrace *etm, in cs_etm__alloc_queue() argument
330 if (etm->synth_opts.last_branch || etm->sample_branches) { in cs_etm__alloc_queue()
336 if (etm->synth_opts.last_branch) { in cs_etm__alloc_queue()
339 sz += etm->synth_opts.last_branch_sz * in cs_etm__alloc_queue()
353 etmq->etm = etm; in cs_etm__alloc_queue()
360 t_params = zalloc(sizeof(*t_params) * etm->num_cpu); in cs_etm__alloc_queue()
365 for (i = 0; i < etm->num_cpu; i++) { in cs_etm__alloc_queue()
367 t_params[i].etmv4.reg_idr0 = etm->metadata[i][CS_ETMV4_TRCIDR0]; in cs_etm__alloc_queue()
368 t_params[i].etmv4.reg_idr1 = etm->metadata[i][CS_ETMV4_TRCIDR1]; in cs_etm__alloc_queue()
369 t_params[i].etmv4.reg_idr2 = etm->metadata[i][CS_ETMV4_TRCIDR2]; in cs_etm__alloc_queue()
370 t_params[i].etmv4.reg_idr8 = etm->metadata[i][CS_ETMV4_TRCIDR8]; in cs_etm__alloc_queue()
372 etm->metadata[i][CS_ETMV4_TRCCONFIGR]; in cs_etm__alloc_queue()
374 etm->metadata[i][CS_ETMV4_TRCTRACEIDR]; in cs_etm__alloc_queue()
386 etmq->decoder = cs_etm_decoder__new(etm->num_cpu, &d_params, t_params); in cs_etm__alloc_queue()
420 static int cs_etm__setup_queue(struct cs_etm_auxtrace *etm, in cs_etm__setup_queue() argument
429 etmq = cs_etm__alloc_queue(etm, queue_nr); in cs_etm__setup_queue()
444 static int cs_etm__setup_queues(struct cs_etm_auxtrace *etm) in cs_etm__setup_queues() argument
449 for (i = 0; i < etm->queues.nr_queues; i++) { in cs_etm__setup_queues()
450 ret = cs_etm__setup_queue(etm, &etm->queues.queue_array[i], i); in cs_etm__setup_queues()
458 static int cs_etm__update_queues(struct cs_etm_auxtrace *etm) in cs_etm__update_queues() argument
460 if (etm->queues.new_data) { in cs_etm__update_queues()
461 etm->queues.new_data = false; in cs_etm__update_queues()
462 return cs_etm__setup_queues(etm); in cs_etm__update_queues()
491 nr = etmq->etm->synth_opts.last_branch_sz - etmq->last_branch_pos; in cs_etm__copy_last_branch_rb()
503 if (bs_src->nr >= etmq->etm->synth_opts.last_branch_sz) { in cs_etm__copy_last_branch_rb()
577 etmq->last_branch_pos = etmq->etm->synth_opts.last_branch_sz; in cs_etm__update_last_branch_rb()
592 if (bs->nr < etmq->etm->synth_opts.last_branch_sz) in cs_etm__update_last_branch_rb()
611 queue = &etmq->etm->queues.queue_array[etmq->queue_nr]; in cs_etm__get_trace()
628 int fd = perf_data__fd(etmq->etm->session->data); in cs_etm__get_trace()
648 static void cs_etm__set_pid_tid_cpu(struct cs_etm_auxtrace *etm, in cs_etm__set_pid_tid_cpu() argument
658 etmq->thread = machine__find_thread(etm->machine, -1, in cs_etm__set_pid_tid_cpu()
672 struct cs_etm_auxtrace *etm = etmq->etm; in cs_etm__synth_instruction_sample() local
683 sample.id = etmq->etm->instructions_id; in cs_etm__synth_instruction_sample()
684 sample.stream_id = etmq->etm->instructions_id; in cs_etm__synth_instruction_sample()
691 if (etm->synth_opts.last_branch) { in cs_etm__synth_instruction_sample()
696 if (etm->synth_opts.inject) { in cs_etm__synth_instruction_sample()
698 etm->instructions_sample_type); in cs_etm__synth_instruction_sample()
703 ret = perf_session__deliver_synth_event(etm->session, event, &sample); in cs_etm__synth_instruction_sample()
707 "CS ETM Trace: failed to deliver instruction event, error %d\n", in cs_etm__synth_instruction_sample()
710 if (etm->synth_opts.last_branch) in cs_etm__synth_instruction_sample()
717 * The cs etm packet encodes an instruction range between a branch target
723 struct cs_etm_auxtrace *etm = etmq->etm; in cs_etm__synth_branch_sample() local
742 sample.id = etmq->etm->branches_id; in cs_etm__synth_branch_sample()
743 sample.stream_id = etmq->etm->branches_id; in cs_etm__synth_branch_sample()
752 if (etm->synth_opts.last_branch) { in cs_etm__synth_branch_sample()
763 if (etm->synth_opts.inject) { in cs_etm__synth_branch_sample()
765 etm->branches_sample_type); in cs_etm__synth_branch_sample()
770 ret = perf_session__deliver_synth_event(etm->session, event, &sample); in cs_etm__synth_branch_sample()
774 "CS ETM Trace: failed to deliver instruction event, error %d\n", in cs_etm__synth_branch_sample()
809 static int cs_etm__synth_events(struct cs_etm_auxtrace *etm, in cs_etm__synth_events() argument
820 if (evsel->attr.type == etm->pmu_type) { in cs_etm__synth_events()
837 if (etm->timeless_decoding) in cs_etm__synth_events()
856 if (etm->synth_opts.branches) { in cs_etm__synth_events()
863 etm->sample_branches = true; in cs_etm__synth_events()
864 etm->branches_sample_type = attr.sample_type; in cs_etm__synth_events()
865 etm->branches_id = id; in cs_etm__synth_events()
870 if (etm->synth_opts.last_branch) in cs_etm__synth_events()
873 if (etm->synth_opts.instructions) { in cs_etm__synth_events()
875 attr.sample_period = etm->synth_opts.period; in cs_etm__synth_events()
876 etm->instructions_sample_period = attr.sample_period; in cs_etm__synth_events()
880 etm->sample_instructions = true; in cs_etm__synth_events()
881 etm->instructions_sample_type = attr.sample_type; in cs_etm__synth_events()
882 etm->instructions_id = id; in cs_etm__synth_events()
891 struct cs_etm_auxtrace *etm = etmq->etm; in cs_etm__sample() local
903 if (etm->synth_opts.last_branch && in cs_etm__sample()
909 if (etm->sample_instructions && in cs_etm__sample()
910 etmq->period_instructions >= etm->instructions_sample_period) { in cs_etm__sample()
918 etm->instructions_sample_period; in cs_etm__sample()
929 etmq, addr, etm->instructions_sample_period); in cs_etm__sample()
937 if (etm->sample_branches && etmq->prev_packet) { in cs_etm__sample()
956 if (etm->sample_branches || etm->synth_opts.last_branch) { in cs_etm__sample()
972 struct cs_etm_auxtrace *etm = etmq->etm; in cs_etm__flush() local
982 if (etmq->etm->synth_opts.last_branch && in cs_etm__flush()
1003 if (etm->sample_branches && in cs_etm__flush()
1011 if (etm->sample_branches || etm->synth_opts.last_branch) { in cs_etm__flush()
1026 struct cs_etm_auxtrace *etm = etmq->etm; in cs_etm__run_decoder() local
1031 if (!etm->kernel_start) in cs_etm__run_decoder()
1032 etm->kernel_start = machine__kernel_start(etm->machine); in cs_etm__run_decoder()
1096 pr_err("CS ETM Trace: empty packet\n"); in cs_etm__run_decoder()
1112 static int cs_etm__process_timeless_queues(struct cs_etm_auxtrace *etm, in cs_etm__process_timeless_queues() argument
1116 struct auxtrace_queues *queues = &etm->queues; in cs_etm__process_timeless_queues()
1119 struct auxtrace_queue *queue = &etm->queues.queue_array[i]; in cs_etm__process_timeless_queues()
1124 cs_etm__set_pid_tid_cpu(etm, queue); in cs_etm__process_timeless_queues()
1139 struct cs_etm_auxtrace *etm = container_of(session->auxtrace, in cs_etm__process_event() local
1147 pr_err("CoreSight ETM Trace requires ordered events\n"); in cs_etm__process_event()
1151 if (!etm->timeless_decoding) in cs_etm__process_event()
1159 if (timestamp || etm->timeless_decoding) { in cs_etm__process_event()
1160 err = cs_etm__update_queues(etm); in cs_etm__process_event()
1166 return cs_etm__process_timeless_queues(etm, in cs_etm__process_event()
1177 struct cs_etm_auxtrace *etm = container_of(session->auxtrace, in cs_etm__process_auxtrace_event() local
1180 if (!etm->data_queued) { in cs_etm__process_auxtrace_event()
1195 err = auxtrace_queues__add_event(&etm->queues, session, in cs_etm__process_auxtrace_event()
1202 cs_etm__dump_event(etm, buffer); in cs_etm__process_auxtrace_event()
1210 static bool cs_etm__is_timeless_decoding(struct cs_etm_auxtrace *etm) in cs_etm__is_timeless_decoding() argument
1213 struct perf_evlist *evlist = etm->session->evlist; in cs_etm__is_timeless_decoding()
1279 struct cs_etm_auxtrace *etm = NULL; in cs_etm__process_auxtrace_info() local
1314 /* Extract header information - see cs-etm.h for format */ in cs_etm__process_auxtrace_info()
1406 etm = zalloc(sizeof(*etm)); in cs_etm__process_auxtrace_info()
1408 if (!etm) { in cs_etm__process_auxtrace_info()
1413 err = auxtrace_queues__init(&etm->queues); in cs_etm__process_auxtrace_info()
1417 etm->session = session; in cs_etm__process_auxtrace_info()
1418 etm->machine = &session->machines.host; in cs_etm__process_auxtrace_info()
1420 etm->num_cpu = num_cpu; in cs_etm__process_auxtrace_info()
1421 etm->pmu_type = pmu_type; in cs_etm__process_auxtrace_info()
1422 etm->snapshot_mode = (hdr[CS_ETM_SNAPSHOT] != 0); in cs_etm__process_auxtrace_info()
1423 etm->metadata = metadata; in cs_etm__process_auxtrace_info()
1424 etm->auxtrace_type = auxtrace_info->type; in cs_etm__process_auxtrace_info()
1425 etm->timeless_decoding = cs_etm__is_timeless_decoding(etm); in cs_etm__process_auxtrace_info()
1427 etm->auxtrace.process_event = cs_etm__process_event; in cs_etm__process_auxtrace_info()
1428 etm->auxtrace.process_auxtrace_event = cs_etm__process_auxtrace_event; in cs_etm__process_auxtrace_info()
1429 etm->auxtrace.flush_events = cs_etm__flush_events; in cs_etm__process_auxtrace_info()
1430 etm->auxtrace.free_events = cs_etm__free_events; in cs_etm__process_auxtrace_info()
1431 etm->auxtrace.free = cs_etm__free; in cs_etm__process_auxtrace_info()
1432 session->auxtrace = &etm->auxtrace; in cs_etm__process_auxtrace_info()
1434 etm->unknown_thread = thread__new(999999999, 999999999); in cs_etm__process_auxtrace_info()
1435 if (!etm->unknown_thread) in cs_etm__process_auxtrace_info()
1442 INIT_LIST_HEAD(&etm->unknown_thread->node); in cs_etm__process_auxtrace_info()
1444 err = thread__set_comm(etm->unknown_thread, "unknown", 0); in cs_etm__process_auxtrace_info()
1448 if (thread__init_map_groups(etm->unknown_thread, etm->machine)) in cs_etm__process_auxtrace_info()
1457 etm->synth_opts = *session->itrace_synth_opts; in cs_etm__process_auxtrace_info()
1459 itrace_synth_opts__set_default(&etm->synth_opts); in cs_etm__process_auxtrace_info()
1460 etm->synth_opts.callchain = false; in cs_etm__process_auxtrace_info()
1463 err = cs_etm__synth_events(etm, session); in cs_etm__process_auxtrace_info()
1467 err = auxtrace_queues__process_index(&etm->queues, session); in cs_etm__process_auxtrace_info()
1471 etm->data_queued = etm->queues.populated; in cs_etm__process_auxtrace_info()
1476 thread__zput(etm->unknown_thread); in cs_etm__process_auxtrace_info()
1478 auxtrace_queues__free(&etm->queues); in cs_etm__process_auxtrace_info()
1481 zfree(&etm); in cs_etm__process_auxtrace_info()