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