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