| /* |
| * \file ocsd_c_api_cust_impl.h |
| * \brief OpenCSD : Custom decoder implementation common API definitions |
| * |
| * \copyright Copyright (c) 2016, ARM Limited. All Rights Reserved. |
| */ |
| |
| /* |
| * Redistribution and use in source and binary forms, with or without modification, |
| * are permitted provided that the following conditions are met: |
| * |
| * 1. Redistributions of source code must retain the above copyright notice, |
| * this list of conditions and the following disclaimer. |
| * |
| * 2. Redistributions in binary form must reproduce the above copyright notice, |
| * this list of conditions and the following disclaimer in the documentation |
| * and/or other materials provided with the distribution. |
| * |
| * 3. Neither the name of the copyright holder nor the names of its contributors |
| * may be used to endorse or promote products derived from this software without |
| * specific prior written permission. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND |
| * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
| * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
| * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, |
| * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| */ |
| #ifndef ARM_OCSD_C_API_CUST_IMPL_H_INCLUDED |
| #define ARM_OCSD_C_API_CUST_IMPL_H_INCLUDED |
| |
| #include "opencsd/c_api/ocsd_c_api_types.h" |
| #include "opencsd/c_api/ocsd_c_api_custom.h" |
| |
| /** @addtogroup ocsd_ext_dcd |
| @{*/ |
| |
| /**@name External decoder - Inline utility functions. |
| @brief inline functions used in decoders to call the various library callback functionality. |
| |
| Functions manipulate and use the ocsd_extern_dcd_cb_fns structure to call into the library, |
| with appropriate checking for initialisation and usage flags. |
| |
| @{*/ |
| |
| static inline ocsd_datapath_resp_t lib_cb_GenElemOp(const ocsd_extern_dcd_cb_fns *callbacks, |
| const ocsd_trc_index_t index_sop, |
| const uint8_t trc_chan_id, |
| const ocsd_generic_trace_elem *elem) |
| { |
| if (callbacks->fn_gen_elem_out) |
| return callbacks->fn_gen_elem_out(callbacks->lib_context, index_sop, trc_chan_id, elem); |
| return OCSD_RESP_FATAL_NOT_INIT; |
| } |
| |
| static inline ocsd_err_t lib_cb_LogError(const ocsd_extern_dcd_cb_fns *callbacks, |
| const ocsd_err_severity_t filter_level, |
| const ocsd_err_t code, |
| const ocsd_trc_index_t idx, |
| const uint8_t chan_id, |
| const char *pMsg) |
| { |
| if (callbacks->fn_log_error) |
| { |
| callbacks->fn_log_error(callbacks->lib_context, filter_level, code, idx, chan_id, pMsg); |
| return OCSD_OK; |
| } |
| return OCSD_ERR_NOT_INIT; |
| } |
| |
| static inline ocsd_err_t lib_cb_LogMsg(const ocsd_extern_dcd_cb_fns *callbacks, |
| const ocsd_err_severity_t filter_level, |
| const char *pMsg) |
| { |
| if (callbacks->fn_log_msg) |
| { |
| callbacks->fn_log_msg(callbacks->lib_context, filter_level, pMsg); |
| return OCSD_OK; |
| } |
| return OCSD_ERR_NOT_INIT; |
| } |
| |
| static inline ocsd_err_t lib_cb_DecodeArmInst(const ocsd_extern_dcd_cb_fns *callbacks, |
| ocsd_instr_info *instr_info) |
| { |
| if (callbacks->fn_arm_instruction_decode) |
| return callbacks->fn_arm_instruction_decode(callbacks->lib_context, instr_info); |
| return OCSD_ERR_NOT_INIT; |
| } |
| |
| static inline ocsd_err_t lib_cb_MemAccess(const ocsd_extern_dcd_cb_fns *callbacks, |
| const ocsd_vaddr_t address, |
| const uint8_t cs_trace_id, |
| const ocsd_mem_space_acc_t mem_space, |
| uint32_t *num_bytes, |
| uint8_t *p_buffer) |
| { |
| if (callbacks->fn_memory_access) |
| return callbacks->fn_memory_access(callbacks->lib_context, address, cs_trace_id, mem_space, num_bytes, p_buffer); |
| return OCSD_ERR_NOT_INIT; |
| } |
| |
| static inline void lib_cb_PktMon(const ocsd_extern_dcd_cb_fns *callbacks, |
| const ocsd_datapath_op_t op, |
| const ocsd_trc_index_t index_sop, |
| const void *pkt, |
| const uint32_t size, |
| const uint8_t *p_data) |
| { |
| if (callbacks->packetCBFlags & OCSD_CUST_DCD_PKT_CB_USE_MON) |
| { |
| if (callbacks->fn_packet_mon) |
| callbacks->fn_packet_mon(callbacks->lib_context, op, index_sop, pkt, size, p_data); |
| } |
| } |
| |
| static inline int lib_cb_usePktMon(const ocsd_extern_dcd_cb_fns *callbacks) |
| { |
| return (callbacks->packetCBFlags & OCSD_CUST_DCD_PKT_CB_USE_MON); |
| } |
| |
| /* callback function to connect to the packet sink interface, on the main decode |
| data path - used if decoder created as packet processor only */ |
| static inline ocsd_datapath_resp_t lib_cb_PktDataSink(const ocsd_extern_dcd_cb_fns *callbacks, |
| const ocsd_datapath_op_t op, |
| const ocsd_trc_index_t index_sop, |
| const void *pkt) |
| { |
| if (callbacks->packetCBFlags & OCSD_CUST_DCD_PKT_CB_USE_SINK) |
| { |
| if (callbacks->fn_packet_data_sink) |
| return callbacks->fn_packet_data_sink(callbacks->lib_context, op, index_sop, pkt); |
| else |
| return OCSD_RESP_FATAL_NOT_INIT; |
| } |
| return OCSD_RESP_CONT; |
| } |
| |
| static inline int lib_cb_usePktSink(const ocsd_extern_dcd_cb_fns *callbacks) |
| { |
| return (callbacks->packetCBFlags & OCSD_CUST_DCD_PKT_CB_USE_SINK); |
| } |
| |
| static inline void lib_cb_updatePktCBFlags(ocsd_extern_dcd_cb_fns *callbacks, const int newFlags) |
| { |
| callbacks->packetCBFlags = newFlags; |
| } |
| |
| /** @}*/ |
| |
| /** @}*/ |
| |
| #endif /* ARM_OCSD_C_API_CUST_IMPL_H_INCLUDED */ |