/* * Copyright(C) 2015 Linaro Limited. All rights reserved. * Author: Tor Jeremiassen * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General * Public License for more details. * * You should have received a copy of the GNU GEneral Public License along * with this program. If not, see . */ #ifndef INCLUDE__CS_ETM_DECODER_H__ #define INCLUDE__CS_ETM_DECODER_H__ #include #include struct cs_etm_decoder; struct cs_etm_buffer { const unsigned char *buf; size_t len; uint64_t offset; //bool consecutive; uint64_t ref_timestamp; //uint64_t trace_nr; }; enum cs_etm_sample_type { CS_ETM_RANGE = 1 << 0, }; struct cs_etm_state { int err; void *data; unsigned isa; uint64_t start; uint64_t end; uint64_t timestamp; }; struct cs_etm_packet { enum cs_etm_sample_type sample_type; uint64_t start_addr; uint64_t end_addr; bool exc; bool exc_ret; int cpu; }; struct cs_etm_queue; typedef uint32_t (*cs_etm_mem_cb_type)(struct cs_etm_queue *, uint64_t, size_t, uint8_t *); struct cs_etm_trace_params { void *etmv4i_packet_handler; uint32_t reg_idr0; uint32_t reg_idr1; uint32_t reg_idr2; uint32_t reg_idr8; uint32_t reg_configr; uint32_t reg_traceidr; int protocol; }; struct cs_etm_decoder_params { int operation; void (*packet_printer)(const char *); cs_etm_mem_cb_type mem_acc_cb; bool formatted; bool fsyncs; bool hsyncs; bool frame_aligned; void *data; }; enum { CS_ETM_PROTO_ETMV3 = 1, CS_ETM_PROTO_ETMV4i, CS_ETM_PROTO_ETMV4d, }; enum { CS_ETM_OPERATION_PRINT = 1, CS_ETM_OPERATION_DECODE, }; enum { CS_ETM_ERR_NOMEM = 1, CS_ETM_ERR_NODATA, CS_ETM_ERR_PARAM, }; struct cs_etm_decoder *cs_etm_decoder__new(uint32_t num_cpu, struct cs_etm_decoder_params *,struct cs_etm_trace_params []); int cs_etm_decoder__add_mem_access_cb(struct cs_etm_decoder *, uint64_t, uint64_t, cs_etm_mem_cb_type); int cs_etm_decoder__flush(struct cs_etm_decoder *); void cs_etm_decoder__free(struct cs_etm_decoder *); int cs_etm_decoder__get_packet(struct cs_etm_decoder *, struct cs_etm_packet *); int cs_etm_decoder__add_bin_file(struct cs_etm_decoder *, uint64_t, uint64_t, uint64_t, const char *); const struct cs_etm_state *cs_etm_decoder__process_data_block(struct cs_etm_decoder *, uint64_t, const uint8_t *, size_t, size_t *); #endif /* INCLUDE__CS_ETM_DECODER_H__ */