OpenCSD - CoreSight Trace Decode Library 1.5.5
Loading...
Searching...
No Matches
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
40#include "comp_attach_pt_t.h"
43
53{
54public:
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
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;
94 const bool isCondInstr() const;
95 const bool isLink() const;
96 const bool ISAChanged() const;
97 const ocsd_isa nextISA() const;
98 const uint8_t getInstrSize() const;
99
100 // information on error conditions
101 const bool isNacc() const;
102 void clearNacc();
103 const ocsd_vaddr_t getNaccAddr() const;
105
106private:
107 bool initFollowerState();
108
109 ocsd_err_t decodeSingleOpCode();
110
111 ocsd_instr_info m_instr_info;
112
113 ocsd_vaddr_t m_st_range_addr;
114 ocsd_vaddr_t m_en_range_addr;
115 ocsd_vaddr_t m_next_addr;
116 bool m_b_next_valid;
117
119 ocsd_mem_space_acc_t m_mem_acc_rule;
121 uint8_t m_mem_space_csid;
122
123 ocsd_vaddr_t m_nacc_address;
124 bool m_b_nacc_err;
125
129
130};
131
132#endif // ARM_OCSD_CODE_FOLLOWER_H_INCLUDED
133
134//*********** setup API
136{
137 m_instr_info.pe_type = profile;
138}
139
141{
142 m_mem_acc_rule = mem_acc_rule;
143}
144
146{
147 return m_mem_acc_rule;
148}
149
150inline void OcsdCodeFollower::setMemSpaceCSID(const uint8_t csid)
151{
152 m_mem_space_csid = csid;
153}
154
155inline void OcsdCodeFollower::setISA(const ocsd_isa isa)
156{
157 m_instr_info.isa = isa;
158}
159
161{
162 m_instr_info.dsb_dmb_waypoints = 1;
163}
164
165//**************************************** results API
167{
168 return m_st_range_addr;
169}
170
172{
173 return m_en_range_addr;
174}
175
176inline const bool OcsdCodeFollower::hasRange() const
177{
178 return m_st_range_addr < m_en_range_addr;
179}
180
181inline const bool OcsdCodeFollower::hasNextAddr() const
182{
183 return m_b_next_valid;
184}
185
187{
188 return m_next_addr;
189}
190
191// information on last instruction executed in range.
193{
194 return m_instr_info.type;
195}
196
198{
199 return m_instr_info.sub_type;
200}
201
202inline const uint8_t OcsdCodeFollower::getInstrSize() const
203{
204 return m_instr_info.instr_size;
205}
206
207inline const bool OcsdCodeFollower::isCondInstr() const
208{
209 return (bool)(m_instr_info.is_conditional == 1);
210}
211
212inline const bool OcsdCodeFollower::isLink() const
213{
214 return (bool)(m_instr_info.is_link == 1);
215}
216
217inline const bool OcsdCodeFollower::ISAChanged() const
218{
219 return (bool)(m_instr_info.isa != m_instr_info.next_isa);
220}
221
223{
224 return m_instr_info.next_isa;
225}
226
227// information on error conditions
228inline const bool OcsdCodeFollower::isNacc() const
229{
230 return m_b_nacc_err;
231}
232
234{
235 m_b_nacc_err = false;
236}
237
239{
240 return m_nacc_address;
241}
242
243/* End of File ocsd_code_follower.h */
The code follower looks for waypoints or addresses.
ocsd_err_t followSingleAtom(const ocsd_vaddr_t addrStart, const ocsd_atm_val A)
const ocsd_mem_space_acc_t getMemSpaceAccess() const
get the memory space used for access.
const ocsd_vaddr_t getNextAddr() const
next address - valid if hasNextAddr() true.
const bool isNacc() const
true if Memory Not Accessible (nacc) error occurred
const ocsd_isa nextISA() const
ISA for next instruction.
void setMemSpaceCSID(const uint8_t csid)
memory spaces might be partitioned by CSID
void setISA(const ocsd_isa isa)
set the ISA for the decode.
void initInterfaces(componentAttachPt< ITargetMemAccess > *pMemAccess, componentAttachPt< IInstrDecode > *pIDecode)
const ocsd_vaddr_t getNaccAddr() const
get the nacc error address.
void setArchProfile(const ocsd_arch_profile_t profile)
core profile
const uint8_t getInstrSize() const
Get the last instruction size.
const bool ISAChanged() const
next ISA different from input ISA.
const ocsd_vaddr_t getRangeSt() const
inclusive start address of decoded range (value passed in)
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 isCondInstr() const
is a conditional instruction
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 getRangeEn() const
exclusive end address of decoded range (first instruction not executed / potential next instruction).
const bool isLink() const
is a link (branch with link etc)
void setDSBDMBasWP()
DSB and DMB can be treated as WP in some archs.
const ocsd_instr_type getInstrType() const
last instruction type
void clearNacc()
clear the nacc error flag
const ocsd_instr_subtype getInstrSubType() const
last instruction sub-type
Single component interface pointer attachment point.
OpenCSD : Component attachment point interface class.
enum _ocsd_instr_subtype ocsd_instr_subtype
enum _ocsd_instr_type ocsd_instr_type
enum _ocsd_mem_space_acc_t ocsd_mem_space_acc_t
enum _ocsd_err_t ocsd_err_t
enum _ocsd_isa ocsd_isa
uint64_t ocsd_vaddr_t
enum _ocsd_atm_val ocsd_atm_val
OpenCSD : Standard Types used in the library interfaces.
uint8_t dsb_dmb_waypoints
ocsd_instr_type type
ocsd_instr_subtype sub_type
ocsd_arch_profile_t pe_type
OpenCSD: Common "C" types for trace packets.