Lines Matching refs:etmq

104 static int cs_etm__get_data_block(struct cs_etm_queue *etmq);
105 static int cs_etm__decode_data_block(struct cs_etm_queue *etmq);
159 void cs_etm__etmq_set_traceid_queue_timestamp(struct cs_etm_queue *etmq, in cs_etm__etmq_set_traceid_queue_timestamp() argument
169 etmq->pending_timestamp = trace_chan_id; in cs_etm__etmq_set_traceid_queue_timestamp()
172 static u64 cs_etm__etmq_get_timestamp(struct cs_etm_queue *etmq, in cs_etm__etmq_get_timestamp() argument
177 if (!etmq->pending_timestamp) in cs_etm__etmq_get_timestamp()
181 *trace_chan_id = etmq->pending_timestamp; in cs_etm__etmq_get_timestamp()
183 packet_queue = cs_etm__etmq_get_packet_queue(etmq, in cs_etm__etmq_get_timestamp()
184 etmq->pending_timestamp); in cs_etm__etmq_get_timestamp()
189 etmq->pending_timestamp = 0; in cs_etm__etmq_get_timestamp()
219 static void cs_etm__clear_all_packet_queues(struct cs_etm_queue *etmq) in cs_etm__clear_all_packet_queues() argument
224 struct intlist *traceid_queues_list = etmq->traceid_queues_list; in cs_etm__clear_all_packet_queues()
228 tidq = etmq->traceid_queues[idx]; in cs_etm__clear_all_packet_queues()
233 static int cs_etm__init_traceid_queue(struct cs_etm_queue *etmq, in cs_etm__init_traceid_queue() argument
239 struct cs_etm_auxtrace *etm = etmq->etm; in cs_etm__init_traceid_queue()
243 queue = &etmq->etm->queues.queue_array[etmq->queue_nr]; in cs_etm__init_traceid_queue()
285 *cs_etm__etmq_get_traceid_queue(struct cs_etm_queue *etmq, u8 trace_chan_id) in cs_etm__etmq_get_traceid_queue() argument
291 struct cs_etm_auxtrace *etm = etmq->etm; in cs_etm__etmq_get_traceid_queue()
296 traceid_queues_list = etmq->traceid_queues_list; in cs_etm__etmq_get_traceid_queue()
305 return etmq->traceid_queues[idx]; in cs_etm__etmq_get_traceid_queue()
325 if (cs_etm__init_traceid_queue(etmq, tidq, trace_chan_id)) in cs_etm__etmq_get_traceid_queue()
329 traceid_queues = etmq->traceid_queues; in cs_etm__etmq_get_traceid_queue()
342 etmq->traceid_queues = traceid_queues; in cs_etm__etmq_get_traceid_queue()
344 return etmq->traceid_queues[idx]; in cs_etm__etmq_get_traceid_queue()
358 *cs_etm__etmq_get_packet_queue(struct cs_etm_queue *etmq, u8 trace_chan_id) in cs_etm__etmq_get_packet_queue() argument
362 tidq = cs_etm__etmq_get_traceid_queue(etmq, trace_chan_id); in cs_etm__etmq_get_packet_queue()
451 struct cs_etm_queue *etmq, in cs_etm__init_decoder_params() argument
461 d_params->data = etmq; in cs_etm__init_decoder_params()
548 static void cs_etm__free_traceid_queues(struct cs_etm_queue *etmq) in cs_etm__free_traceid_queues() argument
554 struct intlist *traceid_queues_list = etmq->traceid_queues_list; in cs_etm__free_traceid_queues()
561 tidq = etmq->traceid_queues[idx]; in cs_etm__free_traceid_queues()
579 etmq->traceid_queues_list = NULL; in cs_etm__free_traceid_queues()
582 zfree(&etmq->traceid_queues); in cs_etm__free_traceid_queues()
587 struct cs_etm_queue *etmq = priv; in cs_etm__free_queue() local
589 if (!etmq) in cs_etm__free_queue()
592 cs_etm_decoder__free(etmq->decoder); in cs_etm__free_queue()
593 cs_etm__free_traceid_queues(etmq); in cs_etm__free_queue()
594 free(etmq); in cs_etm__free_queue()
647 static u8 cs_etm__cpu_mode(struct cs_etm_queue *etmq, u64 address) in cs_etm__cpu_mode() argument
651 machine = etmq->etm->machine; in cs_etm__cpu_mode()
653 if (address >= etmq->etm->kernel_start) { in cs_etm__cpu_mode()
668 static u32 cs_etm__mem_access(struct cs_etm_queue *etmq, u8 trace_chan_id, in cs_etm__mem_access() argument
679 if (!etmq) in cs_etm__mem_access()
682 machine = etmq->etm->machine; in cs_etm__mem_access()
683 cpumode = cs_etm__cpu_mode(etmq, address); in cs_etm__mem_access()
684 tidq = cs_etm__etmq_get_traceid_queue(etmq, trace_chan_id); in cs_etm__mem_access()
692 thread = etmq->etm->unknown_thread; in cs_etm__mem_access()
718 struct cs_etm_queue *etmq; in cs_etm__alloc_queue() local
720 etmq = zalloc(sizeof(*etmq)); in cs_etm__alloc_queue()
721 if (!etmq) in cs_etm__alloc_queue()
724 etmq->traceid_queues_list = intlist__new(NULL); in cs_etm__alloc_queue()
725 if (!etmq->traceid_queues_list) in cs_etm__alloc_queue()
738 if (cs_etm__init_decoder_params(&d_params, etmq, in cs_etm__alloc_queue()
742 etmq->decoder = cs_etm_decoder__new(etm->num_cpu, &d_params, t_params); in cs_etm__alloc_queue()
744 if (!etmq->decoder) in cs_etm__alloc_queue()
751 if (cs_etm_decoder__add_mem_access_cb(etmq->decoder, in cs_etm__alloc_queue()
757 return etmq; in cs_etm__alloc_queue()
760 cs_etm_decoder__free(etmq->decoder); in cs_etm__alloc_queue()
762 intlist__delete(etmq->traceid_queues_list); in cs_etm__alloc_queue()
763 free(etmq); in cs_etm__alloc_queue()
776 struct cs_etm_queue *etmq = queue->priv; in cs_etm__setup_queue() local
778 if (list_empty(&queue->head) || etmq) in cs_etm__setup_queue()
781 etmq = cs_etm__alloc_queue(etm); in cs_etm__setup_queue()
783 if (!etmq) { in cs_etm__setup_queue()
788 queue->priv = etmq; in cs_etm__setup_queue()
789 etmq->etm = etm; in cs_etm__setup_queue()
790 etmq->queue_nr = queue_nr; in cs_etm__setup_queue()
791 etmq->offset = 0; in cs_etm__setup_queue()
809 ret = cs_etm__get_data_block(etmq); in cs_etm__setup_queue()
818 ret = cs_etm__decode_data_block(etmq); in cs_etm__setup_queue()
826 timestamp = cs_etm__etmq_get_timestamp(etmq, &trace_chan_id); in cs_etm__setup_queue()
839 cs_etm__clear_all_packet_queues(etmq); in cs_etm__setup_queue()
886 void cs_etm__copy_last_branch_rb(struct cs_etm_queue *etmq, in cs_etm__copy_last_branch_rb() argument
910 nr = etmq->etm->synth_opts.last_branch_sz - tidq->last_branch_pos; in cs_etm__copy_last_branch_rb()
922 if (bs_src->nr >= etmq->etm->synth_opts.last_branch_sz) { in cs_etm__copy_last_branch_rb()
936 static inline int cs_etm__t32_instr_size(struct cs_etm_queue *etmq, in cs_etm__t32_instr_size() argument
941 cs_etm__mem_access(etmq, trace_chan_id, addr, in cs_etm__t32_instr_size()
970 static inline u64 cs_etm__instr_addr(struct cs_etm_queue *etmq, in cs_etm__instr_addr() argument
979 addr += cs_etm__t32_instr_size(etmq, in cs_etm__instr_addr()
990 static void cs_etm__update_last_branch_rb(struct cs_etm_queue *etmq, in cs_etm__update_last_branch_rb() argument
1003 tidq->last_branch_pos = etmq->etm->synth_opts.last_branch_sz; in cs_etm__update_last_branch_rb()
1018 if (bs->nr < etmq->etm->synth_opts.last_branch_sz) in cs_etm__update_last_branch_rb()
1031 cs_etm__get_trace(struct cs_etm_queue *etmq) in cs_etm__get_trace() argument
1033 struct auxtrace_buffer *aux_buffer = etmq->buffer; in cs_etm__get_trace()
1037 queue = &etmq->etm->queues.queue_array[etmq->queue_nr]; in cs_etm__get_trace()
1045 etmq->buf_len = 0; in cs_etm__get_trace()
1049 etmq->buffer = aux_buffer; in cs_etm__get_trace()
1054 int fd = perf_data__fd(etmq->etm->session->data); in cs_etm__get_trace()
1065 etmq->buf_used = 0; in cs_etm__get_trace()
1066 etmq->buf_len = aux_buffer->size; in cs_etm__get_trace()
1067 etmq->buf = aux_buffer->data; in cs_etm__get_trace()
1069 return etmq->buf_len; in cs_etm__get_trace()
1083 int cs_etm__etmq_set_tid(struct cs_etm_queue *etmq, in cs_etm__etmq_set_tid() argument
1087 struct cs_etm_auxtrace *etm = etmq->etm; in cs_etm__etmq_set_tid()
1090 tidq = cs_etm__etmq_get_traceid_queue(etmq, trace_chan_id); in cs_etm__etmq_set_tid()
1108 bool cs_etm__etmq_is_timeless(struct cs_etm_queue *etmq) in cs_etm__etmq_is_timeless() argument
1110 return !!etmq->etm->timeless_decoding; in cs_etm__etmq_is_timeless()
1113 static void cs_etm__copy_insn(struct cs_etm_queue *etmq, in cs_etm__copy_insn() argument
1132 sample->insn_len = cs_etm__t32_instr_size(etmq, trace_chan_id, in cs_etm__copy_insn()
1138 cs_etm__mem_access(etmq, trace_chan_id, sample->ip, in cs_etm__copy_insn()
1142 static int cs_etm__synth_instruction_sample(struct cs_etm_queue *etmq, in cs_etm__synth_instruction_sample() argument
1147 struct cs_etm_auxtrace *etm = etmq->etm; in cs_etm__synth_instruction_sample()
1152 event->sample.header.misc = cs_etm__cpu_mode(etmq, addr); in cs_etm__synth_instruction_sample()
1158 sample.id = etmq->etm->instructions_id; in cs_etm__synth_instruction_sample()
1159 sample.stream_id = etmq->etm->instructions_id; in cs_etm__synth_instruction_sample()
1165 cs_etm__copy_insn(etmq, tidq->trace_chan_id, tidq->packet, &sample); in cs_etm__synth_instruction_sample()
1191 static int cs_etm__synth_branch_sample(struct cs_etm_queue *etmq, in cs_etm__synth_branch_sample() argument
1195 struct cs_etm_auxtrace *etm = etmq->etm; in cs_etm__synth_branch_sample()
1208 event->sample.header.misc = cs_etm__cpu_mode(etmq, ip); in cs_etm__synth_branch_sample()
1215 sample.id = etmq->etm->branches_id; in cs_etm__synth_branch_sample()
1216 sample.stream_id = etmq->etm->branches_id; in cs_etm__synth_branch_sample()
1222 cs_etm__copy_insn(etmq, tidq->trace_chan_id, tidq->prev_packet, in cs_etm__synth_branch_sample()
1373 static int cs_etm__sample(struct cs_etm_queue *etmq, in cs_etm__sample() argument
1376 struct cs_etm_auxtrace *etm = etmq->etm; in cs_etm__sample()
1393 cs_etm__update_last_branch_rb(etmq, tidq); in cs_etm__sample()
1454 cs_etm__copy_last_branch_rb(etmq, tidq); in cs_etm__sample()
1464 addr = cs_etm__instr_addr(etmq, trace_chan_id, in cs_etm__sample()
1467 etmq, tidq, addr, in cs_etm__sample()
1491 ret = cs_etm__synth_branch_sample(etmq, tidq); in cs_etm__sample()
1521 static int cs_etm__flush(struct cs_etm_queue *etmq, in cs_etm__flush() argument
1525 struct cs_etm_auxtrace *etm = etmq->etm; in cs_etm__flush()
1531 if (etmq->etm->synth_opts.last_branch && in cs_etm__flush()
1536 cs_etm__copy_last_branch_rb(etmq, tidq); in cs_etm__flush()
1548 etmq, tidq, addr, in cs_etm__flush()
1559 err = cs_etm__synth_branch_sample(etmq, tidq); in cs_etm__flush()
1574 static int cs_etm__end_block(struct cs_etm_queue *etmq, in cs_etm__end_block() argument
1588 if (etmq->etm->synth_opts.last_branch && in cs_etm__end_block()
1593 cs_etm__copy_last_branch_rb(etmq, tidq); in cs_etm__end_block()
1602 etmq, tidq, addr, in cs_etm__end_block()
1619 static int cs_etm__get_data_block(struct cs_etm_queue *etmq) in cs_etm__get_data_block() argument
1623 if (!etmq->buf_len) { in cs_etm__get_data_block()
1624 ret = cs_etm__get_trace(etmq); in cs_etm__get_data_block()
1631 ret = cs_etm_decoder__reset(etmq->decoder); in cs_etm__get_data_block()
1636 return etmq->buf_len; in cs_etm__get_data_block()
1639 static bool cs_etm__is_svc_instr(struct cs_etm_queue *etmq, u8 trace_chan_id, in cs_etm__is_svc_instr() argument
1663 cs_etm__mem_access(etmq, trace_chan_id, addr, in cs_etm__is_svc_instr()
1679 cs_etm__mem_access(etmq, trace_chan_id, addr, in cs_etm__is_svc_instr()
1696 cs_etm__mem_access(etmq, trace_chan_id, addr, in cs_etm__is_svc_instr()
1710 static bool cs_etm__is_syscall(struct cs_etm_queue *etmq, in cs_etm__is_syscall() argument
1728 cs_etm__is_svc_instr(etmq, trace_chan_id, prev_packet, in cs_etm__is_syscall()
1762 static bool cs_etm__is_sync_exception(struct cs_etm_queue *etmq, in cs_etm__is_sync_exception() argument
1792 !cs_etm__is_svc_instr(etmq, trace_chan_id, prev_packet, in cs_etm__is_sync_exception()
1811 static int cs_etm__set_sample_flags(struct cs_etm_queue *etmq, in cs_etm__set_sample_flags() argument
1897 cs_etm__is_svc_instr(etmq, trace_chan_id, in cs_etm__set_sample_flags()
1919 if (cs_etm__is_syscall(etmq, tidq, magic)) in cs_etm__set_sample_flags()
1936 else if (cs_etm__is_sync_exception(etmq, tidq, magic)) in cs_etm__set_sample_flags()
1990 static int cs_etm__decode_data_block(struct cs_etm_queue *etmq) in cs_etm__decode_data_block() argument
2002 ret = cs_etm_decoder__process_data_block(etmq->decoder, in cs_etm__decode_data_block()
2003 etmq->offset, in cs_etm__decode_data_block()
2004 &etmq->buf[etmq->buf_used], in cs_etm__decode_data_block()
2005 etmq->buf_len, in cs_etm__decode_data_block()
2010 etmq->offset += processed; in cs_etm__decode_data_block()
2011 etmq->buf_used += processed; in cs_etm__decode_data_block()
2012 etmq->buf_len -= processed; in cs_etm__decode_data_block()
2018 static int cs_etm__process_traceid_queue(struct cs_etm_queue *etmq, in cs_etm__process_traceid_queue() argument
2044 ret = cs_etm__set_sample_flags(etmq, tidq); in cs_etm__process_traceid_queue()
2055 cs_etm__sample(etmq, tidq); in cs_etm__process_traceid_queue()
2071 cs_etm__flush(etmq, tidq); in cs_etm__process_traceid_queue()
2088 static void cs_etm__clear_all_traceid_queues(struct cs_etm_queue *etmq) in cs_etm__clear_all_traceid_queues() argument
2093 struct intlist *traceid_queues_list = etmq->traceid_queues_list; in cs_etm__clear_all_traceid_queues()
2097 tidq = etmq->traceid_queues[idx]; in cs_etm__clear_all_traceid_queues()
2100 cs_etm__process_traceid_queue(etmq, tidq); in cs_etm__clear_all_traceid_queues()
2106 cs_etm__flush(etmq, tidq); in cs_etm__clear_all_traceid_queues()
2110 static int cs_etm__run_decoder(struct cs_etm_queue *etmq) in cs_etm__run_decoder() argument
2115 tidq = cs_etm__etmq_get_traceid_queue(etmq, CS_ETM_PER_THREAD_TRACEID); in cs_etm__run_decoder()
2121 err = cs_etm__get_data_block(etmq); in cs_etm__run_decoder()
2127 err = cs_etm__decode_data_block(etmq); in cs_etm__run_decoder()
2136 err = cs_etm__process_traceid_queue(etmq, tidq); in cs_etm__run_decoder()
2138 } while (etmq->buf_len); in cs_etm__run_decoder()
2142 err = cs_etm__end_block(etmq, tidq); in cs_etm__run_decoder()
2156 struct cs_etm_queue *etmq = queue->priv; in cs_etm__process_timeless_queues() local
2159 if (!etmq) in cs_etm__process_timeless_queues()
2162 tidq = cs_etm__etmq_get_traceid_queue(etmq, in cs_etm__process_timeless_queues()
2170 cs_etm__run_decoder(etmq); in cs_etm__process_timeless_queues()
2184 struct cs_etm_queue *etmq; in cs_etm__process_queues() local
2196 etmq = queue->priv; in cs_etm__process_queues()
2204 tidq = cs_etm__etmq_get_traceid_queue(etmq, trace_chan_id); in cs_etm__process_queues()
2219 ret = cs_etm__process_traceid_queue(etmq, tidq); in cs_etm__process_queues()
2229 ret = cs_etm__get_data_block(etmq); in cs_etm__process_queues()
2240 ret = cs_etm__decode_data_block(etmq); in cs_etm__process_queues()
2244 timestamp = cs_etm__etmq_get_timestamp(etmq, &trace_chan_id); in cs_etm__process_queues()
2256 cs_etm__clear_all_traceid_queues(etmq); in cs_etm__process_queues()