Lines Matching refs:etmq
120 static int cs_etm__get_data_block(struct cs_etm_queue *etmq);
121 static int cs_etm__decode_data_block(struct cs_etm_queue *etmq);
213 enum cs_etm_pid_fmt cs_etm__get_pid_fmt(struct cs_etm_queue *etmq)
215 return etmq->etm->pid_fmt;
390 void cs_etm__etmq_set_traceid_queue_timestamp(struct cs_etm_queue *etmq,
400 etmq->pending_timestamp_chan_id = trace_chan_id;
403 static u64 cs_etm__etmq_get_timestamp(struct cs_etm_queue *etmq,
408 if (!etmq->pending_timestamp_chan_id)
412 *trace_chan_id = etmq->pending_timestamp_chan_id;
414 packet_queue = cs_etm__etmq_get_packet_queue(etmq,
415 etmq->pending_timestamp_chan_id);
420 etmq->pending_timestamp_chan_id = 0;
450 static void cs_etm__clear_all_packet_queues(struct cs_etm_queue *etmq)
455 struct intlist *traceid_queues_list = etmq->traceid_queues_list;
459 tidq = etmq->traceid_queues[idx];
464 static int cs_etm__init_traceid_queue(struct cs_etm_queue *etmq,
470 struct cs_etm_auxtrace *etm = etmq->etm;
474 queue = &etmq->etm->queues.queue_array[etmq->queue_nr];
518 *cs_etm__etmq_get_traceid_queue(struct cs_etm_queue *etmq, u8 trace_chan_id)
524 struct cs_etm_auxtrace *etm = etmq->etm;
529 traceid_queues_list = etmq->traceid_queues_list;
538 return etmq->traceid_queues[idx];
558 if (cs_etm__init_traceid_queue(etmq, tidq, trace_chan_id))
562 traceid_queues = etmq->traceid_queues;
575 etmq->traceid_queues = traceid_queues;
577 return etmq->traceid_queues[idx];
591 *cs_etm__etmq_get_packet_queue(struct cs_etm_queue *etmq, u8 trace_chan_id)
595 tidq = cs_etm__etmq_get_traceid_queue(etmq, trace_chan_id);
714 struct cs_etm_queue *etmq,
725 d_params->data = etmq;
736 static void cs_etm__dump_event(struct cs_etm_queue *etmq,
746 cs_etm_decoder__get_name(etmq->decoder), buffer->size);
752 etmq->decoder, buffer->offset,
761 cs_etm_decoder__reset(etmq->decoder);
787 static void cs_etm__free_traceid_queues(struct cs_etm_queue *etmq)
793 struct intlist *traceid_queues_list = etmq->traceid_queues_list;
800 tidq = etmq->traceid_queues[idx];
819 etmq->traceid_queues_list = NULL;
822 zfree(&etmq->traceid_queues);
827 struct cs_etm_queue *etmq = priv;
829 if (!etmq)
832 cs_etm_decoder__free(etmq->decoder);
833 cs_etm__free_traceid_queues(etmq);
834 free(etmq);
886 static struct machine *cs_etm__get_machine(struct cs_etm_queue *etmq,
889 enum cs_etm_pid_fmt pid_fmt = cs_etm__get_pid_fmt(etmq);
896 return &etmq->etm->session->machines.host;
908 return machines__find_guest(&etmq->etm->session->machines,
915 return &etmq->etm->session->machines.host;
919 static u8 cs_etm__cpu_mode(struct cs_etm_queue *etmq, u64 address,
922 struct machine *machine = cs_etm__get_machine(etmq, el);
943 static u32 cs_etm__mem_access(struct cs_etm_queue *etmq, u8 trace_chan_id,
955 if (!etmq)
959 tidq = cs_etm__etmq_get_traceid_queue(etmq, trace_chan_id);
981 cpumode = cs_etm__cpu_mode(etmq, address, tidq->el);
1023 struct cs_etm_queue *etmq;
1030 etmq = zalloc(sizeof(*etmq));
1031 if (!etmq)
1034 etmq->traceid_queues_list = intlist__new(NULL);
1035 if (!etmq->traceid_queues_list)
1048 if (cs_etm__init_decoder_params(&d_params, etmq,
1054 etmq->decoder = cs_etm_decoder__new(decoders, &d_params,
1057 if (!etmq->decoder)
1064 if (cs_etm_decoder__add_mem_access_cb(etmq->decoder,
1070 return etmq;
1073 cs_etm_decoder__free(etmq->decoder);
1075 intlist__delete(etmq->traceid_queues_list);
1076 free(etmq);
1086 struct cs_etm_queue *etmq = queue->priv;
1088 if (list_empty(&queue->head) || etmq)
1091 etmq = cs_etm__alloc_queue(etm, formatted);
1093 if (!etmq)
1096 queue->priv = etmq;
1097 etmq->etm = etm;
1098 etmq->queue_nr = queue_nr;
1099 etmq->offset = 0;
1105 struct cs_etm_queue *etmq,
1123 * Fetch an aux_buffer from this etmq. Bail if no more
1126 ret = cs_etm__get_data_block(etmq);
1135 ret = cs_etm__decode_data_block(etmq);
1143 cs_timestamp = cs_etm__etmq_get_timestamp(etmq, &trace_chan_id);
1156 cs_etm__clear_all_packet_queues(etmq);
1163 * queues of each etmq, redenring and decoding can start in
1176 void cs_etm__copy_last_branch_rb(struct cs_etm_queue *etmq,
1200 nr = etmq->etm->synth_opts.last_branch_sz - tidq->last_branch_pos;
1212 if (bs_src->nr >= etmq->etm->synth_opts.last_branch_sz) {
1226 static inline int cs_etm__t32_instr_size(struct cs_etm_queue *etmq,
1231 cs_etm__mem_access(etmq, trace_chan_id, addr, ARRAY_SIZE(instrBytes),
1260 static inline u64 cs_etm__instr_addr(struct cs_etm_queue *etmq,
1269 addr += cs_etm__t32_instr_size(etmq,
1280 static void cs_etm__update_last_branch_rb(struct cs_etm_queue *etmq,
1293 tidq->last_branch_pos = etmq->etm->synth_opts.last_branch_sz;
1308 if (bs->nr < etmq->etm->synth_opts.last_branch_sz)
1321 cs_etm__get_trace(struct cs_etm_queue *etmq)
1323 struct auxtrace_buffer *aux_buffer = etmq->buffer;
1327 queue = &etmq->etm->queues.queue_array[etmq->queue_nr];
1335 etmq->buf_len = 0;
1339 etmq->buffer = aux_buffer;
1344 int fd = perf_data__fd(etmq->etm->session->data);
1355 etmq->buf_used = 0;
1356 etmq->buf_len = aux_buffer->size;
1357 etmq->buf = aux_buffer->data;
1359 return etmq->buf_len;
1362 static void cs_etm__set_thread(struct cs_etm_queue *etmq,
1366 struct machine *machine = cs_etm__get_machine(etmq, el);
1380 int cs_etm__etmq_set_tid_el(struct cs_etm_queue *etmq, pid_t tid,
1385 tidq = cs_etm__etmq_get_traceid_queue(etmq, trace_chan_id);
1389 cs_etm__set_thread(etmq, tidq, tid, el);
1393 bool cs_etm__etmq_is_timeless(struct cs_etm_queue *etmq)
1395 return !!etmq->etm->timeless_decoding;
1398 static void cs_etm__copy_insn(struct cs_etm_queue *etmq,
1417 sample->insn_len = cs_etm__t32_instr_size(etmq, trace_chan_id,
1423 cs_etm__mem_access(etmq, trace_chan_id, sample->ip, sample->insn_len,
1427 u64 cs_etm__convert_sample_time(struct cs_etm_queue *etmq, u64 cs_timestamp)
1429 struct cs_etm_auxtrace *etm = etmq->etm;
1437 static inline u64 cs_etm__resolve_sample_time(struct cs_etm_queue *etmq,
1440 struct cs_etm_auxtrace *etm = etmq->etm;
1449 static int cs_etm__synth_instruction_sample(struct cs_etm_queue *etmq,
1454 struct cs_etm_auxtrace *etm = etmq->etm;
1459 event->sample.header.misc = cs_etm__cpu_mode(etmq, addr, tidq->el);
1463 sample.time = cs_etm__resolve_sample_time(etmq, tidq);
1468 sample.id = etmq->etm->instructions_id;
1469 sample.stream_id = etmq->etm->instructions_id;
1475 cs_etm__copy_insn(etmq, tidq->trace_chan_id, tidq->packet, &sample);
1501 static int cs_etm__synth_branch_sample(struct cs_etm_queue *etmq,
1505 struct cs_etm_auxtrace *etm = etmq->etm;
1518 event->sample.header.misc = cs_etm__cpu_mode(etmq, ip,
1523 sample.time = cs_etm__resolve_sample_time(etmq, tidq);
1529 sample.id = etmq->etm->branches_id;
1530 sample.stream_id = etmq->etm->branches_id;
1536 cs_etm__copy_insn(etmq, tidq->trace_chan_id, tidq->prev_packet,
1685 static int cs_etm__sample(struct cs_etm_queue *etmq,
1688 struct cs_etm_auxtrace *etm = etmq->etm;
1705 cs_etm__update_last_branch_rb(etmq, tidq);
1766 cs_etm__copy_last_branch_rb(etmq, tidq);
1776 addr = cs_etm__instr_addr(etmq, trace_chan_id,
1779 etmq, tidq, addr,
1803 ret = cs_etm__synth_branch_sample(etmq, tidq);
1833 static int cs_etm__flush(struct cs_etm_queue *etmq,
1837 struct cs_etm_auxtrace *etm = etmq->etm;
1843 if (etmq->etm->synth_opts.last_branch &&
1844 etmq->etm->synth_opts.instructions &&
1849 cs_etm__copy_last_branch_rb(etmq, tidq);
1861 etmq, tidq, addr,
1872 err = cs_etm__synth_branch_sample(etmq, tidq);
1887 static int cs_etm__end_block(struct cs_etm_queue *etmq,
1893 * It has no new packet coming and 'etmq->packet' contains the stale
1901 if (etmq->etm->synth_opts.last_branch &&
1902 etmq->etm->synth_opts.instructions &&
1907 cs_etm__copy_last_branch_rb(etmq, tidq);
1916 etmq, tidq, addr,
1933 static int cs_etm__get_data_block(struct cs_etm_queue *etmq)
1937 if (!etmq->buf_len) {
1938 ret = cs_etm__get_trace(etmq);
1945 ret = cs_etm_decoder__reset(etmq->decoder);
1950 return etmq->buf_len;
1953 static bool cs_etm__is_svc_instr(struct cs_etm_queue *etmq, u8 trace_chan_id,
1977 cs_etm__mem_access(etmq, trace_chan_id, addr, sizeof(instr16),
1993 cs_etm__mem_access(etmq, trace_chan_id, addr, sizeof(instr32),
2010 cs_etm__mem_access(etmq, trace_chan_id, addr, sizeof(instr32),
2024 static bool cs_etm__is_syscall(struct cs_etm_queue *etmq,
2042 cs_etm__is_svc_instr(etmq, trace_chan_id, prev_packet,
2076 static bool cs_etm__is_sync_exception(struct cs_etm_queue *etmq,
2106 !cs_etm__is_svc_instr(etmq, trace_chan_id, prev_packet,
2125 static int cs_etm__set_sample_flags(struct cs_etm_queue *etmq,
2211 cs_etm__is_svc_instr(etmq, trace_chan_id,
2233 if (cs_etm__is_syscall(etmq, tidq, magic))
2250 else if (cs_etm__is_sync_exception(etmq, tidq, magic))
2304 static int cs_etm__decode_data_block(struct cs_etm_queue *etmq)
2316 ret = cs_etm_decoder__process_data_block(etmq->decoder,
2317 etmq->offset,
2318 &etmq->buf[etmq->buf_used],
2319 etmq->buf_len,
2324 etmq->offset += processed;
2325 etmq->buf_used += processed;
2326 etmq->buf_len -= processed;
2332 static int cs_etm__process_traceid_queue(struct cs_etm_queue *etmq,
2358 ret = cs_etm__set_sample_flags(etmq, tidq);
2369 cs_etm__sample(etmq, tidq);
2385 cs_etm__flush(etmq, tidq);
2402 static void cs_etm__clear_all_traceid_queues(struct cs_etm_queue *etmq)
2407 struct intlist *traceid_queues_list = etmq->traceid_queues_list;
2411 tidq = etmq->traceid_queues[idx];
2414 cs_etm__process_traceid_queue(etmq, tidq);
2420 cs_etm__flush(etmq, tidq);
2424 static int cs_etm__run_per_thread_timeless_decoder(struct cs_etm_queue *etmq)
2429 tidq = cs_etm__etmq_get_traceid_queue(etmq, CS_ETM_PER_THREAD_TRACEID);
2435 err = cs_etm__get_data_block(etmq);
2441 err = cs_etm__decode_data_block(etmq);
2450 err = cs_etm__process_traceid_queue(etmq, tidq);
2452 } while (etmq->buf_len);
2456 err = cs_etm__end_block(etmq, tidq);
2462 static int cs_etm__run_per_cpu_timeless_decoder(struct cs_etm_queue *etmq)
2470 err = cs_etm__get_data_block(etmq);
2476 err = cs_etm__decode_data_block(etmq);
2487 etmq->traceid_queues_list) {
2489 tidq = etmq->traceid_queues[idx];
2490 cs_etm__process_traceid_queue(etmq, tidq);
2492 } while (etmq->buf_len);
2494 intlist__for_each_entry(inode, etmq->traceid_queues_list) {
2496 tidq = etmq->traceid_queues[idx];
2498 err = cs_etm__end_block(etmq, tidq);
2515 struct cs_etm_queue *etmq = queue->priv;
2518 if (!etmq)
2523 etmq, CS_ETM_PER_THREAD_TRACEID);
2529 cs_etm__run_per_thread_timeless_decoder(etmq);
2531 cs_etm__run_per_cpu_timeless_decoder(etmq);
2544 struct cs_etm_queue *etmq;
2552 etmq = etm->queues.queue_array[i].priv;
2553 if (!etmq)
2556 ret = cs_etm__queue_first_cs_timestamp(etm, etmq, i);
2570 etmq = queue->priv;
2578 tidq = cs_etm__etmq_get_traceid_queue(etmq, trace_chan_id);
2591 * the etmq's traceID queue, so process them.
2593 ret = cs_etm__process_traceid_queue(etmq, tidq);
2603 ret = cs_etm__get_data_block(etmq);
2608 * No more auxtrace_buffers to process in this etmq, simply
2614 ret = cs_etm__decode_data_block(etmq);
2618 cs_timestamp = cs_etm__etmq_get_timestamp(etmq, &trace_chan_id);
2630 cs_etm__clear_all_traceid_queues(etmq);
2632 /* Fetch another auxtrace_buffer for this etmq */