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