Lines Matching defs: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;
399 void cs_etm__etmq_set_traceid_queue_timestamp(struct cs_etm_queue *etmq,
409 etmq->pending_timestamp_chan_id = trace_chan_id;
412 static u64 cs_etm__etmq_get_timestamp(struct cs_etm_queue *etmq,
417 if (!etmq->pending_timestamp_chan_id)
421 *trace_chan_id = etmq->pending_timestamp_chan_id;
423 packet_queue = cs_etm__etmq_get_packet_queue(etmq,
424 etmq->pending_timestamp_chan_id);
429 etmq->pending_timestamp_chan_id = 0;
459 static void cs_etm__clear_all_packet_queues(struct cs_etm_queue *etmq)
464 struct intlist *traceid_queues_list = etmq->traceid_queues_list;
468 tidq = etmq->traceid_queues[idx];
473 static int cs_etm__init_traceid_queue(struct cs_etm_queue *etmq,
479 struct cs_etm_auxtrace *etm = etmq->etm;
483 queue = &etmq->etm->queues.queue_array[etmq->queue_nr];
527 *cs_etm__etmq_get_traceid_queue(struct cs_etm_queue *etmq, u8 trace_chan_id)
533 struct cs_etm_auxtrace *etm = etmq->etm;
538 traceid_queues_list = etmq->traceid_queues_list;
547 return etmq->traceid_queues[idx];
567 if (cs_etm__init_traceid_queue(etmq, tidq, trace_chan_id))
571 traceid_queues = etmq->traceid_queues;
584 etmq->traceid_queues = traceid_queues;
586 return etmq->traceid_queues[idx];
600 *cs_etm__etmq_get_packet_queue(struct cs_etm_queue *etmq, u8 trace_chan_id)
604 tidq = cs_etm__etmq_get_traceid_queue(etmq, trace_chan_id);
737 struct cs_etm_queue *etmq,
748 d_params->data = etmq;
759 static void cs_etm__dump_event(struct cs_etm_queue *etmq,
769 cs_etm_decoder__get_name(etmq->decoder), buffer->size);
775 etmq->decoder, buffer->offset,
784 cs_etm_decoder__reset(etmq->decoder);
810 static void cs_etm__free_traceid_queues(struct cs_etm_queue *etmq)
816 struct intlist *traceid_queues_list = etmq->traceid_queues_list;
823 tidq = etmq->traceid_queues[idx];
842 etmq->traceid_queues_list = NULL;
845 zfree(&etmq->traceid_queues);
850 struct cs_etm_queue *etmq = priv;
852 if (!etmq)
855 cs_etm_decoder__free(etmq->decoder);
856 cs_etm__free_traceid_queues(etmq);
857 free(etmq);
909 static struct machine *cs_etm__get_machine(struct cs_etm_queue *etmq,
912 enum cs_etm_pid_fmt pid_fmt = cs_etm__get_pid_fmt(etmq);
919 return &etmq->etm->session->machines.host;
931 return machines__find_guest(&etmq->etm->session->machines,
938 return &etmq->etm->session->machines.host;
942 static u8 cs_etm__cpu_mode(struct cs_etm_queue *etmq, u64 address,
945 struct machine *machine = cs_etm__get_machine(etmq, el);
966 static u32 cs_etm__mem_access(struct cs_etm_queue *etmq, u8 trace_chan_id,
978 if (!etmq)
982 tidq = cs_etm__etmq_get_traceid_queue(etmq, trace_chan_id);
1004 cpumode = cs_etm__cpu_mode(etmq, address, tidq->el);
1046 struct cs_etm_queue *etmq;
1053 etmq = zalloc(sizeof(*etmq));
1054 if (!etmq)
1057 etmq->traceid_queues_list = intlist__new(NULL);
1058 if (!etmq->traceid_queues_list)
1071 if (cs_etm__init_decoder_params(&d_params, etmq,
1077 etmq->decoder = cs_etm_decoder__new(decoders, &d_params,
1080 if (!etmq->decoder)
1087 if (cs_etm_decoder__add_mem_access_cb(etmq->decoder,
1093 return etmq;
1096 cs_etm_decoder__free(etmq->decoder);
1098 intlist__delete(etmq->traceid_queues_list);
1099 free(etmq);
1110 struct cs_etm_queue *etmq = queue->priv;
1112 if (list_empty(&queue->head) || etmq)
1115 etmq = cs_etm__alloc_queue(etm, formatted, sample_cpu);
1117 if (!etmq)
1120 queue->priv = etmq;
1121 etmq->etm = etm;
1122 etmq->queue_nr = queue_nr;
1123 etmq->offset = 0;
1129 struct cs_etm_queue *etmq,
1147 * Fetch an aux_buffer from this etmq. Bail if no more
1150 ret = cs_etm__get_data_block(etmq);
1159 ret = cs_etm__decode_data_block(etmq);
1167 cs_timestamp = cs_etm__etmq_get_timestamp(etmq, &trace_chan_id);
1180 cs_etm__clear_all_packet_queues(etmq);
1187 * queues of each etmq, redenring and decoding can start in
1200 void cs_etm__copy_last_branch_rb(struct cs_etm_queue *etmq,
1224 nr = etmq->etm->synth_opts.last_branch_sz - tidq->last_branch_pos;
1236 if (bs_src->nr >= etmq->etm->synth_opts.last_branch_sz) {
1250 static inline int cs_etm__t32_instr_size(struct cs_etm_queue *etmq,
1255 cs_etm__mem_access(etmq, trace_chan_id, addr, ARRAY_SIZE(instrBytes),
1284 static inline u64 cs_etm__instr_addr(struct cs_etm_queue *etmq,
1293 addr += cs_etm__t32_instr_size(etmq,
1304 static void cs_etm__update_last_branch_rb(struct cs_etm_queue *etmq,
1317 tidq->last_branch_pos = etmq->etm->synth_opts.last_branch_sz;
1332 if (bs->nr < etmq->etm->synth_opts.last_branch_sz)
1345 cs_etm__get_trace(struct cs_etm_queue *etmq)
1347 struct auxtrace_buffer *aux_buffer = etmq->buffer;
1351 queue = &etmq->etm->queues.queue_array[etmq->queue_nr];
1359 etmq->buf_len = 0;
1363 etmq->buffer = aux_buffer;
1368 int fd = perf_data__fd(etmq->etm->session->data);
1379 etmq->buf_used = 0;
1380 etmq->buf_len = aux_buffer->size;
1381 etmq->buf = aux_buffer->data;
1383 return etmq->buf_len;
1386 static void cs_etm__set_thread(struct cs_etm_queue *etmq,
1390 struct machine *machine = cs_etm__get_machine(etmq, el);
1404 int cs_etm__etmq_set_tid_el(struct cs_etm_queue *etmq, pid_t tid,
1409 tidq = cs_etm__etmq_get_traceid_queue(etmq, trace_chan_id);
1413 cs_etm__set_thread(etmq, tidq, tid, el);
1417 bool cs_etm__etmq_is_timeless(struct cs_etm_queue *etmq)
1419 return !!etmq->etm->timeless_decoding;
1422 static void cs_etm__copy_insn(struct cs_etm_queue *etmq,
1441 sample->insn_len = cs_etm__t32_instr_size(etmq, trace_chan_id,
1447 cs_etm__mem_access(etmq, trace_chan_id, sample->ip, sample->insn_len,
1451 u64 cs_etm__convert_sample_time(struct cs_etm_queue *etmq, u64 cs_timestamp)
1453 struct cs_etm_auxtrace *etm = etmq->etm;
1461 static inline u64 cs_etm__resolve_sample_time(struct cs_etm_queue *etmq,
1464 struct cs_etm_auxtrace *etm = etmq->etm;
1473 static int cs_etm__synth_instruction_sample(struct cs_etm_queue *etmq,
1478 struct cs_etm_auxtrace *etm = etmq->etm;
1483 event->sample.header.misc = cs_etm__cpu_mode(etmq, addr, tidq->el);
1487 sample.time = cs_etm__resolve_sample_time(etmq, tidq);
1492 sample.id = etmq->etm->instructions_id;
1493 sample.stream_id = etmq->etm->instructions_id;
1499 cs_etm__copy_insn(etmq, tidq->trace_chan_id, tidq->packet, &sample);
1525 static int cs_etm__synth_branch_sample(struct cs_etm_queue *etmq,
1529 struct cs_etm_auxtrace *etm = etmq->etm;
1542 event->sample.header.misc = cs_etm__cpu_mode(etmq, ip,
1547 sample.time = cs_etm__resolve_sample_time(etmq, tidq);
1553 sample.id = etmq->etm->branches_id;
1554 sample.stream_id = etmq->etm->branches_id;
1560 cs_etm__copy_insn(etmq, tidq->trace_chan_id, tidq->prev_packet,
1709 static int cs_etm__sample(struct cs_etm_queue *etmq,
1712 struct cs_etm_auxtrace *etm = etmq->etm;
1729 cs_etm__update_last_branch_rb(etmq, tidq);
1790 cs_etm__copy_last_branch_rb(etmq, tidq);
1800 addr = cs_etm__instr_addr(etmq, trace_chan_id,
1803 etmq, tidq, addr,
1827 ret = cs_etm__synth_branch_sample(etmq, tidq);
1857 static int cs_etm__flush(struct cs_etm_queue *etmq,
1861 struct cs_etm_auxtrace *etm = etmq->etm;
1867 if (etmq->etm->synth_opts.last_branch &&
1868 etmq->etm->synth_opts.instructions &&
1873 cs_etm__copy_last_branch_rb(etmq, tidq);
1885 etmq, tidq, addr,
1896 err = cs_etm__synth_branch_sample(etmq, tidq);
1911 static int cs_etm__end_block(struct cs_etm_queue *etmq,
1917 * It has no new packet coming and 'etmq->packet' contains the stale
1925 if (etmq->etm->synth_opts.last_branch &&
1926 etmq->etm->synth_opts.instructions &&
1931 cs_etm__copy_last_branch_rb(etmq, tidq);
1940 etmq, tidq, addr,
1957 static int cs_etm__get_data_block(struct cs_etm_queue *etmq)
1961 if (!etmq->buf_len) {
1962 ret = cs_etm__get_trace(etmq);
1969 ret = cs_etm_decoder__reset(etmq->decoder);
1974 return etmq->buf_len;
1977 static bool cs_etm__is_svc_instr(struct cs_etm_queue *etmq, u8 trace_chan_id,
2001 cs_etm__mem_access(etmq, trace_chan_id, addr, sizeof(instr16),
2017 cs_etm__mem_access(etmq, trace_chan_id, addr, sizeof(instr32),
2034 cs_etm__mem_access(etmq, trace_chan_id, addr, sizeof(instr32),
2048 static bool cs_etm__is_syscall(struct cs_etm_queue *etmq,
2066 cs_etm__is_svc_instr(etmq, trace_chan_id, prev_packet,
2100 static bool cs_etm__is_sync_exception(struct cs_etm_queue *etmq,
2130 !cs_etm__is_svc_instr(etmq, trace_chan_id, prev_packet,
2149 static int cs_etm__set_sample_flags(struct cs_etm_queue *etmq,
2235 cs_etm__is_svc_instr(etmq, trace_chan_id,
2257 if (cs_etm__is_syscall(etmq, tidq, magic))
2274 else if (cs_etm__is_sync_exception(etmq, tidq, magic))
2328 static int cs_etm__decode_data_block(struct cs_etm_queue *etmq)
2340 ret = cs_etm_decoder__process_data_block(etmq->decoder,
2341 etmq->offset,
2342 &etmq->buf[etmq->buf_used],
2343 etmq->buf_len,
2348 etmq->offset += processed;
2349 etmq->buf_used += processed;
2350 etmq->buf_len -= processed;
2356 static int cs_etm__process_traceid_queue(struct cs_etm_queue *etmq,
2382 ret = cs_etm__set_sample_flags(etmq, tidq);
2393 cs_etm__sample(etmq, tidq);
2409 cs_etm__flush(etmq, tidq);
2426 static void cs_etm__clear_all_traceid_queues(struct cs_etm_queue *etmq)
2431 struct intlist *traceid_queues_list = etmq->traceid_queues_list;
2435 tidq = etmq->traceid_queues[idx];
2438 cs_etm__process_traceid_queue(etmq, tidq);
2444 cs_etm__flush(etmq, tidq);
2448 static int cs_etm__run_per_thread_timeless_decoder(struct cs_etm_queue *etmq)
2453 tidq = cs_etm__etmq_get_traceid_queue(etmq, CS_ETM_PER_THREAD_TRACEID);
2459 err = cs_etm__get_data_block(etmq);
2465 err = cs_etm__decode_data_block(etmq);
2474 err = cs_etm__process_traceid_queue(etmq, tidq);
2476 } while (etmq->buf_len);
2480 err = cs_etm__end_block(etmq, tidq);
2486 static int cs_etm__run_per_cpu_timeless_decoder(struct cs_etm_queue *etmq)
2494 err = cs_etm__get_data_block(etmq);
2500 err = cs_etm__decode_data_block(etmq);
2511 etmq->traceid_queues_list) {
2513 tidq = etmq->traceid_queues[idx];
2514 cs_etm__process_traceid_queue(etmq, tidq);
2516 } while (etmq->buf_len);
2518 intlist__for_each_entry(inode, etmq->traceid_queues_list) {
2520 tidq = etmq->traceid_queues[idx];
2522 err = cs_etm__end_block(etmq, tidq);
2539 struct cs_etm_queue *etmq = queue->priv;
2542 if (!etmq)
2547 etmq, CS_ETM_PER_THREAD_TRACEID);
2553 cs_etm__run_per_thread_timeless_decoder(etmq);
2555 cs_etm__run_per_cpu_timeless_decoder(etmq);
2568 struct cs_etm_queue *etmq;
2576 etmq = etm->queues.queue_array[i].priv;
2577 if (!etmq)
2580 ret = cs_etm__queue_first_cs_timestamp(etm, etmq, i);
2594 etmq = queue->priv;
2602 tidq = cs_etm__etmq_get_traceid_queue(etmq, trace_chan_id);
2615 * the etmq's traceID queue, so process them.
2617 ret = cs_etm__process_traceid_queue(etmq, tidq);
2627 ret = cs_etm__get_data_block(etmq);
2632 * No more auxtrace_buffers to process in this etmq, simply
2638 ret = cs_etm__decode_data_block(etmq);
2642 cs_timestamp = cs_etm__etmq_get_timestamp(etmq, &trace_chan_id);
2654 cs_etm__clear_all_traceid_queues(etmq);
2656 /* Fetch another auxtrace_buffer for this etmq */