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