OpenCSD - CoreSight Trace Decode Library  0.5
ocsd_code_follower.h
Go to the documentation of this file.
1 /*
2  * \file ocsd_code_follower.h
3  * \brief OpenCSD : Code follower for instruction trace decode
4  *
5  * \copyright Copyright (c) 2016, 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_OCSD_CODE_FOLLOWER_H_INCLUDED
36 #define ARM_OCSD_CODE_FOLLOWER_H_INCLUDED
37 
38 #include "opencsd/ocsd_if_types.h"
39 #include "opencsd/trc_pkt_types.h"
40 #include "comp_attach_pt_t.h"
43 
53 {
54 public:
57 
58 //*********** setup API
60 
61 // set information for decode operation - static or occasionally changing settings
62 // per decode values are passed as parameters into the decode API calls.
63  void setArchProfile(const ocsd_arch_profile_t profile);
64  void setMemSpaceAccess(const ocsd_mem_space_acc_t mem_acc_rule);
65  void setMemSpaceCSID(const uint8_t csid);
66  void setISA(const ocsd_isa isa);
67  void setDSBDMBasWP();
68 
69 //********** code following API
70 
71  // standard WP search - for program flow trace
72  //ocsd_err_t followToAtomWP(idec_res_t &op_result, const ocsd_vaddr_t addrStart, const ocsd_atm_val A);
73 
74  // PTM exception code may require follow to an address
75  //ocsd_err_t followToAddress(idec_res_t &op_result, const ocsd_vaddr_t addrStart, const ocsd_atm_val A, const ocsd_vaddr_t addrMatch);
76 
77  // single instruction atom format such as ETMv3
78  ocsd_err_t followSingleAtom(const ocsd_vaddr_t addrStart, const ocsd_atm_val A);
79 
80  // follow N instructions
81  // ocsd_err_t followNInstructions(idec_res_t &op_result) // ETMv4 Q elements
82 
83 //*********************** results API
84  const ocsd_vaddr_t getRangeSt() const;
85  const ocsd_vaddr_t getRangeEn() const;
86  const bool hasRange() const;
87 
88  const bool hasNextAddr() const;
89  const ocsd_vaddr_t getNextAddr() const;
90 
91  // information on last instruction executed in range.
92  const ocsd_instr_type getInstrType() const;
93  const ocsd_instr_subtype getInstrSubType() const;
94  const bool isCondInstr() const;
95  const bool isLink() const;
96  const bool ISAChanged() const;
97  const ocsd_isa nextISA() const;
98 
99  // information on error conditions
100  const bool isNacc() const;
101  void clearNacc();
102  const ocsd_vaddr_t getNaccAddr() const;
103 
104 private:
105  bool initFollowerState();
106 
107  ocsd_err_t decodeSingleOpCode();
108 
109  ocsd_instr_info m_instr_info;
110 
111  ocsd_vaddr_t m_st_range_addr;
112  ocsd_vaddr_t m_en_range_addr;
113  ocsd_vaddr_t m_next_addr;
114  bool m_b_next_valid;
115 
117  ocsd_mem_space_acc_t m_mem_acc_rule;
119  uint8_t m_mem_space_csid;
120 
121  ocsd_vaddr_t m_nacc_address;
122  bool m_b_nacc_err;
123 
127 
128 };
129 
130 #endif // ARM_OCSD_CODE_FOLLOWER_H_INCLUDED
131 
132 //*********** setup API
133 inline void OcsdCodeFollower::setArchProfile(const ocsd_arch_profile_t profile)
134 {
135  m_instr_info.pe_type = profile;
136 }
137 
138 inline void OcsdCodeFollower::setMemSpaceAccess(const ocsd_mem_space_acc_t mem_acc_rule)
139 {
140  m_mem_acc_rule = mem_acc_rule;
141 }
142 
143 inline void OcsdCodeFollower::setMemSpaceCSID(const uint8_t csid)
144 {
145  m_mem_space_csid = csid;
146 }
147 
148 inline void OcsdCodeFollower::setISA(const ocsd_isa isa)
149 {
150  m_instr_info.isa = isa;
151 }
152 
154 {
155  m_instr_info.dsb_dmb_waypoints = 1;
156 }
157 
158 //**************************************** results API
159 inline const ocsd_vaddr_t OcsdCodeFollower::getRangeSt() const
160 {
161  return m_st_range_addr;
162 }
163 
164 inline const ocsd_vaddr_t OcsdCodeFollower::getRangeEn() const
165 {
166  return m_en_range_addr;
167 }
168 
169 inline const bool OcsdCodeFollower::hasRange() const
170 {
171  return m_st_range_addr < m_en_range_addr;
172 }
173 
174 inline const bool OcsdCodeFollower::hasNextAddr() const
175 {
176  return m_b_next_valid;
177 }
178 
179 inline const ocsd_vaddr_t OcsdCodeFollower::getNextAddr() const
180 {
181  return m_next_addr;
182 }
183 
184 // information on last instruction executed in range.
185 inline const ocsd_instr_type OcsdCodeFollower::getInstrType() const
186 {
187  return m_instr_info.type;
188 }
189 
190 inline const ocsd_instr_subtype OcsdCodeFollower::getInstrSubType() const
191 {
192  return m_instr_info.sub_type;
193 }
194 
195 inline const bool OcsdCodeFollower::isCondInstr() const
196 {
197  return (bool)(m_instr_info.is_conditional == 1);
198 }
199 
200 inline const bool OcsdCodeFollower::isLink() const
201 {
202  return (bool)(m_instr_info.is_link == 1);
203 }
204 
205 inline const bool OcsdCodeFollower::ISAChanged() const
206 {
207  return (bool)(m_instr_info.isa != m_instr_info.next_isa);
208 }
209 
210 inline const ocsd_isa OcsdCodeFollower::nextISA() const
211 {
212  return m_instr_info.next_isa;
213 }
214 
215 // information on error conditions
216 inline const bool OcsdCodeFollower::isNacc() const
217 {
218  return m_b_nacc_err;
219 }
220 
222 {
223  m_b_nacc_err = false;
224 }
225 
226 inline const ocsd_vaddr_t OcsdCodeFollower::getNaccAddr() const
227 {
228  return m_nacc_address;
229 }
230 
231 /* End of File ocsd_code_follower.h */
const bool isLink() const
is a link (branch with link etc)
ocsd_err_t followSingleAtom(const ocsd_vaddr_t addrStart, const ocsd_atm_val A)
void setISA(const ocsd_isa isa)
set the ISA for the decode.
void clearNacc()
clear the nacc error flag
void initInterfaces(componentAttachPt< ITargetMemAccess > *pMemAccess, componentAttachPt< IInstrDecode > *pIDecode)
void setArchProfile(const ocsd_arch_profile_t profile)
core profile
const bool hasRange() const
we have a valid range executed (may be false if nacc).
const bool hasNextAddr() const
we have calulated the next address - otherwise this is needed from trace packets. ...
const bool isNacc() const
true if Memory Not Accessible (nacc) error occurred
const bool isCondInstr() const
is a conditional instruction
const ocsd_instr_type getInstrType() const
last instruction type
void setDSBDMBasWP()
DSB and DMB can be treated as WP in some archs.
void setMemSpaceAccess(const ocsd_mem_space_acc_t mem_acc_rule)
memory space to use for access (filtered by S/NS, EL etc).
const ocsd_vaddr_t getNextAddr() const
next address - valid if hasNextAddr() true.
const ocsd_vaddr_t getNaccAddr() const
get the nacc error address.
void setMemSpaceCSID(const uint8_t csid)
memory spaces might be partitioned by CSID
const bool ISAChanged() const
next ISA different from input ISA.
const ocsd_isa nextISA() const
ISA for next instruction.
const ocsd_vaddr_t getRangeSt() const
inclusive start address of decoded range (value passed in)
const ocsd_vaddr_t getRangeEn() const
exclusive end address of decoded range (first instruction not executed / potential next instruction)...
The code follower looks for waypoints or addresses.
const ocsd_instr_subtype getInstrSubType() const
last instruction sub-type
OpenCSD : Component attachment point interface class.