Lines Matching refs:etm

84 	struct cs_etm_auxtrace *etm;  member
97 static int cs_etm__update_queues(struct cs_etm_auxtrace *etm);
98 static int cs_etm__process_queues(struct cs_etm_auxtrace *etm);
99 static int cs_etm__process_timeless_queues(struct cs_etm_auxtrace *etm,
236 struct cs_etm_auxtrace *etm = etmq->etm; in cs_etm__init_traceid_queue() local
240 queue = &etmq->etm->queues.queue_array[etmq->queue_nr]; in cs_etm__init_traceid_queue()
253 if (etm->synth_opts.last_branch) { in cs_etm__init_traceid_queue()
256 sz += etm->synth_opts.last_branch_sz * in cs_etm__init_traceid_queue()
288 struct cs_etm_auxtrace *etm = etmq->etm; in cs_etm__etmq_get_traceid_queue() local
290 if (etm->timeless_decoding) in cs_etm__etmq_get_traceid_queue()
380 struct cs_etm_auxtrace *etm, int idx, in cs_etm__set_trace_param_etmv3() argument
383 u64 **metadata = etm->metadata; in cs_etm__set_trace_param_etmv3()
391 struct cs_etm_auxtrace *etm, int idx) in cs_etm__set_trace_param_etmv4() argument
393 u64 **metadata = etm->metadata; in cs_etm__set_trace_param_etmv4()
405 struct cs_etm_auxtrace *etm) in cs_etm__init_trace_params() argument
411 for (i = 0; i < etm->num_cpu; i++) { in cs_etm__init_trace_params()
412 architecture = etm->metadata[i][CS_ETM_MAGIC]; in cs_etm__init_trace_params()
416 etmidr = etm->metadata[i][CS_ETM_ETMIDR]; in cs_etm__init_trace_params()
417 cs_etm__set_trace_param_etmv3(t_params, etm, i, etmidr); in cs_etm__init_trace_params()
420 cs_etm__set_trace_param_etmv4(t_params, etm, i); in cs_etm__init_trace_params()
452 static void cs_etm__dump_event(struct cs_etm_auxtrace *etm, in cs_etm__dump_event() argument
468 t_params = zalloc(sizeof(*t_params) * etm->num_cpu); in cs_etm__dump_event()
473 if (cs_etm__init_trace_params(t_params, etm)) in cs_etm__dump_event()
481 decoder = cs_etm_decoder__new(etm->num_cpu, &d_params, t_params); in cs_etm__dump_event()
508 struct cs_etm_auxtrace *etm = container_of(session->auxtrace, in cs_etm__flush_events() local
517 ret = cs_etm__update_queues(etm); in cs_etm__flush_events()
522 if (etm->timeless_decoding) in cs_etm__flush_events()
523 return cs_etm__process_timeless_queues(etm, -1); in cs_etm__flush_events()
525 return cs_etm__process_queues(etm); in cs_etm__flush_events()
621 machine = etmq->etm->machine; in cs_etm__cpu_mode()
623 if (address >= etmq->etm->kernel_start) { in cs_etm__cpu_mode()
652 machine = etmq->etm->machine; in cs_etm__mem_access()
662 thread = etmq->etm->unknown_thread; in cs_etm__mem_access()
684 static struct cs_etm_queue *cs_etm__alloc_queue(struct cs_etm_auxtrace *etm) in cs_etm__alloc_queue() argument
699 t_params = zalloc(sizeof(*t_params) * etm->num_cpu); in cs_etm__alloc_queue()
704 if (cs_etm__init_trace_params(t_params, etm)) in cs_etm__alloc_queue()
712 etmq->decoder = cs_etm_decoder__new(etm->num_cpu, &d_params, t_params); in cs_etm__alloc_queue()
738 static int cs_etm__setup_queue(struct cs_etm_auxtrace *etm, in cs_etm__setup_queue() argument
751 etmq = cs_etm__alloc_queue(etm); in cs_etm__setup_queue()
759 etmq->etm = etm; in cs_etm__setup_queue()
763 if (etm->timeless_decoding) in cs_etm__setup_queue()
823 ret = auxtrace_heap__add(&etm->heap, cs_queue_nr, timestamp); in cs_etm__setup_queue()
828 static int cs_etm__setup_queues(struct cs_etm_auxtrace *etm) in cs_etm__setup_queues() argument
833 if (!etm->kernel_start) in cs_etm__setup_queues()
834 etm->kernel_start = machine__kernel_start(etm->machine); in cs_etm__setup_queues()
836 for (i = 0; i < etm->queues.nr_queues; i++) { in cs_etm__setup_queues()
837 ret = cs_etm__setup_queue(etm, &etm->queues.queue_array[i], i); in cs_etm__setup_queues()
845 static int cs_etm__update_queues(struct cs_etm_auxtrace *etm) in cs_etm__update_queues() argument
847 if (etm->queues.new_data) { in cs_etm__update_queues()
848 etm->queues.new_data = false; in cs_etm__update_queues()
849 return cs_etm__setup_queues(etm); in cs_etm__update_queues()
880 nr = etmq->etm->synth_opts.last_branch_sz - tidq->last_branch_pos; in cs_etm__copy_last_branch_rb()
892 if (bs_src->nr >= etmq->etm->synth_opts.last_branch_sz) { in cs_etm__copy_last_branch_rb()
973 tidq->last_branch_pos = etmq->etm->synth_opts.last_branch_sz; in cs_etm__update_last_branch_rb()
988 if (bs->nr < etmq->etm->synth_opts.last_branch_sz) in cs_etm__update_last_branch_rb()
1007 queue = &etmq->etm->queues.queue_array[etmq->queue_nr]; in cs_etm__get_trace()
1024 int fd = perf_data__fd(etmq->etm->session->data); in cs_etm__get_trace()
1042 static void cs_etm__set_pid_tid_cpu(struct cs_etm_auxtrace *etm, in cs_etm__set_pid_tid_cpu() argument
1046 tidq->thread = machine__find_thread(etm->machine, -1, in cs_etm__set_pid_tid_cpu()
1057 struct cs_etm_auxtrace *etm = etmq->etm; in cs_etm__etmq_set_tid() local
1067 err = machine__set_current_tid(etm->machine, cpu, tid, tid); in cs_etm__etmq_set_tid()
1074 cs_etm__set_pid_tid_cpu(etm, tidq); in cs_etm__etmq_set_tid()
1080 return !!etmq->etm->timeless_decoding; in cs_etm__etmq_is_timeless()
1117 struct cs_etm_auxtrace *etm = etmq->etm; in cs_etm__synth_instruction_sample() local
1128 sample.id = etmq->etm->instructions_id; in cs_etm__synth_instruction_sample()
1129 sample.stream_id = etmq->etm->instructions_id; in cs_etm__synth_instruction_sample()
1137 if (etm->synth_opts.last_branch) { in cs_etm__synth_instruction_sample()
1142 if (etm->synth_opts.inject) { in cs_etm__synth_instruction_sample()
1144 etm->instructions_sample_type); in cs_etm__synth_instruction_sample()
1149 ret = perf_session__deliver_synth_event(etm->session, event, &sample); in cs_etm__synth_instruction_sample()
1156 if (etm->synth_opts.last_branch) in cs_etm__synth_instruction_sample()
1170 struct cs_etm_auxtrace *etm = etmq->etm; in cs_etm__synth_branch_sample() local
1189 sample.id = etmq->etm->branches_id; in cs_etm__synth_branch_sample()
1190 sample.stream_id = etmq->etm->branches_id; in cs_etm__synth_branch_sample()
1202 if (etm->synth_opts.last_branch) { in cs_etm__synth_branch_sample()
1213 if (etm->synth_opts.inject) { in cs_etm__synth_branch_sample()
1215 etm->branches_sample_type); in cs_etm__synth_branch_sample()
1220 ret = perf_session__deliver_synth_event(etm->session, event, &sample); in cs_etm__synth_branch_sample()
1259 static int cs_etm__synth_events(struct cs_etm_auxtrace *etm, in cs_etm__synth_events() argument
1270 if (evsel->core.attr.type == etm->pmu_type) { in cs_etm__synth_events()
1287 if (etm->timeless_decoding) in cs_etm__synth_events()
1306 if (etm->synth_opts.branches) { in cs_etm__synth_events()
1313 etm->sample_branches = true; in cs_etm__synth_events()
1314 etm->branches_sample_type = attr.sample_type; in cs_etm__synth_events()
1315 etm->branches_id = id; in cs_etm__synth_events()
1320 if (etm->synth_opts.last_branch) in cs_etm__synth_events()
1323 if (etm->synth_opts.instructions) { in cs_etm__synth_events()
1325 attr.sample_period = etm->synth_opts.period; in cs_etm__synth_events()
1326 etm->instructions_sample_period = attr.sample_period; in cs_etm__synth_events()
1330 etm->sample_instructions = true; in cs_etm__synth_events()
1331 etm->instructions_sample_type = attr.sample_type; in cs_etm__synth_events()
1332 etm->instructions_id = id; in cs_etm__synth_events()
1342 struct cs_etm_auxtrace *etm = etmq->etm; in cs_etm__sample() local
1354 if (etm->synth_opts.last_branch && in cs_etm__sample()
1359 if (etm->sample_instructions && in cs_etm__sample()
1360 tidq->period_instructions >= etm->instructions_sample_period) { in cs_etm__sample()
1368 etm->instructions_sample_period; in cs_etm__sample()
1380 etmq, tidq, addr, etm->instructions_sample_period); in cs_etm__sample()
1388 if (etm->sample_branches) { in cs_etm__sample()
1407 if (etm->sample_branches || etm->synth_opts.last_branch) { in cs_etm__sample()
1443 struct cs_etm_auxtrace *etm = etmq->etm; in cs_etm__flush() local
1450 if (etmq->etm->synth_opts.last_branch && in cs_etm__flush()
1471 if (etm->sample_branches && in cs_etm__flush()
1479 if (etm->sample_branches || etm->synth_opts.last_branch) { in cs_etm__flush()
1506 if (etmq->etm->synth_opts.last_branch && in cs_etm__end_block()
2061 static int cs_etm__process_timeless_queues(struct cs_etm_auxtrace *etm, in cs_etm__process_timeless_queues() argument
2065 struct auxtrace_queues *queues = &etm->queues; in cs_etm__process_timeless_queues()
2068 struct auxtrace_queue *queue = &etm->queues.queue_array[i]; in cs_etm__process_timeless_queues()
2082 cs_etm__set_pid_tid_cpu(etm, tidq); in cs_etm__process_timeless_queues()
2090 static int cs_etm__process_queues(struct cs_etm_auxtrace *etm) in cs_etm__process_queues() argument
2101 if (!etm->heap.heap_cnt) in cs_etm__process_queues()
2105 cs_queue_nr = etm->heap.heap_array[0].queue_nr; in cs_etm__process_queues()
2108 queue = &etm->queues.queue_array[queue_nr]; in cs_etm__process_queues()
2115 auxtrace_heap__pop(&etm->heap); in cs_etm__process_queues()
2182 ret = auxtrace_heap__add(&etm->heap, cs_queue_nr, timestamp); in cs_etm__process_queues()
2189 static int cs_etm__process_itrace_start(struct cs_etm_auxtrace *etm, in cs_etm__process_itrace_start() argument
2194 if (etm->timeless_decoding) in cs_etm__process_itrace_start()
2201 th = machine__findnew_thread(etm->machine, in cs_etm__process_itrace_start()
2212 static int cs_etm__process_switch_cpu_wide(struct cs_etm_auxtrace *etm, in cs_etm__process_switch_cpu_wide() argument
2222 if (etm->timeless_decoding) in cs_etm__process_switch_cpu_wide()
2237 th = machine__findnew_thread(etm->machine, in cs_etm__process_switch_cpu_wide()
2255 struct cs_etm_auxtrace *etm = container_of(session->auxtrace, in cs_etm__process_event() local
2272 if (timestamp || etm->timeless_decoding) { in cs_etm__process_event()
2273 err = cs_etm__update_queues(etm); in cs_etm__process_event()
2278 if (etm->timeless_decoding && in cs_etm__process_event()
2280 return cs_etm__process_timeless_queues(etm, in cs_etm__process_event()
2284 return cs_etm__process_itrace_start(etm, event); in cs_etm__process_event()
2286 return cs_etm__process_switch_cpu_wide(etm, event); in cs_etm__process_event()
2288 if (!etm->timeless_decoding && in cs_etm__process_event()
2290 return cs_etm__process_queues(etm); in cs_etm__process_event()
2299 struct cs_etm_auxtrace *etm = container_of(session->auxtrace, in cs_etm__process_auxtrace_event() local
2302 if (!etm->data_queued) { in cs_etm__process_auxtrace_event()
2317 err = auxtrace_queues__add_event(&etm->queues, session, in cs_etm__process_auxtrace_event()
2324 cs_etm__dump_event(etm, buffer); in cs_etm__process_auxtrace_event()
2332 static bool cs_etm__is_timeless_decoding(struct cs_etm_auxtrace *etm) in cs_etm__is_timeless_decoding() argument
2335 struct evlist *evlist = etm->session->evlist; in cs_etm__is_timeless_decoding()
2401 struct cs_etm_auxtrace *etm = NULL; in cs_etm__process_auxtrace_info() local
2528 etm = zalloc(sizeof(*etm)); in cs_etm__process_auxtrace_info()
2530 if (!etm) { in cs_etm__process_auxtrace_info()
2535 err = auxtrace_queues__init(&etm->queues); in cs_etm__process_auxtrace_info()
2539 etm->session = session; in cs_etm__process_auxtrace_info()
2540 etm->machine = &session->machines.host; in cs_etm__process_auxtrace_info()
2542 etm->num_cpu = num_cpu; in cs_etm__process_auxtrace_info()
2543 etm->pmu_type = pmu_type; in cs_etm__process_auxtrace_info()
2544 etm->snapshot_mode = (hdr[CS_ETM_SNAPSHOT] != 0); in cs_etm__process_auxtrace_info()
2545 etm->metadata = metadata; in cs_etm__process_auxtrace_info()
2546 etm->auxtrace_type = auxtrace_info->type; in cs_etm__process_auxtrace_info()
2547 etm->timeless_decoding = cs_etm__is_timeless_decoding(etm); in cs_etm__process_auxtrace_info()
2549 etm->auxtrace.process_event = cs_etm__process_event; in cs_etm__process_auxtrace_info()
2550 etm->auxtrace.process_auxtrace_event = cs_etm__process_auxtrace_event; in cs_etm__process_auxtrace_info()
2551 etm->auxtrace.flush_events = cs_etm__flush_events; in cs_etm__process_auxtrace_info()
2552 etm->auxtrace.free_events = cs_etm__free_events; in cs_etm__process_auxtrace_info()
2553 etm->auxtrace.free = cs_etm__free; in cs_etm__process_auxtrace_info()
2554 session->auxtrace = &etm->auxtrace; in cs_etm__process_auxtrace_info()
2556 etm->unknown_thread = thread__new(999999999, 999999999); in cs_etm__process_auxtrace_info()
2557 if (!etm->unknown_thread) { in cs_etm__process_auxtrace_info()
2566 INIT_LIST_HEAD(&etm->unknown_thread->node); in cs_etm__process_auxtrace_info()
2568 err = thread__set_comm(etm->unknown_thread, "unknown", 0); in cs_etm__process_auxtrace_info()
2572 if (thread__init_map_groups(etm->unknown_thread, etm->machine)) { in cs_etm__process_auxtrace_info()
2583 etm->synth_opts = *session->itrace_synth_opts; in cs_etm__process_auxtrace_info()
2585 itrace_synth_opts__set_default(&etm->synth_opts, in cs_etm__process_auxtrace_info()
2587 etm->synth_opts.callchain = false; in cs_etm__process_auxtrace_info()
2590 err = cs_etm__synth_events(etm, session); in cs_etm__process_auxtrace_info()
2594 err = auxtrace_queues__process_index(&etm->queues, session); in cs_etm__process_auxtrace_info()
2598 etm->data_queued = etm->queues.populated; in cs_etm__process_auxtrace_info()
2603 thread__zput(etm->unknown_thread); in cs_etm__process_auxtrace_info()
2605 auxtrace_queues__free(&etm->queues); in cs_etm__process_auxtrace_info()
2608 zfree(&etm); in cs_etm__process_auxtrace_info()