1c120c564SAndrew Turner /*
2c120c564SAndrew Turner * \file ocsd_dcd_tree.cpp
3c120c564SAndrew Turner * \brief OpenCSD :
4c120c564SAndrew Turner *
5c120c564SAndrew Turner * \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
6c120c564SAndrew Turner */
7c120c564SAndrew Turner
8c120c564SAndrew Turner
9c120c564SAndrew Turner /*
10c120c564SAndrew Turner * Redistribution and use in source and binary forms, with or without modification,
11c120c564SAndrew Turner * are permitted provided that the following conditions are met:
12c120c564SAndrew Turner *
13c120c564SAndrew Turner * 1. Redistributions of source code must retain the above copyright notice,
14c120c564SAndrew Turner * this list of conditions and the following disclaimer.
15c120c564SAndrew Turner *
16c120c564SAndrew Turner * 2. Redistributions in binary form must reproduce the above copyright notice,
17c120c564SAndrew Turner * this list of conditions and the following disclaimer in the documentation
18c120c564SAndrew Turner * and/or other materials provided with the distribution.
19c120c564SAndrew Turner *
20c120c564SAndrew Turner * 3. Neither the name of the copyright holder nor the names of its contributors
21c120c564SAndrew Turner * may be used to endorse or promote products derived from this software without
22c120c564SAndrew Turner * specific prior written permission.
23c120c564SAndrew Turner *
24c120c564SAndrew Turner * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
25c120c564SAndrew Turner * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
26c120c564SAndrew Turner * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
27c120c564SAndrew Turner * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
28c120c564SAndrew Turner * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
29c120c564SAndrew Turner * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
30c120c564SAndrew Turner * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
31c120c564SAndrew Turner * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32c120c564SAndrew Turner * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
33c120c564SAndrew Turner * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34c120c564SAndrew Turner */
35c120c564SAndrew Turner
36c120c564SAndrew Turner #include "common/ocsd_dcd_tree.h"
37c120c564SAndrew Turner #include "common/ocsd_lib_dcd_register.h"
38c120c564SAndrew Turner #include "mem_acc/trc_mem_acc_mapper.h"
39c120c564SAndrew Turner
40c120c564SAndrew Turner /***************************************************************/
41c120c564SAndrew Turner ITraceErrorLog *DecodeTree::s_i_error_logger = &DecodeTree::s_error_logger;
42c120c564SAndrew Turner std::list<DecodeTree *> DecodeTree::s_trace_dcd_trees; /**< list of pointers to decode tree objects */
43c120c564SAndrew Turner ocsdDefaultErrorLogger DecodeTree::s_error_logger; /**< The library default error logger */
44c120c564SAndrew Turner TrcIDecode DecodeTree::s_instruction_decoder; /**< default instruction decode library */
45c120c564SAndrew Turner
CreateDecodeTree(const ocsd_dcd_tree_src_t src_type,uint32_t formatterCfgFlags)46c120c564SAndrew Turner DecodeTree *DecodeTree::CreateDecodeTree(const ocsd_dcd_tree_src_t src_type, uint32_t formatterCfgFlags)
47c120c564SAndrew Turner {
48c120c564SAndrew Turner DecodeTree *dcd_tree = new (std::nothrow) DecodeTree();
49c120c564SAndrew Turner if(dcd_tree != 0)
50c120c564SAndrew Turner {
51c120c564SAndrew Turner if(dcd_tree->initialise(src_type, formatterCfgFlags))
52c120c564SAndrew Turner {
53c120c564SAndrew Turner s_trace_dcd_trees.push_back(dcd_tree);
54c120c564SAndrew Turner }
55c120c564SAndrew Turner else
56c120c564SAndrew Turner {
57c120c564SAndrew Turner delete dcd_tree;
58c120c564SAndrew Turner dcd_tree = 0;
59c120c564SAndrew Turner }
60c120c564SAndrew Turner }
61c120c564SAndrew Turner return dcd_tree;
62c120c564SAndrew Turner }
63c120c564SAndrew Turner
DestroyDecodeTree(DecodeTree * p_dcd_tree)64c120c564SAndrew Turner void DecodeTree::DestroyDecodeTree(DecodeTree *p_dcd_tree)
65c120c564SAndrew Turner {
66c120c564SAndrew Turner std::list<DecodeTree *>::iterator it;
67c120c564SAndrew Turner bool bDestroyed = false;
68c120c564SAndrew Turner it = s_trace_dcd_trees.begin();
69c120c564SAndrew Turner while(!bDestroyed && (it != s_trace_dcd_trees.end()))
70c120c564SAndrew Turner {
71c120c564SAndrew Turner if(*it == p_dcd_tree)
72c120c564SAndrew Turner {
73c120c564SAndrew Turner s_trace_dcd_trees.erase(it);
74c120c564SAndrew Turner delete p_dcd_tree;
75c120c564SAndrew Turner bDestroyed = true;
76c120c564SAndrew Turner }
77c120c564SAndrew Turner else
78c120c564SAndrew Turner it++;
79c120c564SAndrew Turner }
80c120c564SAndrew Turner }
81c120c564SAndrew Turner
setAlternateErrorLogger(ITraceErrorLog * p_error_logger)82c120c564SAndrew Turner void DecodeTree::setAlternateErrorLogger(ITraceErrorLog *p_error_logger)
83c120c564SAndrew Turner {
84c120c564SAndrew Turner if(p_error_logger)
85c120c564SAndrew Turner s_i_error_logger = p_error_logger;
86c120c564SAndrew Turner else
87c120c564SAndrew Turner s_i_error_logger = &s_error_logger;
88c120c564SAndrew Turner }
89c120c564SAndrew Turner
90c120c564SAndrew Turner /***************************************************************/
91c120c564SAndrew Turner
DecodeTree()92c120c564SAndrew Turner DecodeTree::DecodeTree() :
93c120c564SAndrew Turner m_i_instr_decode(&s_instruction_decoder),
94c120c564SAndrew Turner m_i_mem_access(0),
95c120c564SAndrew Turner m_i_gen_elem_out(0),
96c120c564SAndrew Turner m_i_decoder_root(0),
97c120c564SAndrew Turner m_frame_deformatter_root(0),
98c120c564SAndrew Turner m_decode_elem_iter(0),
99c120c564SAndrew Turner m_default_mapper(0),
100c120c564SAndrew Turner m_created_mapper(false)
101c120c564SAndrew Turner {
102c120c564SAndrew Turner for(int i = 0; i < 0x80; i++)
103c120c564SAndrew Turner m_decode_elements[i] = 0;
104*46e6e290SRuslan Bukin
105*46e6e290SRuslan Bukin // reset the global demux stats.
106*46e6e290SRuslan Bukin m_demux_stats.frame_bytes = 0;
107*46e6e290SRuslan Bukin m_demux_stats.no_id_bytes = 0;
108*46e6e290SRuslan Bukin m_demux_stats.valid_id_bytes = 0;
109*46e6e290SRuslan Bukin m_demux_stats.unknown_id_bytes = 0;
110*46e6e290SRuslan Bukin m_demux_stats.reserved_id_bytes = 0;
111c120c564SAndrew Turner }
112c120c564SAndrew Turner
~DecodeTree()113c120c564SAndrew Turner DecodeTree::~DecodeTree()
114c120c564SAndrew Turner {
115c120c564SAndrew Turner destroyMemAccMapper();
116c120c564SAndrew Turner for(uint8_t i = 0; i < 0x80; i++)
117c120c564SAndrew Turner {
118c120c564SAndrew Turner destroyDecodeElement(i);
119c120c564SAndrew Turner }
120c120c564SAndrew Turner PktPrinterFact::destroyAllPrinters(m_printer_list);
121b6aadd18SAndrew Turner delete m_frame_deformatter_root;
122c120c564SAndrew Turner }
123c120c564SAndrew Turner
124c120c564SAndrew Turner
125c120c564SAndrew Turner
TraceDataIn(const ocsd_datapath_op_t op,const ocsd_trc_index_t index,const uint32_t dataBlockSize,const uint8_t * pDataBlock,uint32_t * numBytesProcessed)126c120c564SAndrew Turner ocsd_datapath_resp_t DecodeTree::TraceDataIn( const ocsd_datapath_op_t op,
127c120c564SAndrew Turner const ocsd_trc_index_t index,
128c120c564SAndrew Turner const uint32_t dataBlockSize,
129c120c564SAndrew Turner const uint8_t *pDataBlock,
130c120c564SAndrew Turner uint32_t *numBytesProcessed)
131c120c564SAndrew Turner {
132c120c564SAndrew Turner if(m_i_decoder_root)
133c120c564SAndrew Turner return m_i_decoder_root->TraceDataIn(op,index,dataBlockSize,pDataBlock,numBytesProcessed);
134c120c564SAndrew Turner *numBytesProcessed = 0;
135c120c564SAndrew Turner return OCSD_RESP_FATAL_NOT_INIT;
136c120c564SAndrew Turner }
137c120c564SAndrew Turner
138c120c564SAndrew Turner /* set key interfaces - attach / replace on any existing tree components */
setInstrDecoder(IInstrDecode * i_instr_decode)139c120c564SAndrew Turner void DecodeTree::setInstrDecoder(IInstrDecode *i_instr_decode)
140c120c564SAndrew Turner {
141c120c564SAndrew Turner uint8_t elemID;
142c120c564SAndrew Turner DecodeTreeElement *pElem = 0;
143c120c564SAndrew Turner
144c120c564SAndrew Turner pElem = getFirstElement(elemID);
145c120c564SAndrew Turner while(pElem != 0)
146c120c564SAndrew Turner {
147c120c564SAndrew Turner pElem->getDecoderMngr()->attachInstrDecoder(pElem->getDecoderHandle(),i_instr_decode);
148c120c564SAndrew Turner pElem = getNextElement(elemID);
149c120c564SAndrew Turner }
150c120c564SAndrew Turner }
151c120c564SAndrew Turner
setMemAccessI(ITargetMemAccess * i_mem_access)152c120c564SAndrew Turner void DecodeTree::setMemAccessI(ITargetMemAccess *i_mem_access)
153c120c564SAndrew Turner {
154c120c564SAndrew Turner uint8_t elemID;
155c120c564SAndrew Turner DecodeTreeElement *pElem = 0;
156c120c564SAndrew Turner
157c120c564SAndrew Turner pElem = getFirstElement(elemID);
158c120c564SAndrew Turner while(pElem != 0)
159c120c564SAndrew Turner {
160c120c564SAndrew Turner pElem->getDecoderMngr()->attachMemAccessor(pElem->getDecoderHandle(),i_mem_access);
161c120c564SAndrew Turner pElem = getNextElement(elemID);
162c120c564SAndrew Turner }
163c120c564SAndrew Turner m_i_mem_access = i_mem_access;
164c120c564SAndrew Turner }
165c120c564SAndrew Turner
setGenTraceElemOutI(ITrcGenElemIn * i_gen_trace_elem)166c120c564SAndrew Turner void DecodeTree::setGenTraceElemOutI(ITrcGenElemIn *i_gen_trace_elem)
167c120c564SAndrew Turner {
168c120c564SAndrew Turner uint8_t elemID;
169c120c564SAndrew Turner DecodeTreeElement *pElem = 0;
170c120c564SAndrew Turner
171c120c564SAndrew Turner pElem = getFirstElement(elemID);
172c120c564SAndrew Turner while(pElem != 0)
173c120c564SAndrew Turner {
174c120c564SAndrew Turner pElem->getDecoderMngr()->attachOutputSink(pElem->getDecoderHandle(),i_gen_trace_elem);
175c120c564SAndrew Turner pElem = getNextElement(elemID);
176c120c564SAndrew Turner }
177c120c564SAndrew Turner }
178c120c564SAndrew Turner
createMemAccMapper(memacc_mapper_t type)179c120c564SAndrew Turner ocsd_err_t DecodeTree::createMemAccMapper(memacc_mapper_t type /* = MEMACC_MAP_GLOBAL*/ )
180c120c564SAndrew Turner {
181c120c564SAndrew Turner // clean up any old one
182c120c564SAndrew Turner destroyMemAccMapper();
183c120c564SAndrew Turner
184c120c564SAndrew Turner // make a new one
185c120c564SAndrew Turner switch(type)
186c120c564SAndrew Turner {
187c120c564SAndrew Turner default:
188c120c564SAndrew Turner case MEMACC_MAP_GLOBAL:
189c120c564SAndrew Turner m_default_mapper = new (std::nothrow) TrcMemAccMapGlobalSpace();
190c120c564SAndrew Turner break;
191c120c564SAndrew Turner }
192c120c564SAndrew Turner
193c120c564SAndrew Turner // set the access interface
194c120c564SAndrew Turner if(m_default_mapper)
195c120c564SAndrew Turner {
196c120c564SAndrew Turner m_created_mapper = true;
197c120c564SAndrew Turner setMemAccessI(m_default_mapper);
198c120c564SAndrew Turner m_default_mapper->setErrorLog(s_i_error_logger);
199c120c564SAndrew Turner }
200c120c564SAndrew Turner
201c120c564SAndrew Turner return (m_default_mapper != 0) ? OCSD_OK : OCSD_ERR_MEM;
202c120c564SAndrew Turner }
203c120c564SAndrew Turner
setExternMemAccMapper(TrcMemAccMapper * pMapper)204c120c564SAndrew Turner void DecodeTree::setExternMemAccMapper(TrcMemAccMapper* pMapper)
205c120c564SAndrew Turner {
206c120c564SAndrew Turner destroyMemAccMapper(); // destroy any existing mapper - if decode tree created it.
207c120c564SAndrew Turner m_default_mapper = pMapper;
208c120c564SAndrew Turner }
209c120c564SAndrew Turner
destroyMemAccMapper()210c120c564SAndrew Turner void DecodeTree::destroyMemAccMapper()
211c120c564SAndrew Turner {
212c120c564SAndrew Turner if(m_default_mapper && m_created_mapper)
213c120c564SAndrew Turner {
214c120c564SAndrew Turner m_default_mapper->RemoveAllAccessors();
215c120c564SAndrew Turner delete m_default_mapper;
216c120c564SAndrew Turner m_default_mapper = 0;
217c120c564SAndrew Turner m_created_mapper = false;
218c120c564SAndrew Turner }
219c120c564SAndrew Turner }
220c120c564SAndrew Turner
logMappedRanges()221c120c564SAndrew Turner void DecodeTree::logMappedRanges()
222c120c564SAndrew Turner {
223c120c564SAndrew Turner if(m_default_mapper)
224c120c564SAndrew Turner m_default_mapper->logMappedRanges();
225c120c564SAndrew Turner }
226c120c564SAndrew Turner
227c120c564SAndrew Turner /* Memory accessor creation - all on default mem accessor using the 0 CSID for global core space. */
addBufferMemAcc(const ocsd_vaddr_t address,const ocsd_mem_space_acc_t mem_space,const uint8_t * p_mem_buffer,const uint32_t mem_length)228c120c564SAndrew Turner ocsd_err_t DecodeTree::addBufferMemAcc(const ocsd_vaddr_t address, const ocsd_mem_space_acc_t mem_space, const uint8_t *p_mem_buffer, const uint32_t mem_length)
229c120c564SAndrew Turner {
230c120c564SAndrew Turner if(!hasMemAccMapper())
231c120c564SAndrew Turner return OCSD_ERR_NOT_INIT;
232c120c564SAndrew Turner
233c120c564SAndrew Turner // need a valid memory buffer, and a least enough bytes for one opcode.
234c120c564SAndrew Turner if((p_mem_buffer == 0) || (mem_length < 4))
235c120c564SAndrew Turner return OCSD_ERR_INVALID_PARAM_VAL;
236c120c564SAndrew Turner
237c120c564SAndrew Turner TrcMemAccessorBase *p_accessor;
238c120c564SAndrew Turner ocsd_err_t err = TrcMemAccFactory::CreateBufferAccessor(&p_accessor, address, p_mem_buffer, mem_length);
239c120c564SAndrew Turner if(err == OCSD_OK)
240c120c564SAndrew Turner {
241c120c564SAndrew Turner TrcMemAccBufPtr *pMBuffAcc = dynamic_cast<TrcMemAccBufPtr *>(p_accessor);
242c120c564SAndrew Turner if(pMBuffAcc)
243c120c564SAndrew Turner {
244c120c564SAndrew Turner pMBuffAcc->setMemSpace(mem_space);
245c120c564SAndrew Turner err = m_default_mapper->AddAccessor(p_accessor,0);
246c120c564SAndrew Turner }
247c120c564SAndrew Turner else
248c120c564SAndrew Turner err = OCSD_ERR_MEM; // wrong type of object - treat as mem error
249c120c564SAndrew Turner
250c120c564SAndrew Turner if(err != OCSD_OK)
251c120c564SAndrew Turner TrcMemAccFactory::DestroyAccessor(p_accessor);
252c120c564SAndrew Turner }
253c120c564SAndrew Turner return err;
254c120c564SAndrew Turner }
255c120c564SAndrew Turner
addBinFileMemAcc(const ocsd_vaddr_t address,const ocsd_mem_space_acc_t mem_space,const std::string & filepath)256c120c564SAndrew Turner ocsd_err_t DecodeTree::addBinFileMemAcc(const ocsd_vaddr_t address, const ocsd_mem_space_acc_t mem_space, const std::string &filepath)
257c120c564SAndrew Turner {
258c120c564SAndrew Turner if(!hasMemAccMapper())
259c120c564SAndrew Turner return OCSD_ERR_NOT_INIT;
260c120c564SAndrew Turner
261c120c564SAndrew Turner if(filepath.length() == 0)
262c120c564SAndrew Turner return OCSD_ERR_INVALID_PARAM_VAL;
263c120c564SAndrew Turner
264c120c564SAndrew Turner TrcMemAccessorBase *p_accessor;
265c120c564SAndrew Turner ocsd_err_t err = TrcMemAccFactory::CreateFileAccessor(&p_accessor,filepath,address);
266c120c564SAndrew Turner
267c120c564SAndrew Turner if(err == OCSD_OK)
268c120c564SAndrew Turner {
269c120c564SAndrew Turner TrcMemAccessorFile *pAcc = dynamic_cast<TrcMemAccessorFile *>(p_accessor);
270c120c564SAndrew Turner if(pAcc)
271c120c564SAndrew Turner {
272c120c564SAndrew Turner pAcc->setMemSpace(mem_space);
273c120c564SAndrew Turner err = m_default_mapper->AddAccessor(pAcc,0);
274c120c564SAndrew Turner }
275c120c564SAndrew Turner else
276c120c564SAndrew Turner err = OCSD_ERR_MEM; // wrong type of object - treat as mem error
277c120c564SAndrew Turner
278c120c564SAndrew Turner if(err != OCSD_OK)
279c120c564SAndrew Turner TrcMemAccFactory::DestroyAccessor(p_accessor);
280c120c564SAndrew Turner }
281c120c564SAndrew Turner return err;
282c120c564SAndrew Turner
283c120c564SAndrew Turner }
284c120c564SAndrew Turner
addBinFileRegionMemAcc(const ocsd_file_mem_region_t * region_array,const int num_regions,const ocsd_mem_space_acc_t mem_space,const std::string & filepath)285c120c564SAndrew Turner ocsd_err_t DecodeTree::addBinFileRegionMemAcc(const ocsd_file_mem_region_t *region_array, const int num_regions, const ocsd_mem_space_acc_t mem_space, const std::string &filepath)
286c120c564SAndrew Turner {
287c120c564SAndrew Turner if(!hasMemAccMapper())
288c120c564SAndrew Turner return OCSD_ERR_NOT_INIT;
289c120c564SAndrew Turner
290c120c564SAndrew Turner if((region_array == 0) || (num_regions == 0) || (filepath.length() == 0))
291c120c564SAndrew Turner return OCSD_ERR_INVALID_PARAM_VAL;
292c120c564SAndrew Turner
293c120c564SAndrew Turner TrcMemAccessorBase *p_accessor;
294c120c564SAndrew Turner int curr_region_idx = 0;
295c120c564SAndrew Turner
296c120c564SAndrew Turner // add first region during the creation of the file accessor.
297c120c564SAndrew Turner ocsd_err_t err = TrcMemAccFactory::CreateFileAccessor(&p_accessor,filepath,region_array[curr_region_idx].start_address,region_array[curr_region_idx].file_offset, region_array[curr_region_idx].region_size);
298c120c564SAndrew Turner if(err == OCSD_OK)
299c120c564SAndrew Turner {
300c120c564SAndrew Turner TrcMemAccessorFile *pAcc = dynamic_cast<TrcMemAccessorFile *>(p_accessor);
301c120c564SAndrew Turner if(pAcc)
302c120c564SAndrew Turner {
303c120c564SAndrew Turner // add additional regions to the file accessor.
304c120c564SAndrew Turner curr_region_idx++;
305c120c564SAndrew Turner while(curr_region_idx < num_regions)
306c120c564SAndrew Turner {
307c120c564SAndrew Turner pAcc->AddOffsetRange(region_array[curr_region_idx].start_address,
308c120c564SAndrew Turner region_array[curr_region_idx].region_size,
309c120c564SAndrew Turner region_array[curr_region_idx].file_offset);
310c120c564SAndrew Turner curr_region_idx++;
311c120c564SAndrew Turner }
312c120c564SAndrew Turner pAcc->setMemSpace(mem_space);
313c120c564SAndrew Turner
314c120c564SAndrew Turner // add the accessor to the map.
315c120c564SAndrew Turner err = m_default_mapper->AddAccessor(pAcc,0);
316c120c564SAndrew Turner }
317c120c564SAndrew Turner else
318c120c564SAndrew Turner err = OCSD_ERR_MEM; // wrong type of object - treat as mem error
319c120c564SAndrew Turner
320c120c564SAndrew Turner if(err != OCSD_OK)
321c120c564SAndrew Turner TrcMemAccFactory::DestroyAccessor(p_accessor);
322c120c564SAndrew Turner }
323c120c564SAndrew Turner return err;
324c120c564SAndrew Turner }
325c120c564SAndrew Turner
updateBinFileRegionMemAcc(const ocsd_file_mem_region_t * region_array,const int num_regions,const ocsd_mem_space_acc_t mem_space,const std::string & filepath)326c120c564SAndrew Turner ocsd_err_t DecodeTree::updateBinFileRegionMemAcc(const ocsd_file_mem_region_t *region_array, const int num_regions, const ocsd_mem_space_acc_t mem_space, const std::string &filepath)
327c120c564SAndrew Turner {
328c120c564SAndrew Turner if (!hasMemAccMapper())
329c120c564SAndrew Turner return OCSD_ERR_NOT_INIT;
330c120c564SAndrew Turner
331c120c564SAndrew Turner if ((region_array == 0) || (num_regions == 0) || (filepath.length() == 0))
332c120c564SAndrew Turner return OCSD_ERR_INVALID_PARAM_VAL;
333c120c564SAndrew Turner
334c120c564SAndrew Turner TrcMemAccessorFile *pAcc = TrcMemAccessorFile::getExistingFileAccessor(filepath);
335c120c564SAndrew Turner if (!pAcc)
336c120c564SAndrew Turner return OCSD_ERR_INVALID_PARAM_VAL;
337c120c564SAndrew Turner
338c120c564SAndrew Turner int curr_region_idx = 0;
339c120c564SAndrew Turner while (curr_region_idx < num_regions)
340c120c564SAndrew Turner {
341c120c564SAndrew Turner // check "new" range
342c120c564SAndrew Turner if (!pAcc->addrStartOfRange(region_array[curr_region_idx].start_address))
343c120c564SAndrew Turner {
344c120c564SAndrew Turner // ensure adds cleanly
345c120c564SAndrew Turner if (!pAcc->AddOffsetRange(region_array[curr_region_idx].start_address,
346c120c564SAndrew Turner region_array[curr_region_idx].region_size,
347c120c564SAndrew Turner region_array[curr_region_idx].file_offset))
348c120c564SAndrew Turner return OCSD_ERR_INVALID_PARAM_VAL; // otherwise bail out
349c120c564SAndrew Turner }
350c120c564SAndrew Turner curr_region_idx++;
351c120c564SAndrew Turner }
352c120c564SAndrew Turner return OCSD_OK;
353c120c564SAndrew Turner }
initCallbackMemAcc(const ocsd_vaddr_t st_address,const ocsd_vaddr_t en_address,const ocsd_mem_space_acc_t mem_space,void * p_cb_func,bool IDfn,const void * p_context)354c120c564SAndrew Turner ocsd_err_t DecodeTree::initCallbackMemAcc(const ocsd_vaddr_t st_address, const ocsd_vaddr_t en_address,
355c120c564SAndrew Turner const ocsd_mem_space_acc_t mem_space, void *p_cb_func, bool IDfn, const void *p_context)
356c120c564SAndrew Turner {
357c120c564SAndrew Turner if(!hasMemAccMapper())
358c120c564SAndrew Turner return OCSD_ERR_NOT_INIT;
359c120c564SAndrew Turner
360c120c564SAndrew Turner if(p_cb_func == 0)
361c120c564SAndrew Turner return OCSD_ERR_INVALID_PARAM_VAL;
362c120c564SAndrew Turner
363c120c564SAndrew Turner TrcMemAccessorBase *p_accessor;
364c120c564SAndrew Turner ocsd_err_t err = TrcMemAccFactory::CreateCBAccessor(&p_accessor, st_address, en_address, mem_space);
365c120c564SAndrew Turner if(err == OCSD_OK)
366c120c564SAndrew Turner {
367c120c564SAndrew Turner TrcMemAccCB *pCBAcc = dynamic_cast<TrcMemAccCB *>(p_accessor);
368c120c564SAndrew Turner if(pCBAcc)
369c120c564SAndrew Turner {
370c120c564SAndrew Turner if (IDfn)
371c120c564SAndrew Turner pCBAcc->setCBIDIfFn((Fn_MemAccID_CB)p_cb_func, p_context);
372c120c564SAndrew Turner else
373c120c564SAndrew Turner pCBAcc->setCBIfFn((Fn_MemAcc_CB)p_cb_func, p_context);
374c120c564SAndrew Turner
375c120c564SAndrew Turner err = m_default_mapper->AddAccessor(p_accessor,0);
376c120c564SAndrew Turner }
377c120c564SAndrew Turner else
378c120c564SAndrew Turner err = OCSD_ERR_MEM; // wrong type of object - treat as mem error
379c120c564SAndrew Turner
380c120c564SAndrew Turner if(err != OCSD_OK)
381c120c564SAndrew Turner TrcMemAccFactory::DestroyAccessor(p_accessor);
382c120c564SAndrew Turner }
383c120c564SAndrew Turner return err;
384c120c564SAndrew Turner }
385c120c564SAndrew Turner
addCallbackMemAcc(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)386c120c564SAndrew Turner ocsd_err_t DecodeTree::addCallbackMemAcc(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)
387c120c564SAndrew Turner {
388c120c564SAndrew Turner return initCallbackMemAcc(st_address, en_address, mem_space, (void *)p_cb_func, false, p_context);
389c120c564SAndrew Turner }
390c120c564SAndrew Turner
addCallbackIDMemAcc(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)391c120c564SAndrew Turner ocsd_err_t DecodeTree::addCallbackIDMemAcc(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)
392c120c564SAndrew Turner {
393c120c564SAndrew Turner return initCallbackMemAcc(st_address, en_address, mem_space, (void *)p_cb_func, true, p_context);
394c120c564SAndrew Turner }
395c120c564SAndrew Turner
removeMemAccByAddress(const ocsd_vaddr_t address,const ocsd_mem_space_acc_t mem_space)396c120c564SAndrew Turner ocsd_err_t DecodeTree::removeMemAccByAddress(const ocsd_vaddr_t address, const ocsd_mem_space_acc_t mem_space)
397c120c564SAndrew Turner {
398c120c564SAndrew Turner if(!hasMemAccMapper())
399c120c564SAndrew Turner return OCSD_ERR_NOT_INIT;
400c120c564SAndrew Turner return m_default_mapper->RemoveAccessorByAddress(address,mem_space,0);
401c120c564SAndrew Turner }
402c120c564SAndrew Turner
createDecoder(const std::string & decoderName,const int createFlags,const CSConfig * pConfig)403c120c564SAndrew Turner ocsd_err_t DecodeTree::createDecoder(const std::string &decoderName, const int createFlags, const CSConfig *pConfig)
404c120c564SAndrew Turner {
405c120c564SAndrew Turner ocsd_err_t err = OCSD_OK;
406c120c564SAndrew Turner IDecoderMngr *pDecoderMngr = 0;
407c120c564SAndrew Turner TraceComponent *pTraceComp = 0;
408c120c564SAndrew Turner int crtFlags = createFlags;
409c120c564SAndrew Turner
410c120c564SAndrew Turner uint8_t CSID = 0; // default for single stream decoder (no deformatter) - we ignore the ID
411c120c564SAndrew Turner if(usingFormatter())
412c120c564SAndrew Turner {
413c120c564SAndrew Turner CSID = pConfig->getTraceID();
414c120c564SAndrew Turner crtFlags |= OCSD_CREATE_FLG_INST_ID;
415c120c564SAndrew Turner }
416c120c564SAndrew Turner
417c120c564SAndrew Turner // create the decode element to attach to the channel.
418c120c564SAndrew Turner if((err = createDecodeElement(CSID)) != OCSD_OK)
419c120c564SAndrew Turner return err;
420c120c564SAndrew Turner
421c120c564SAndrew Turner // get the libary decoder register.
422c120c564SAndrew Turner OcsdLibDcdRegister * lib_reg = OcsdLibDcdRegister::getDecoderRegister();
423c120c564SAndrew Turner if(lib_reg == 0)
424c120c564SAndrew Turner return OCSD_ERR_NOT_INIT;
425c120c564SAndrew Turner
426c120c564SAndrew Turner // find the named decoder
427c120c564SAndrew Turner if((err = lib_reg->getDecoderMngrByName(decoderName,&pDecoderMngr)) != OCSD_OK)
428c120c564SAndrew Turner return err;
429c120c564SAndrew Turner
430c120c564SAndrew Turner // got the decoder...
431c120c564SAndrew Turner if((err = pDecoderMngr->createDecoder(crtFlags,(int)CSID,pConfig,&pTraceComp)) != OCSD_OK)
432c120c564SAndrew Turner return err;
433c120c564SAndrew Turner
434c120c564SAndrew Turner m_decode_elements[CSID]->SetDecoderElement(decoderName, pDecoderMngr, pTraceComp, true);
435c120c564SAndrew Turner
436c120c564SAndrew Turner // always attach an error logger
437c120c564SAndrew Turner if(err == OCSD_OK)
438c120c564SAndrew Turner err = pDecoderMngr->attachErrorLogger(pTraceComp,DecodeTree::s_i_error_logger);
439c120c564SAndrew Turner
440c120c564SAndrew Turner // if we created a packet decoder it may need additional components.
441c120c564SAndrew Turner if(crtFlags & OCSD_CREATE_FLG_FULL_DECODER)
442c120c564SAndrew Turner {
443c120c564SAndrew Turner if(m_i_instr_decode && (err == OCSD_OK))
444c120c564SAndrew Turner err = pDecoderMngr->attachInstrDecoder(pTraceComp,m_i_instr_decode);
445c120c564SAndrew Turner
446c120c564SAndrew Turner if(err == OCSD_ERR_DCD_INTERFACE_UNUSED) // ignore if instruction decoder refused
447c120c564SAndrew Turner err = OCSD_OK;
448c120c564SAndrew Turner
449c120c564SAndrew Turner if(m_i_mem_access && (err == OCSD_OK))
450c120c564SAndrew Turner err = pDecoderMngr->attachMemAccessor(pTraceComp,m_i_mem_access);
451c120c564SAndrew Turner
452c120c564SAndrew Turner if(err == OCSD_ERR_DCD_INTERFACE_UNUSED) // ignore if mem accessor refused
453c120c564SAndrew Turner err = OCSD_OK;
454c120c564SAndrew Turner
455c120c564SAndrew Turner if( m_i_gen_elem_out && (err == OCSD_OK))
456c120c564SAndrew Turner err = pDecoderMngr->attachOutputSink(pTraceComp,m_i_gen_elem_out);
457c120c564SAndrew Turner }
458c120c564SAndrew Turner
459c120c564SAndrew Turner // finally attach the packet processor input to the demux output channel
460c120c564SAndrew Turner if(err == OCSD_OK)
461c120c564SAndrew Turner {
462c120c564SAndrew Turner ITrcDataIn *pDataIn = 0;
463c120c564SAndrew Turner if((err = pDecoderMngr->getDataInputI(pTraceComp,&pDataIn)) == OCSD_OK)
464c120c564SAndrew Turner {
465c120c564SAndrew Turner // got the interface -> attach to demux, or direct to input of decode tree
466c120c564SAndrew Turner if(usingFormatter())
467c120c564SAndrew Turner err = m_frame_deformatter_root->getIDStreamAttachPt(CSID)->attach(pDataIn);
468c120c564SAndrew Turner else
469c120c564SAndrew Turner m_i_decoder_root = pDataIn;
470c120c564SAndrew Turner }
471c120c564SAndrew Turner }
472c120c564SAndrew Turner
473c120c564SAndrew Turner if(err != OCSD_OK)
474c120c564SAndrew Turner {
475c120c564SAndrew Turner destroyDecodeElement(CSID); // will destroy decoder as well.
476c120c564SAndrew Turner }
477c120c564SAndrew Turner return err;
478c120c564SAndrew Turner }
479c120c564SAndrew Turner
removeDecoder(const uint8_t CSID)480c120c564SAndrew Turner ocsd_err_t DecodeTree::removeDecoder(const uint8_t CSID)
481c120c564SAndrew Turner {
482c120c564SAndrew Turner ocsd_err_t err = OCSD_OK;
483c120c564SAndrew Turner uint8_t localID = CSID;
484c120c564SAndrew Turner if(!usingFormatter())
485c120c564SAndrew Turner localID = 0;
486c120c564SAndrew Turner
487c120c564SAndrew Turner if(usingFormatter() && !OCSD_IS_VALID_CS_SRC_ID(CSID))
488c120c564SAndrew Turner err = OCSD_ERR_INVALID_ID;
489c120c564SAndrew Turner else
490c120c564SAndrew Turner {
491c120c564SAndrew Turner destroyDecodeElement(localID);
492c120c564SAndrew Turner }
493c120c564SAndrew Turner return err;
494c120c564SAndrew Turner }
495c120c564SAndrew Turner
getDecoderStats(const uint8_t CSID,ocsd_decode_stats_t ** p_stats_block)496*46e6e290SRuslan Bukin ocsd_err_t DecodeTree::getDecoderStats(const uint8_t CSID, ocsd_decode_stats_t **p_stats_block)
497*46e6e290SRuslan Bukin {
498*46e6e290SRuslan Bukin ocsd_err_t err = OCSD_OK;
499*46e6e290SRuslan Bukin TrcPktProcI *pPktProc = getPktProcI(CSID);
500*46e6e290SRuslan Bukin if (!pPktProc)
501*46e6e290SRuslan Bukin return OCSD_ERR_INVALID_PARAM_VAL;
502*46e6e290SRuslan Bukin err = pPktProc->getStatsBlock(p_stats_block);
503*46e6e290SRuslan Bukin if (err == OCSD_OK) {
504*46e6e290SRuslan Bukin // copy in the global demux stats.
505*46e6e290SRuslan Bukin (*p_stats_block)->demux.frame_bytes = m_demux_stats.frame_bytes;
506*46e6e290SRuslan Bukin (*p_stats_block)->demux.no_id_bytes = m_demux_stats.no_id_bytes;
507*46e6e290SRuslan Bukin (*p_stats_block)->demux.valid_id_bytes = m_demux_stats.valid_id_bytes;
508*46e6e290SRuslan Bukin (*p_stats_block)->demux.unknown_id_bytes = m_demux_stats.unknown_id_bytes;
509*46e6e290SRuslan Bukin (*p_stats_block)->demux.reserved_id_bytes = m_demux_stats.reserved_id_bytes;
510*46e6e290SRuslan Bukin }
511*46e6e290SRuslan Bukin return err;
512*46e6e290SRuslan Bukin }
513*46e6e290SRuslan Bukin
resetDecoderStats(const uint8_t CSID)514*46e6e290SRuslan Bukin ocsd_err_t DecodeTree::resetDecoderStats(const uint8_t CSID)
515*46e6e290SRuslan Bukin {
516*46e6e290SRuslan Bukin TrcPktProcI *pPktProc = getPktProcI(CSID);
517*46e6e290SRuslan Bukin if (!pPktProc)
518*46e6e290SRuslan Bukin return OCSD_ERR_INVALID_PARAM_VAL;
519*46e6e290SRuslan Bukin pPktProc->resetStats();
520*46e6e290SRuslan Bukin
521*46e6e290SRuslan Bukin // reset the global demux stats.
522*46e6e290SRuslan Bukin m_demux_stats.frame_bytes = 0;
523*46e6e290SRuslan Bukin m_demux_stats.no_id_bytes = 0;
524*46e6e290SRuslan Bukin m_demux_stats.valid_id_bytes = 0;
525*46e6e290SRuslan Bukin m_demux_stats.unknown_id_bytes = 0;
526*46e6e290SRuslan Bukin m_demux_stats.reserved_id_bytes = 0;
527*46e6e290SRuslan Bukin return OCSD_OK;
528*46e6e290SRuslan Bukin }
529*46e6e290SRuslan Bukin
getPktProcI(const uint8_t CSID)530*46e6e290SRuslan Bukin TrcPktProcI *DecodeTree::getPktProcI(const uint8_t CSID)
531*46e6e290SRuslan Bukin {
532*46e6e290SRuslan Bukin TrcPktProcI *pPktProc = 0;
533*46e6e290SRuslan Bukin TraceComponent *pComp, *pAssoc;
534*46e6e290SRuslan Bukin DecodeTreeElement *pElem = getDecoderElement(CSID);
535*46e6e290SRuslan Bukin
536*46e6e290SRuslan Bukin if (pElem)
537*46e6e290SRuslan Bukin {
538*46e6e290SRuslan Bukin pComp = pElem->getDecoderHandle();
539*46e6e290SRuslan Bukin if (pComp)
540*46e6e290SRuslan Bukin {
541*46e6e290SRuslan Bukin /* if this is a full decoder then the associated component is the packet processor */
542*46e6e290SRuslan Bukin pAssoc = pComp->getAssocComponent();
543*46e6e290SRuslan Bukin if (pAssoc)
544*46e6e290SRuslan Bukin pPktProc = dynamic_cast<TrcPktProcI *>(pAssoc);
545*46e6e290SRuslan Bukin else
546*46e6e290SRuslan Bukin pPktProc = dynamic_cast<TrcPktProcI *>(pComp);
547*46e6e290SRuslan Bukin }
548*46e6e290SRuslan Bukin }
549*46e6e290SRuslan Bukin return pPktProc;
550*46e6e290SRuslan Bukin }
551*46e6e290SRuslan Bukin
getDecoderElement(const uint8_t CSID) const552c120c564SAndrew Turner DecodeTreeElement * DecodeTree::getDecoderElement(const uint8_t CSID) const
553c120c564SAndrew Turner {
554c120c564SAndrew Turner DecodeTreeElement *ret_elem = 0;
555c120c564SAndrew Turner if(usingFormatter() && OCSD_IS_VALID_CS_SRC_ID(CSID))
556c120c564SAndrew Turner {
557c120c564SAndrew Turner ret_elem = m_decode_elements[CSID];
558c120c564SAndrew Turner }
559c120c564SAndrew Turner else
560c120c564SAndrew Turner ret_elem = m_decode_elements[0]; // ID 0 is used if single leaf tree.
561c120c564SAndrew Turner return ret_elem;
562c120c564SAndrew Turner }
563c120c564SAndrew Turner
getFirstElement(uint8_t & elemID)564c120c564SAndrew Turner DecodeTreeElement *DecodeTree::getFirstElement(uint8_t &elemID)
565c120c564SAndrew Turner {
566c120c564SAndrew Turner m_decode_elem_iter = 0;
567c120c564SAndrew Turner return getNextElement(elemID);
568c120c564SAndrew Turner }
569c120c564SAndrew Turner
getNextElement(uint8_t & elemID)570c120c564SAndrew Turner DecodeTreeElement *DecodeTree::getNextElement(uint8_t &elemID)
571c120c564SAndrew Turner {
572c120c564SAndrew Turner DecodeTreeElement *ret_elem = 0;
573c120c564SAndrew Turner
574c120c564SAndrew Turner if(m_decode_elem_iter < 0x80)
575c120c564SAndrew Turner {
576c120c564SAndrew Turner // find a none zero entry or end of range
577*46e6e290SRuslan Bukin while((m_decode_elem_iter < 0x80) && (m_decode_elements[m_decode_elem_iter] == 0))
578c120c564SAndrew Turner m_decode_elem_iter++;
579c120c564SAndrew Turner
580c120c564SAndrew Turner // return entry unless end of range
581c120c564SAndrew Turner if(m_decode_elem_iter < 0x80)
582c120c564SAndrew Turner {
583c120c564SAndrew Turner ret_elem = m_decode_elements[m_decode_elem_iter];
584c120c564SAndrew Turner elemID = m_decode_elem_iter;
585c120c564SAndrew Turner m_decode_elem_iter++;
586c120c564SAndrew Turner }
587c120c564SAndrew Turner }
588c120c564SAndrew Turner return ret_elem;
589c120c564SAndrew Turner }
590c120c564SAndrew Turner
initialise(const ocsd_dcd_tree_src_t type,uint32_t formatterCfgFlags)591c120c564SAndrew Turner bool DecodeTree::initialise(const ocsd_dcd_tree_src_t type, uint32_t formatterCfgFlags)
592c120c564SAndrew Turner {
593*46e6e290SRuslan Bukin ocsd_err_t err;
594c120c564SAndrew Turner m_dcd_tree_type = type;
595c120c564SAndrew Turner if(type == OCSD_TRC_SRC_FRAME_FORMATTED)
596c120c564SAndrew Turner {
597c120c564SAndrew Turner // frame formatted - we want to create the deformatter and hook it up
598c120c564SAndrew Turner m_frame_deformatter_root = new (std::nothrow) TraceFormatterFrameDecoder();
599c120c564SAndrew Turner if(m_frame_deformatter_root)
600c120c564SAndrew Turner {
601*46e6e290SRuslan Bukin if (m_frame_deformatter_root->Init() != OCSD_OK)
602*46e6e290SRuslan Bukin return false;
603c120c564SAndrew Turner m_frame_deformatter_root->getErrLogAttachPt()->attach(DecodeTree::s_i_error_logger);
604*46e6e290SRuslan Bukin err = m_frame_deformatter_root->Configure(formatterCfgFlags);
605*46e6e290SRuslan Bukin if (err != OCSD_OK)
606*46e6e290SRuslan Bukin return false;
607c120c564SAndrew Turner m_i_decoder_root = dynamic_cast<ITrcDataIn*>(m_frame_deformatter_root);
608*46e6e290SRuslan Bukin m_frame_deformatter_root->SetDemuxStatsBlock(&m_demux_stats);
609c120c564SAndrew Turner }
610c120c564SAndrew Turner else
611*46e6e290SRuslan Bukin return false;
612c120c564SAndrew Turner }
613*46e6e290SRuslan Bukin return true;
614c120c564SAndrew Turner }
615c120c564SAndrew Turner
setSingleRoot(TrcPktProcI * pComp)616c120c564SAndrew Turner void DecodeTree::setSingleRoot(TrcPktProcI *pComp)
617c120c564SAndrew Turner {
618c120c564SAndrew Turner m_i_decoder_root = static_cast<ITrcDataIn*>(pComp);
619c120c564SAndrew Turner }
620c120c564SAndrew Turner
createDecodeElement(const uint8_t CSID)621c120c564SAndrew Turner ocsd_err_t DecodeTree::createDecodeElement(const uint8_t CSID)
622c120c564SAndrew Turner {
623c120c564SAndrew Turner ocsd_err_t err = OCSD_ERR_INVALID_ID;
624c120c564SAndrew Turner if(CSID < 0x80)
625c120c564SAndrew Turner {
626c120c564SAndrew Turner if(m_decode_elements[CSID] == 0)
627c120c564SAndrew Turner {
628c120c564SAndrew Turner m_decode_elements[CSID] = new (std::nothrow) DecodeTreeElement();
629c120c564SAndrew Turner if(m_decode_elements[CSID] == 0)
630c120c564SAndrew Turner err = OCSD_ERR_MEM;
631c120c564SAndrew Turner else
632c120c564SAndrew Turner err = OCSD_OK;
633c120c564SAndrew Turner }
634c120c564SAndrew Turner else
635c120c564SAndrew Turner err = OCSD_ERR_ATTACH_TOO_MANY;
636c120c564SAndrew Turner }
637c120c564SAndrew Turner return err;
638c120c564SAndrew Turner }
639c120c564SAndrew Turner
destroyDecodeElement(const uint8_t CSID)640c120c564SAndrew Turner void DecodeTree::destroyDecodeElement(const uint8_t CSID)
641c120c564SAndrew Turner {
642c120c564SAndrew Turner if(CSID < 0x80)
643c120c564SAndrew Turner {
644c120c564SAndrew Turner if(m_decode_elements[CSID] != 0)
645c120c564SAndrew Turner {
646c120c564SAndrew Turner m_decode_elements[CSID]->DestroyElem();
647c120c564SAndrew Turner delete m_decode_elements[CSID];
648c120c564SAndrew Turner m_decode_elements[CSID] = 0;
649c120c564SAndrew Turner }
650c120c564SAndrew Turner }
651c120c564SAndrew Turner }
652c120c564SAndrew Turner
setIDFilter(std::vector<uint8_t> & ids)653c120c564SAndrew Turner ocsd_err_t DecodeTree::setIDFilter(std::vector<uint8_t> &ids)
654c120c564SAndrew Turner {
655c120c564SAndrew Turner ocsd_err_t err = OCSD_ERR_DCDT_NO_FORMATTER;
656c120c564SAndrew Turner if(usingFormatter())
657c120c564SAndrew Turner {
658c120c564SAndrew Turner err = m_frame_deformatter_root->OutputFilterAllIDs(false);
659c120c564SAndrew Turner if(err == OCSD_OK)
660c120c564SAndrew Turner err = m_frame_deformatter_root->OutputFilterIDs(ids,true);
661c120c564SAndrew Turner }
662c120c564SAndrew Turner return err;
663c120c564SAndrew Turner }
664c120c564SAndrew Turner
clearIDFilter()665c120c564SAndrew Turner ocsd_err_t DecodeTree::clearIDFilter()
666c120c564SAndrew Turner {
667c120c564SAndrew Turner ocsd_err_t err = OCSD_ERR_DCDT_NO_FORMATTER;
668c120c564SAndrew Turner if(usingFormatter())
669c120c564SAndrew Turner {
670c120c564SAndrew Turner err = m_frame_deformatter_root->OutputFilterAllIDs(true);
671c120c564SAndrew Turner }
672c120c564SAndrew Turner return err;
673c120c564SAndrew Turner }
674c120c564SAndrew Turner
675c120c564SAndrew Turner /** add a protocol packet printer */
addPacketPrinter(uint8_t CSID,bool bMonitor,ItemPrinter ** ppPrinter)676c120c564SAndrew Turner ocsd_err_t DecodeTree::addPacketPrinter(uint8_t CSID, bool bMonitor, ItemPrinter **ppPrinter)
677c120c564SAndrew Turner {
678c120c564SAndrew Turner ocsd_err_t err = OCSD_ERR_INVALID_PARAM_VAL;
679c120c564SAndrew Turner DecodeTreeElement *pElement = getDecoderElement(CSID);
680c120c564SAndrew Turner if (pElement)
681c120c564SAndrew Turner {
682c120c564SAndrew Turner ocsd_trace_protocol_t protocol = pElement->getProtocol();
683c120c564SAndrew Turner ItemPrinter *pPrinter;
684c120c564SAndrew Turner
685c120c564SAndrew Turner pPrinter = PktPrinterFact::createProtocolPrinter(getPrinterList(), protocol, CSID);
686c120c564SAndrew Turner if (pPrinter)
687c120c564SAndrew Turner {
688c120c564SAndrew Turner pPrinter->setMessageLogger(getCurrentErrorLogI()->getOutputLogger());
689c120c564SAndrew Turner switch (protocol)
690c120c564SAndrew Turner {
691c120c564SAndrew Turner case OCSD_PROTOCOL_ETMV4I:
692*46e6e290SRuslan Bukin case OCSD_PROTOCOL_ETE:
693c120c564SAndrew Turner {
694c120c564SAndrew Turner PacketPrinter<EtmV4ITrcPacket> *pTPrinter = dynamic_cast<PacketPrinter<EtmV4ITrcPacket> *>(pPrinter);
695c120c564SAndrew Turner if (bMonitor)
696c120c564SAndrew Turner err = pElement->getDecoderMngr()->attachPktMonitor(pElement->getDecoderHandle(), (IPktRawDataMon<EtmV4ITrcPacket> *)pTPrinter);
697c120c564SAndrew Turner else
698c120c564SAndrew Turner err = pElement->getDecoderMngr()->attachPktSink(pElement->getDecoderHandle(), (IPktDataIn<EtmV4ITrcPacket> *)pTPrinter);
699c120c564SAndrew Turner }
700c120c564SAndrew Turner break;
701c120c564SAndrew Turner
702c120c564SAndrew Turner case OCSD_PROTOCOL_ETMV3:
703c120c564SAndrew Turner {
704c120c564SAndrew Turner PacketPrinter<EtmV3TrcPacket> *pTPrinter = dynamic_cast<PacketPrinter<EtmV3TrcPacket> *>(pPrinter);
705c120c564SAndrew Turner if (bMonitor)
706c120c564SAndrew Turner err = pElement->getDecoderMngr()->attachPktMonitor(pElement->getDecoderHandle(), (IPktRawDataMon<EtmV3TrcPacket> *)pTPrinter);
707c120c564SAndrew Turner else
708c120c564SAndrew Turner err = pElement->getDecoderMngr()->attachPktSink(pElement->getDecoderHandle(), (IPktDataIn<EtmV3TrcPacket> *)pTPrinter);
709c120c564SAndrew Turner }
710c120c564SAndrew Turner break;
711c120c564SAndrew Turner
712c120c564SAndrew Turner case OCSD_PROTOCOL_PTM:
713c120c564SAndrew Turner {
714c120c564SAndrew Turner PacketPrinter<PtmTrcPacket> *pTPrinter = dynamic_cast<PacketPrinter<PtmTrcPacket> *>(pPrinter);
715c120c564SAndrew Turner if (bMonitor)
716c120c564SAndrew Turner err = pElement->getDecoderMngr()->attachPktMonitor(pElement->getDecoderHandle(), (IPktRawDataMon<PtmTrcPacket> *)pTPrinter);
717c120c564SAndrew Turner else
718c120c564SAndrew Turner err = pElement->getDecoderMngr()->attachPktSink(pElement->getDecoderHandle(), (IPktDataIn<PtmTrcPacket> *)pTPrinter);
719c120c564SAndrew Turner }
720c120c564SAndrew Turner break;
721c120c564SAndrew Turner
722c120c564SAndrew Turner case OCSD_PROTOCOL_STM:
723c120c564SAndrew Turner {
724c120c564SAndrew Turner PacketPrinter<StmTrcPacket> *pTPrinter = dynamic_cast<PacketPrinter<StmTrcPacket> *>(pPrinter);
725c120c564SAndrew Turner if (bMonitor)
726c120c564SAndrew Turner err = pElement->getDecoderMngr()->attachPktMonitor(pElement->getDecoderHandle(), (IPktRawDataMon<StmTrcPacket> *)pTPrinter);
727c120c564SAndrew Turner else
728c120c564SAndrew Turner err = pElement->getDecoderMngr()->attachPktSink(pElement->getDecoderHandle(), (IPktDataIn<StmTrcPacket> *)pTPrinter);
729c120c564SAndrew Turner }
730c120c564SAndrew Turner break;
731c120c564SAndrew Turner
732c120c564SAndrew Turner default:
733c120c564SAndrew Turner err = OCSD_ERR_NO_PROTOCOL;
734c120c564SAndrew Turner break;
735c120c564SAndrew Turner }
736c120c564SAndrew Turner
737c120c564SAndrew Turner if (err == OCSD_OK)
738c120c564SAndrew Turner {
739c120c564SAndrew Turner if (ppPrinter)
740c120c564SAndrew Turner *ppPrinter = pPrinter;
741c120c564SAndrew Turner }
742c120c564SAndrew Turner else
743c120c564SAndrew Turner PktPrinterFact::destroyPrinter(getPrinterList(), pPrinter);
744c120c564SAndrew Turner }
745c120c564SAndrew Turner }
746c120c564SAndrew Turner return err;
747c120c564SAndrew Turner }
748c120c564SAndrew Turner
749c120c564SAndrew Turner /** add a raw frame printer */
addRawFramePrinter(RawFramePrinter ** ppPrinter,uint32_t flags)750c120c564SAndrew Turner ocsd_err_t DecodeTree::addRawFramePrinter(RawFramePrinter **ppPrinter, uint32_t flags)
751c120c564SAndrew Turner {
752c120c564SAndrew Turner ocsd_err_t err = OCSD_ERR_MEM;
753c120c564SAndrew Turner RawFramePrinter *pPrinter = PktPrinterFact::createRawFramePrinter(getPrinterList());
754c120c564SAndrew Turner if (pPrinter)
755c120c564SAndrew Turner {
756c120c564SAndrew Turner pPrinter->setMessageLogger((DecodeTree::getCurrentErrorLogI()->getOutputLogger()));
757c120c564SAndrew Turner TraceFormatterFrameDecoder *pFrameDecoder = getFrameDeformatter();
758c120c564SAndrew Turner uint32_t cfgFlags = pFrameDecoder->getConfigFlags();
759c120c564SAndrew Turner cfgFlags |= ((uint32_t)flags & (OCSD_DFRMTR_PACKED_RAW_OUT | OCSD_DFRMTR_UNPACKED_RAW_OUT));
760c120c564SAndrew Turner pFrameDecoder->Configure(cfgFlags);
761c120c564SAndrew Turner err = pFrameDecoder->getTrcRawFrameAttachPt()->attach(pPrinter);
762c120c564SAndrew Turner if (ppPrinter && (err==OCSD_OK))
763c120c564SAndrew Turner *ppPrinter = pPrinter;
764c120c564SAndrew Turner }
765c120c564SAndrew Turner return err;
766c120c564SAndrew Turner }
767c120c564SAndrew Turner
768c120c564SAndrew Turner /** add a generic element output printer */
addGenElemPrinter(TrcGenericElementPrinter ** ppPrinter)769c120c564SAndrew Turner ocsd_err_t DecodeTree::addGenElemPrinter(TrcGenericElementPrinter **ppPrinter)
770c120c564SAndrew Turner {
771c120c564SAndrew Turner ocsd_err_t err = OCSD_ERR_MEM;
772c120c564SAndrew Turner TrcGenericElementPrinter *pPrinter = PktPrinterFact::createGenElemPrinter(getPrinterList());
773c120c564SAndrew Turner if (pPrinter)
774c120c564SAndrew Turner {
775c120c564SAndrew Turner pPrinter->setMessageLogger((DecodeTree::getCurrentErrorLogI()->getOutputLogger()));
776c120c564SAndrew Turner setGenTraceElemOutI(pPrinter);
777c120c564SAndrew Turner err = OCSD_OK;
778c120c564SAndrew Turner if (ppPrinter)
779c120c564SAndrew Turner *ppPrinter = pPrinter;
780c120c564SAndrew Turner }
781c120c564SAndrew Turner return err;
782c120c564SAndrew Turner
783c120c564SAndrew Turner }
784c120c564SAndrew Turner
785c120c564SAndrew Turner /* End of File ocsd_dcd_tree.cpp */
786