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 44 class TraceComponent; 45 #endif 46 47 typedef struct _retStackElement 48 { 49 ocsd_vaddr_t ret_addr; 50 ocsd_isa ret_isa; 51 } retStackElement; 52 53 class TrcAddrReturnStack 54 { 55 public: 56 TrcAddrReturnStack(); ~TrcAddrReturnStack()57 ~TrcAddrReturnStack() {}; 58 set_active(bool active)59 void set_active(bool active) 60 { 61 m_active = active; 62 }; 63 is_active()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 overflow()73 bool overflow() const 74 { 75 return (bool)(num_entries < 0); 76 }; 77 set_pop_pending()78 void set_pop_pending() 79 { 80 if (m_active) 81 m_pop_pending = true; 82 } 83 clear_pop_pending()84 void clear_pop_pending() 85 { 86 m_pop_pending = false; 87 } 88 pop_pending()89 bool pop_pending() const 90 { 91 return m_pop_pending; 92 }; 93 94 private: 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 103 public: set_dbg_logger(TraceComponent * pLogger)104 void set_dbg_logger(TraceComponent *pLogger) { m_p_debug_logger = pLogger; }; 105 private: 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