Lines Matching refs:etm

84 	struct cs_etm_auxtrace *etm;  member
100 static int cs_etm__process_queues(struct cs_etm_auxtrace *etm);
101 static int cs_etm__process_timeless_queues(struct cs_etm_auxtrace *etm,
279 struct cs_etm_auxtrace *etm = etmq->etm; in cs_etm__init_traceid_queue() local
283 queue = &etmq->etm->queues.queue_array[etmq->queue_nr]; in cs_etm__init_traceid_queue()
296 if (etm->synth_opts.last_branch) { in cs_etm__init_traceid_queue()
299 sz += etm->synth_opts.last_branch_sz * in cs_etm__init_traceid_queue()
331 struct cs_etm_auxtrace *etm = etmq->etm; in cs_etm__etmq_get_traceid_queue() local
333 if (etm->timeless_decoding) in cs_etm__etmq_get_traceid_queue()
409 static void cs_etm__packet_swap(struct cs_etm_auxtrace *etm, in cs_etm__packet_swap() argument
414 if (etm->synth_opts.branches || etm->synth_opts.last_branch || in cs_etm__packet_swap()
415 etm->synth_opts.instructions) { in cs_etm__packet_swap()
440 struct cs_etm_auxtrace *etm, int idx, in cs_etm__set_trace_param_etmv3() argument
443 u64 **metadata = etm->metadata; in cs_etm__set_trace_param_etmv3()
451 struct cs_etm_auxtrace *etm, int idx) in cs_etm__set_trace_param_etmv4() argument
453 u64 **metadata = etm->metadata; in cs_etm__set_trace_param_etmv4()
465 struct cs_etm_auxtrace *etm, int idx) in cs_etm__set_trace_param_ete() argument
467 u64 **metadata = etm->metadata; in cs_etm__set_trace_param_ete()
480 struct cs_etm_auxtrace *etm, in cs_etm__init_trace_params() argument
488 architecture = etm->metadata[i][CS_ETM_MAGIC]; in cs_etm__init_trace_params()
492 etmidr = etm->metadata[i][CS_ETM_ETMIDR]; in cs_etm__init_trace_params()
493 cs_etm__set_trace_param_etmv3(t_params, etm, i, etmidr); in cs_etm__init_trace_params()
496 cs_etm__set_trace_param_etmv4(t_params, etm, i); in cs_etm__init_trace_params()
499 cs_etm__set_trace_param_ete(t_params, etm, i); in cs_etm__init_trace_params()
563 struct cs_etm_auxtrace *etm = container_of(session->auxtrace, in cs_etm__flush_events() local
572 if (etm->timeless_decoding) in cs_etm__flush_events()
573 return cs_etm__process_timeless_queues(etm, -1); in cs_etm__flush_events()
575 return cs_etm__process_queues(etm); in cs_etm__flush_events()
681 machine = etmq->etm->machine; in cs_etm__cpu_mode()
712 machine = etmq->etm->machine; in cs_etm__mem_access()
722 thread = etmq->etm->unknown_thread; in cs_etm__mem_access()
753 static struct cs_etm_queue *cs_etm__alloc_queue(struct cs_etm_auxtrace *etm, in cs_etm__alloc_queue() argument
763 int decoders = formatted ? etm->num_cpu : 1; in cs_etm__alloc_queue()
779 if (cs_etm__init_trace_params(t_params, etm, decoders)) in cs_etm__alloc_queue()
816 static int cs_etm__setup_queue(struct cs_etm_auxtrace *etm, in cs_etm__setup_queue() argument
826 etmq = cs_etm__alloc_queue(etm, formatted); in cs_etm__setup_queue()
832 etmq->etm = etm; in cs_etm__setup_queue()
839 static int cs_etm__queue_first_cs_timestamp(struct cs_etm_auxtrace *etm, in cs_etm__queue_first_cs_timestamp() argument
905 ret = auxtrace_heap__add(&etm->heap, cs_queue_nr, cs_timestamp); in cs_etm__queue_first_cs_timestamp()
935 nr = etmq->etm->synth_opts.last_branch_sz - tidq->last_branch_pos; in cs_etm__copy_last_branch_rb()
947 if (bs_src->nr >= etmq->etm->synth_opts.last_branch_sz) { in cs_etm__copy_last_branch_rb()
1028 tidq->last_branch_pos = etmq->etm->synth_opts.last_branch_sz; in cs_etm__update_last_branch_rb()
1043 if (bs->nr < etmq->etm->synth_opts.last_branch_sz) in cs_etm__update_last_branch_rb()
1062 queue = &etmq->etm->queues.queue_array[etmq->queue_nr]; in cs_etm__get_trace()
1079 int fd = perf_data__fd(etmq->etm->session->data); in cs_etm__get_trace()
1097 static void cs_etm__set_pid_tid_cpu(struct cs_etm_auxtrace *etm, in cs_etm__set_pid_tid_cpu() argument
1101 tidq->thread = machine__find_thread(etm->machine, -1, in cs_etm__set_pid_tid_cpu()
1112 struct cs_etm_auxtrace *etm = etmq->etm; in cs_etm__etmq_set_tid() local
1122 err = machine__set_current_tid(etm->machine, cpu, tid, tid); in cs_etm__etmq_set_tid()
1129 cs_etm__set_pid_tid_cpu(etm, tidq); in cs_etm__etmq_set_tid()
1135 return !!etmq->etm->timeless_decoding; in cs_etm__etmq_is_timeless()
1169 struct cs_etm_auxtrace *etm = etmq->etm; in cs_etm__convert_sample_time() local
1171 if (etm->has_virtual_ts) in cs_etm__convert_sample_time()
1172 return tsc_to_perf_time(cs_timestamp, &etm->tc); in cs_etm__convert_sample_time()
1180 struct cs_etm_auxtrace *etm = etmq->etm; in cs_etm__resolve_sample_time() local
1183 if (etm->timeless_decoding) in cs_etm__resolve_sample_time()
1185 else if (etm->has_virtual_ts) in cs_etm__resolve_sample_time()
1188 return etm->latest_kernel_timestamp; in cs_etm__resolve_sample_time()
1196 struct cs_etm_auxtrace *etm = etmq->etm; in cs_etm__synth_instruction_sample() local
1210 sample.id = etmq->etm->instructions_id; in cs_etm__synth_instruction_sample()
1211 sample.stream_id = etmq->etm->instructions_id; in cs_etm__synth_instruction_sample()
1219 if (etm->synth_opts.last_branch) in cs_etm__synth_instruction_sample()
1222 if (etm->synth_opts.inject) { in cs_etm__synth_instruction_sample()
1224 etm->instructions_sample_type); in cs_etm__synth_instruction_sample()
1229 ret = perf_session__deliver_synth_event(etm->session, event, &sample); in cs_etm__synth_instruction_sample()
1247 struct cs_etm_auxtrace *etm = etmq->etm; in cs_etm__synth_branch_sample() local
1270 sample.id = etmq->etm->branches_id; in cs_etm__synth_branch_sample()
1271 sample.stream_id = etmq->etm->branches_id; in cs_etm__synth_branch_sample()
1283 if (etm->synth_opts.last_branch) { in cs_etm__synth_branch_sample()
1295 if (etm->synth_opts.inject) { in cs_etm__synth_branch_sample()
1297 etm->branches_sample_type); in cs_etm__synth_branch_sample()
1302 ret = perf_session__deliver_synth_event(etm->session, event, &sample); in cs_etm__synth_branch_sample()
1341 static int cs_etm__synth_events(struct cs_etm_auxtrace *etm, in cs_etm__synth_events() argument
1352 if (evsel->core.attr.type == etm->pmu_type) { in cs_etm__synth_events()
1369 if (etm->timeless_decoding) in cs_etm__synth_events()
1388 if (etm->synth_opts.branches) { in cs_etm__synth_events()
1395 etm->branches_sample_type = attr.sample_type; in cs_etm__synth_events()
1396 etm->branches_id = id; in cs_etm__synth_events()
1401 if (etm->synth_opts.last_branch) { in cs_etm__synth_events()
1411 if (etm->synth_opts.instructions) { in cs_etm__synth_events()
1413 attr.sample_period = etm->synth_opts.period; in cs_etm__synth_events()
1414 etm->instructions_sample_period = attr.sample_period; in cs_etm__synth_events()
1418 etm->instructions_sample_type = attr.sample_type; in cs_etm__synth_events()
1419 etm->instructions_id = id; in cs_etm__synth_events()
1429 struct cs_etm_auxtrace *etm = etmq->etm; in cs_etm__sample() local
1443 if (etm->synth_opts.last_branch && in cs_etm__sample()
1448 if (etm->synth_opts.instructions && in cs_etm__sample()
1449 tidq->period_instructions >= etm->instructions_sample_period) { in cs_etm__sample()
1502 u64 offset = etm->instructions_sample_period - instrs_prev; in cs_etm__sample()
1506 if (etm->synth_opts.last_branch) in cs_etm__sample()
1510 etm->instructions_sample_period) { in cs_etm__sample()
1521 etm->instructions_sample_period); in cs_etm__sample()
1525 offset += etm->instructions_sample_period; in cs_etm__sample()
1527 etm->instructions_sample_period; in cs_etm__sample()
1531 if (etm->synth_opts.branches) { in cs_etm__sample()
1550 cs_etm__packet_swap(etm, tidq); in cs_etm__sample()
1578 struct cs_etm_auxtrace *etm = etmq->etm; in cs_etm__flush() local
1584 if (etmq->etm->synth_opts.last_branch && in cs_etm__flush()
1585 etmq->etm->synth_opts.instructions && in cs_etm__flush()
1611 if (etm->synth_opts.branches && in cs_etm__flush()
1619 cs_etm__packet_swap(etm, tidq); in cs_etm__flush()
1622 if (etm->synth_opts.last_branch) in cs_etm__flush()
1642 if (etmq->etm->synth_opts.last_branch && in cs_etm__end_block()
1643 etmq->etm->synth_opts.instructions && in cs_etm__end_block()
2203 static int cs_etm__process_timeless_queues(struct cs_etm_auxtrace *etm, in cs_etm__process_timeless_queues() argument
2207 struct auxtrace_queues *queues = &etm->queues; in cs_etm__process_timeless_queues()
2210 struct auxtrace_queue *queue = &etm->queues.queue_array[i]; in cs_etm__process_timeless_queues()
2224 cs_etm__set_pid_tid_cpu(etm, tidq); in cs_etm__process_timeless_queues()
2232 static int cs_etm__process_queues(struct cs_etm_auxtrace *etm) in cs_etm__process_queues() argument
2246 for (i = 0; i < etm->queues.nr_queues; i++) { in cs_etm__process_queues()
2247 etmq = etm->queues.queue_array[i].priv; in cs_etm__process_queues()
2251 ret = cs_etm__queue_first_cs_timestamp(etm, etmq, i); in cs_etm__process_queues()
2257 if (!etm->heap.heap_cnt) in cs_etm__process_queues()
2261 cs_queue_nr = etm->heap.heap_array[0].queue_nr; in cs_etm__process_queues()
2264 queue = &etm->queues.queue_array[queue_nr]; in cs_etm__process_queues()
2271 auxtrace_heap__pop(&etm->heap); in cs_etm__process_queues()
2338 ret = auxtrace_heap__add(&etm->heap, cs_queue_nr, cs_timestamp); in cs_etm__process_queues()
2345 static int cs_etm__process_itrace_start(struct cs_etm_auxtrace *etm, in cs_etm__process_itrace_start() argument
2350 if (etm->timeless_decoding) in cs_etm__process_itrace_start()
2357 th = machine__findnew_thread(etm->machine, in cs_etm__process_itrace_start()
2368 static int cs_etm__process_switch_cpu_wide(struct cs_etm_auxtrace *etm, in cs_etm__process_switch_cpu_wide() argument
2378 if (etm->timeless_decoding) in cs_etm__process_switch_cpu_wide()
2393 th = machine__findnew_thread(etm->machine, in cs_etm__process_switch_cpu_wide()
2410 struct cs_etm_auxtrace *etm = container_of(session->auxtrace, in cs_etm__process_event() local
2432 if (etm->timeless_decoding && in cs_etm__process_event()
2434 return cs_etm__process_timeless_queues(etm, in cs_etm__process_event()
2438 return cs_etm__process_itrace_start(etm, event); in cs_etm__process_event()
2440 return cs_etm__process_switch_cpu_wide(etm, event); in cs_etm__process_event()
2442 if (!etm->timeless_decoding && event->header.type == PERF_RECORD_AUX) { in cs_etm__process_event()
2448 etm->latest_kernel_timestamp = sample_kernel_timestamp; in cs_etm__process_event()
2454 static void dump_queued_data(struct cs_etm_auxtrace *etm, in dump_queued_data() argument
2464 for (i = 0; i < etm->queues.nr_queues; ++i) in dump_queued_data()
2465 list_for_each_entry(buf, &etm->queues.queue_array[i].head, list) in dump_queued_data()
2467 cs_etm__dump_event(etm->queues.queue_array[i].priv, buf); in dump_queued_data()
2474 struct cs_etm_auxtrace *etm = container_of(session->auxtrace, in cs_etm__process_auxtrace_event() local
2477 if (!etm->data_queued) { in cs_etm__process_auxtrace_event()
2493 err = auxtrace_queues__add_event(&etm->queues, session, in cs_etm__process_auxtrace_event()
2504 err = cs_etm__setup_queue(etm, &etm->queues.queue_array[idx], in cs_etm__process_auxtrace_event()
2511 cs_etm__dump_event(etm->queues.queue_array[idx].priv, buffer); in cs_etm__process_auxtrace_event()
2515 dump_queued_data(etm, &event->auxtrace); in cs_etm__process_auxtrace_event()
2520 static bool cs_etm__is_timeless_decoding(struct cs_etm_auxtrace *etm) in cs_etm__is_timeless_decoding() argument
2523 struct evlist *evlist = etm->session->evlist; in cs_etm__is_timeless_decoding()
2527 if (etm->synth_opts.timeless_decoding) in cs_etm__is_timeless_decoding()
2625 struct cs_etm_auxtrace *etm = container_of(session->auxtrace, in cs_etm__queue_aux_fragment() local
2685 err = auxtrace_queues__add_event(&etm->queues, session, &auxtrace_fragment, in cs_etm__queue_aux_fragment()
2692 return cs_etm__setup_queue(etm, &etm->queues.queue_array[idx], in cs_etm__queue_aux_fragment()
2811 struct cs_etm_auxtrace *etm = NULL; in cs_etm__process_auxtrace_info_full() local
2919 etm = zalloc(sizeof(*etm)); in cs_etm__process_auxtrace_info_full()
2921 if (!etm) { in cs_etm__process_auxtrace_info_full()
2926 err = auxtrace_queues__init(&etm->queues); in cs_etm__process_auxtrace_info_full()
2931 etm->synth_opts = *session->itrace_synth_opts; in cs_etm__process_auxtrace_info_full()
2933 itrace_synth_opts__set_default(&etm->synth_opts, in cs_etm__process_auxtrace_info_full()
2935 etm->synth_opts.callchain = false; in cs_etm__process_auxtrace_info_full()
2938 etm->session = session; in cs_etm__process_auxtrace_info_full()
2939 etm->machine = &session->machines.host; in cs_etm__process_auxtrace_info_full()
2941 etm->num_cpu = num_cpu; in cs_etm__process_auxtrace_info_full()
2942 etm->pmu_type = (unsigned int) ((ptr[CS_PMU_TYPE_CPUS] >> 32) & 0xffffffff); in cs_etm__process_auxtrace_info_full()
2943 etm->snapshot_mode = (ptr[CS_ETM_SNAPSHOT] != 0); in cs_etm__process_auxtrace_info_full()
2944 etm->metadata = metadata; in cs_etm__process_auxtrace_info_full()
2945 etm->auxtrace_type = auxtrace_info->type; in cs_etm__process_auxtrace_info_full()
2946 etm->timeless_decoding = cs_etm__is_timeless_decoding(etm); in cs_etm__process_auxtrace_info_full()
2949 etm->has_virtual_ts = cs_etm__has_virtual_ts(metadata, num_cpu); in cs_etm__process_auxtrace_info_full()
2951 if (!etm->has_virtual_ts) in cs_etm__process_auxtrace_info_full()
2955 etm->auxtrace.process_event = cs_etm__process_event; in cs_etm__process_auxtrace_info_full()
2956 etm->auxtrace.process_auxtrace_event = cs_etm__process_auxtrace_event; in cs_etm__process_auxtrace_info_full()
2957 etm->auxtrace.flush_events = cs_etm__flush_events; in cs_etm__process_auxtrace_info_full()
2958 etm->auxtrace.free_events = cs_etm__free_events; in cs_etm__process_auxtrace_info_full()
2959 etm->auxtrace.free = cs_etm__free; in cs_etm__process_auxtrace_info_full()
2960 etm->auxtrace.evsel_is_auxtrace = cs_etm__evsel_is_auxtrace; in cs_etm__process_auxtrace_info_full()
2961 session->auxtrace = &etm->auxtrace; in cs_etm__process_auxtrace_info_full()
2963 etm->unknown_thread = thread__new(999999999, 999999999); in cs_etm__process_auxtrace_info_full()
2964 if (!etm->unknown_thread) { in cs_etm__process_auxtrace_info_full()
2973 INIT_LIST_HEAD(&etm->unknown_thread->node); in cs_etm__process_auxtrace_info_full()
2975 err = thread__set_comm(etm->unknown_thread, "unknown", 0); in cs_etm__process_auxtrace_info_full()
2979 if (thread__init_maps(etm->unknown_thread, etm->machine)) { in cs_etm__process_auxtrace_info_full()
2984 etm->tc.time_shift = tc->time_shift; in cs_etm__process_auxtrace_info_full()
2985 etm->tc.time_mult = tc->time_mult; in cs_etm__process_auxtrace_info_full()
2986 etm->tc.time_zero = tc->time_zero; in cs_etm__process_auxtrace_info_full()
2988 etm->tc.time_cycles = tc->time_cycles; in cs_etm__process_auxtrace_info_full()
2989 etm->tc.time_mask = tc->time_mask; in cs_etm__process_auxtrace_info_full()
2990 etm->tc.cap_user_time_zero = tc->cap_user_time_zero; in cs_etm__process_auxtrace_info_full()
2991 etm->tc.cap_user_time_short = tc->cap_user_time_short; in cs_etm__process_auxtrace_info_full()
2993 err = cs_etm__synth_events(etm, session); in cs_etm__process_auxtrace_info_full()
3001 etm->data_queued = etm->queues.populated; in cs_etm__process_auxtrace_info_full()
3006 if (!etm->data_queued) in cs_etm__process_auxtrace_info_full()
3013 thread__zput(etm->unknown_thread); in cs_etm__process_auxtrace_info_full()
3015 auxtrace_queues__free(&etm->queues); in cs_etm__process_auxtrace_info_full()
3018 zfree(&etm); in cs_etm__process_auxtrace_info_full()