OpenCSD - CoreSight Trace Decode Library 1.8.3
Loading...
Searching...
No Matches
trc_etmv4_stack_elem.h
Go to the documentation of this file.
1/*
2 * \file trc_etmv4_stack_elem.h
3 * \brief OpenCSD :
4 *
5 * \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
6 */
7/*
8 * Redistribution and use in source and binary forms, with or without modification,
9 * are permitted provided that the following conditions are met:
10 *
11 * 1. Redistributions of source code must retain the above copyright notice,
12 * this list of conditions and the following disclaimer.
13 *
14 * 2. Redistributions in binary form must reproduce the above copyright notice,
15 * this list of conditions and the following disclaimer in the documentation
16 * and/or other materials provided with the distribution.
17 *
18 * 3. Neither the name of the copyright holder nor the names of its contributors
19 * may be used to endorse or promote products derived from this software without
20 * specific prior written permission.
21 *
22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
23 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
24 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
25 * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
26 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
27 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
29 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
31 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 */
33#ifndef ARM_TRC_ETMV4_STACK_ELEM_H_INCLUDED
34#define ARM_TRC_ETMV4_STACK_ELEM_H_INCLUDED
35
38
39#include <deque>
40#include <vector>
41
42/* ETMv4 I trace stack elements
43 Speculation requires that we stack certain elements till they are committed or
44 cancelled. (P0 elements + other associated parts.)
45*/
46
73
74
75/************************************************************/
76/***Trace stack element base class -
77 record originating packet type and index in buffer*/
78
80public:
81 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);
82 virtual ~TrcStackElem() {};
83
84 const p0_elem_t getP0Type() const { return m_P0_type; };
85 const ocsd_etmv4_i_pkt_type getRootPkt() const { return m_root_pkt; };
86 const ocsd_trc_index_t getRootIndex() const { return m_root_idx; };
87 const bool isP0() const { return m_is_P0; };
88
89private:
90 ocsd_etmv4_i_pkt_type m_root_pkt;
91 ocsd_trc_index_t m_root_idx;
92 p0_elem_t m_P0_type;
93
94protected:
95 bool m_is_P0; // true if genuine P0 - commit / cancellable, false otherwise
96
97};
98
99inline TrcStackElem::TrcStackElem(p0_elem_t p0_type, const bool isP0, ocsd_etmv4_i_pkt_type root_pkt, ocsd_trc_index_t root_index) :
100 m_root_pkt(root_pkt),
101 m_root_idx(root_index),
102 m_P0_type(p0_type),
104{
105}
106
107/************************************************************/
109
111{
112protected:
113 TrcStackElemAddr(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index);
114 TrcStackElemAddr(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const bool src_addr);
115 virtual ~TrcStackElemAddr() {};
116
117 friend class EtmV4P0Stack;
118
119public:
120 void setAddr(const etmv4_addr_val_t &addr_val) { m_addr_val = addr_val; };
121 const etmv4_addr_val_t &getAddr() const { return m_addr_val; };
122
123private:
124 etmv4_addr_val_t m_addr_val;
125};
126
128 TrcStackElem(P0_ADDR, false, root_pkt,root_index)
129{
130 m_addr_val.val = 0;
131 m_addr_val.isa = 0;
132}
133
134inline TrcStackElemAddr::TrcStackElemAddr(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const bool src_addr) :
135 TrcStackElem(src_addr ? P0_SRC_ADDR : P0_ADDR, false, root_pkt, root_index)
136{
137 m_addr_val.val = 0;
138 m_addr_val.isa = 0;
139}
140
141
142/************************************************************/
145{
146protected:
147 TrcStackQElem(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index);
148 virtual ~TrcStackQElem() {};
149
150 friend class EtmV4P0Stack;
151
152public:
153 void setInstrCount(const int instr_count) { m_instr_count = instr_count; };
154 const int getInstrCount() const { return m_instr_count; }
155
156 void setAddr(const etmv4_addr_val_t &addr_val)
157 {
158 m_addr_val = addr_val;
159 m_has_addr = true;
160 };
161 const etmv4_addr_val_t &getAddr() const { return m_addr_val; };
162 const bool hasAddr() const { return m_has_addr; };
163
164private:
165 bool m_has_addr;
166 etmv4_addr_val_t m_addr_val;
167 int m_instr_count;
168
169};
170
172 TrcStackElem(P0_Q , true, root_pkt, root_index)
173{
174 m_addr_val.val = 0;
175 m_addr_val.isa = 0;
176 m_has_addr = false;
177 m_instr_count = 0;
178}
179
180/************************************************************/
182
184{
185protected:
186 TrcStackElemCtxt(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index);
187 virtual ~TrcStackElemCtxt() {};
188
189 friend class EtmV4P0Stack;
190
191public:
192 void setContext(const etmv4_context_t &ctxt) { m_context = ctxt; };
193 const etmv4_context_t &getContext() const { return m_context; };
194
195private:
196 etmv4_context_t m_context;
197};
198
200 TrcStackElem(P0_CTXT, false, root_pkt,root_index)
201{
202}
203
204/************************************************************/
206
208{
209protected:
210 TrcStackElemExcept(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index);
212
213 friend class EtmV4P0Stack;
214
215public:
216 void setPrevSame(bool bSame) { m_prev_addr_same = bSame; };
217 const bool getPrevSame() const { return m_prev_addr_same; };
218
219 void setExcepNum(const uint16_t num) { m_excep_num = num; };
220 const uint16_t getExcepNum() const { return m_excep_num; };
221
222private:
223 bool m_prev_addr_same;
224 uint16_t m_excep_num;
225};
226
228 TrcStackElem(P0_EXCEP, true, root_pkt,root_index),
229 m_prev_addr_same(false)
230{
231}
232
233/************************************************************/
235
237{
238protected:
239 TrcStackElemAtom(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index);
240 virtual ~TrcStackElemAtom() {};
241
242 friend class EtmV4P0Stack;
243
244public:
245 void setAtom(const ocsd_pkt_atom &atom) { m_atom = atom; };
246
248 int cancelNewest(const int nCancel);
249 void mispredictNewest();
250 const bool isEmpty() const { return (m_atom.num == 0); };
251
252private:
253 ocsd_pkt_atom m_atom;
254};
255
257 TrcStackElem(P0_ATOM, true, root_pkt,root_index)
258{
259 m_atom.num = 0;
260}
261
262// commit oldest - get value and remove it from pattern
264{
265 ocsd_atm_val val = (m_atom.En_bits & 0x1) ? ATOM_E : ATOM_N;
266 m_atom.num--;
267 m_atom.En_bits >>= 1;
268 return val;
269}
270
271// cancel newest - just reduce the atom count.
272inline int TrcStackElemAtom::cancelNewest(const int nCancel)
273{
274 int nRemove = (nCancel <= m_atom.num) ? nCancel : m_atom.num;
275 m_atom.num -= nRemove;
276 return nRemove;
277}
278
279// mispredict newest - flip the bit of the newest atom
281{
282 uint32_t mask = 0x1 << (m_atom.num - 1);
283 if (m_atom.En_bits & mask)
284 m_atom.En_bits &= ~mask;
285 else
286 m_atom.En_bits |= mask;
287}
288
289/************************************************************/
291
293{
294protected:
295 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);
296 virtual ~TrcStackElemParam() {};
297
298 friend class EtmV4P0Stack;
299
300public:
301 void setParam(const uint32_t param, const int nParamNum) { m_param[(nParamNum & 0x3)] = param; };
302 const uint32_t &getParam(const int nParamNum) const { return m_param[(nParamNum & 0x3)]; };
303
304private:
305 uint32_t m_param[4];
306};
307
308inline 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) :
309 TrcStackElem(p0_type, isP0, root_pkt,root_index)
310{
311}
312
313/************************************************************/
315
317{
318protected:
319 TrcStackElemMarker(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index);
321
322 friend class EtmV4P0Stack;
323
324public:
325 void setMarker(const trace_marker_payload_t &marker) { m_marker = marker; };
326 const trace_marker_payload_t &getMarker() const { return m_marker; };
327
328private:
329 trace_marker_payload_t m_marker;
330};
331
333 TrcStackElem(P0_MARKER, false, root_pkt, root_index)
334{
335}
336
337/************************************************************/
338/* Instrumentation element
339 */
340
342{
343protected:
344 TrcStackElemITE(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index);
345 virtual ~TrcStackElemITE() {};
346
347 friend class EtmV4P0Stack;
348
349public:
350 void setITE(const trace_sw_ite_t &ite) { m_ite = ite; };
351 const trace_sw_ite_t &getITE() { return m_ite; };
352
353private:
354 trace_sw_ite_t m_ite;
355};
356
358 TrcStackElem(P0_ITE, false, root_pkt, root_index)
359{
360}
361
362/************************************************************/
363/* P0 element stack that allows push of elements, and deletion of elements when done.
364*/
366{
367public:
370
371 void push_front(TrcStackElem *pElem);
372 void push_back(TrcStackElem *pElem); // insert element when processing
373 void pop_back(bool pend_delete = true);
374 void pop_front(bool pend_delete = true);
377 size_t size();
378
379 // iterate through stack from front
382 void erase_curr_from_front(); // erase the element last returned
383
384 void delete_all();
385 void delete_back();
386 void delete_front();
387 void delete_popped();
388
389 // creation functions - create and push if successful.
390 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);
391 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);
393 TrcStackElemExcept *createExceptElem(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const bool bSame, const uint16_t excepNum);
394 TrcStackElemCtxt *createContextElem(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const etmv4_context_t &context, const bool back = false);
395 TrcStackElemAddr *createAddrElem(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const etmv4_addr_val_t &addr_val);
396 TrcStackQElem *createQElem(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const int count);
400
401 /* create unseen & uncommited P0 elements before sync TInfo - allow subsequent commit / cancel to be applied */
402 int createUnseenUncommitedP0Elem(const int n_unseen, const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index);
403
404private:
405 std::deque<TrcStackElem *> m_P0_stack;
406 std::vector<TrcStackElem *> m_popped_elem;
407 std::deque<TrcStackElem *>::iterator m_iter;
408};
409
411{
412 delete_all();
414}
415
416// put an element on the front of the stack
418{
419 m_P0_stack.push_front(pElem);
420}
421
422// put an element on the back of the stack
424{
425 m_P0_stack.push_back(pElem);
426}
427
428// pop last element pointer off the stack and stash it for later deletion
429inline void EtmV4P0Stack::pop_back(bool pend_delete /* = true */)
430{
431 if (pend_delete)
432 m_popped_elem.push_back(m_P0_stack.back());
433 m_P0_stack.pop_back();
434}
435
436inline void EtmV4P0Stack::pop_front(bool pend_delete /* = true */)
437{
438 if (pend_delete)
439 m_popped_elem.push_back(m_P0_stack.front());
440 m_P0_stack.pop_front();
441}
442
443// pop last element pointer off the stack and delete immediately
445{
446 if (m_P0_stack.size() > 0)
447 {
448 TrcStackElem* pElem = m_P0_stack.back();
449 delete pElem;
450 m_P0_stack.pop_back();
451 }
452}
453
454// pop first element pointer off the stack and delete immediately
456{
457 if (m_P0_stack.size() > 0)
458 {
459 TrcStackElem* pElem = m_P0_stack.front();
460 delete pElem;
461 m_P0_stack.pop_front();
462 }
463}
464
465
466
467// get a pointer to the last element on the stack
469{
470 return m_P0_stack.back();
471}
472
474{
475 return m_P0_stack.front();
476}
477
478// remove and delete all the elements left on the stack
480{
481 while (m_P0_stack.size() > 0)
482 delete_back();
483 m_P0_stack.clear();
484}
485
486// delete list of popped elements.
488{
489 while (m_popped_elem.size() > 0)
490 {
491 delete m_popped_elem.back();
492 m_popped_elem.pop_back();
493 }
494 m_popped_elem.clear();
495}
496
497// get current number of elements on the stack
498inline size_t EtmV4P0Stack::size()
499{
500 return m_P0_stack.size();
501}
502
503#endif // ARM_TRC_ETMV4_STACK_ELEM_H_INCLUDED
504
505/* End of File trc_etmv4_stack_elem.h */
void from_front_init()
TrcStackElem * from_front_next()
TrcStackElemAddr * createSrcAddrElem(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const etmv4_addr_val_t &addr_val)
TrcStackElemAtom * createAtomElem(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const ocsd_pkt_atom &atom)
TrcStackElemITE * createITEElem(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const trace_sw_ite_t &ite)
void erase_curr_from_front()
TrcStackElemCtxt * createContextElem(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const etmv4_context_t &context, const bool back=false)
void pop_front(bool pend_delete=true)
TrcStackElem * front()
int createUnseenUncommitedP0Elem(const int n_unseen, const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index)
void push_front(TrcStackElem *pElem)
TrcStackElemAddr * createAddrElem(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const etmv4_addr_val_t &addr_val)
TrcStackElem * back()
TrcStackElemMarker * createMarkerElem(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const trace_marker_payload_t &marker)
TrcStackQElem * createQElem(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const int count)
void push_back(TrcStackElem *pElem)
void pop_back(bool pend_delete=true)
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)
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)
TrcStackElemExcept * createExceptElem(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const bool bSame, const uint16_t excepNum)
TrcStackElemAddr(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index)
const etmv4_addr_val_t & getAddr() const
void setAddr(const etmv4_addr_val_t &addr_val)
int cancelNewest(const int nCancel)
const bool isEmpty() const
void setAtom(const ocsd_pkt_atom &atom)
TrcStackElemAtom(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index)
const ocsd_atm_val commitOldest()
const etmv4_context_t & getContext() const
TrcStackElemCtxt(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index)
void setContext(const etmv4_context_t &ctxt)
void setPrevSame(bool bSame)
const bool getPrevSame() const
TrcStackElemExcept(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index)
void setExcepNum(const uint16_t num)
const uint16_t getExcepNum() const
const ocsd_trc_index_t getRootIndex() const
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)
const bool isP0() const
const ocsd_etmv4_i_pkt_type getRootPkt() const
const p0_elem_t getP0Type() const
const trace_sw_ite_t & getITE()
void setITE(const trace_sw_ite_t &ite)
TrcStackElemITE(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index)
TrcStackElemMarker(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index)
void setMarker(const trace_marker_payload_t &marker)
const trace_marker_payload_t & getMarker() const
void setParam(const uint32_t param, const int nParamNum)
const uint32_t & getParam(const int nParamNum) const
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)
TrcStackQElem(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index)
friend class EtmV4P0Stack
void setInstrCount(const int instr_count)
const int getInstrCount() const
const bool hasAddr() const
const etmv4_addr_val_t & getAddr() const
void setAddr(const etmv4_addr_val_t &addr_val)
struct _sw_ite_t trace_sw_ite_t
struct _trace_marker_payload_t trace_marker_payload_t
uint32_t ocsd_trc_index_t
struct _etmv4_addr_val_t etmv4_addr_val_t
enum _ocsd_atm_val ocsd_atm_val
enum _ocsd_etmv4_i_pkt_type ocsd_etmv4_i_pkt_type
struct _ocsd_pkt_atom ocsd_pkt_atom
struct _etmv4_context_t etmv4_context_t
@ ATOM_N
@ ATOM_E
@ P0_TRANS_START
@ P0_TRANS_TRACE_INIT
@ P0_FUNC_RET
@ P0_TRANS_FAIL
@ P0_EXCEP_RET
@ P0_TRANS_COMMIT
@ P0_OVERFLOW
@ P0_SRC_ADDR
@ P0_UNSEEN_UNCOMMITTED
enum _p0_elem_t p0_elem_t
OpenCSD : Decoder Output Generic Element types.