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