1c120c564SAndrew Turner /*
2c120c564SAndrew Turner * \file       trc_etmv4_stack_elem.cpp
3c120c564SAndrew Turner * \brief      OpenCSD : ETMv4 decoder
4c120c564SAndrew Turner *
5c120c564SAndrew Turner * \copyright  Copyright (c) 2017, ARM Limited. All Rights Reserved.
6c120c564SAndrew Turner */
7c120c564SAndrew Turner 
8c120c564SAndrew Turner 
9c120c564SAndrew Turner /*
10c120c564SAndrew Turner * Redistribution and use in source and binary forms, with or without modification,
11c120c564SAndrew Turner * are permitted provided that the following conditions are met:
12c120c564SAndrew Turner *
13c120c564SAndrew Turner * 1. Redistributions of source code must retain the above copyright notice,
14c120c564SAndrew Turner * this list of conditions and the following disclaimer.
15c120c564SAndrew Turner *
16c120c564SAndrew Turner * 2. Redistributions in binary form must reproduce the above copyright notice,
17c120c564SAndrew Turner * this list of conditions and the following disclaimer in the documentation
18c120c564SAndrew Turner * and/or other materials provided with the distribution.
19c120c564SAndrew Turner *
20c120c564SAndrew Turner * 3. Neither the name of the copyright holder nor the names of its contributors
21c120c564SAndrew Turner * may be used to endorse or promote products derived from this software without
22c120c564SAndrew Turner * specific prior written permission.
23c120c564SAndrew Turner *
24c120c564SAndrew Turner * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
25c120c564SAndrew Turner * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
26c120c564SAndrew Turner * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
27c120c564SAndrew Turner * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
28c120c564SAndrew Turner * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
29c120c564SAndrew Turner * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
30c120c564SAndrew Turner * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
31c120c564SAndrew Turner * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32c120c564SAndrew Turner * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
33c120c564SAndrew Turner * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34c120c564SAndrew Turner */
35c120c564SAndrew Turner 
36c120c564SAndrew Turner #include "opencsd/etmv4/trc_etmv4_stack_elem.h"
37c120c564SAndrew Turner 
38c120c564SAndrew Turner /* implementation of P0 element stack in ETM v4 trace*/
createParamElemNoParam(const p0_elem_t p0_type,const bool isP0,const ocsd_etmv4_i_pkt_type root_pkt,const ocsd_trc_index_t root_index,bool back)39c120c564SAndrew Turner TrcStackElem *EtmV4P0Stack::createParamElemNoParam(const p0_elem_t p0_type, const bool isP0, const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, bool back /*= false*/)
40c120c564SAndrew Turner {
41c120c564SAndrew Turner     TrcStackElem *pElem = new (std::nothrow) TrcStackElem(p0_type, isP0, root_pkt, root_index);
42c120c564SAndrew Turner     if (pElem)
43c120c564SAndrew Turner     {
44c120c564SAndrew Turner         if (back)
45c120c564SAndrew Turner             push_back(pElem);
46c120c564SAndrew Turner         else
47c120c564SAndrew Turner             push_front(pElem);
48c120c564SAndrew Turner     }
49c120c564SAndrew Turner     return pElem;
50c120c564SAndrew Turner }
51c120c564SAndrew Turner 
createParamElem(const p0_elem_t p0_type,const bool isP0,const ocsd_etmv4_i_pkt_type root_pkt,const ocsd_trc_index_t root_index,const std::vector<uint32_t> & params)52c120c564SAndrew Turner TrcStackElemParam *EtmV4P0Stack::createParamElem(const p0_elem_t p0_type, const bool isP0, const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const std::vector<uint32_t> &params)
53c120c564SAndrew Turner {
54c120c564SAndrew Turner     TrcStackElemParam *pElem = new (std::nothrow) TrcStackElemParam(p0_type, isP0, root_pkt, root_index);
55c120c564SAndrew Turner     if (pElem)
56c120c564SAndrew Turner     {
57c120c564SAndrew Turner         int param_idx = 0;
58c120c564SAndrew Turner         int params_to_fill = params.size();
59c120c564SAndrew Turner         while ((param_idx < 4) && params_to_fill)
60c120c564SAndrew Turner         {
61c120c564SAndrew Turner             pElem->setParam(params[param_idx], param_idx);
62c120c564SAndrew Turner             param_idx++;
63c120c564SAndrew Turner             params_to_fill--;
64c120c564SAndrew Turner         }
65c120c564SAndrew Turner         push_front(pElem);
66c120c564SAndrew Turner     }
67c120c564SAndrew Turner     return pElem;
68c120c564SAndrew Turner }
69c120c564SAndrew Turner 
createAtomElem(const ocsd_etmv4_i_pkt_type root_pkt,const ocsd_trc_index_t root_index,const ocsd_pkt_atom & atom)70c120c564SAndrew Turner TrcStackElemAtom *EtmV4P0Stack::createAtomElem(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const ocsd_pkt_atom &atom)
71c120c564SAndrew Turner {
72c120c564SAndrew Turner     TrcStackElemAtom *pElem = new (std::nothrow) TrcStackElemAtom(root_pkt, root_index);
73c120c564SAndrew Turner     if (pElem)
74c120c564SAndrew Turner     {
75c120c564SAndrew Turner         pElem->setAtom(atom);
76c120c564SAndrew Turner         push_front(pElem);
77c120c564SAndrew Turner     }
78c120c564SAndrew Turner     return pElem;
79c120c564SAndrew Turner }
80c120c564SAndrew Turner 
createExceptElem(const ocsd_etmv4_i_pkt_type root_pkt,const ocsd_trc_index_t root_index,const bool bSame,const uint16_t excepNum)81c120c564SAndrew Turner TrcStackElemExcept *EtmV4P0Stack::createExceptElem(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const bool bSame, const uint16_t excepNum)
82c120c564SAndrew Turner {
83c120c564SAndrew Turner     TrcStackElemExcept *pElem = new (std::nothrow) TrcStackElemExcept(root_pkt, root_index);
84c120c564SAndrew Turner     if (pElem)
85c120c564SAndrew Turner     {
86c120c564SAndrew Turner         pElem->setExcepNum(excepNum);
87c120c564SAndrew Turner         pElem->setPrevSame(bSame);
88c120c564SAndrew Turner         push_front(pElem);
89c120c564SAndrew Turner     }
90c120c564SAndrew Turner     return pElem;
91c120c564SAndrew Turner }
92c120c564SAndrew Turner 
createContextElem(const ocsd_etmv4_i_pkt_type root_pkt,const ocsd_trc_index_t root_index,const etmv4_context_t & context,const uint8_t IS,const bool back)93b6aadd18SAndrew Turner TrcStackElemCtxt *EtmV4P0Stack::createContextElem(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const etmv4_context_t &context, const uint8_t IS, const bool back /*= false*/)
94c120c564SAndrew Turner {
95c120c564SAndrew Turner     TrcStackElemCtxt *pElem = new (std::nothrow) TrcStackElemCtxt(root_pkt, root_index);
96c120c564SAndrew Turner     if (pElem)
97c120c564SAndrew Turner     {
98c120c564SAndrew Turner         pElem->setContext(context);
99b6aadd18SAndrew Turner         pElem->setIS(IS);
100b6aadd18SAndrew Turner         if (back)
101b6aadd18SAndrew Turner             push_back(pElem);
102b6aadd18SAndrew Turner         else
103c120c564SAndrew Turner             push_front(pElem);
104c120c564SAndrew Turner     }
105c120c564SAndrew Turner     return pElem;
106c120c564SAndrew Turner 
107c120c564SAndrew Turner }
108c120c564SAndrew Turner 
createAddrElem(const ocsd_etmv4_i_pkt_type root_pkt,const ocsd_trc_index_t root_index,const etmv4_addr_val_t & addr_val)109c120c564SAndrew Turner TrcStackElemAddr *EtmV4P0Stack::createAddrElem(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const etmv4_addr_val_t &addr_val)
110c120c564SAndrew Turner {
111c120c564SAndrew Turner     TrcStackElemAddr *pElem = new (std::nothrow) TrcStackElemAddr(root_pkt, root_index);
112c120c564SAndrew Turner     if (pElem)
113c120c564SAndrew Turner     {
114c120c564SAndrew Turner         pElem->setAddr(addr_val);
115c120c564SAndrew Turner         push_front(pElem);
116c120c564SAndrew Turner     }
117c120c564SAndrew Turner     return pElem;
118c120c564SAndrew Turner }
119c120c564SAndrew Turner 
createQElem(const ocsd_etmv4_i_pkt_type root_pkt,const ocsd_trc_index_t root_index,const int count)120b6aadd18SAndrew Turner TrcStackQElem *EtmV4P0Stack::createQElem(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const int count)
121b6aadd18SAndrew Turner {
122b6aadd18SAndrew Turner     TrcStackQElem *pElem = new (std::nothrow) TrcStackQElem(root_pkt, root_index);
123b6aadd18SAndrew Turner     if (pElem)
124b6aadd18SAndrew Turner     {
125b6aadd18SAndrew Turner         pElem->setInstrCount(count);
126b6aadd18SAndrew Turner         push_front(pElem);
127b6aadd18SAndrew Turner     }
128b6aadd18SAndrew Turner     return pElem;
129b6aadd18SAndrew Turner }
130b6aadd18SAndrew Turner 
createMarkerElem(const ocsd_etmv4_i_pkt_type root_pkt,const ocsd_trc_index_t root_index,const trace_marker_payload_t & marker)13146e6e290SRuslan Bukin TrcStackElemMarker *EtmV4P0Stack::createMarkerElem(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const trace_marker_payload_t &marker)
13246e6e290SRuslan Bukin {
13346e6e290SRuslan Bukin     TrcStackElemMarker *pElem = new (std::nothrow) TrcStackElemMarker(root_pkt, root_index);
13446e6e290SRuslan Bukin     if (pElem)
13546e6e290SRuslan Bukin     {
13646e6e290SRuslan Bukin         pElem->setMarker(marker);
13746e6e290SRuslan Bukin         push_front(pElem);
13846e6e290SRuslan Bukin     }
13946e6e290SRuslan Bukin     return pElem;
14046e6e290SRuslan Bukin }
14146e6e290SRuslan Bukin 
createSrcAddrElem(const ocsd_etmv4_i_pkt_type root_pkt,const ocsd_trc_index_t root_index,const etmv4_addr_val_t & addr_val)14246e6e290SRuslan Bukin TrcStackElemAddr *EtmV4P0Stack::createSrcAddrElem(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const etmv4_addr_val_t &addr_val)
14346e6e290SRuslan Bukin {
14446e6e290SRuslan Bukin     TrcStackElemAddr *pElem = new (std::nothrow) TrcStackElemAddr(root_pkt, root_index, true);
14546e6e290SRuslan Bukin     if (pElem)
14646e6e290SRuslan Bukin     {
14746e6e290SRuslan Bukin         pElem->setAddr(addr_val);
14846e6e290SRuslan Bukin         push_front(pElem);
14946e6e290SRuslan Bukin     }
15046e6e290SRuslan Bukin     return pElem;
15146e6e290SRuslan Bukin }
15246e6e290SRuslan Bukin 
createITEElem(const ocsd_etmv4_i_pkt_type root_pkt,const ocsd_trc_index_t root_index,const trace_sw_ite_t & ite)15346e6e290SRuslan Bukin TrcStackElemITE *EtmV4P0Stack::createITEElem(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const trace_sw_ite_t &ite)
15446e6e290SRuslan Bukin {
15546e6e290SRuslan Bukin     TrcStackElemITE *pElem = new (std::nothrow) TrcStackElemITE(root_pkt, root_index);
15646e6e290SRuslan Bukin     if (pElem)
15746e6e290SRuslan Bukin     {
15846e6e290SRuslan Bukin         pElem->setITE(ite);
15946e6e290SRuslan Bukin         push_front(pElem);
16046e6e290SRuslan Bukin     }
16146e6e290SRuslan Bukin     return pElem;
16246e6e290SRuslan Bukin }
16346e6e290SRuslan Bukin 
16446e6e290SRuslan Bukin 
165b6aadd18SAndrew Turner // iteration functions
from_front_init()166b6aadd18SAndrew Turner void EtmV4P0Stack::from_front_init()
167b6aadd18SAndrew Turner {
168b6aadd18SAndrew Turner     m_iter = m_P0_stack.begin();
169b6aadd18SAndrew Turner }
170b6aadd18SAndrew Turner 
from_front_next()171b6aadd18SAndrew Turner TrcStackElem *EtmV4P0Stack::from_front_next()
172b6aadd18SAndrew Turner {
173b6aadd18SAndrew Turner     TrcStackElem *pElem = 0;
174b6aadd18SAndrew Turner     if (m_iter != m_P0_stack.end())
175b6aadd18SAndrew Turner     {
176b6aadd18SAndrew Turner         pElem = *m_iter++;
177b6aadd18SAndrew Turner     }
178b6aadd18SAndrew Turner     return pElem;
179b6aadd18SAndrew Turner }
180b6aadd18SAndrew Turner 
erase_curr_from_front()181b6aadd18SAndrew Turner void EtmV4P0Stack::erase_curr_from_front()
182b6aadd18SAndrew Turner {
183b6aadd18SAndrew Turner     std::deque<TrcStackElem *>::iterator erase_iter;
184b6aadd18SAndrew Turner     erase_iter = m_iter;
185b6aadd18SAndrew Turner     erase_iter--;
186b6aadd18SAndrew Turner     m_P0_stack.erase(erase_iter);
18746e6e290SRuslan Bukin 
18846e6e290SRuslan Bukin     // explicitly delete the item here as the caller can no longer reference it.
18946e6e290SRuslan Bukin     // fixes memory leak from github issue #52
19046e6e290SRuslan Bukin     delete *erase_iter;
191b6aadd18SAndrew Turner }
192b6aadd18SAndrew Turner 
193b6aadd18SAndrew Turner 
194c120c564SAndrew Turner /* End of file trc_etmv4_stack_elem.cpp */
195