1/* 2* \file trc_ret_stack.h 3* \brief OpenCSD : trace decoder return stack feature. 4* 5* \copyright Copyright (c) 2017, ARM Limited. All Rights Reserved. 6*/ 7 8/* 9* Redistribution and use in source and binary forms, with or without modification, 10* are permitted provided that the following conditions are met: 11* 12* 1. Redistributions of source code must retain the above copyright notice, 13* this list of conditions and the following disclaimer. 14* 15* 2. Redistributions in binary form must reproduce the above copyright notice, 16* this list of conditions and the following disclaimer in the documentation 17* and/or other materials provided with the distribution. 18* 19* 3. Neither the name of the copyright holder nor the names of its contributors 20* may be used to endorse or promote products derived from this software without 21* specific prior written permission. 22* 23* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND 24* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 25* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 26* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 27* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 28* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 29* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 30* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 31* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 32* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 33*/ 34 35#ifndef ARM_TRC_RET_STACK_H_INCLUDED 36#define ARM_TRC_RET_STACK_H_INCLUDED 37 38#include "opencsd/ocsd_if_types.h" 39 40// uncomment below for return stack logging 41// #define TRC_RET_STACK_DEBUG 42 43#ifdef TRC_RET_STACK_DEBUG 44class TraceComponent; 45#endif 46 47typedef struct _retStackElement 48{ 49 ocsd_vaddr_t ret_addr; 50 ocsd_isa ret_isa; 51} retStackElement; 52 53class TrcAddrReturnStack 54{ 55public: 56 TrcAddrReturnStack(); 57 ~TrcAddrReturnStack() {}; 58 59 void set_active(bool active) 60 { 61 m_active = active; 62 }; 63 64 bool is_active() const 65 { 66 return m_active; 67 }; 68 69 void push(const ocsd_vaddr_t addr, const ocsd_isa isa); 70 ocsd_vaddr_t pop(ocsd_isa &isa); 71 void flush(); 72 73 bool overflow() const 74 { 75 return (bool)(num_entries < 0); 76 }; 77 78 void set_pop_pending() 79 { 80 if (m_active) 81 m_pop_pending = true; 82 } 83 84 void clear_pop_pending() 85 { 86 m_pop_pending = false; 87 } 88 89 bool pop_pending() const 90 { 91 return m_pop_pending; 92 }; 93 94private: 95 bool m_active; 96 bool m_pop_pending; // flag for decoder to indicate a pop might be needed depending on the next packet (ETMv4) 97 98 int head_idx; 99 int num_entries; 100 retStackElement m_stack[16]; 101 102#ifdef TRC_RET_STACK_DEBUG 103public: 104 void set_dbg_logger(TraceComponent *pLogger) { m_p_debug_logger = pLogger; }; 105private: 106 void LogOp(const char *pszOpString, ocsd_vaddr_t addr, int head_off, ocsd_isa isa); 107 108 TraceComponent *m_p_debug_logger; 109#endif // TRC_RET_STACK_DEBUG 110}; 111 112#endif // ARM_TRC_RET_STACK_H_INCLUDED 113 114/* End of File trc_ret_stack.h */ 115