blob: 245ce162752e9916a0bba3559fe12c6096d7efc5 [file] [log] [blame]
/*
* \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 */