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