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