Lines Matching +full:ete +full:- +full:1
1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright(C) 2015-2018 Linaro Limited.
10 #include <linux/coresight-pmu.h>
17 #include "cs-etm.h"
18 #include "cs-etm-decoder.h"
35 * case with a theoretical 10GHz core executing 1 instruction per cycle.
62 return decoder->mem_access(decoder->data, trace_chan_id, address, in cs_etm_decoder__mem_access()
70 decoder->mem_access = cb_func; in cs_etm_decoder__add_mem_access_cb()
72 if (ocsd_dt_add_callback_trcid_mem_acc(decoder->dcd_tree, start, end, in cs_etm_decoder__add_mem_access_cb()
76 return -1; in cs_etm_decoder__add_mem_access_cb()
85 decoder->prev_return = OCSD_RESP_CONT; in cs_etm_decoder__reset()
86 decoder->suppress_printing = true; in cs_etm_decoder__reset()
87 dp_ret = ocsd_dt_process_data(decoder->dcd_tree, OCSD_OP_RESET, in cs_etm_decoder__reset()
89 decoder->suppress_printing = false; in cs_etm_decoder__reset()
91 return -1; in cs_etm_decoder__reset()
100 return -EINVAL; in cs_etm_decoder__get_packet()
103 if (packet_queue->packet_count == 0) in cs_etm_decoder__get_packet()
114 packet_queue->head = (packet_queue->head + 1) & in cs_etm_decoder__get_packet()
115 (CS_ETM_PACKET_MAX_BUFFER - 1); in cs_etm_decoder__get_packet()
117 *packet = packet_queue->packet_buffer[packet_queue->head]; in cs_etm_decoder__get_packet()
119 packet_queue->packet_count--; in cs_etm_decoder__get_packet()
121 return 1; in cs_etm_decoder__get_packet()
141 config->reg_idr = params->etmv3.reg_idr; in cs_etm_decoder__gen_etmv3_config()
142 config->reg_ctrl = params->etmv3.reg_ctrl; in cs_etm_decoder__gen_etmv3_config()
143 config->reg_ccer = params->etmv3.reg_ccer; in cs_etm_decoder__gen_etmv3_config()
144 config->reg_trc_id = params->etmv3.reg_trc_id; in cs_etm_decoder__gen_etmv3_config()
145 config->arch_ver = ARCH_V7; in cs_etm_decoder__gen_etmv3_config()
146 config->core_prof = profile_CortexA; in cs_etm_decoder__gen_etmv3_config()
169 config->reg_configr = params->etmv4.reg_configr; in cs_etm_decoder__gen_etmv4_config()
170 config->reg_traceidr = params->etmv4.reg_traceidr; in cs_etm_decoder__gen_etmv4_config()
171 config->reg_idr0 = params->etmv4.reg_idr0; in cs_etm_decoder__gen_etmv4_config()
172 config->reg_idr1 = params->etmv4.reg_idr1; in cs_etm_decoder__gen_etmv4_config()
173 config->reg_idr2 = params->etmv4.reg_idr2; in cs_etm_decoder__gen_etmv4_config()
174 config->reg_idr8 = params->etmv4.reg_idr8; in cs_etm_decoder__gen_etmv4_config()
175 config->reg_idr9 = 0; in cs_etm_decoder__gen_etmv4_config()
176 config->reg_idr10 = 0; in cs_etm_decoder__gen_etmv4_config()
177 config->reg_idr11 = 0; in cs_etm_decoder__gen_etmv4_config()
178 config->reg_idr12 = 0; in cs_etm_decoder__gen_etmv4_config()
179 config->reg_idr13 = 0; in cs_etm_decoder__gen_etmv4_config()
180 config->arch_ver = cs_etm_decoder__get_etmv4_arch_ver(params->etmv4.reg_idr1); in cs_etm_decoder__gen_etmv4_config()
181 config->core_prof = profile_CortexA; in cs_etm_decoder__gen_etmv4_config()
187 config->reg_configr = params->ete.reg_configr; in cs_etm_decoder__gen_ete_config()
188 config->reg_traceidr = params->ete.reg_traceidr; in cs_etm_decoder__gen_ete_config()
189 config->reg_idr0 = params->ete.reg_idr0; in cs_etm_decoder__gen_ete_config()
190 config->reg_idr1 = params->ete.reg_idr1; in cs_etm_decoder__gen_ete_config()
191 config->reg_idr2 = params->ete.reg_idr2; in cs_etm_decoder__gen_ete_config()
192 config->reg_idr8 = params->ete.reg_idr8; in cs_etm_decoder__gen_ete_config()
193 config->reg_devarch = params->ete.reg_devarch; in cs_etm_decoder__gen_ete_config()
194 config->arch_ver = ARCH_AA64; in cs_etm_decoder__gen_ete_config()
195 config->core_prof = profile_CortexA; in cs_etm_decoder__gen_ete_config()
204 if (p_context && str_len && !decoder->suppress_printing) in cs_etm_decoder__print_str_cb()
205 decoder->packet_printer(msg, decoder->data); in cs_etm_decoder__print_str_cb()
214 if (d_params->packet_printer == NULL) in cs_etm_decoder__init_def_logger_printing()
215 return -1; in cs_etm_decoder__init_def_logger_printing()
217 decoder->packet_printer = d_params->packet_printer; in cs_etm_decoder__init_def_logger_printing()
223 ret = ocsd_def_errlog_init(OCSD_ERR_SEV_ERROR, 1); in cs_etm_decoder__init_def_logger_printing()
225 return -1; in cs_etm_decoder__init_def_logger_printing()
230 return -1; in cs_etm_decoder__init_def_logger_printing()
236 ret = ocsd_def_errlog_set_strprint_cb(decoder->dcd_tree, in cs_etm_decoder__init_def_logger_printing()
240 ret = -1; in cs_etm_decoder__init_def_logger_printing()
250 /* Only log these during a --dump operation */ in cs_etm_decoder__init_raw_frame_logging()
251 if (d_params->operation == CS_ETM_OPERATION_PRINT) { in cs_etm_decoder__init_raw_frame_logging()
255 ocsd_def_errlog_init(OCSD_ERR_SEV_ERROR, 1); in cs_etm_decoder__init_raw_frame_logging()
263 ocsd_def_errlog_set_strprint_cb(decoder->dcd_tree, in cs_etm_decoder__init_raw_frame_logging()
268 ocsd_dt_set_raw_frame_printer(decoder->dcd_tree, in cs_etm_decoder__init_raw_frame_logging()
289 if (!packet_queue->next_cs_timestamp) in cs_etm_decoder__do_soft_timestamp()
292 estimated_ts = packet_queue->cs_timestamp + in cs_etm_decoder__do_soft_timestamp()
293 cs_etm_decoder__dec_instr_count_to_ns(&packet_queue->instr_count); in cs_etm_decoder__do_soft_timestamp()
296 packet_queue->cs_timestamp = min(packet_queue->next_cs_timestamp, estimated_ts); in cs_etm_decoder__do_soft_timestamp()
323 converted_timestamp = elem->timestamp ? in cs_etm_decoder__do_hard_timestamp()
324 cs_etm__convert_sample_time(etmq, elem->timestamp) : 0; in cs_etm_decoder__do_hard_timestamp()
327 * We've seen a timestamp packet before - simply record the new value. in cs_etm_decoder__do_hard_timestamp()
331 if (packet_queue->next_cs_timestamp) { in cs_etm_decoder__do_hard_timestamp()
336 packet_queue->cs_timestamp = packet_queue->next_cs_timestamp; in cs_etm_decoder__do_hard_timestamp()
337 packet_queue->next_cs_timestamp = converted_timestamp; in cs_etm_decoder__do_hard_timestamp()
347 packet_queue->cs_timestamp = 0; in cs_etm_decoder__do_hard_timestamp()
350 ". Decoding may be improved by prepending 'Z' to your current --itrace arguments.\n", in cs_etm_decoder__do_hard_timestamp()
353 } else if (packet_queue->instr_count / INSTR_PER_NS > converted_timestamp) { in cs_etm_decoder__do_hard_timestamp()
355 * Sanity check that the elem->timestamp - packet_queue->instr_count would not in cs_etm_decoder__do_hard_timestamp()
358 packet_queue->cs_timestamp = 0; in cs_etm_decoder__do_hard_timestamp()
369 estimated_first_ts = converted_timestamp - in cs_etm_decoder__do_hard_timestamp()
370 (packet_queue->instr_count / INSTR_PER_NS); in cs_etm_decoder__do_hard_timestamp()
371 packet_queue->cs_timestamp = max(packet_queue->cs_timestamp, estimated_first_ts); in cs_etm_decoder__do_hard_timestamp()
373 packet_queue->next_cs_timestamp = converted_timestamp; in cs_etm_decoder__do_hard_timestamp()
374 packet_queue->instr_count = 0; in cs_etm_decoder__do_hard_timestamp()
386 packet_queue->next_cs_timestamp = 0; in cs_etm_decoder__reset_timestamp()
387 packet_queue->instr_count = 0; in cs_etm_decoder__reset_timestamp()
399 if (packet_queue->packet_count >= CS_ETM_PACKET_MAX_BUFFER - 1) in cs_etm_decoder__buffer_packet()
405 et = packet_queue->tail; in cs_etm_decoder__buffer_packet()
406 et = (et + 1) & (CS_ETM_PACKET_MAX_BUFFER - 1); in cs_etm_decoder__buffer_packet()
407 packet_queue->tail = et; in cs_etm_decoder__buffer_packet()
408 packet_queue->packet_count++; in cs_etm_decoder__buffer_packet()
410 packet_queue->packet_buffer[et].sample_type = sample_type; in cs_etm_decoder__buffer_packet()
411 packet_queue->packet_buffer[et].isa = CS_ETM_ISA_UNKNOWN; in cs_etm_decoder__buffer_packet()
412 packet_queue->packet_buffer[et].cpu = cpu; in cs_etm_decoder__buffer_packet()
413 packet_queue->packet_buffer[et].start_addr = CS_ETM_INVAL_ADDR; in cs_etm_decoder__buffer_packet()
414 packet_queue->packet_buffer[et].end_addr = CS_ETM_INVAL_ADDR; in cs_etm_decoder__buffer_packet()
415 packet_queue->packet_buffer[et].instr_count = 0; in cs_etm_decoder__buffer_packet()
416 packet_queue->packet_buffer[et].last_instr_taken_branch = false; in cs_etm_decoder__buffer_packet()
417 packet_queue->packet_buffer[et].last_instr_size = 0; in cs_etm_decoder__buffer_packet()
418 packet_queue->packet_buffer[et].last_instr_type = 0; in cs_etm_decoder__buffer_packet()
419 packet_queue->packet_buffer[et].last_instr_subtype = 0; in cs_etm_decoder__buffer_packet()
420 packet_queue->packet_buffer[et].last_instr_cond = 0; in cs_etm_decoder__buffer_packet()
421 packet_queue->packet_buffer[et].flags = 0; in cs_etm_decoder__buffer_packet()
422 packet_queue->packet_buffer[et].exception_number = UINT32_MAX; in cs_etm_decoder__buffer_packet()
423 packet_queue->packet_buffer[et].trace_chan_id = trace_chan_id; in cs_etm_decoder__buffer_packet()
425 if (packet_queue->packet_count == CS_ETM_PACKET_MAX_BUFFER - 1) in cs_etm_decoder__buffer_packet()
445 packet = &packet_queue->packet_buffer[packet_queue->tail]; in cs_etm_decoder__buffer_range()
447 switch (elem->isa) { in cs_etm_decoder__buffer_range()
449 packet->isa = CS_ETM_ISA_A64; in cs_etm_decoder__buffer_range()
452 packet->isa = CS_ETM_ISA_A32; in cs_etm_decoder__buffer_range()
455 packet->isa = CS_ETM_ISA_T32; in cs_etm_decoder__buffer_range()
462 packet->isa = CS_ETM_ISA_UNKNOWN; in cs_etm_decoder__buffer_range()
465 packet->start_addr = elem->st_addr; in cs_etm_decoder__buffer_range()
466 packet->end_addr = elem->en_addr; in cs_etm_decoder__buffer_range()
467 packet->instr_count = elem->num_instr_range; in cs_etm_decoder__buffer_range()
468 packet->last_instr_type = elem->last_i_type; in cs_etm_decoder__buffer_range()
469 packet->last_instr_subtype = elem->last_i_subtype; in cs_etm_decoder__buffer_range()
470 packet->last_instr_cond = elem->last_instr_cond; in cs_etm_decoder__buffer_range()
472 if (elem->last_i_type == OCSD_INSTR_BR || elem->last_i_type == OCSD_INSTR_BR_INDIRECT) in cs_etm_decoder__buffer_range()
473 packet->last_instr_taken_branch = elem->last_instr_exec; in cs_etm_decoder__buffer_range()
475 packet->last_instr_taken_branch = false; in cs_etm_decoder__buffer_range()
477 packet->last_instr_size = elem->last_instr_sz; in cs_etm_decoder__buffer_range()
479 /* per-thread scenario, no need to generate a timestamp */ in cs_etm_decoder__buffer_range()
491 packet_queue->instr_count += elem->num_instr_range; in cs_etm_decoder__buffer_range()
526 packet = &queue->packet_buffer[queue->tail]; in cs_etm_decoder__buffer_exception()
527 packet->exception_number = elem->exception_number; in cs_etm_decoder__buffer_exception()
547 pid_t tid = -1; in cs_etm_decoder__set_tid()
556 if (elem->context.ctxt_id_valid) in cs_etm_decoder__set_tid()
557 tid = elem->context.context_id; in cs_etm_decoder__set_tid()
560 if (elem->context.vmid_valid) in cs_etm_decoder__set_tid()
561 tid = elem->context.vmid; in cs_etm_decoder__set_tid()
569 elem->context.exception_level)) in cs_etm_decoder__set_tid()
572 if (tid == -1) in cs_etm_decoder__set_tid()
592 struct cs_etm_queue *etmq = decoder->data; in cs_etm_decoder__gen_trace_elem_printer()
600 switch (elem->elem_type) { in cs_etm_decoder__gen_trace_elem_printer()
661 switch (t_params->protocol) { in cs_etm_decoder__create_etm_decoder()
664 csid = (t_params->etmv3.reg_idr & CORESIGHT_TRACE_ID_VAL_MASK); in cs_etm_decoder__create_etm_decoder()
666 decoder->decoder_name = (t_params->protocol == CS_ETM_PROTO_ETMV3) ? in cs_etm_decoder__create_etm_decoder()
672 csid = (t_params->etmv4.reg_traceidr & CORESIGHT_TRACE_ID_VAL_MASK); in cs_etm_decoder__create_etm_decoder()
674 decoder->decoder_name = OCSD_BUILTIN_DCD_ETMV4I; in cs_etm_decoder__create_etm_decoder()
678 csid = (t_params->ete.reg_traceidr & CORESIGHT_TRACE_ID_VAL_MASK); in cs_etm_decoder__create_etm_decoder()
680 decoder->decoder_name = OCSD_BUILTIN_DCD_ETE; in cs_etm_decoder__create_etm_decoder()
684 return -1; in cs_etm_decoder__create_etm_decoder()
687 if (d_params->operation == CS_ETM_OPERATION_DECODE) { in cs_etm_decoder__create_etm_decoder()
693 if (ocsd_dt_create_decoder(decoder->dcd_tree, in cs_etm_decoder__create_etm_decoder()
694 decoder->decoder_name, in cs_etm_decoder__create_etm_decoder()
697 return -1; in cs_etm_decoder__create_etm_decoder()
699 if (ocsd_dt_set_gen_elem_outfn(decoder->dcd_tree, in cs_etm_decoder__create_etm_decoder()
702 return -1; in cs_etm_decoder__create_etm_decoder()
705 } else if (d_params->operation == CS_ETM_OPERATION_PRINT) { in cs_etm_decoder__create_etm_decoder()
706 if (ocsd_dt_create_decoder(decoder->dcd_tree, decoder->decoder_name, in cs_etm_decoder__create_etm_decoder()
709 return -1; in cs_etm_decoder__create_etm_decoder()
711 if (ocsd_dt_set_pkt_protocol_printer(decoder->dcd_tree, csid, 0)) in cs_etm_decoder__create_etm_decoder()
712 return -1; in cs_etm_decoder__create_etm_decoder()
717 return -1; in cs_etm_decoder__create_etm_decoder()
737 decoder->data = d_params->data; in cs_etm_decoder__new()
738 decoder->prev_return = OCSD_RESP_CONT; in cs_etm_decoder__new()
739 format = (d_params->formatted ? OCSD_TRC_SRC_FRAME_FORMATTED : in cs_etm_decoder__new()
742 flags |= (d_params->fsyncs ? OCSD_DFRMTR_HAS_FSYNCS : 0); in cs_etm_decoder__new()
743 flags |= (d_params->hsyncs ? OCSD_DFRMTR_HAS_HSYNCS : 0); in cs_etm_decoder__new()
744 flags |= (d_params->frame_aligned ? OCSD_DFRMTR_FRAME_MEM_ALIGN : 0); in cs_etm_decoder__new()
753 decoder->dcd_tree = ocsd_create_dcd_tree(format, flags); in cs_etm_decoder__new()
755 if (decoder->dcd_tree == 0) in cs_etm_decoder__new()
787 ocsd_datapath_resp_t prev_return = decoder->prev_return; in cs_etm_decoder__process_data_block()
793 cur = ocsd_dt_process_data(decoder->dcd_tree, in cs_etm_decoder__process_data_block()
800 cur = ocsd_dt_process_data(decoder->dcd_tree, in cs_etm_decoder__process_data_block()
803 len - processed, in cs_etm_decoder__process_data_block()
808 ret = -EINVAL; in cs_etm_decoder__process_data_block()
823 decoder->prev_return = cur; in cs_etm_decoder__process_data_block()
834 ocsd_destroy_dcd_tree(decoder->dcd_tree); in cs_etm_decoder__free()
835 decoder->dcd_tree = NULL; in cs_etm_decoder__free()
841 return decoder->decoder_name; in cs_etm_decoder__get_name()