1c120c564SAndrew Turner /*
2c120c564SAndrew Turner  * \file       trc_etmv4_stack_elem.h
3c120c564SAndrew Turner  * \brief      OpenCSD :
4c120c564SAndrew Turner  *
5c120c564SAndrew Turner  * \copyright  Copyright (c) 2015, ARM Limited. All Rights Reserved.
6c120c564SAndrew Turner  */
7c120c564SAndrew Turner /*
8c120c564SAndrew Turner  * Redistribution and use in source and binary forms, with or without modification,
9c120c564SAndrew Turner  * are permitted provided that the following conditions are met:
10c120c564SAndrew Turner  *
11c120c564SAndrew Turner  * 1. Redistributions of source code must retain the above copyright notice,
12c120c564SAndrew Turner  * this list of conditions and the following disclaimer.
13c120c564SAndrew Turner  *
14c120c564SAndrew Turner  * 2. Redistributions in binary form must reproduce the above copyright notice,
15c120c564SAndrew Turner  * this list of conditions and the following disclaimer in the documentation
16c120c564SAndrew Turner  * and/or other materials provided with the distribution.
17c120c564SAndrew Turner  *
18c120c564SAndrew Turner  * 3. Neither the name of the copyright holder nor the names of its contributors
19c120c564SAndrew Turner  * may be used to endorse or promote products derived from this software without
20c120c564SAndrew Turner  * specific prior written permission.
21c120c564SAndrew Turner  *
22c120c564SAndrew Turner  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
23c120c564SAndrew Turner  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
24c120c564SAndrew Turner  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
25c120c564SAndrew Turner  * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
26c120c564SAndrew Turner  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
27c120c564SAndrew Turner  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28c120c564SAndrew Turner  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
29c120c564SAndrew Turner  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30c120c564SAndrew Turner  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
31c120c564SAndrew Turner  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32c120c564SAndrew Turner  */
33c120c564SAndrew Turner #ifndef ARM_TRC_ETMV4_STACK_ELEM_H_INCLUDED
34c120c564SAndrew Turner #define ARM_TRC_ETMV4_STACK_ELEM_H_INCLUDED
35c120c564SAndrew Turner 
36c120c564SAndrew Turner #include "opencsd/etmv4/trc_pkt_types_etmv4.h"
3746e6e290SRuslan Bukin #include "opencsd/trc_gen_elem_types.h"
38c120c564SAndrew Turner 
39c120c564SAndrew Turner #include <deque>
40c120c564SAndrew Turner #include <vector>
41c120c564SAndrew Turner 
42c120c564SAndrew Turner /* ETMv4 I trace stack elements
43c120c564SAndrew Turner     Speculation requires that we stack certain elements till they are committed or
44c120c564SAndrew Turner     cancelled. (P0 elements + other associated parts.)
45c120c564SAndrew Turner */
46c120c564SAndrew Turner 
47c120c564SAndrew Turner typedef enum _p0_elem_t
48c120c564SAndrew Turner {
49c120c564SAndrew Turner     P0_UNKNOWN,
50c120c564SAndrew Turner     P0_ATOM,
51c120c564SAndrew Turner     P0_ADDR,
52c120c564SAndrew Turner     P0_CTXT,
53c120c564SAndrew Turner     P0_TRC_ON,
54c120c564SAndrew Turner     P0_EXCEP,
55c120c564SAndrew Turner     P0_EXCEP_RET,
56c120c564SAndrew Turner     P0_EVENT,
57c120c564SAndrew Turner     P0_TS,
58c120c564SAndrew Turner     P0_CC,
59c120c564SAndrew Turner     P0_TS_CC,
6046e6e290SRuslan Bukin     P0_MARKER,
61b6aadd18SAndrew Turner     P0_Q,
62c120c564SAndrew Turner     P0_OVERFLOW,
63c120c564SAndrew Turner     P0_FUNC_RET,
6446e6e290SRuslan Bukin     P0_SRC_ADDR,
6546e6e290SRuslan Bukin     P0_TRANS_TRACE_INIT,
6646e6e290SRuslan Bukin     P0_TRANS_START,
6746e6e290SRuslan Bukin     P0_TRANS_COMMIT,
6846e6e290SRuslan Bukin     P0_TRANS_FAIL,
6946e6e290SRuslan Bukin     P0_ITE,
70c120c564SAndrew Turner } p0_elem_t;
71c120c564SAndrew Turner 
72c120c564SAndrew Turner 
73c120c564SAndrew Turner /************************************************************/
74c120c564SAndrew Turner /***Trace stack element base class -
75c120c564SAndrew Turner     record originating packet type and index in buffer*/
76c120c564SAndrew Turner 
77c120c564SAndrew Turner class TrcStackElem {
78c120c564SAndrew Turner public:
79c120c564SAndrew Turner      TrcStackElem(const p0_elem_t p0_type, const bool isP0, const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index);
~TrcStackElem()80c120c564SAndrew Turner      virtual ~TrcStackElem() {};
81c120c564SAndrew Turner 
getP0Type()82c120c564SAndrew Turner      const p0_elem_t getP0Type() const { return m_P0_type; };
getRootPkt()83c120c564SAndrew Turner      const ocsd_etmv4_i_pkt_type getRootPkt() const { return m_root_pkt; };
getRootIndex()84c120c564SAndrew Turner      const ocsd_trc_index_t getRootIndex() const  { return m_root_idx; };
isP0()85c120c564SAndrew Turner      const bool isP0() const { return m_is_P0; };
86c120c564SAndrew Turner 
87c120c564SAndrew Turner private:
88c120c564SAndrew Turner      ocsd_etmv4_i_pkt_type m_root_pkt;
89c120c564SAndrew Turner      ocsd_trc_index_t m_root_idx;
90c120c564SAndrew Turner      p0_elem_t m_P0_type;
91c120c564SAndrew Turner 
92c120c564SAndrew Turner protected:
93c120c564SAndrew Turner      bool m_is_P0;  // true if genuine P0 - commit / cancellable, false otherwise
94c120c564SAndrew Turner 
95c120c564SAndrew Turner };
96c120c564SAndrew Turner 
TrcStackElem(p0_elem_t p0_type,const bool isP0,ocsd_etmv4_i_pkt_type root_pkt,ocsd_trc_index_t root_index)97c120c564SAndrew Turner inline TrcStackElem::TrcStackElem(p0_elem_t p0_type, const bool isP0, ocsd_etmv4_i_pkt_type root_pkt, ocsd_trc_index_t root_index) :
98c120c564SAndrew Turner     m_root_pkt(root_pkt),
99c120c564SAndrew Turner     m_root_idx(root_index),
100c120c564SAndrew Turner     m_P0_type(p0_type),
101c120c564SAndrew Turner     m_is_P0(isP0)
102c120c564SAndrew Turner {
103c120c564SAndrew Turner }
104c120c564SAndrew Turner 
105c120c564SAndrew Turner /************************************************************/
106c120c564SAndrew Turner /** Address element */
107c120c564SAndrew Turner 
108c120c564SAndrew Turner class TrcStackElemAddr : public TrcStackElem
109c120c564SAndrew Turner {
110c120c564SAndrew Turner protected:
111c120c564SAndrew Turner     TrcStackElemAddr(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index);
11246e6e290SRuslan Bukin     TrcStackElemAddr(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const bool src_addr);
~TrcStackElemAddr()113c120c564SAndrew Turner     virtual ~TrcStackElemAddr() {};
114c120c564SAndrew Turner 
115c120c564SAndrew Turner     friend class EtmV4P0Stack;
116c120c564SAndrew Turner 
117c120c564SAndrew Turner public:
setAddr(const etmv4_addr_val_t & addr_val)118c120c564SAndrew Turner     void setAddr(const etmv4_addr_val_t &addr_val) { m_addr_val = addr_val; };
getAddr()119c120c564SAndrew Turner     const etmv4_addr_val_t &getAddr() const { return m_addr_val; };
120c120c564SAndrew Turner 
121c120c564SAndrew Turner private:
122c120c564SAndrew Turner     etmv4_addr_val_t m_addr_val;
123c120c564SAndrew Turner };
124c120c564SAndrew Turner 
TrcStackElemAddr(const ocsd_etmv4_i_pkt_type root_pkt,const ocsd_trc_index_t root_index)125c120c564SAndrew Turner inline TrcStackElemAddr::TrcStackElemAddr(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index) :
126c120c564SAndrew Turner     TrcStackElem(P0_ADDR, false, root_pkt,root_index)
127c120c564SAndrew Turner {
128c120c564SAndrew Turner     m_addr_val.val = 0;
129c120c564SAndrew Turner     m_addr_val.isa = 0;
130c120c564SAndrew Turner }
131c120c564SAndrew Turner 
TrcStackElemAddr(const ocsd_etmv4_i_pkt_type root_pkt,const ocsd_trc_index_t root_index,const bool src_addr)13246e6e290SRuslan Bukin inline TrcStackElemAddr::TrcStackElemAddr(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const bool src_addr) :
13346e6e290SRuslan Bukin     TrcStackElem(src_addr ? P0_SRC_ADDR : P0_ADDR, false, root_pkt, root_index)
13446e6e290SRuslan Bukin {
13546e6e290SRuslan Bukin     m_addr_val.val = 0;
13646e6e290SRuslan Bukin     m_addr_val.isa = 0;
13746e6e290SRuslan Bukin }
13846e6e290SRuslan Bukin 
13946e6e290SRuslan Bukin 
140c120c564SAndrew Turner /************************************************************/
141b6aadd18SAndrew Turner /** Q element */
142b6aadd18SAndrew Turner class TrcStackQElem : public TrcStackElem
143b6aadd18SAndrew Turner {
144b6aadd18SAndrew Turner protected:
145b6aadd18SAndrew Turner     TrcStackQElem(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index);
~TrcStackQElem()146b6aadd18SAndrew Turner     virtual ~TrcStackQElem() {};
147b6aadd18SAndrew Turner 
148b6aadd18SAndrew Turner     friend class EtmV4P0Stack;
149b6aadd18SAndrew Turner 
150b6aadd18SAndrew Turner public:
setInstrCount(const int instr_count)151b6aadd18SAndrew Turner     void setInstrCount(const int instr_count) { m_instr_count = instr_count; };
getInstrCount()152b6aadd18SAndrew Turner     const int getInstrCount() const { return m_instr_count;  }
153b6aadd18SAndrew Turner 
setAddr(const etmv4_addr_val_t & addr_val)154b6aadd18SAndrew Turner     void setAddr(const etmv4_addr_val_t &addr_val)
155b6aadd18SAndrew Turner     {
156b6aadd18SAndrew Turner         m_addr_val = addr_val;
157b6aadd18SAndrew Turner         m_has_addr = true;
158b6aadd18SAndrew Turner     };
getAddr()159b6aadd18SAndrew Turner     const etmv4_addr_val_t &getAddr() const { return m_addr_val; };
hasAddr()160b6aadd18SAndrew Turner     const bool hasAddr() const { return  m_has_addr; };
161b6aadd18SAndrew Turner 
162b6aadd18SAndrew Turner private:
163b6aadd18SAndrew Turner     bool m_has_addr;
164b6aadd18SAndrew Turner     etmv4_addr_val_t m_addr_val;
165b6aadd18SAndrew Turner     int m_instr_count;
166b6aadd18SAndrew Turner 
167b6aadd18SAndrew Turner };
168b6aadd18SAndrew Turner 
TrcStackQElem(const ocsd_etmv4_i_pkt_type root_pkt,const ocsd_trc_index_t root_index)169b6aadd18SAndrew Turner inline TrcStackQElem::TrcStackQElem(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index) :
170b6aadd18SAndrew Turner     TrcStackElem(P0_Q , true, root_pkt, root_index)
171b6aadd18SAndrew Turner {
172b6aadd18SAndrew Turner     m_addr_val.val = 0;
173b6aadd18SAndrew Turner     m_addr_val.isa = 0;
174b6aadd18SAndrew Turner     m_has_addr = false;
175b6aadd18SAndrew Turner     m_instr_count = 0;
176b6aadd18SAndrew Turner }
177b6aadd18SAndrew Turner 
178b6aadd18SAndrew Turner /************************************************************/
179c120c564SAndrew Turner /** Context element */
180c120c564SAndrew Turner 
181c120c564SAndrew Turner class TrcStackElemCtxt : public TrcStackElem
182c120c564SAndrew Turner {
183c120c564SAndrew Turner protected:
184c120c564SAndrew Turner     TrcStackElemCtxt(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index);
~TrcStackElemCtxt()185c120c564SAndrew Turner     virtual ~TrcStackElemCtxt() {};
186c120c564SAndrew Turner 
187c120c564SAndrew Turner     friend class EtmV4P0Stack;
188c120c564SAndrew Turner 
189c120c564SAndrew Turner public:
setContext(const etmv4_context_t & ctxt)190c120c564SAndrew Turner     void setContext(const  etmv4_context_t &ctxt) { m_context = ctxt; };
getContext()191c120c564SAndrew Turner     const  etmv4_context_t &getContext() const  { return m_context; };
setIS(const uint8_t IS)192b6aadd18SAndrew Turner     void setIS(const uint8_t IS) { m_IS = IS; };
getIS()193b6aadd18SAndrew Turner     const uint8_t getIS() const { return m_IS; };
194c120c564SAndrew Turner 
195c120c564SAndrew Turner private:
196c120c564SAndrew Turner      etmv4_context_t m_context;
197b6aadd18SAndrew Turner      uint8_t m_IS;  //!< IS value at time of generation of packet.
198c120c564SAndrew Turner };
199c120c564SAndrew Turner 
TrcStackElemCtxt(const ocsd_etmv4_i_pkt_type root_pkt,const ocsd_trc_index_t root_index)200c120c564SAndrew Turner inline TrcStackElemCtxt::TrcStackElemCtxt(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index) :
201c120c564SAndrew Turner     TrcStackElem(P0_CTXT, false, root_pkt,root_index)
202c120c564SAndrew Turner {
203c120c564SAndrew Turner }
204c120c564SAndrew Turner 
205c120c564SAndrew Turner /************************************************************/
206c120c564SAndrew Turner /** Exception element */
207c120c564SAndrew Turner 
208c120c564SAndrew Turner class TrcStackElemExcept : public TrcStackElem
209c120c564SAndrew Turner {
210c120c564SAndrew Turner protected:
211c120c564SAndrew Turner     TrcStackElemExcept(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index);
~TrcStackElemExcept()212c120c564SAndrew Turner     virtual ~TrcStackElemExcept() {};
213c120c564SAndrew Turner 
214c120c564SAndrew Turner     friend class EtmV4P0Stack;
215c120c564SAndrew Turner 
216c120c564SAndrew Turner public:
setPrevSame(bool bSame)217c120c564SAndrew Turner     void setPrevSame(bool bSame) { m_prev_addr_same = bSame; };
getPrevSame()218c120c564SAndrew Turner     const bool getPrevSame() const { return m_prev_addr_same; };
219c120c564SAndrew Turner 
setExcepNum(const uint16_t num)220c120c564SAndrew Turner     void setExcepNum(const uint16_t num) { m_excep_num = num; };
getExcepNum()221c120c564SAndrew Turner     const uint16_t getExcepNum() const { return m_excep_num; };
222c120c564SAndrew Turner 
223c120c564SAndrew Turner private:
224c120c564SAndrew Turner     bool m_prev_addr_same;
225c120c564SAndrew Turner     uint16_t m_excep_num;
226c120c564SAndrew Turner };
227c120c564SAndrew Turner 
TrcStackElemExcept(const ocsd_etmv4_i_pkt_type root_pkt,const ocsd_trc_index_t root_index)228c120c564SAndrew Turner inline TrcStackElemExcept::TrcStackElemExcept(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index) :
229c120c564SAndrew Turner     TrcStackElem(P0_EXCEP, true, root_pkt,root_index),
230c120c564SAndrew Turner         m_prev_addr_same(false)
231c120c564SAndrew Turner {
232c120c564SAndrew Turner }
233c120c564SAndrew Turner 
234c120c564SAndrew Turner /************************************************************/
235c120c564SAndrew Turner /** Atom element */
236c120c564SAndrew Turner 
237c120c564SAndrew Turner class TrcStackElemAtom : public TrcStackElem
238c120c564SAndrew Turner {
239c120c564SAndrew Turner protected:
240c120c564SAndrew Turner     TrcStackElemAtom(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index);
~TrcStackElemAtom()241c120c564SAndrew Turner     virtual ~TrcStackElemAtom() {};
242c120c564SAndrew Turner 
243c120c564SAndrew Turner     friend class EtmV4P0Stack;
244c120c564SAndrew Turner 
245c120c564SAndrew Turner public:
setAtom(const ocsd_pkt_atom & atom)246c120c564SAndrew Turner     void setAtom(const ocsd_pkt_atom &atom) { m_atom = atom; };
247c120c564SAndrew Turner 
248c120c564SAndrew Turner     const ocsd_atm_val commitOldest();
249c120c564SAndrew Turner     int cancelNewest(const int nCancel);
250b6aadd18SAndrew Turner     void mispredictNewest();
isEmpty()251c120c564SAndrew Turner     const bool isEmpty() const { return (m_atom.num == 0); };
252c120c564SAndrew Turner 
253c120c564SAndrew Turner private:
254c120c564SAndrew Turner     ocsd_pkt_atom m_atom;
255c120c564SAndrew Turner };
256c120c564SAndrew Turner 
TrcStackElemAtom(const ocsd_etmv4_i_pkt_type root_pkt,const ocsd_trc_index_t root_index)257c120c564SAndrew Turner inline TrcStackElemAtom::TrcStackElemAtom(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index) :
258c120c564SAndrew Turner     TrcStackElem(P0_ATOM, true, root_pkt,root_index)
259c120c564SAndrew Turner {
260c120c564SAndrew Turner     m_atom.num = 0;
261c120c564SAndrew Turner }
262c120c564SAndrew Turner 
263c120c564SAndrew Turner // commit oldest - get value and remove it from pattern
commitOldest()264c120c564SAndrew Turner inline const ocsd_atm_val TrcStackElemAtom::commitOldest()
265c120c564SAndrew Turner {
266c120c564SAndrew Turner     ocsd_atm_val val = (m_atom.En_bits & 0x1) ? ATOM_E : ATOM_N;
267c120c564SAndrew Turner     m_atom.num--;
268c120c564SAndrew Turner     m_atom.En_bits >>= 1;
269c120c564SAndrew Turner     return val;
270c120c564SAndrew Turner }
271c120c564SAndrew Turner 
272c120c564SAndrew Turner // cancel newest - just reduce the atom count.
cancelNewest(const int nCancel)273c120c564SAndrew Turner inline int TrcStackElemAtom::cancelNewest(const int nCancel)
274c120c564SAndrew Turner {
275c120c564SAndrew Turner     int nRemove = (nCancel <= m_atom.num) ? nCancel : m_atom.num;
276c120c564SAndrew Turner     m_atom.num -= nRemove;
277c120c564SAndrew Turner     return nRemove;
278c120c564SAndrew Turner }
279c120c564SAndrew Turner 
280b6aadd18SAndrew Turner // mispredict newest - flip the bit of the newest atom
mispredictNewest()281b6aadd18SAndrew Turner inline void TrcStackElemAtom::mispredictNewest()
282b6aadd18SAndrew Turner {
283b6aadd18SAndrew Turner     uint32_t mask = 0x1 << (m_atom.num - 1);
284b6aadd18SAndrew Turner     if (m_atom.En_bits & mask)
285b6aadd18SAndrew Turner         m_atom.En_bits &= ~mask;
286b6aadd18SAndrew Turner     else
287b6aadd18SAndrew Turner         m_atom.En_bits |= mask;
288b6aadd18SAndrew Turner }
289b6aadd18SAndrew Turner 
290c120c564SAndrew Turner /************************************************************/
291c120c564SAndrew Turner /** Generic param element */
292c120c564SAndrew Turner 
293c120c564SAndrew Turner class TrcStackElemParam : public TrcStackElem
294c120c564SAndrew Turner {
295c120c564SAndrew Turner protected:
296c120c564SAndrew Turner     TrcStackElemParam(const p0_elem_t p0_type, const bool isP0, const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index);
~TrcStackElemParam()297c120c564SAndrew Turner     virtual ~TrcStackElemParam() {};
298c120c564SAndrew Turner 
299c120c564SAndrew Turner     friend class EtmV4P0Stack;
300c120c564SAndrew Turner 
301c120c564SAndrew Turner public:
setParam(const uint32_t param,const int nParamNum)302c120c564SAndrew Turner     void setParam(const uint32_t param, const int nParamNum) { m_param[(nParamNum & 0x3)] = param; };
getParam(const int nParamNum)303c120c564SAndrew Turner     const uint32_t &getParam(const int nParamNum) const { return m_param[(nParamNum & 0x3)]; };
304c120c564SAndrew Turner 
305c120c564SAndrew Turner private:
306c120c564SAndrew Turner     uint32_t m_param[4];
307c120c564SAndrew Turner };
308c120c564SAndrew Turner 
TrcStackElemParam(const p0_elem_t p0_type,const bool isP0,const ocsd_etmv4_i_pkt_type root_pkt,const ocsd_trc_index_t root_index)309c120c564SAndrew Turner inline TrcStackElemParam::TrcStackElemParam(const p0_elem_t p0_type, const bool isP0, const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index) :
310c120c564SAndrew Turner     TrcStackElem(p0_type, isP0, root_pkt,root_index)
311c120c564SAndrew Turner {
312c120c564SAndrew Turner }
313c120c564SAndrew Turner 
314c120c564SAndrew Turner /************************************************************/
31546e6e290SRuslan Bukin /** Marker element */
31646e6e290SRuslan Bukin 
31746e6e290SRuslan Bukin class TrcStackElemMarker : public TrcStackElem
31846e6e290SRuslan Bukin {
31946e6e290SRuslan Bukin protected:
32046e6e290SRuslan Bukin     TrcStackElemMarker(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index);
~TrcStackElemMarker()32146e6e290SRuslan Bukin     virtual ~TrcStackElemMarker() {};
32246e6e290SRuslan Bukin 
32346e6e290SRuslan Bukin     friend class EtmV4P0Stack;
32446e6e290SRuslan Bukin 
32546e6e290SRuslan Bukin public:
setMarker(const trace_marker_payload_t & marker)32646e6e290SRuslan Bukin     void setMarker(const trace_marker_payload_t &marker) { m_marker = marker; };
getMarker()32746e6e290SRuslan Bukin     const trace_marker_payload_t &getMarker() const { return m_marker; };
32846e6e290SRuslan Bukin 
32946e6e290SRuslan Bukin private:
33046e6e290SRuslan Bukin     trace_marker_payload_t m_marker;
33146e6e290SRuslan Bukin };
33246e6e290SRuslan Bukin 
TrcStackElemMarker(const ocsd_etmv4_i_pkt_type root_pkt,const ocsd_trc_index_t root_index)33346e6e290SRuslan Bukin inline TrcStackElemMarker::TrcStackElemMarker(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index) :
33446e6e290SRuslan Bukin     TrcStackElem(P0_MARKER, false, root_pkt, root_index)
33546e6e290SRuslan Bukin {
33646e6e290SRuslan Bukin }
33746e6e290SRuslan Bukin 
33846e6e290SRuslan Bukin /************************************************************/
33946e6e290SRuslan Bukin /* Instrumentation element
34046e6e290SRuslan Bukin  */
34146e6e290SRuslan Bukin 
34246e6e290SRuslan Bukin class TrcStackElemITE : public TrcStackElem
34346e6e290SRuslan Bukin {
34446e6e290SRuslan Bukin protected:
34546e6e290SRuslan Bukin     TrcStackElemITE(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index);
~TrcStackElemITE()34646e6e290SRuslan Bukin     virtual ~TrcStackElemITE() {};
34746e6e290SRuslan Bukin 
34846e6e290SRuslan Bukin     friend class EtmV4P0Stack;
34946e6e290SRuslan Bukin 
35046e6e290SRuslan Bukin public:
setITE(const trace_sw_ite_t & ite)35146e6e290SRuslan Bukin     void setITE(const trace_sw_ite_t &ite) { m_ite = ite; };
getITE()35246e6e290SRuslan Bukin     const trace_sw_ite_t &getITE() { return m_ite; };
35346e6e290SRuslan Bukin 
35446e6e290SRuslan Bukin private:
35546e6e290SRuslan Bukin     trace_sw_ite_t m_ite;
35646e6e290SRuslan Bukin };
35746e6e290SRuslan Bukin 
TrcStackElemITE(const ocsd_etmv4_i_pkt_type root_pkt,const ocsd_trc_index_t root_index)35846e6e290SRuslan Bukin inline TrcStackElemITE::TrcStackElemITE(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index) :
35946e6e290SRuslan Bukin     TrcStackElem(P0_ITE, false, root_pkt, root_index)
36046e6e290SRuslan Bukin {
36146e6e290SRuslan Bukin }
36246e6e290SRuslan Bukin 
36346e6e290SRuslan Bukin /************************************************************/
364c120c564SAndrew Turner /* P0 element stack that allows push of elements, and deletion of elements when done.
365c120c564SAndrew Turner */
366c120c564SAndrew Turner class EtmV4P0Stack
367c120c564SAndrew Turner {
368c120c564SAndrew Turner public:
EtmV4P0Stack()369c120c564SAndrew Turner     EtmV4P0Stack() {};
370c120c564SAndrew Turner     ~EtmV4P0Stack();
371c120c564SAndrew Turner 
372c120c564SAndrew Turner     void push_front(TrcStackElem *pElem);
373c120c564SAndrew Turner     void push_back(TrcStackElem *pElem);        // insert element when processing
374b6aadd18SAndrew Turner     void pop_back(bool pend_delete = true);
375b6aadd18SAndrew Turner     void pop_front(bool pend_delete = true);
376c120c564SAndrew Turner     TrcStackElem *back();
377b6aadd18SAndrew Turner     TrcStackElem *front();
378c120c564SAndrew Turner     size_t size();
379c120c564SAndrew Turner 
380b6aadd18SAndrew Turner     // iterate through stack from front
381b6aadd18SAndrew Turner     void from_front_init();
382b6aadd18SAndrew Turner     TrcStackElem *from_front_next();
383b6aadd18SAndrew Turner     void erase_curr_from_front();  // erase the element last returned
384b6aadd18SAndrew Turner 
385c120c564SAndrew Turner     void delete_all();
386c120c564SAndrew Turner     void delete_back();
387b6aadd18SAndrew Turner     void delete_front();
388c120c564SAndrew Turner     void delete_popped();
389c120c564SAndrew Turner 
390c120c564SAndrew Turner     // creation functions - create and push if successful.
391c120c564SAndrew Turner     TrcStackElemParam *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);
392c120c564SAndrew Turner     TrcStackElem *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);
393c120c564SAndrew Turner     TrcStackElemAtom *createAtomElem (const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const ocsd_pkt_atom &atom);
394c120c564SAndrew Turner     TrcStackElemExcept *createExceptElem(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const bool bSame, const uint16_t excepNum);
395b6aadd18SAndrew Turner     TrcStackElemCtxt *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);
396c120c564SAndrew Turner     TrcStackElemAddr *createAddrElem(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const etmv4_addr_val_t &addr_val);
397b6aadd18SAndrew Turner     TrcStackQElem *createQElem(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const int count);
39846e6e290SRuslan Bukin     TrcStackElemMarker *createMarkerElem(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const trace_marker_payload_t &marker);
39946e6e290SRuslan Bukin     TrcStackElemAddr *createSrcAddrElem(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const etmv4_addr_val_t &addr_val);
40046e6e290SRuslan Bukin     TrcStackElemITE *createITEElem(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const trace_sw_ite_t &ite);
40146e6e290SRuslan Bukin 
402c120c564SAndrew Turner private:
403c120c564SAndrew Turner     std::deque<TrcStackElem *> m_P0_stack;  //!< P0 decode element stack
404c120c564SAndrew Turner     std::vector<TrcStackElem *> m_popped_elem;  //!< save list of popped but not deleted elements.
405b6aadd18SAndrew Turner     std::deque<TrcStackElem *>::iterator m_iter;    //!< iterate across the list w/o removing stuff
406c120c564SAndrew Turner };
407c120c564SAndrew Turner 
~EtmV4P0Stack()408c120c564SAndrew Turner inline EtmV4P0Stack::~EtmV4P0Stack()
409c120c564SAndrew Turner {
410c120c564SAndrew Turner     delete_all();
411c120c564SAndrew Turner     delete_popped();
412c120c564SAndrew Turner }
413c120c564SAndrew Turner 
414c120c564SAndrew Turner // put an element on the front of the stack
push_front(TrcStackElem * pElem)415c120c564SAndrew Turner inline void EtmV4P0Stack::push_front(TrcStackElem *pElem)
416c120c564SAndrew Turner {
417c120c564SAndrew Turner     m_P0_stack.push_front(pElem);
418c120c564SAndrew Turner }
419c120c564SAndrew Turner 
420c120c564SAndrew Turner // put an element on the back of the stack
push_back(TrcStackElem * pElem)421c120c564SAndrew Turner inline void EtmV4P0Stack::push_back(TrcStackElem *pElem)
422c120c564SAndrew Turner {
423c120c564SAndrew Turner     m_P0_stack.push_back(pElem);
424c120c564SAndrew Turner }
425c120c564SAndrew Turner 
426c120c564SAndrew Turner // pop last element pointer off the stack and stash it for later deletion
pop_back(bool pend_delete)427b6aadd18SAndrew Turner inline void EtmV4P0Stack::pop_back(bool pend_delete /* = true */)
428c120c564SAndrew Turner {
429b6aadd18SAndrew Turner     if (pend_delete)
430c120c564SAndrew Turner         m_popped_elem.push_back(m_P0_stack.back());
431c120c564SAndrew Turner     m_P0_stack.pop_back();
432c120c564SAndrew Turner }
433c120c564SAndrew Turner 
pop_front(bool pend_delete)434b6aadd18SAndrew Turner inline void EtmV4P0Stack::pop_front(bool pend_delete /* = true */)
435b6aadd18SAndrew Turner {
436b6aadd18SAndrew Turner     if (pend_delete)
437b6aadd18SAndrew Turner         m_popped_elem.push_back(m_P0_stack.front());
438b6aadd18SAndrew Turner     m_P0_stack.pop_front();
439b6aadd18SAndrew Turner }
440b6aadd18SAndrew Turner 
441c120c564SAndrew Turner // pop last element pointer off the stack and delete immediately
delete_back()442c120c564SAndrew Turner inline void EtmV4P0Stack::delete_back()
443c120c564SAndrew Turner {
444c120c564SAndrew Turner     if (m_P0_stack.size() > 0)
445c120c564SAndrew Turner     {
446c120c564SAndrew Turner         TrcStackElem* pElem = m_P0_stack.back();
447c120c564SAndrew Turner         delete pElem;
448c120c564SAndrew Turner         m_P0_stack.pop_back();
449c120c564SAndrew Turner     }
450c120c564SAndrew Turner }
451c120c564SAndrew Turner 
452b6aadd18SAndrew Turner // pop first element pointer off the stack and delete immediately
delete_front()453b6aadd18SAndrew Turner inline void EtmV4P0Stack::delete_front()
454b6aadd18SAndrew Turner {
455b6aadd18SAndrew Turner     if (m_P0_stack.size() > 0)
456b6aadd18SAndrew Turner     {
457b6aadd18SAndrew Turner         TrcStackElem* pElem = m_P0_stack.front();
458b6aadd18SAndrew Turner         delete pElem;
459b6aadd18SAndrew Turner         m_P0_stack.pop_front();
460b6aadd18SAndrew Turner     }
461b6aadd18SAndrew Turner }
462b6aadd18SAndrew Turner 
463b6aadd18SAndrew Turner 
464b6aadd18SAndrew Turner 
465c120c564SAndrew Turner // get a pointer to the last element on the stack
back()466c120c564SAndrew Turner inline TrcStackElem *EtmV4P0Stack::back()
467c120c564SAndrew Turner {
468c120c564SAndrew Turner     return m_P0_stack.back();
469c120c564SAndrew Turner }
470c120c564SAndrew Turner 
front()471b6aadd18SAndrew Turner inline TrcStackElem *EtmV4P0Stack::front()
472b6aadd18SAndrew Turner {
473b6aadd18SAndrew Turner     return m_P0_stack.front();
474b6aadd18SAndrew Turner }
475b6aadd18SAndrew Turner 
476c120c564SAndrew Turner // remove and delete all the elements left on the stack
delete_all()477c120c564SAndrew Turner inline void EtmV4P0Stack::delete_all()
478c120c564SAndrew Turner {
479c120c564SAndrew Turner     while (m_P0_stack.size() > 0)
480c120c564SAndrew Turner         delete_back();
481c120c564SAndrew Turner     m_P0_stack.clear();
482c120c564SAndrew Turner }
483c120c564SAndrew Turner 
484c120c564SAndrew Turner // delete list of popped elements.
delete_popped()485c120c564SAndrew Turner inline void EtmV4P0Stack::delete_popped()
486c120c564SAndrew Turner {
487c120c564SAndrew Turner     while (m_popped_elem.size() > 0)
488c120c564SAndrew Turner     {
489c120c564SAndrew Turner         delete m_popped_elem.back();
490c120c564SAndrew Turner         m_popped_elem.pop_back();
491c120c564SAndrew Turner     }
492c120c564SAndrew Turner     m_popped_elem.clear();
493c120c564SAndrew Turner }
494c120c564SAndrew Turner 
495c120c564SAndrew Turner // get current number of elements on the stack
size()496c120c564SAndrew Turner inline size_t EtmV4P0Stack::size()
497c120c564SAndrew Turner {
498c120c564SAndrew Turner     return m_P0_stack.size();
499c120c564SAndrew Turner }
500c120c564SAndrew Turner 
501c120c564SAndrew Turner #endif // ARM_TRC_ETMV4_STACK_ELEM_H_INCLUDED
502c120c564SAndrew Turner 
503c120c564SAndrew Turner /* End of File trc_etmv4_stack_elem.h */
504