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