Lines Matching refs:etm
21 #include "cs-etm.h"
22 #include "cs-etm-decoder/cs-etm-decoder.h"
84 struct cs_etm_auxtrace *etm;
100 static int cs_etm__update_queues(struct cs_etm_auxtrace *etm);
101 static int cs_etm__process_queues(struct cs_etm_auxtrace *etm);
102 static int cs_etm__process_timeless_queues(struct cs_etm_auxtrace *etm,
113 * encode the etm queue number as the upper 16 bit and the channel as
239 struct cs_etm_auxtrace *etm = etmq->etm;
243 queue = &etmq->etm->queues.queue_array[etmq->queue_nr];
256 if (etm->synth_opts.last_branch) {
259 sz += etm->synth_opts.last_branch_sz *
291 struct cs_etm_auxtrace *etm = etmq->etm;
293 if (etm->timeless_decoding)
369 static void cs_etm__packet_swap(struct cs_etm_auxtrace *etm,
374 if (etm->sample_branches || etm->synth_opts.last_branch ||
375 etm->sample_instructions) {
400 struct cs_etm_auxtrace *etm, int idx,
403 u64 **metadata = etm->metadata;
411 struct cs_etm_auxtrace *etm, int idx)
413 u64 **metadata = etm->metadata;
425 struct cs_etm_auxtrace *etm)
431 for (i = 0; i < etm->num_cpu; i++) {
432 architecture = etm->metadata[i][CS_ETM_MAGIC];
436 etmidr = etm->metadata[i][CS_ETM_ETMIDR];
437 cs_etm__set_trace_param_etmv3(t_params, etm, i, etmidr);
440 cs_etm__set_trace_param_etmv4(t_params, etm, i);
472 static void cs_etm__dump_event(struct cs_etm_auxtrace *etm,
488 t_params = zalloc(sizeof(*t_params) * etm->num_cpu);
493 if (cs_etm__init_trace_params(t_params, etm))
501 decoder = cs_etm_decoder__new(etm->num_cpu, &d_params, t_params);
528 struct cs_etm_auxtrace *etm = container_of(session->auxtrace,
537 ret = cs_etm__update_queues(etm);
542 if (etm->timeless_decoding)
543 return cs_etm__process_timeless_queues(etm, -1);
545 return cs_etm__process_queues(etm);
651 machine = etmq->etm->machine;
653 if (address >= etmq->etm->kernel_start) {
682 machine = etmq->etm->machine;
692 thread = etmq->etm->unknown_thread;
714 static struct cs_etm_queue *cs_etm__alloc_queue(struct cs_etm_auxtrace *etm)
729 t_params = zalloc(sizeof(*t_params) * etm->num_cpu);
734 if (cs_etm__init_trace_params(t_params, etm))
742 etmq->decoder = cs_etm_decoder__new(etm->num_cpu, &d_params, t_params);
768 static int cs_etm__setup_queue(struct cs_etm_auxtrace *etm,
781 etmq = cs_etm__alloc_queue(etm);
789 etmq->etm = etm;
793 if (etm->timeless_decoding)
853 ret = auxtrace_heap__add(&etm->heap, cs_queue_nr, timestamp);
858 static int cs_etm__setup_queues(struct cs_etm_auxtrace *etm)
863 if (!etm->kernel_start)
864 etm->kernel_start = machine__kernel_start(etm->machine);
866 for (i = 0; i < etm->queues.nr_queues; i++) {
867 ret = cs_etm__setup_queue(etm, &etm->queues.queue_array[i], i);
875 static int cs_etm__update_queues(struct cs_etm_auxtrace *etm)
877 if (etm->queues.new_data) {
878 etm->queues.new_data = false;
879 return cs_etm__setup_queues(etm);
910 nr = etmq->etm->synth_opts.last_branch_sz - tidq->last_branch_pos;
922 if (bs_src->nr >= etmq->etm->synth_opts.last_branch_sz) {
1003 tidq->last_branch_pos = etmq->etm->synth_opts.last_branch_sz;
1018 if (bs->nr < etmq->etm->synth_opts.last_branch_sz)
1037 queue = &etmq->etm->queues.queue_array[etmq->queue_nr];
1054 int fd = perf_data__fd(etmq->etm->session->data);
1072 static void cs_etm__set_pid_tid_cpu(struct cs_etm_auxtrace *etm,
1076 tidq->thread = machine__find_thread(etm->machine, -1,
1087 struct cs_etm_auxtrace *etm = etmq->etm;
1097 err = machine__set_current_tid(etm->machine, cpu, tid, tid);
1104 cs_etm__set_pid_tid_cpu(etm, tidq);
1110 return !!etmq->etm->timeless_decoding;
1147 struct cs_etm_auxtrace *etm = etmq->etm;
1158 sample.id = etmq->etm->instructions_id;
1159 sample.stream_id = etmq->etm->instructions_id;
1167 if (etm->synth_opts.last_branch)
1170 if (etm->synth_opts.inject) {
1172 etm->instructions_sample_type);
1177 ret = perf_session__deliver_synth_event(etm->session, event, &sample);
1188 * The cs etm packet encodes an instruction range between a branch target
1195 struct cs_etm_auxtrace *etm = etmq->etm;
1215 sample.id = etmq->etm->branches_id;
1216 sample.stream_id = etmq->etm->branches_id;
1228 if (etm->synth_opts.last_branch) {
1240 if (etm->synth_opts.inject) {
1242 etm->branches_sample_type);
1247 ret = perf_session__deliver_synth_event(etm->session, event, &sample);
1286 static int cs_etm__synth_events(struct cs_etm_auxtrace *etm,
1297 if (evsel->core.attr.type == etm->pmu_type) {
1314 if (etm->timeless_decoding)
1333 if (etm->synth_opts.branches) {
1340 etm->sample_branches = true;
1341 etm->branches_sample_type = attr.sample_type;
1342 etm->branches_id = id;
1347 if (etm->synth_opts.last_branch) {
1357 if (etm->synth_opts.instructions) {
1359 attr.sample_period = etm->synth_opts.period;
1360 etm->instructions_sample_period = attr.sample_period;
1364 etm->sample_instructions = true;
1365 etm->instructions_sample_type = attr.sample_type;
1366 etm->instructions_id = id;
1376 struct cs_etm_auxtrace *etm = etmq->etm;
1390 if (etm->synth_opts.last_branch &&
1395 if (etm->sample_instructions &&
1396 tidq->period_instructions >= etm->instructions_sample_period) {
1422 * every etm->instructions_sample_period instructions - as
1424 * last sample before the current etm packet, n+1 to n+3
1425 * samples are generated from the current etm packet.
1428 * instructions in the current etm packet.
1432 * previous etm packet. This will always be less than
1433 * etm->instructions_sample_period.
1447 * etm->instructions_sample_period.
1449 u64 offset = etm->instructions_sample_period - instrs_prev;
1453 if (etm->synth_opts.last_branch)
1457 etm->instructions_sample_period) {
1468 etm->instructions_sample_period);
1472 offset += etm->instructions_sample_period;
1474 etm->instructions_sample_period;
1478 if (etm->sample_branches) {
1497 cs_etm__packet_swap(etm, tidq);
1525 struct cs_etm_auxtrace *etm = etmq->etm;
1531 if (etmq->etm->synth_opts.last_branch &&
1557 if (etm->sample_branches &&
1565 cs_etm__packet_swap(etm, tidq);
1568 if (etm->synth_opts.last_branch)
1588 if (etmq->etm->synth_opts.last_branch &&
2148 static int cs_etm__process_timeless_queues(struct cs_etm_auxtrace *etm,
2152 struct auxtrace_queues *queues = &etm->queues;
2155 struct auxtrace_queue *queue = &etm->queues.queue_array[i];
2169 cs_etm__set_pid_tid_cpu(etm, tidq);
2177 static int cs_etm__process_queues(struct cs_etm_auxtrace *etm)
2188 if (!etm->heap.heap_cnt)
2192 cs_queue_nr = etm->heap.heap_array[0].queue_nr;
2195 queue = &etm->queues.queue_array[queue_nr];
2202 auxtrace_heap__pop(&etm->heap);
2269 ret = auxtrace_heap__add(&etm->heap, cs_queue_nr, timestamp);
2276 static int cs_etm__process_itrace_start(struct cs_etm_auxtrace *etm,
2281 if (etm->timeless_decoding)
2288 th = machine__findnew_thread(etm->machine,
2299 static int cs_etm__process_switch_cpu_wide(struct cs_etm_auxtrace *etm,
2309 if (etm->timeless_decoding)
2324 th = machine__findnew_thread(etm->machine,
2342 struct cs_etm_auxtrace *etm = container_of(session->auxtrace,
2359 if (timestamp || etm->timeless_decoding) {
2360 err = cs_etm__update_queues(etm);
2365 if (etm->timeless_decoding &&
2367 return cs_etm__process_timeless_queues(etm,
2371 return cs_etm__process_itrace_start(etm, event);
2373 return cs_etm__process_switch_cpu_wide(etm, event);
2375 if (!etm->timeless_decoding &&
2377 return cs_etm__process_queues(etm);
2386 struct cs_etm_auxtrace *etm = container_of(session->auxtrace,
2389 if (!etm->data_queued) {
2404 err = auxtrace_queues__add_event(&etm->queues, session,
2411 cs_etm__dump_event(etm, buffer);
2419 static bool cs_etm__is_timeless_decoding(struct cs_etm_auxtrace *etm)
2422 struct evlist *evlist = etm->session->evlist;
2488 struct cs_etm_auxtrace *etm = NULL;
2523 /* Extract header information - see cs-etm.h for format */
2615 etm = zalloc(sizeof(*etm));
2617 if (!etm) {
2622 err = auxtrace_queues__init(&etm->queues);
2626 etm->session = session;
2627 etm->machine = &session->machines.host;
2629 etm->num_cpu = num_cpu;
2630 etm->pmu_type = pmu_type;
2631 etm->snapshot_mode = (hdr[CS_ETM_SNAPSHOT] != 0);
2632 etm->metadata = metadata;
2633 etm->auxtrace_type = auxtrace_info->type;
2634 etm->timeless_decoding = cs_etm__is_timeless_decoding(etm);
2636 etm->auxtrace.process_event = cs_etm__process_event;
2637 etm->auxtrace.process_auxtrace_event = cs_etm__process_auxtrace_event;
2638 etm->auxtrace.flush_events = cs_etm__flush_events;
2639 etm->auxtrace.free_events = cs_etm__free_events;
2640 etm->auxtrace.free = cs_etm__free;
2641 etm->auxtrace.evsel_is_auxtrace = cs_etm__evsel_is_auxtrace;
2642 session->auxtrace = &etm->auxtrace;
2644 etm->unknown_thread = thread__new(999999999, 999999999);
2645 if (!etm->unknown_thread) {
2654 INIT_LIST_HEAD(&etm->unknown_thread->node);
2656 err = thread__set_comm(etm->unknown_thread, "unknown", 0);
2660 if (thread__init_maps(etm->unknown_thread, etm->machine)) {
2671 etm->synth_opts = *session->itrace_synth_opts;
2673 itrace_synth_opts__set_default(&etm->synth_opts,
2675 etm->synth_opts.callchain = false;
2678 err = cs_etm__synth_events(etm, session);
2682 err = auxtrace_queues__process_index(&etm->queues, session);
2686 etm->data_queued = etm->queues.populated;
2691 thread__zput(etm->unknown_thread);
2693 auxtrace_queues__free(&etm->queues);
2696 zfree(&etm);