1*17f65170SRuslan Bukin /*
2*17f65170SRuslan Bukin * \file ocsd_lib_dcd_register.cpp
3*17f65170SRuslan Bukin * \brief OpenCSD : Library decoder register object
4*17f65170SRuslan Bukin *
5*17f65170SRuslan Bukin * \copyright Copyright (c) 2016, ARM Limited. All Rights Reserved.
6*17f65170SRuslan Bukin */
7*17f65170SRuslan Bukin
8*17f65170SRuslan Bukin /*
9*17f65170SRuslan Bukin * Redistribution and use in source and binary forms, with or without modification,
10*17f65170SRuslan Bukin * are permitted provided that the following conditions are met:
11*17f65170SRuslan Bukin *
12*17f65170SRuslan Bukin * 1. Redistributions of source code must retain the above copyright notice,
13*17f65170SRuslan Bukin * this list of conditions and the following disclaimer.
14*17f65170SRuslan Bukin *
15*17f65170SRuslan Bukin * 2. Redistributions in binary form must reproduce the above copyright notice,
16*17f65170SRuslan Bukin * this list of conditions and the following disclaimer in the documentation
17*17f65170SRuslan Bukin * and/or other materials provided with the distribution.
18*17f65170SRuslan Bukin *
19*17f65170SRuslan Bukin * 3. Neither the name of the copyright holder nor the names of its contributors
20*17f65170SRuslan Bukin * may be used to endorse or promote products derived from this software without
21*17f65170SRuslan Bukin * specific prior written permission.
22*17f65170SRuslan Bukin *
23*17f65170SRuslan Bukin * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
24*17f65170SRuslan Bukin * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
25*17f65170SRuslan Bukin * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26*17f65170SRuslan Bukin * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
27*17f65170SRuslan Bukin * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
28*17f65170SRuslan Bukin * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
29*17f65170SRuslan Bukin * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
30*17f65170SRuslan Bukin * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31*17f65170SRuslan Bukin * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
32*17f65170SRuslan Bukin * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33*17f65170SRuslan Bukin */
34*17f65170SRuslan Bukin
35*17f65170SRuslan Bukin #include "common/ocsd_lib_dcd_register.h"
36*17f65170SRuslan Bukin
37*17f65170SRuslan Bukin // include built-in decode manager headers
38*17f65170SRuslan Bukin #include "opencsd/etmv4/trc_dcd_mngr_etmv4i.h"
39*17f65170SRuslan Bukin #include "opencsd/etmv3/trc_dcd_mngr_etmv3.h"
40*17f65170SRuslan Bukin #include "opencsd/ptm/trc_dcd_mngr_ptm.h"
41*17f65170SRuslan Bukin #include "opencsd/stm/trc_dcd_mngr_stm.h"
42*17f65170SRuslan Bukin
43*17f65170SRuslan Bukin // create array of built-in decoders to register with library
44*17f65170SRuslan Bukin static built_in_decoder_info_t sBuiltInArray[] = {
45*17f65170SRuslan Bukin CREATE_BUILTIN_ENTRY(DecoderMngrEtmV4I,OCSD_BUILTIN_DCD_ETMV4I),
46*17f65170SRuslan Bukin CREATE_BUILTIN_ENTRY(DecoderMngrEtmV3, OCSD_BUILTIN_DCD_ETMV3),
47*17f65170SRuslan Bukin CREATE_BUILTIN_ENTRY(DecoderMngrPtm, OCSD_BUILTIN_DCD_PTM),
48*17f65170SRuslan Bukin CREATE_BUILTIN_ENTRY(DecoderMngrStm, OCSD_BUILTIN_DCD_STM)
49*17f65170SRuslan Bukin //{ 0, 0, 0}
50*17f65170SRuslan Bukin };
51*17f65170SRuslan Bukin
52*17f65170SRuslan Bukin #define NUM_BUILTINS sizeof(sBuiltInArray) / sizeof(built_in_decoder_info_t)
53*17f65170SRuslan Bukin
54*17f65170SRuslan Bukin
55*17f65170SRuslan Bukin OcsdLibDcdRegister *OcsdLibDcdRegister::m_p_libMngr = 0;
56*17f65170SRuslan Bukin bool OcsdLibDcdRegister::m_b_registeredBuiltins = false;
57*17f65170SRuslan Bukin ocsd_trace_protocol_t OcsdLibDcdRegister::m_nextCustomProtocolID = OCSD_PROTOCOL_CUSTOM_0;
58*17f65170SRuslan Bukin
getDecoderRegister()59*17f65170SRuslan Bukin OcsdLibDcdRegister *OcsdLibDcdRegister::getDecoderRegister()
60*17f65170SRuslan Bukin {
61*17f65170SRuslan Bukin if(m_p_libMngr == 0)
62*17f65170SRuslan Bukin m_p_libMngr = new (std::nothrow) OcsdLibDcdRegister();
63*17f65170SRuslan Bukin return m_p_libMngr;
64*17f65170SRuslan Bukin }
65*17f65170SRuslan Bukin
getNextCustomProtocolID()66*17f65170SRuslan Bukin const ocsd_trace_protocol_t OcsdLibDcdRegister::getNextCustomProtocolID()
67*17f65170SRuslan Bukin {
68*17f65170SRuslan Bukin ocsd_trace_protocol_t ret = m_nextCustomProtocolID;
69*17f65170SRuslan Bukin if(m_nextCustomProtocolID < OCSD_PROTOCOL_END)
70*17f65170SRuslan Bukin m_nextCustomProtocolID = (ocsd_trace_protocol_t)(((int)m_nextCustomProtocolID)+1);
71*17f65170SRuslan Bukin return ret;
72*17f65170SRuslan Bukin }
73*17f65170SRuslan Bukin
releaseLastCustomProtocolID()74*17f65170SRuslan Bukin void OcsdLibDcdRegister::releaseLastCustomProtocolID()
75*17f65170SRuslan Bukin {
76*17f65170SRuslan Bukin if(m_nextCustomProtocolID > OCSD_PROTOCOL_CUSTOM_0)
77*17f65170SRuslan Bukin m_nextCustomProtocolID = (ocsd_trace_protocol_t)(((int)m_nextCustomProtocolID)-1);
78*17f65170SRuslan Bukin }
79*17f65170SRuslan Bukin
OcsdLibDcdRegister()80*17f65170SRuslan Bukin OcsdLibDcdRegister::OcsdLibDcdRegister()
81*17f65170SRuslan Bukin {
82*17f65170SRuslan Bukin m_iter = m_decoder_mngrs.begin();
83*17f65170SRuslan Bukin m_pLastTypedDecoderMngr = 0;
84*17f65170SRuslan Bukin }
85*17f65170SRuslan Bukin
~OcsdLibDcdRegister()86*17f65170SRuslan Bukin OcsdLibDcdRegister::~OcsdLibDcdRegister()
87*17f65170SRuslan Bukin {
88*17f65170SRuslan Bukin m_decoder_mngrs.clear();
89*17f65170SRuslan Bukin m_typed_decoder_mngrs.clear();
90*17f65170SRuslan Bukin m_pLastTypedDecoderMngr = 0;
91*17f65170SRuslan Bukin }
92*17f65170SRuslan Bukin
93*17f65170SRuslan Bukin
registerDecoderTypeByName(const std::string & name,IDecoderMngr * p_decoder_fact)94*17f65170SRuslan Bukin const ocsd_err_t OcsdLibDcdRegister::registerDecoderTypeByName(const std::string &name, IDecoderMngr *p_decoder_fact)
95*17f65170SRuslan Bukin {
96*17f65170SRuslan Bukin if(isRegisteredDecoder(name))
97*17f65170SRuslan Bukin return OCSD_ERR_DCDREG_NAME_REPEAT;
98*17f65170SRuslan Bukin m_decoder_mngrs.emplace(std::pair<const std::string, IDecoderMngr *>(name,p_decoder_fact));
99*17f65170SRuslan Bukin m_typed_decoder_mngrs.emplace(std::pair<const ocsd_trace_protocol_t, IDecoderMngr *>(p_decoder_fact->getProtocolType(),p_decoder_fact));
100*17f65170SRuslan Bukin return OCSD_OK;
101*17f65170SRuslan Bukin }
102*17f65170SRuslan Bukin
registerBuiltInDecoders()103*17f65170SRuslan Bukin void OcsdLibDcdRegister::registerBuiltInDecoders()
104*17f65170SRuslan Bukin {
105*17f65170SRuslan Bukin bool memFail = false;
106*17f65170SRuslan Bukin for(unsigned i = 0; i < NUM_BUILTINS; i++)
107*17f65170SRuslan Bukin {
108*17f65170SRuslan Bukin if(sBuiltInArray[i].PFn)
109*17f65170SRuslan Bukin {
110*17f65170SRuslan Bukin sBuiltInArray[i].pMngr = sBuiltInArray[i].PFn( sBuiltInArray[i].name);
111*17f65170SRuslan Bukin if(!sBuiltInArray[i].pMngr)
112*17f65170SRuslan Bukin memFail=true;
113*17f65170SRuslan Bukin }
114*17f65170SRuslan Bukin }
115*17f65170SRuslan Bukin m_b_registeredBuiltins = !memFail;
116*17f65170SRuslan Bukin }
117*17f65170SRuslan Bukin
deregisterAllDecoders()118*17f65170SRuslan Bukin void OcsdLibDcdRegister::deregisterAllDecoders()
119*17f65170SRuslan Bukin {
120*17f65170SRuslan Bukin if(m_b_registeredBuiltins)
121*17f65170SRuslan Bukin {
122*17f65170SRuslan Bukin for(unsigned i = 0; i < NUM_BUILTINS; i++)
123*17f65170SRuslan Bukin delete sBuiltInArray[i].pMngr;
124*17f65170SRuslan Bukin m_b_registeredBuiltins = false;
125*17f65170SRuslan Bukin }
126*17f65170SRuslan Bukin
127*17f65170SRuslan Bukin if(m_p_libMngr)
128*17f65170SRuslan Bukin {
129*17f65170SRuslan Bukin m_p_libMngr->deRegisterCustomDecoders();
130*17f65170SRuslan Bukin delete m_p_libMngr;
131*17f65170SRuslan Bukin m_p_libMngr = 0;
132*17f65170SRuslan Bukin }
133*17f65170SRuslan Bukin }
134*17f65170SRuslan Bukin
deRegisterCustomDecoders()135*17f65170SRuslan Bukin void OcsdLibDcdRegister::deRegisterCustomDecoders()
136*17f65170SRuslan Bukin {
137*17f65170SRuslan Bukin std::map<const ocsd_trace_protocol_t, IDecoderMngr *>::const_iterator iter = m_typed_decoder_mngrs.begin();
138*17f65170SRuslan Bukin while(iter != m_typed_decoder_mngrs.end())
139*17f65170SRuslan Bukin {
140*17f65170SRuslan Bukin IDecoderMngr *pMngr = iter->second;
141*17f65170SRuslan Bukin if(pMngr->getProtocolType() >= OCSD_PROTOCOL_CUSTOM_0)
142*17f65170SRuslan Bukin delete pMngr;
143*17f65170SRuslan Bukin iter++;
144*17f65170SRuslan Bukin }
145*17f65170SRuslan Bukin }
146*17f65170SRuslan Bukin
getDecoderMngrByName(const std::string & name,IDecoderMngr ** p_decoder_mngr)147*17f65170SRuslan Bukin const ocsd_err_t OcsdLibDcdRegister::getDecoderMngrByName(const std::string &name, IDecoderMngr **p_decoder_mngr)
148*17f65170SRuslan Bukin {
149*17f65170SRuslan Bukin if(!m_b_registeredBuiltins)
150*17f65170SRuslan Bukin {
151*17f65170SRuslan Bukin registerBuiltInDecoders();
152*17f65170SRuslan Bukin if(!m_b_registeredBuiltins)
153*17f65170SRuslan Bukin return OCSD_ERR_MEM;
154*17f65170SRuslan Bukin }
155*17f65170SRuslan Bukin
156*17f65170SRuslan Bukin std::map<const std::string, IDecoderMngr *>::const_iterator iter = m_decoder_mngrs.find(name);
157*17f65170SRuslan Bukin if(iter == m_decoder_mngrs.end())
158*17f65170SRuslan Bukin return OCSD_ERR_DCDREG_NAME_UNKNOWN;
159*17f65170SRuslan Bukin *p_decoder_mngr = iter->second;
160*17f65170SRuslan Bukin return OCSD_OK;
161*17f65170SRuslan Bukin }
162*17f65170SRuslan Bukin
getDecoderMngrByType(const ocsd_trace_protocol_t decoderType,IDecoderMngr ** p_decoder_mngr)163*17f65170SRuslan Bukin const ocsd_err_t OcsdLibDcdRegister::getDecoderMngrByType(const ocsd_trace_protocol_t decoderType, IDecoderMngr **p_decoder_mngr)
164*17f65170SRuslan Bukin {
165*17f65170SRuslan Bukin if(!m_b_registeredBuiltins)
166*17f65170SRuslan Bukin {
167*17f65170SRuslan Bukin registerBuiltInDecoders();
168*17f65170SRuslan Bukin if(!m_b_registeredBuiltins)
169*17f65170SRuslan Bukin return OCSD_ERR_MEM;
170*17f65170SRuslan Bukin }
171*17f65170SRuslan Bukin
172*17f65170SRuslan Bukin if (m_pLastTypedDecoderMngr && (m_pLastTypedDecoderMngr->getProtocolType() == decoderType))
173*17f65170SRuslan Bukin *p_decoder_mngr = m_pLastTypedDecoderMngr;
174*17f65170SRuslan Bukin else
175*17f65170SRuslan Bukin {
176*17f65170SRuslan Bukin std::map<const ocsd_trace_protocol_t, IDecoderMngr *>::const_iterator iter = m_typed_decoder_mngrs.find(decoderType);
177*17f65170SRuslan Bukin if (iter == m_typed_decoder_mngrs.end())
178*17f65170SRuslan Bukin return OCSD_ERR_DCDREG_TYPE_UNKNOWN;
179*17f65170SRuslan Bukin *p_decoder_mngr = m_pLastTypedDecoderMngr = iter->second;
180*17f65170SRuslan Bukin }
181*17f65170SRuslan Bukin return OCSD_OK;
182*17f65170SRuslan Bukin }
183*17f65170SRuslan Bukin
isRegisteredDecoder(const std::string & name)184*17f65170SRuslan Bukin const bool OcsdLibDcdRegister::isRegisteredDecoder(const std::string &name)
185*17f65170SRuslan Bukin {
186*17f65170SRuslan Bukin std::map<const std::string, IDecoderMngr *>::const_iterator iter = m_decoder_mngrs.find(name);
187*17f65170SRuslan Bukin if(iter != m_decoder_mngrs.end())
188*17f65170SRuslan Bukin return true;
189*17f65170SRuslan Bukin return false;
190*17f65170SRuslan Bukin }
191*17f65170SRuslan Bukin
isRegisteredDecoderType(const ocsd_trace_protocol_t decoderType)192*17f65170SRuslan Bukin const bool OcsdLibDcdRegister::isRegisteredDecoderType(const ocsd_trace_protocol_t decoderType)
193*17f65170SRuslan Bukin {
194*17f65170SRuslan Bukin std::map<const ocsd_trace_protocol_t, IDecoderMngr *>::const_iterator iter = m_typed_decoder_mngrs.find(decoderType);
195*17f65170SRuslan Bukin if(iter != m_typed_decoder_mngrs.end())
196*17f65170SRuslan Bukin return true;
197*17f65170SRuslan Bukin return false;
198*17f65170SRuslan Bukin }
199*17f65170SRuslan Bukin
getFirstNamedDecoder(std::string & name)200*17f65170SRuslan Bukin const bool OcsdLibDcdRegister::getFirstNamedDecoder(std::string &name)
201*17f65170SRuslan Bukin {
202*17f65170SRuslan Bukin m_iter = m_decoder_mngrs.begin();
203*17f65170SRuslan Bukin return getNextNamedDecoder(name);
204*17f65170SRuslan Bukin }
205*17f65170SRuslan Bukin
getNextNamedDecoder(std::string & name)206*17f65170SRuslan Bukin const bool OcsdLibDcdRegister::getNextNamedDecoder(std::string &name)
207*17f65170SRuslan Bukin {
208*17f65170SRuslan Bukin if(m_iter == m_decoder_mngrs.end())
209*17f65170SRuslan Bukin return false;
210*17f65170SRuslan Bukin name = m_iter->first;
211*17f65170SRuslan Bukin m_iter++;
212*17f65170SRuslan Bukin return true;
213*17f65170SRuslan Bukin }
214*17f65170SRuslan Bukin
215*17f65170SRuslan Bukin /* End of File ocsd_lib_dcd_register.cpp */
216