36 #ifndef ARM_TRC_PKT_ELEM_ETMV4I_H_INCLUDED 37 #define ARM_TRC_PKT_ELEM_ETMV4I_H_INCLUDED 60 for (
int i = 0; i < 3; i++)
73 m_v_addr[2] = m_v_addr[1];
74 m_v_addr[1] = m_v_addr[0];
76 m_v_addr_ISA[2] = m_v_addr_ISA[1];
77 m_v_addr_ISA[1] = m_v_addr_ISA[0];
78 m_v_addr_ISA[0] = isa;
85 vaddr = m_v_addr[idx];
86 isa = m_v_addr_ISA[idx];
92 uint8_t m_v_addr_ISA[3];
114 void initStartState();
115 void initNextPacket();
120 void clearTraceInfo();
121 void setTraceInfo(
const uint32_t infoVal);
122 void setTraceInfoKey(
const uint32_t keyVal);
123 void setTraceInfoSpec(
const uint32_t specVal);
124 void setTraceInfoCyct(
const uint32_t cyctVal);
126 void setTS(
const uint64_t value,
const uint8_t bits);
127 void setCycleCount(
const uint32_t value);
128 void setCommitElements(
const uint32_t commit_elem);
129 void setCancelElements(
const uint32_t cancel_elem);
130 void setAtomPacket(
const ocsd_pkt_atm_type type,
const uint32_t En_bits,
const uint8_t num);
132 void setCondIF1(uint32_t
const cond_key);
133 void setCondIF2(uint8_t
const c_elem_idx);
134 void setCondIF3(uint8_t
const num_c_elem,
const bool finalElem);
136 void setCondRF1(
const uint32_t key[2],
const uint8_t res[2],
const uint8_t CI[2],
const bool set2Keys);
137 void setCondRF2(
const uint8_t key_incr,
const uint8_t token);
138 void setCondRF3(
const uint16_t tokens);
139 void setCondRF4(
const uint8_t token);
141 void setContextInfo(
const bool update,
const uint8_t EL = 0,
const uint8_t NS = 0,
const uint8_t SF = 0);
142 void setContextVMID(
const uint32_t VMID);
143 void setContextCID(
const uint32_t CID);
145 void setExceptionInfo(
const uint16_t excep_type,
const uint8_t addr_interp,
const uint8_t m_fault_pending,
const uint8_t m_type);
147 void set64BitAddress(
const uint64_t addr,
const uint8_t IS);
148 void set32BitAddress(
const uint32_t addr,
const uint8_t IS);
149 void updateShortAddress(
const uint32_t addr,
const uint8_t IS,
const uint8_t update_bits);
150 void setAddressExactMatch(
const uint8_t idx);
152 void setDataSyncMarker(
const uint8_t dsm_val);
153 void setEvent(
const uint8_t event_val);
155 void setQType(
const bool has_count,
const uint32_t count,
const bool has_addr,
const bool addr_match,
const uint8_t type);
164 return pkt_valid.bits.commit_elem_valid ? true :
false;
169 const uint32_t getCCThreshold()
const;
170 const uint32_t getP0Key()
const;
171 const uint32_t getCurrSpecDepth()
const;
182 const uint8_t &
getAddrIS()
const {
return v_addr_ISA; };
186 const uint64_t
getTS()
const {
return pkt_valid.bits.ts_valid ? ts.timestamp : 0; };
189 const uint32_t
getCC()
const {
return pkt_valid.bits.cc_valid ? cycle_count : 0; };
192 const bool isBadPacket()
const;
195 virtual void toString(std::string &str)
const;
196 virtual void toStringFmt(
const uint32_t fmtFlags, std::string &str)
const;
200 void contextStr(std::string &ctxtStr)
const;
201 void atomSeq(std::string &valStr)
const;
202 void addrMatchIdx(std::string &valStr)
const;
203 void exceptionInfo(std::string &valStr)
const;
206 void pop_vaddr_idx(
const uint8_t idx);
220 pkt_valid.bits.ts_valid = 0;
221 pkt_valid.bits.trace_info_valid = 0;
222 pkt_valid.bits.p0_key_valid = 0;
223 pkt_valid.bits.spec_depth_valid = 0;
224 pkt_valid.bits.cc_thresh_valid = 0;
226 pkt_valid.bits.ts_valid = 0;
231 trace_info.val = infoVal;
232 pkt_valid.bits.trace_info_valid = 1;
238 pkt_valid.bits.p0_key_valid = 1;
243 curr_spec_depth = specVal;
244 pkt_valid.bits.spec_depth_valid = 1;
249 cc_threshold = cyctVal;
250 pkt_valid.bits.cc_thresh_valid = 1;
255 uint64_t mask = (uint64_t)-1LL;
256 if(bits < 64) mask = (1ULL << bits) - 1;
257 ts.timestamp = (ts.timestamp & ~mask) | (value & mask);
258 ts.bits_changed = bits;
259 pkt_valid.bits.ts_valid = 1;
264 pkt_valid.bits.cc_valid = 1;
270 pkt_valid.bits.commit_elem_valid = 1;
271 commit_elements = commit_elem;
276 if(pkt_valid.bits.cc_thresh_valid)
283 if(pkt_valid.bits.p0_key_valid)
290 if(pkt_valid.bits.spec_depth_valid)
291 return curr_spec_depth;
297 cancel_elements = cancel_elem;
304 uint32_t bit_patt = En_bits & 0x1;
308 bit_patt = (bit_patt << num) - 1;
310 atom.En_bits = bit_patt;
313 atom.En_bits = En_bits;
319 cond_instr.cond_key_set = 1;
320 cond_instr.f3_final_elem = 0;
321 cond_instr.f2_cond_incr = 0;
322 cond_instr.num_c_elem = 1;
323 cond_instr.cond_c_key = cond_key;
328 cond_instr.cond_key_set = 0;
329 cond_instr.f3_final_elem = 0;
330 switch(c_elem_idx & 0x3)
333 cond_instr.f2_cond_incr = 1;
334 cond_instr.num_c_elem = 1;
338 cond_instr.f2_cond_incr = 0;
339 cond_instr.num_c_elem = 1;
343 cond_instr.f2_cond_incr = 1;
344 cond_instr.num_c_elem = 2;
351 cond_instr.cond_key_set = 0;
352 cond_instr.f3_final_elem = finalElem ? 1: 0;
353 cond_instr.f2_cond_incr = 0;
354 cond_instr.num_c_elem = num_c_elem;
359 cond_result.key_res_0_set = 1;
360 cond_result.cond_r_key_0 = key[0];
361 cond_result.res_0 = res[0];
362 cond_result.ci_0 = CI[0];
366 cond_result.key_res_1_set = 1;
367 cond_result.cond_r_key_1 = key[1];
368 cond_result.res_1 = res[1];
369 cond_result.ci_1 = CI[1];
376 cond_result.key_res_0_set = 0;
377 cond_result.key_res_1_set = 0;
378 cond_result.f2_key_incr = key_incr;
379 cond_result.f2f4_token = token;
384 cond_result.key_res_0_set = 0;
385 cond_result.key_res_1_set = 0;
386 cond_result.f3_tokens = tokens;
391 cond_result.key_res_0_set = 0;
392 cond_result.key_res_1_set = 0;
393 cond_result.f2f4_token = token;
398 pkt_valid.bits.context_valid = 1;
410 pkt_valid.bits.context_valid = 1;
413 context.updated_v = 1;
418 pkt_valid.bits.context_valid = 1;
420 context.ctxtID = CID;
421 context.updated_c = 1;
426 exception_info.exceptionType = excep_type;
427 exception_info.addr_interp = addr_interp;
428 exception_info.m_fault_pending = m_fault_pending;
429 exception_info.m_type = m_type;
434 v_addr.pkt_bits = 64;
435 v_addr.valid_bits = 64;
445 v_addr.pkt_bits = 32;
447 if (pkt_valid.bits.context_valid && context.SF)
450 if (v_addr.valid_bits < 32)
451 v_addr.valid_bits = 32;
452 v_addr.val = (v_addr.val & ~mask) | (addr & mask);
458 v_addr.valid_bits = 32;
468 v_addr.pkt_bits = update_bits;
469 if(v_addr.valid_bits < update_bits)
470 v_addr.valid_bits = update_bits;
472 v_addr.val = (v_addr.val & ~update_mask) | (addr & update_mask);
479 addr_exact_match_idx = idx;
491 event_val = event_value;
494 inline void EtmV4ITrcPacket::setQType(
const bool has_count,
const uint32_t count,
const bool has_addr,
const bool addr_match,
const uint8_t type)
496 Q_pkt.q_count = count;
498 Q_pkt.count_present = has_count ? 1 : 0;
499 Q_pkt.addr_present = has_addr ? 1: 0;
500 Q_pkt.addr_match = addr_match ? 1 :0;
508 inline void EtmV4ITrcPacket::push_vaddr()
510 m_addr_stack.push(v_addr, v_addr_ISA);
513 inline void EtmV4ITrcPacket::pop_vaddr_idx(
const uint8_t idx)
515 m_addr_stack.get_idx(idx, v_addr, v_addr_ISA);
520 #endif // ARM_TRC_PKT_ELEM_ETMV4I_H_INCLUDED const ocsd_vaddr_t & getAddrVal() const
virtual const void * c_pkt() const
return the underlying C API packet structure
void setDataSyncMarker(const uint8_t dsm_val)
const uint32_t getCC() const
const bool hasCommitElementsCount() const
return true if this packet has set the commit packet count.
void setAtomPacket(const ocsd_pkt_atm_type type, const uint32_t En_bits, const uint8_t num)
const etmv4_trace_info_t & getTraceInfo() const
const uint32_t getCurrSpecDepth() const
void set32BitAddress(const uint32_t addr, const uint8_t IS)
void setCommitElements(const uint32_t commit_elem)
void get_idx(const uint8_t idx, ocsd_pkt_vaddr &vaddr, uint8_t &isa)
const uint64_t getTS() const
const uint32_t getCCThreshold() const
void setCondRF2(const uint8_t key_incr, const uint8_t token)
void setTraceInfoCyct(const uint32_t cyctVal)
const bool isBadPacket() const
enum _ocsd_etmv4_i_pkt_type ocsd_etmv4_i_pkt_type
OpenCSD : Standard printable element base class.
void setTraceInfoKey(const uint32_t keyVal)
void setCondIF1(uint32_t const cond_key)
const bool getAddr64Bit() const
const ocsd_etmv4_i_pkt_type getType() const
void setTraceInfoSpec(const uint32_t specVal)
void setContextInfo(const bool update, const uint8_t EL=0, const uint8_t NS=0, const uint8_t SF=0)
ETMv4 Address packet values stackThis class represents a stack of recent broadcast address values - u...
void setCondRF3(const uint16_t tokens)
void setExceptionInfo(const uint16_t excep_type, const uint8_t addr_interp, const uint8_t m_fault_pending, const uint8_t m_type)
void setCycleCount(const uint32_t value)
void setAddressExactMatch(const uint8_t idx)
const ocsd_pkt_atom & getAtom() const
void setCondRF4(const uint8_t token)
void setCondIF3(uint8_t const num_c_elem, const bool finalElem)
void setTraceInfo(const uint32_t infoVal)
void updateShortAddress(const uint32_t addr, const uint8_t IS, const uint8_t update_bits)
void updateErrType(const ocsd_etmv4_i_pkt_type err_pkt_type)
void clearTraceInfo()
clear all the trace info data prior to setting for new trace info packet.
void setType(const ocsd_etmv4_i_pkt_type pkt_type)
void set64BitAddress(const uint64_t addr, const uint8_t IS)
enum _ocsd_pkt_atm_type ocsd_pkt_atm_type
Class to provide trace element strings for printing.
const uint32_t getP0Key() const
const uint8_t & getAddrMatch() const
void setContextVMID(const uint32_t VMID)
void setQType(const bool has_count, const uint32_t count, const bool has_addr, const bool addr_match, const uint8_t type)
void setCondRF1(const uint32_t key[2], const uint8_t res[2], const uint8_t CI[2], const bool set2Keys)
#define OCSD_BIT_MASK(bits)
void setCondIF2(uint8_t const c_elem_idx)
ETMv4 Instuction Trace Protocol Packet.This class represents a single ETMv4 data trace packet...
const etmv4_context_t & getContext() const
const ocsd_etmv4_i_pkt_type getErrType() const
void setCancelElements(const uint32_t cancel_elem)
void setEvent(const uint8_t event_val)
const uint8_t & getAddrIS() const
void setTS(const uint64_t value, const uint8_t bits)
void setContextCID(const uint32_t CID)
void push(const ocsd_pkt_vaddr vaddr, const uint8_t isa)