1c120c564SAndrew Turner /*
2c120c564SAndrew Turner * \file ocsd_c_api.cpp
3c120c564SAndrew Turner * \brief OpenCSD : "C" API libary implementation.
4c120c564SAndrew Turner *
5c120c564SAndrew Turner * \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
6c120c564SAndrew Turner */
7c120c564SAndrew Turner
8c120c564SAndrew Turner /*
9c120c564SAndrew Turner * Redistribution and use in source and binary forms, with or without modification,
10c120c564SAndrew Turner * are permitted provided that the following conditions are met:
11c120c564SAndrew Turner *
12c120c564SAndrew Turner * 1. Redistributions of source code must retain the above copyright notice,
13c120c564SAndrew Turner * this list of conditions and the following disclaimer.
14c120c564SAndrew Turner *
15c120c564SAndrew Turner * 2. Redistributions in binary form must reproduce the above copyright notice,
16c120c564SAndrew Turner * this list of conditions and the following disclaimer in the documentation
17c120c564SAndrew Turner * and/or other materials provided with the distribution.
18c120c564SAndrew Turner *
19c120c564SAndrew Turner * 3. Neither the name of the copyright holder nor the names of its contributors
20c120c564SAndrew Turner * may be used to endorse or promote products derived from this software without
21c120c564SAndrew Turner * specific prior written permission.
22c120c564SAndrew Turner *
23c120c564SAndrew Turner * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
24c120c564SAndrew Turner * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
25c120c564SAndrew Turner * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26c120c564SAndrew Turner * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
27c120c564SAndrew Turner * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
28c120c564SAndrew Turner * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
29c120c564SAndrew Turner * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
30c120c564SAndrew Turner * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31c120c564SAndrew Turner * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
32c120c564SAndrew Turner * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33c120c564SAndrew Turner */
34c120c564SAndrew Turner
35c120c564SAndrew Turner #include <cstring>
36c120c564SAndrew Turner
37c120c564SAndrew Turner /* pull in the C++ decode library */
38c120c564SAndrew Turner #include "opencsd.h"
39c120c564SAndrew Turner
40c120c564SAndrew Turner /* C-API and wrapper objects */
41c120c564SAndrew Turner #include "opencsd/c_api/opencsd_c_api.h"
42c120c564SAndrew Turner #include "ocsd_c_api_obj.h"
43c120c564SAndrew Turner
44c120c564SAndrew Turner /** MSVC2010 unwanted export workaround */
45c120c564SAndrew Turner #ifdef WIN32
46c120c564SAndrew Turner #if (_MSC_VER == 1600)
47c120c564SAndrew Turner #include <new>
48c120c564SAndrew Turner namespace std { const nothrow_t nothrow = nothrow_t(); }
49c120c564SAndrew Turner #endif
50c120c564SAndrew Turner #endif
51c120c564SAndrew Turner
52c120c564SAndrew Turner /*******************************************************************************/
53c120c564SAndrew Turner /* C API internal helper function declarations */
54c120c564SAndrew Turner /*******************************************************************************/
55c120c564SAndrew Turner
56c120c564SAndrew Turner static ocsd_err_t ocsd_create_pkt_sink_cb(ocsd_trace_protocol_t protocol, FnDefPktDataIn pPktInFn, const void *p_context, ITrcTypedBase **ppCBObj );
57c120c564SAndrew Turner static ocsd_err_t ocsd_create_pkt_mon_cb(ocsd_trace_protocol_t protocol, FnDefPktDataMon pPktInFn, const void *p_context, ITrcTypedBase **ppCBObj );
58c120c564SAndrew Turner static ocsd_err_t ocsd_check_and_add_mem_acc_mapper(const dcd_tree_handle_t handle, DecodeTree **ppDT);
59c120c564SAndrew Turner
60c120c564SAndrew Turner /*******************************************************************************/
61c120c564SAndrew Turner /* C library data - additional data on top of the C++ library objects */
62c120c564SAndrew Turner /*******************************************************************************/
63c120c564SAndrew Turner
64c120c564SAndrew Turner /* keep a list of interface objects for a decode tree for later disposal */
65c120c564SAndrew Turner typedef struct _lib_dt_data_list {
66c120c564SAndrew Turner std::vector<ITrcTypedBase *> cb_objs;
67c120c564SAndrew Turner DefLogStrCBObj s_def_log_str_cb;
68c120c564SAndrew Turner } lib_dt_data_list;
69c120c564SAndrew Turner
70c120c564SAndrew Turner /* map lists to handles */
71c120c564SAndrew Turner static std::map<dcd_tree_handle_t, lib_dt_data_list *> s_data_map;
72c120c564SAndrew Turner
73c120c564SAndrew Turner /*******************************************************************************/
74c120c564SAndrew Turner /* C API functions */
75c120c564SAndrew Turner /*******************************************************************************/
76c120c564SAndrew Turner
77c120c564SAndrew Turner /** Get Library version. Return a 32 bit version in form MMMMnnpp - MMMM = major version, nn = minor version, pp = patch version */
ocsd_get_version(void)78c120c564SAndrew Turner OCSD_C_API uint32_t ocsd_get_version(void)
79c120c564SAndrew Turner {
80c120c564SAndrew Turner return ocsdVersion::vers_num();
81c120c564SAndrew Turner }
82c120c564SAndrew Turner
83c120c564SAndrew Turner /** Get library version string */
ocsd_get_version_str(void)84c120c564SAndrew Turner OCSD_C_API const char * ocsd_get_version_str(void)
85c120c564SAndrew Turner {
86c120c564SAndrew Turner return ocsdVersion::vers_str();
87c120c564SAndrew Turner }
88c120c564SAndrew Turner
89c120c564SAndrew Turner
90c120c564SAndrew Turner /*** Decode tree creation etc. */
91c120c564SAndrew Turner
ocsd_create_dcd_tree(const ocsd_dcd_tree_src_t src_type,const uint32_t deformatterCfgFlags)92c120c564SAndrew Turner OCSD_C_API dcd_tree_handle_t ocsd_create_dcd_tree(const ocsd_dcd_tree_src_t src_type, const uint32_t deformatterCfgFlags)
93c120c564SAndrew Turner {
94c120c564SAndrew Turner dcd_tree_handle_t handle = C_API_INVALID_TREE_HANDLE;
95c120c564SAndrew Turner handle = (dcd_tree_handle_t)DecodeTree::CreateDecodeTree(src_type,deformatterCfgFlags);
96c120c564SAndrew Turner if(handle != C_API_INVALID_TREE_HANDLE)
97c120c564SAndrew Turner {
98c120c564SAndrew Turner lib_dt_data_list *pList = new (std::nothrow) lib_dt_data_list;
99c120c564SAndrew Turner if(pList != 0)
100c120c564SAndrew Turner {
101c120c564SAndrew Turner s_data_map.insert(std::pair<dcd_tree_handle_t, lib_dt_data_list *>(handle,pList));
102c120c564SAndrew Turner }
103c120c564SAndrew Turner else
104c120c564SAndrew Turner {
105c120c564SAndrew Turner ocsd_destroy_dcd_tree(handle);
106c120c564SAndrew Turner handle = C_API_INVALID_TREE_HANDLE;
107c120c564SAndrew Turner }
108c120c564SAndrew Turner }
109c120c564SAndrew Turner return handle;
110c120c564SAndrew Turner }
111c120c564SAndrew Turner
ocsd_destroy_dcd_tree(const dcd_tree_handle_t handle)112c120c564SAndrew Turner OCSD_C_API void ocsd_destroy_dcd_tree(const dcd_tree_handle_t handle)
113c120c564SAndrew Turner {
114c120c564SAndrew Turner if(handle != C_API_INVALID_TREE_HANDLE)
115c120c564SAndrew Turner {
116c120c564SAndrew Turner GenTraceElemCBObj * pIf = (GenTraceElemCBObj *)(((DecodeTree *)handle)->getGenTraceElemOutI());
117c120c564SAndrew Turner if(pIf != 0)
118c120c564SAndrew Turner delete pIf;
119c120c564SAndrew Turner
120c120c564SAndrew Turner /* need to clear any associated callback data. */
121c120c564SAndrew Turner std::map<dcd_tree_handle_t, lib_dt_data_list *>::iterator it;
122c120c564SAndrew Turner it = s_data_map.find(handle);
123c120c564SAndrew Turner if(it != s_data_map.end())
124c120c564SAndrew Turner {
125c120c564SAndrew Turner std::vector<ITrcTypedBase *>::iterator itcb;
126c120c564SAndrew Turner itcb = it->second->cb_objs.begin();
127c120c564SAndrew Turner while(itcb != it->second->cb_objs.end())
128c120c564SAndrew Turner {
129c120c564SAndrew Turner delete *itcb;
130c120c564SAndrew Turner itcb++;
131c120c564SAndrew Turner }
132c120c564SAndrew Turner it->second->cb_objs.clear();
133c120c564SAndrew Turner delete it->second;
134c120c564SAndrew Turner s_data_map.erase(it);
135c120c564SAndrew Turner }
136c120c564SAndrew Turner DecodeTree::DestroyDecodeTree((DecodeTree *)handle);
137c120c564SAndrew Turner }
138c120c564SAndrew Turner }
139c120c564SAndrew Turner
140c120c564SAndrew Turner /*** Decode tree process data */
141c120c564SAndrew Turner
ocsd_dt_process_data(const dcd_tree_handle_t handle,const ocsd_datapath_op_t op,const ocsd_trc_index_t index,const uint32_t dataBlockSize,const uint8_t * pDataBlock,uint32_t * numBytesProcessed)142c120c564SAndrew Turner OCSD_C_API ocsd_datapath_resp_t ocsd_dt_process_data(const dcd_tree_handle_t handle,
143c120c564SAndrew Turner const ocsd_datapath_op_t op,
144c120c564SAndrew Turner const ocsd_trc_index_t index,
145c120c564SAndrew Turner const uint32_t dataBlockSize,
146c120c564SAndrew Turner const uint8_t *pDataBlock,
147c120c564SAndrew Turner uint32_t *numBytesProcessed)
148c120c564SAndrew Turner {
149c120c564SAndrew Turner ocsd_datapath_resp_t resp = OCSD_RESP_FATAL_NOT_INIT;
150c120c564SAndrew Turner if(handle != C_API_INVALID_TREE_HANDLE)
151c120c564SAndrew Turner resp = ((DecodeTree *)handle)->TraceDataIn(op,index,dataBlockSize,pDataBlock,numBytesProcessed);
152c120c564SAndrew Turner return resp;
153c120c564SAndrew Turner }
154c120c564SAndrew Turner
155c120c564SAndrew Turner /*** Decode tree - decoder management */
156c120c564SAndrew Turner
ocsd_dt_create_decoder(const dcd_tree_handle_t handle,const char * decoder_name,const int create_flags,const void * decoder_cfg,unsigned char * pCSID)157c120c564SAndrew Turner OCSD_C_API ocsd_err_t ocsd_dt_create_decoder(const dcd_tree_handle_t handle,
158c120c564SAndrew Turner const char *decoder_name,
159c120c564SAndrew Turner const int create_flags,
160c120c564SAndrew Turner const void *decoder_cfg,
161c120c564SAndrew Turner unsigned char *pCSID
162c120c564SAndrew Turner )
163c120c564SAndrew Turner {
164c120c564SAndrew Turner ocsd_err_t err = OCSD_OK;
165c120c564SAndrew Turner DecodeTree *dt = (DecodeTree *)handle;
166c120c564SAndrew Turner std::string dName = decoder_name;
167c120c564SAndrew Turner IDecoderMngr *pDcdMngr;
168c120c564SAndrew Turner err = OcsdLibDcdRegister::getDecoderRegister()->getDecoderMngrByName(dName,&pDcdMngr);
169c120c564SAndrew Turner if(err != OCSD_OK)
170c120c564SAndrew Turner return err;
171c120c564SAndrew Turner
172c120c564SAndrew Turner CSConfig *pConfig = 0;
173c120c564SAndrew Turner err = pDcdMngr->createConfigFromDataStruct(&pConfig,decoder_cfg);
174c120c564SAndrew Turner if(err != OCSD_OK)
175c120c564SAndrew Turner return err;
176c120c564SAndrew Turner
177c120c564SAndrew Turner err = dt->createDecoder(dName,create_flags,pConfig);
178c120c564SAndrew Turner if(err == OCSD_OK)
179c120c564SAndrew Turner *pCSID = pConfig->getTraceID();
180c120c564SAndrew Turner delete pConfig;
181c120c564SAndrew Turner return err;
182c120c564SAndrew Turner }
183c120c564SAndrew Turner
ocsd_dt_remove_decoder(const dcd_tree_handle_t handle,const unsigned char CSID)184c120c564SAndrew Turner OCSD_C_API ocsd_err_t ocsd_dt_remove_decoder( const dcd_tree_handle_t handle,
185c120c564SAndrew Turner const unsigned char CSID)
186c120c564SAndrew Turner {
187c120c564SAndrew Turner return ((DecodeTree *)handle)->removeDecoder(CSID);
188c120c564SAndrew Turner }
189c120c564SAndrew Turner
ocsd_dt_attach_packet_callback(const dcd_tree_handle_t handle,const unsigned char CSID,const ocsd_c_api_cb_types callback_type,void * p_fn_callback_data,const void * p_context)190c120c564SAndrew Turner OCSD_C_API ocsd_err_t ocsd_dt_attach_packet_callback( const dcd_tree_handle_t handle,
191c120c564SAndrew Turner const unsigned char CSID,
192c120c564SAndrew Turner const ocsd_c_api_cb_types callback_type,
193c120c564SAndrew Turner void *p_fn_callback_data,
194c120c564SAndrew Turner const void *p_context)
195c120c564SAndrew Turner {
196c120c564SAndrew Turner ocsd_err_t err = OCSD_OK;
197c120c564SAndrew Turner DecodeTree *pDT = static_cast<DecodeTree *>(handle);
198c120c564SAndrew Turner DecodeTreeElement *pElem = pDT->getDecoderElement(CSID);
199c120c564SAndrew Turner if(pElem == 0)
200c120c564SAndrew Turner return OCSD_ERR_INVALID_ID; // cannot find entry for that CSID
201c120c564SAndrew Turner
202c120c564SAndrew Turner ITrcTypedBase *pDataInSink = 0; // pointer to a sink callback object
203c120c564SAndrew Turner switch(callback_type)
204c120c564SAndrew Turner {
205c120c564SAndrew Turner case OCSD_C_API_CB_PKT_SINK:
206c120c564SAndrew Turner err = ocsd_create_pkt_sink_cb(pElem->getProtocol(),(FnDefPktDataIn)p_fn_callback_data,p_context,&pDataInSink);
207c120c564SAndrew Turner if(err == OCSD_OK)
208c120c564SAndrew Turner err = pElem->getDecoderMngr()->attachPktSink(pElem->getDecoderHandle(), pDataInSink);
209c120c564SAndrew Turner break;
210c120c564SAndrew Turner
211c120c564SAndrew Turner case OCSD_C_API_CB_PKT_MON:
212c120c564SAndrew Turner err = ocsd_create_pkt_mon_cb(pElem->getProtocol(),(FnDefPktDataMon)p_fn_callback_data,p_context,&pDataInSink);
213c120c564SAndrew Turner if (err == OCSD_OK)
214c120c564SAndrew Turner err = pElem->getDecoderMngr()->attachPktMonitor(pElem->getDecoderHandle(), pDataInSink);
215c120c564SAndrew Turner break;
216c120c564SAndrew Turner
217c120c564SAndrew Turner default:
218c120c564SAndrew Turner err = OCSD_ERR_INVALID_PARAM_VAL;
219c120c564SAndrew Turner }
220c120c564SAndrew Turner
221c120c564SAndrew Turner if(err == OCSD_OK)
222c120c564SAndrew Turner {
223c120c564SAndrew Turner if (err == OCSD_OK)
224c120c564SAndrew Turner {
225c120c564SAndrew Turner // save object pointer for destruction later.
226c120c564SAndrew Turner std::map<dcd_tree_handle_t, lib_dt_data_list *>::iterator it;
227c120c564SAndrew Turner it = s_data_map.find(handle);
228c120c564SAndrew Turner if (it != s_data_map.end())
229c120c564SAndrew Turner it->second->cb_objs.push_back(pDataInSink);
230c120c564SAndrew Turner }
231c120c564SAndrew Turner else
232c120c564SAndrew Turner delete pDataInSink;
233c120c564SAndrew Turner }
234c120c564SAndrew Turner return err;
235c120c564SAndrew Turner }
236c120c564SAndrew Turner
ocsd_dt_get_decode_stats(const dcd_tree_handle_t handle,const unsigned char CSID,ocsd_decode_stats_t ** p_stats_block)23746e6e290SRuslan Bukin OCSD_C_API ocsd_err_t ocsd_dt_get_decode_stats(const dcd_tree_handle_t handle,
23846e6e290SRuslan Bukin const unsigned char CSID,
23946e6e290SRuslan Bukin ocsd_decode_stats_t **p_stats_block)
24046e6e290SRuslan Bukin {
24146e6e290SRuslan Bukin DecodeTree *pDT = static_cast<DecodeTree *>(handle);
242c120c564SAndrew Turner
24346e6e290SRuslan Bukin return pDT->getDecoderStats(CSID, p_stats_block);
24446e6e290SRuslan Bukin }
24546e6e290SRuslan Bukin
ocsd_dt_reset_decode_stats(const dcd_tree_handle_t handle,const unsigned char CSID)24646e6e290SRuslan Bukin OCSD_C_API ocsd_err_t ocsd_dt_reset_decode_stats(const dcd_tree_handle_t handle,
24746e6e290SRuslan Bukin const unsigned char CSID)
24846e6e290SRuslan Bukin {
24946e6e290SRuslan Bukin DecodeTree *pDT = static_cast<DecodeTree *>(handle);
25046e6e290SRuslan Bukin
25146e6e290SRuslan Bukin return pDT->resetDecoderStats(CSID);
25246e6e290SRuslan Bukin }
25346e6e290SRuslan Bukin
25446e6e290SRuslan Bukin /*** Decode tree set element output */
ocsd_dt_set_gen_elem_outfn(const dcd_tree_handle_t handle,FnTraceElemIn pFn,const void * p_context)255c120c564SAndrew Turner OCSD_C_API ocsd_err_t ocsd_dt_set_gen_elem_outfn(const dcd_tree_handle_t handle, FnTraceElemIn pFn, const void *p_context)
256c120c564SAndrew Turner {
257c120c564SAndrew Turner
258c120c564SAndrew Turner GenTraceElemCBObj * pCBObj = new (std::nothrow)GenTraceElemCBObj(pFn, p_context);
259c120c564SAndrew Turner if(pCBObj)
260c120c564SAndrew Turner {
261c120c564SAndrew Turner ((DecodeTree *)handle)->setGenTraceElemOutI(pCBObj);
262c120c564SAndrew Turner return OCSD_OK;
263c120c564SAndrew Turner }
264c120c564SAndrew Turner return OCSD_ERR_MEM;
265c120c564SAndrew Turner }
266c120c564SAndrew Turner
267c120c564SAndrew Turner
268c120c564SAndrew Turner /*** Default error logging */
269c120c564SAndrew Turner
ocsd_def_errlog_init(const ocsd_err_severity_t verbosity,const int create_output_logger)270c120c564SAndrew Turner OCSD_C_API ocsd_err_t ocsd_def_errlog_init(const ocsd_err_severity_t verbosity, const int create_output_logger)
271c120c564SAndrew Turner {
272c120c564SAndrew Turner if(DecodeTree::getDefaultErrorLogger()->initErrorLogger(verbosity,(bool)(create_output_logger != 0)))
273c120c564SAndrew Turner return OCSD_OK;
274c120c564SAndrew Turner return OCSD_ERR_NOT_INIT;
275c120c564SAndrew Turner }
276c120c564SAndrew Turner
ocsd_def_errlog_config_output(const int output_flags,const char * log_file_name)277c120c564SAndrew Turner OCSD_C_API ocsd_err_t ocsd_def_errlog_config_output(const int output_flags, const char *log_file_name)
278c120c564SAndrew Turner {
279c120c564SAndrew Turner ocsdMsgLogger *pLogger = DecodeTree::getDefaultErrorLogger()->getOutputLogger();
280c120c564SAndrew Turner if(pLogger)
281c120c564SAndrew Turner {
282c120c564SAndrew Turner pLogger->setLogOpts(output_flags & C_API_MSGLOGOUT_MASK);
283c120c564SAndrew Turner if(log_file_name != NULL)
284c120c564SAndrew Turner {
285c120c564SAndrew Turner pLogger->setLogFileName(log_file_name);
286c120c564SAndrew Turner }
287c120c564SAndrew Turner return OCSD_OK;
288c120c564SAndrew Turner }
289c120c564SAndrew Turner return OCSD_ERR_NOT_INIT;
290c120c564SAndrew Turner }
291c120c564SAndrew Turner
292c120c564SAndrew Turner
ocsd_def_errlog_set_strprint_cb(const dcd_tree_handle_t handle,void * p_context,FnDefLoggerPrintStrCB p_str_print_cb)293c120c564SAndrew Turner OCSD_C_API ocsd_err_t ocsd_def_errlog_set_strprint_cb(const dcd_tree_handle_t handle, void *p_context, FnDefLoggerPrintStrCB p_str_print_cb)
294c120c564SAndrew Turner {
295c120c564SAndrew Turner ocsdMsgLogger *pLogger = DecodeTree::getDefaultErrorLogger()->getOutputLogger();
296c120c564SAndrew Turner if (pLogger)
297c120c564SAndrew Turner {
298c120c564SAndrew Turner std::map<dcd_tree_handle_t, lib_dt_data_list *>::iterator it;
299c120c564SAndrew Turner it = s_data_map.find(handle);
300c120c564SAndrew Turner if (it != s_data_map.end())
301c120c564SAndrew Turner {
302c120c564SAndrew Turner DefLogStrCBObj *pCBObj = &(it->second->s_def_log_str_cb);
303c120c564SAndrew Turner pCBObj->setCBFn(p_context, p_str_print_cb);
304c120c564SAndrew Turner pLogger->setStrOutFn(pCBObj);
305c120c564SAndrew Turner int logOpts = pLogger->getLogOpts();
306c120c564SAndrew Turner logOpts |= (int)(ocsdMsgLogger::OUT_STR_CB);
307c120c564SAndrew Turner pLogger->setLogOpts(logOpts);
308c120c564SAndrew Turner return OCSD_OK;
309c120c564SAndrew Turner }
310c120c564SAndrew Turner }
311c120c564SAndrew Turner return OCSD_ERR_NOT_INIT;
312c120c564SAndrew Turner }
313c120c564SAndrew Turner
ocsd_def_errlog_msgout(const char * msg)314c120c564SAndrew Turner OCSD_C_API void ocsd_def_errlog_msgout(const char *msg)
315c120c564SAndrew Turner {
316c120c564SAndrew Turner ocsdMsgLogger *pLogger = DecodeTree::getDefaultErrorLogger()->getOutputLogger();
317c120c564SAndrew Turner if(pLogger)
318c120c564SAndrew Turner pLogger->LogMsg(msg);
319c120c564SAndrew Turner }
320c120c564SAndrew Turner
321c120c564SAndrew Turner /*** Convert packet to string */
322c120c564SAndrew Turner
ocsd_pkt_str(const ocsd_trace_protocol_t pkt_protocol,const void * p_pkt,char * buffer,const int buffer_size)323c120c564SAndrew Turner OCSD_C_API ocsd_err_t ocsd_pkt_str(const ocsd_trace_protocol_t pkt_protocol, const void *p_pkt, char *buffer, const int buffer_size)
324c120c564SAndrew Turner {
325c120c564SAndrew Turner ocsd_err_t err = OCSD_OK;
326c120c564SAndrew Turner if((buffer == NULL) || (buffer_size < 2))
327c120c564SAndrew Turner return OCSD_ERR_INVALID_PARAM_VAL;
328c120c564SAndrew Turner
329c120c564SAndrew Turner std::string pktStr = "";
330c120c564SAndrew Turner buffer[0] = 0;
331c120c564SAndrew Turner
332c120c564SAndrew Turner switch(pkt_protocol)
333c120c564SAndrew Turner {
334c120c564SAndrew Turner case OCSD_PROTOCOL_ETMV4I:
335c120c564SAndrew Turner trcPrintElemToString<EtmV4ITrcPacket,ocsd_etmv4_i_pkt>(p_pkt, pktStr);
336c120c564SAndrew Turner break;
337c120c564SAndrew Turner
338c120c564SAndrew Turner case OCSD_PROTOCOL_ETMV3:
339c120c564SAndrew Turner trcPrintElemToString<EtmV3TrcPacket,ocsd_etmv3_pkt>(p_pkt, pktStr);
340c120c564SAndrew Turner break;
341c120c564SAndrew Turner
342c120c564SAndrew Turner case OCSD_PROTOCOL_STM:
343c120c564SAndrew Turner trcPrintElemToString<StmTrcPacket,ocsd_stm_pkt>(p_pkt, pktStr);
344c120c564SAndrew Turner break;
345c120c564SAndrew Turner
346c120c564SAndrew Turner case OCSD_PROTOCOL_PTM:
347c120c564SAndrew Turner trcPrintElemToString<PtmTrcPacket,ocsd_ptm_pkt>(p_pkt, pktStr);
348c120c564SAndrew Turner break;
349c120c564SAndrew Turner
350c120c564SAndrew Turner default:
351c120c564SAndrew Turner if (OCSD_PROTOCOL_IS_CUSTOM(pkt_protocol))
352c120c564SAndrew Turner err = ocsd_cust_protocol_to_str(pkt_protocol, p_pkt, buffer, buffer_size);
353c120c564SAndrew Turner else
354c120c564SAndrew Turner err = OCSD_ERR_NO_PROTOCOL;
355c120c564SAndrew Turner break;
356c120c564SAndrew Turner }
357c120c564SAndrew Turner
358c120c564SAndrew Turner if(pktStr.size() > 0)
359c120c564SAndrew Turner {
360c120c564SAndrew Turner strncpy(buffer,pktStr.c_str(),buffer_size-1);
361c120c564SAndrew Turner buffer[buffer_size-1] = 0;
362c120c564SAndrew Turner }
363c120c564SAndrew Turner return err;
364c120c564SAndrew Turner }
365c120c564SAndrew Turner
ocsd_gen_elem_str(const ocsd_generic_trace_elem * p_pkt,char * buffer,const int buffer_size)366c120c564SAndrew Turner OCSD_C_API ocsd_err_t ocsd_gen_elem_str(const ocsd_generic_trace_elem *p_pkt, char *buffer, const int buffer_size)
367c120c564SAndrew Turner {
368c120c564SAndrew Turner ocsd_err_t err = OCSD_OK;
369c120c564SAndrew Turner if((buffer == NULL) || (buffer_size < 2))
370c120c564SAndrew Turner return OCSD_ERR_INVALID_PARAM_VAL;
371c120c564SAndrew Turner std::string str;
372c120c564SAndrew Turner trcPrintElemToString<OcsdTraceElement,ocsd_generic_trace_elem>(p_pkt,str);
373c120c564SAndrew Turner if(str.size() > 0)
374c120c564SAndrew Turner {
375c120c564SAndrew Turner strncpy(buffer,str.c_str(),buffer_size -1);
376c120c564SAndrew Turner buffer[buffer_size-1] = 0;
377c120c564SAndrew Turner }
378c120c564SAndrew Turner return err;
379c120c564SAndrew Turner }
380c120c564SAndrew Turner
381c120c564SAndrew Turner /*** Decode tree -- memory accessor control */
382c120c564SAndrew Turner
ocsd_dt_add_binfile_mem_acc(const dcd_tree_handle_t handle,const ocsd_vaddr_t address,const ocsd_mem_space_acc_t mem_space,const char * filepath)383c120c564SAndrew Turner OCSD_C_API ocsd_err_t ocsd_dt_add_binfile_mem_acc(const dcd_tree_handle_t handle, const ocsd_vaddr_t address, const ocsd_mem_space_acc_t mem_space, const char *filepath)
384c120c564SAndrew Turner {
385c120c564SAndrew Turner ocsd_err_t err = OCSD_OK;
386c120c564SAndrew Turner DecodeTree *pDT;
387c120c564SAndrew Turner err = ocsd_check_and_add_mem_acc_mapper(handle,&pDT);
388c120c564SAndrew Turner if(err == OCSD_OK)
389c120c564SAndrew Turner err = pDT->addBinFileMemAcc(address,mem_space,filepath);
390c120c564SAndrew Turner return err;
391c120c564SAndrew Turner }
392c120c564SAndrew Turner
ocsd_dt_add_binfile_region_mem_acc(const dcd_tree_handle_t handle,const ocsd_file_mem_region_t * region_array,const int num_regions,const ocsd_mem_space_acc_t mem_space,const char * filepath)393c120c564SAndrew Turner OCSD_C_API ocsd_err_t ocsd_dt_add_binfile_region_mem_acc(const dcd_tree_handle_t handle, const ocsd_file_mem_region_t *region_array, const int num_regions, const ocsd_mem_space_acc_t mem_space, const char *filepath)
394c120c564SAndrew Turner {
395c120c564SAndrew Turner ocsd_err_t err = OCSD_OK;
396c120c564SAndrew Turner DecodeTree *pDT;
397c120c564SAndrew Turner err = ocsd_check_and_add_mem_acc_mapper(handle,&pDT);
398c120c564SAndrew Turner if(err == OCSD_OK)
399c120c564SAndrew Turner err = pDT->addBinFileRegionMemAcc(region_array,num_regions,mem_space,filepath);
400c120c564SAndrew Turner return err;
401c120c564SAndrew Turner }
402c120c564SAndrew Turner
ocsd_dt_add_buffer_mem_acc(const dcd_tree_handle_t handle,const ocsd_vaddr_t address,const ocsd_mem_space_acc_t mem_space,const uint8_t * p_mem_buffer,const uint32_t mem_length)403c120c564SAndrew Turner OCSD_C_API ocsd_err_t ocsd_dt_add_buffer_mem_acc(const dcd_tree_handle_t handle, const ocsd_vaddr_t address, const ocsd_mem_space_acc_t mem_space, const uint8_t *p_mem_buffer, const uint32_t mem_length)
404c120c564SAndrew Turner {
405c120c564SAndrew Turner ocsd_err_t err = OCSD_OK;
406c120c564SAndrew Turner DecodeTree *pDT;
407c120c564SAndrew Turner err = ocsd_check_and_add_mem_acc_mapper(handle,&pDT);
408c120c564SAndrew Turner if(err == OCSD_OK)
409c120c564SAndrew Turner err = pDT->addBufferMemAcc(address,mem_space,p_mem_buffer,mem_length);
410c120c564SAndrew Turner return err;
411c120c564SAndrew Turner }
412c120c564SAndrew Turner
ocsd_dt_add_callback_mem_acc(const dcd_tree_handle_t handle,const ocsd_vaddr_t st_address,const ocsd_vaddr_t en_address,const ocsd_mem_space_acc_t mem_space,Fn_MemAcc_CB p_cb_func,const void * p_context)413c120c564SAndrew Turner OCSD_C_API ocsd_err_t ocsd_dt_add_callback_mem_acc(const dcd_tree_handle_t handle, const ocsd_vaddr_t st_address, const ocsd_vaddr_t en_address, const ocsd_mem_space_acc_t mem_space, Fn_MemAcc_CB p_cb_func, const void *p_context)
414c120c564SAndrew Turner {
415c120c564SAndrew Turner ocsd_err_t err = OCSD_OK;
416c120c564SAndrew Turner DecodeTree *pDT;
417c120c564SAndrew Turner err = ocsd_check_and_add_mem_acc_mapper(handle,&pDT);
418c120c564SAndrew Turner if(err == OCSD_OK)
419c120c564SAndrew Turner err = pDT->addCallbackMemAcc(st_address,en_address,mem_space,p_cb_func,p_context);
420c120c564SAndrew Turner return err;
421c120c564SAndrew Turner }
422c120c564SAndrew Turner
ocsd_dt_add_callback_trcid_mem_acc(const dcd_tree_handle_t handle,const ocsd_vaddr_t st_address,const ocsd_vaddr_t en_address,const ocsd_mem_space_acc_t mem_space,Fn_MemAccID_CB p_cb_func,const void * p_context)423c120c564SAndrew Turner OCSD_C_API ocsd_err_t ocsd_dt_add_callback_trcid_mem_acc(const dcd_tree_handle_t handle, const ocsd_vaddr_t st_address, const ocsd_vaddr_t en_address, const ocsd_mem_space_acc_t mem_space, Fn_MemAccID_CB p_cb_func, const void *p_context)
424c120c564SAndrew Turner {
425c120c564SAndrew Turner ocsd_err_t err = OCSD_OK;
426c120c564SAndrew Turner DecodeTree *pDT;
427c120c564SAndrew Turner err = ocsd_check_and_add_mem_acc_mapper(handle, &pDT);
428c120c564SAndrew Turner if (err == OCSD_OK)
429c120c564SAndrew Turner err = pDT->addCallbackIDMemAcc(st_address, en_address, mem_space, p_cb_func, p_context);
430c120c564SAndrew Turner return err;
431c120c564SAndrew Turner }
432c120c564SAndrew Turner
433c120c564SAndrew Turner
ocsd_dt_remove_mem_acc(const dcd_tree_handle_t handle,const ocsd_vaddr_t st_address,const ocsd_mem_space_acc_t mem_space)434c120c564SAndrew Turner OCSD_C_API ocsd_err_t ocsd_dt_remove_mem_acc(const dcd_tree_handle_t handle, const ocsd_vaddr_t st_address, const ocsd_mem_space_acc_t mem_space)
435c120c564SAndrew Turner {
436c120c564SAndrew Turner ocsd_err_t err = OCSD_OK;
437c120c564SAndrew Turner
438c120c564SAndrew Turner if(handle != C_API_INVALID_TREE_HANDLE)
439c120c564SAndrew Turner {
440c120c564SAndrew Turner DecodeTree *pDT = static_cast<DecodeTree *>(handle);
441c120c564SAndrew Turner err = pDT->removeMemAccByAddress(st_address,mem_space);
442c120c564SAndrew Turner }
443c120c564SAndrew Turner else
444c120c564SAndrew Turner err = OCSD_ERR_INVALID_PARAM_VAL;
445c120c564SAndrew Turner return err;
446c120c564SAndrew Turner }
447c120c564SAndrew Turner
ocsd_tl_log_mapped_mem_ranges(const dcd_tree_handle_t handle)448c120c564SAndrew Turner OCSD_C_API void ocsd_tl_log_mapped_mem_ranges(const dcd_tree_handle_t handle)
449c120c564SAndrew Turner {
450c120c564SAndrew Turner if(handle != C_API_INVALID_TREE_HANDLE)
451c120c564SAndrew Turner {
452c120c564SAndrew Turner DecodeTree *pDT = static_cast<DecodeTree *>(handle);
453c120c564SAndrew Turner pDT->logMappedRanges();
454c120c564SAndrew Turner }
455c120c564SAndrew Turner }
456c120c564SAndrew Turner
ocsd_gen_elem_init(ocsd_generic_trace_elem * p_pkt,const ocsd_gen_trc_elem_t elem_type)457c120c564SAndrew Turner OCSD_C_API void ocsd_gen_elem_init(ocsd_generic_trace_elem *p_pkt, const ocsd_gen_trc_elem_t elem_type)
458c120c564SAndrew Turner {
459c120c564SAndrew Turner p_pkt->elem_type = elem_type;
460c120c564SAndrew Turner p_pkt->flag_bits = 0;
461c120c564SAndrew Turner p_pkt->ptr_extended_data = 0;
462c120c564SAndrew Turner }
463c120c564SAndrew Turner
ocsd_dt_set_raw_frame_printer(const dcd_tree_handle_t handle,int flags)464c120c564SAndrew Turner OCSD_C_API ocsd_err_t ocsd_dt_set_raw_frame_printer(const dcd_tree_handle_t handle, int flags)
465c120c564SAndrew Turner {
466c120c564SAndrew Turner if (handle != C_API_INVALID_TREE_HANDLE)
467c120c564SAndrew Turner return ((DecodeTree *)handle)->addRawFramePrinter(0, (uint32_t)flags);
468c120c564SAndrew Turner return OCSD_ERR_NOT_INIT;
469c120c564SAndrew Turner }
470c120c564SAndrew Turner
ocsd_dt_set_gen_elem_printer(const dcd_tree_handle_t handle)471c120c564SAndrew Turner OCSD_C_API ocsd_err_t ocsd_dt_set_gen_elem_printer(const dcd_tree_handle_t handle)
472c120c564SAndrew Turner {
473c120c564SAndrew Turner if (handle != C_API_INVALID_TREE_HANDLE)
474c120c564SAndrew Turner return ((DecodeTree *)handle)->addGenElemPrinter(0);
475c120c564SAndrew Turner return OCSD_ERR_NOT_INIT;
476c120c564SAndrew Turner }
477c120c564SAndrew Turner
ocsd_dt_set_pkt_protocol_printer(const dcd_tree_handle_t handle,uint8_t cs_id,int monitor)478c120c564SAndrew Turner OCSD_C_API ocsd_err_t ocsd_dt_set_pkt_protocol_printer(const dcd_tree_handle_t handle, uint8_t cs_id, int monitor)
479c120c564SAndrew Turner {
480c120c564SAndrew Turner ocsd_err_t err = OCSD_ERR_NOT_INIT;
481c120c564SAndrew Turner if (handle != C_API_INVALID_TREE_HANDLE)
482c120c564SAndrew Turner {
483c120c564SAndrew Turner DecodeTree *p_tree = (DecodeTree *)handle;
484c120c564SAndrew Turner err = p_tree->addPacketPrinter(cs_id, (bool)(monitor != 0), 0);
485c120c564SAndrew Turner }
486c120c564SAndrew Turner return err;
487c120c564SAndrew Turner }
488c120c564SAndrew Turner
ocsd_err_str(const ocsd_err_t err,char * buffer,const int buffer_size)48946e6e290SRuslan Bukin OCSD_C_API void ocsd_err_str(const ocsd_err_t err, char *buffer, const int buffer_size)
49046e6e290SRuslan Bukin {
49146e6e290SRuslan Bukin std::string err_str;
49246e6e290SRuslan Bukin err_str = ocsdError::getErrorString(ocsdError(OCSD_ERR_SEV_ERROR, err));
49346e6e290SRuslan Bukin strncpy(buffer, err_str.c_str(), buffer_size - 1);
49446e6e290SRuslan Bukin buffer[buffer_size - 1] = 0;
49546e6e290SRuslan Bukin }
49646e6e290SRuslan Bukin
ocsd_get_last_err(ocsd_trc_index_t * index,uint8_t * chan_id,char * message,const int message_len)49746e6e290SRuslan Bukin OCSD_C_API ocsd_err_t ocsd_get_last_err(ocsd_trc_index_t *index, uint8_t *chan_id, char *message, const int message_len)
49846e6e290SRuslan Bukin {
49946e6e290SRuslan Bukin ocsdError *p_err;
50046e6e290SRuslan Bukin ocsd_err_t err = OCSD_OK;
50146e6e290SRuslan Bukin std::string err_str;
50246e6e290SRuslan Bukin
50346e6e290SRuslan Bukin p_err = DecodeTree::getDefaultErrorLogger()->GetLastError();
50446e6e290SRuslan Bukin if (p_err)
50546e6e290SRuslan Bukin {
50646e6e290SRuslan Bukin *index = p_err->getErrorIndex();
50746e6e290SRuslan Bukin *chan_id = p_err->getErrorChanID();
50846e6e290SRuslan Bukin err_str = p_err->getErrorString(ocsdError(p_err));
50946e6e290SRuslan Bukin strncpy(message, err_str.c_str(), message_len - 1);
51046e6e290SRuslan Bukin message[message_len - 1] = 0;
51146e6e290SRuslan Bukin err = p_err->getErrorCode();
51246e6e290SRuslan Bukin }
51346e6e290SRuslan Bukin else
51446e6e290SRuslan Bukin {
51546e6e290SRuslan Bukin message[0] = 0;
51646e6e290SRuslan Bukin *index = OCSD_BAD_TRC_INDEX;
51746e6e290SRuslan Bukin *chan_id = OCSD_BAD_CS_SRC_ID;
51846e6e290SRuslan Bukin }
51946e6e290SRuslan Bukin return err;
52046e6e290SRuslan Bukin }
52146e6e290SRuslan Bukin
522c120c564SAndrew Turner /*******************************************************************************/
523c120c564SAndrew Turner /* C API local fns */
524c120c564SAndrew Turner /*******************************************************************************/
ocsd_create_pkt_sink_cb(ocsd_trace_protocol_t protocol,FnDefPktDataIn pPktInFn,const void * p_context,ITrcTypedBase ** ppCBObj)525c120c564SAndrew Turner static ocsd_err_t ocsd_create_pkt_sink_cb(ocsd_trace_protocol_t protocol, FnDefPktDataIn pPktInFn, const void *p_context, ITrcTypedBase **ppCBObj )
526c120c564SAndrew Turner {
527c120c564SAndrew Turner ocsd_err_t err = OCSD_OK;
528c120c564SAndrew Turner *ppCBObj = 0;
529c120c564SAndrew Turner
530c120c564SAndrew Turner switch(protocol)
531c120c564SAndrew Turner {
532c120c564SAndrew Turner case OCSD_PROTOCOL_ETMV4I:
533c120c564SAndrew Turner *ppCBObj = new (std::nothrow) PktCBObj<EtmV4ITrcPacket>(pPktInFn,p_context);
534c120c564SAndrew Turner break;
535c120c564SAndrew Turner
536c120c564SAndrew Turner case OCSD_PROTOCOL_ETMV3:
537c120c564SAndrew Turner *ppCBObj = new (std::nothrow) PktCBObj<EtmV3TrcPacket>(pPktInFn,p_context);
538c120c564SAndrew Turner break;
539c120c564SAndrew Turner
540c120c564SAndrew Turner case OCSD_PROTOCOL_PTM:
541c120c564SAndrew Turner *ppCBObj = new (std::nothrow) PktCBObj<PtmTrcPacket>(pPktInFn,p_context);
542c120c564SAndrew Turner break;
543c120c564SAndrew Turner
544c120c564SAndrew Turner case OCSD_PROTOCOL_STM:
545c120c564SAndrew Turner *ppCBObj = new (std::nothrow) PktCBObj<StmTrcPacket>(pPktInFn,p_context);
546c120c564SAndrew Turner break;
547c120c564SAndrew Turner
548c120c564SAndrew Turner default:
549c120c564SAndrew Turner if ((protocol >= OCSD_PROTOCOL_CUSTOM_0) && (protocol < OCSD_PROTOCOL_END))
550c120c564SAndrew Turner {
551c120c564SAndrew Turner *ppCBObj = new (std::nothrow) PktCBObj<void>(pPktInFn, p_context);
552c120c564SAndrew Turner }
553c120c564SAndrew Turner else
554c120c564SAndrew Turner err = OCSD_ERR_NO_PROTOCOL;
555c120c564SAndrew Turner break;
556c120c564SAndrew Turner }
557c120c564SAndrew Turner
558c120c564SAndrew Turner if((*ppCBObj == 0) && (err == OCSD_OK))
559c120c564SAndrew Turner err = OCSD_ERR_MEM;
560c120c564SAndrew Turner
561c120c564SAndrew Turner return err;
562c120c564SAndrew Turner }
563c120c564SAndrew Turner
ocsd_create_pkt_mon_cb(ocsd_trace_protocol_t protocol,FnDefPktDataMon pPktInFn,const void * p_context,ITrcTypedBase ** ppCBObj)564c120c564SAndrew Turner static ocsd_err_t ocsd_create_pkt_mon_cb(ocsd_trace_protocol_t protocol, FnDefPktDataMon pPktInFn, const void *p_context, ITrcTypedBase **ppCBObj )
565c120c564SAndrew Turner {
566c120c564SAndrew Turner ocsd_err_t err = OCSD_OK;
567c120c564SAndrew Turner *ppCBObj = 0;
568c120c564SAndrew Turner
569c120c564SAndrew Turner switch(protocol)
570c120c564SAndrew Turner {
571c120c564SAndrew Turner case OCSD_PROTOCOL_ETMV4I:
572c120c564SAndrew Turner *ppCBObj = new (std::nothrow) PktMonCBObj<EtmV4ITrcPacket>(pPktInFn,p_context);
573c120c564SAndrew Turner break;
574c120c564SAndrew Turner
575c120c564SAndrew Turner case OCSD_PROTOCOL_ETMV3:
576c120c564SAndrew Turner *ppCBObj = new (std::nothrow) PktMonCBObj<EtmV3TrcPacket>(pPktInFn,p_context);
577c120c564SAndrew Turner break;
578c120c564SAndrew Turner
579c120c564SAndrew Turner case OCSD_PROTOCOL_PTM:
580c120c564SAndrew Turner *ppCBObj = new (std::nothrow) PktMonCBObj<PtmTrcPacket>(pPktInFn,p_context);
581c120c564SAndrew Turner break;
582c120c564SAndrew Turner
583c120c564SAndrew Turner case OCSD_PROTOCOL_STM:
584c120c564SAndrew Turner *ppCBObj = new (std::nothrow) PktMonCBObj<StmTrcPacket>(pPktInFn,p_context);
585c120c564SAndrew Turner break;
586c120c564SAndrew Turner
587c120c564SAndrew Turner default:
588c120c564SAndrew Turner if ((protocol >= OCSD_PROTOCOL_CUSTOM_0) && (protocol < OCSD_PROTOCOL_END))
589c120c564SAndrew Turner {
590c120c564SAndrew Turner *ppCBObj = new (std::nothrow) PktMonCBObj<void>(pPktInFn, p_context);
591c120c564SAndrew Turner }
592c120c564SAndrew Turner else
593c120c564SAndrew Turner err = OCSD_ERR_NO_PROTOCOL;
594c120c564SAndrew Turner break;
595c120c564SAndrew Turner }
596c120c564SAndrew Turner
597c120c564SAndrew Turner if((*ppCBObj == 0) && (err == OCSD_OK))
598c120c564SAndrew Turner err = OCSD_ERR_MEM;
599c120c564SAndrew Turner
600c120c564SAndrew Turner return err;
601c120c564SAndrew Turner }
602c120c564SAndrew Turner
ocsd_check_and_add_mem_acc_mapper(const dcd_tree_handle_t handle,DecodeTree ** ppDT)603c120c564SAndrew Turner static ocsd_err_t ocsd_check_and_add_mem_acc_mapper(const dcd_tree_handle_t handle, DecodeTree **ppDT)
604c120c564SAndrew Turner {
605c120c564SAndrew Turner *ppDT = 0;
606c120c564SAndrew Turner if(handle == C_API_INVALID_TREE_HANDLE)
607c120c564SAndrew Turner return OCSD_ERR_INVALID_PARAM_VAL;
608c120c564SAndrew Turner *ppDT = static_cast<DecodeTree *>(handle);
609c120c564SAndrew Turner if(!(*ppDT)->hasMemAccMapper())
610c120c564SAndrew Turner return (*ppDT)->createMemAccMapper();
611c120c564SAndrew Turner return OCSD_OK;
612c120c564SAndrew Turner }
613c120c564SAndrew Turner
614c120c564SAndrew Turner /*******************************************************************************/
615c120c564SAndrew Turner /* C API Helper objects */
616c120c564SAndrew Turner /*******************************************************************************/
617c120c564SAndrew Turner
618c120c564SAndrew Turner /****************** Generic trace element output callback function ************/
GenTraceElemCBObj(FnTraceElemIn pCBFn,const void * p_context)619c120c564SAndrew Turner GenTraceElemCBObj::GenTraceElemCBObj(FnTraceElemIn pCBFn, const void *p_context) :
620c120c564SAndrew Turner m_c_api_cb_fn(pCBFn),
621c120c564SAndrew Turner m_p_cb_context(p_context)
622c120c564SAndrew Turner {
623c120c564SAndrew Turner }
624c120c564SAndrew Turner
TraceElemIn(const ocsd_trc_index_t index_sop,const uint8_t trc_chan_id,const OcsdTraceElement & elem)625c120c564SAndrew Turner ocsd_datapath_resp_t GenTraceElemCBObj::TraceElemIn(const ocsd_trc_index_t index_sop,
626c120c564SAndrew Turner const uint8_t trc_chan_id,
627c120c564SAndrew Turner const OcsdTraceElement &elem)
628c120c564SAndrew Turner {
629c120c564SAndrew Turner return m_c_api_cb_fn(m_p_cb_context, index_sop, trc_chan_id, &elem);
630c120c564SAndrew Turner }
631c120c564SAndrew Turner
632c120c564SAndrew Turner /* End of File ocsd_c_api.cpp */
633