diff --git a/decoder/include/etmv4/trc_pkt_elem_etmv4i.h b/decoder/include/etmv4/trc_pkt_elem_etmv4i.h index 890baf1ba569..d2a774ecdd47 100644 --- a/decoder/include/etmv4/trc_pkt_elem_etmv4i.h +++ b/decoder/include/etmv4/trc_pkt_elem_etmv4i.h @@ -129,8 +129,8 @@ public: // address const uint8_t &getAddrMatch() const { return addr_exact_match_idx; }; - const ocsd_vaddr_t &getAddrVal() const { return v_addr.val; }; - const uint8_t &getAddrIS() const { return v_addr_ISA; }; + const ocsd_vaddr_t &getAddrVal() const { return v_addr[0].val; }; + const uint8_t &getAddrIS() const { return v_addr_ISA[0]; }; // ts const uint64_t getTS() const { return pkt_valid.bits.ts_valid ? ts.timestamp : 0; }; @@ -377,44 +377,64 @@ inline void EtmV4ITrcPacket::setExceptionInfo(const uint16_t excep_type, const u inline void EtmV4ITrcPacket::set64BitAddress(const uint64_t addr, const uint8_t IS, const uint8_t update_bits) { uint64_t update_mask = (uint64_t)-1; - v_addr.pkt_bits = update_bits; - v_addr.size = VA_64BIT; - if(v_addr.valid_bits < update_bits) - v_addr.valid_bits = update_bits; + v_addr[2] = v_addr[1]; + v_addr[1] = v_addr[0]; + v_addr_ISA[2] = v_addr_ISA[1]; + v_addr_ISA[1] = v_addr_ISA[0]; + v_addr[0].pkt_bits = update_bits; + v_addr[0].size = VA_64BIT; + if(v_addr[0].valid_bits < update_bits) + v_addr[0].valid_bits = update_bits; if(update_bits < 64) { update_mask = ((uint64_t)1 << update_bits) - 1; } - v_addr.val = (v_addr.val & ~update_mask) | (addr & update_mask); - v_addr_ISA = IS; + v_addr[0].val = (v_addr[0].val & ~update_mask) | (addr & update_mask); + v_addr_ISA[0] = IS; } inline void EtmV4ITrcPacket::set32BitAddress(const uint32_t addr, const uint8_t IS, const uint8_t update_bits) { ocsd_vaddr_t update_mask = OCSD_BIT_MASK(update_bits); - v_addr.pkt_bits = update_bits; - v_addr.size = VA_32BIT; - if((v_addr.valid_bits < update_bits) || (update_bits == 32) ) // account for dropping into AArch32 - v_addr.valid_bits = update_bits; + v_addr[2] = v_addr[1]; + v_addr[1] = v_addr[0]; + v_addr_ISA[2] = v_addr_ISA[1]; + v_addr_ISA[1] = v_addr_ISA[0]; + v_addr[0].pkt_bits = update_bits; + v_addr[0].size = VA_32BIT; + if((v_addr[0].valid_bits < update_bits) || (update_bits == 32) ) // account for dropping into AArch32 + v_addr[0].valid_bits = update_bits; - v_addr.val = (v_addr.val & ~update_mask) | (addr & update_mask); - v_addr_ISA = IS; + v_addr[0].val = (v_addr[0].val & ~update_mask) | (addr & update_mask); + v_addr_ISA[0] = IS; } inline void EtmV4ITrcPacket::updateShortAddress(const uint32_t addr, const uint8_t IS, const uint8_t update_bits) { ocsd_vaddr_t update_mask = OCSD_BIT_MASK(update_bits); - v_addr.pkt_bits = update_bits; - if(v_addr.valid_bits < update_bits) - v_addr.valid_bits = update_bits; + v_addr[2] = v_addr[1]; + v_addr[1] = v_addr[0]; + v_addr_ISA[2] = v_addr_ISA[1]; + v_addr_ISA[1] = v_addr_ISA[0]; + v_addr[0].pkt_bits = update_bits; + if(v_addr[0].valid_bits < update_bits) + v_addr[0].valid_bits = update_bits; - v_addr.val = (v_addr.val & ~update_mask) | (addr & update_mask); - v_addr_ISA = IS; + v_addr[0].val = (v_addr[0].val & ~update_mask) | (addr & update_mask); + v_addr_ISA[0] = IS; } inline void EtmV4ITrcPacket::setAddressExactMatch(const uint8_t idx) { + ocsd_pkt_vaddr matchingAddr = v_addr[idx]; + uint8_t matchingISA = v_addr_ISA[idx]; + v_addr[2] = v_addr[1]; + v_addr[1] = v_addr[0]; + v_addr[0] = matchingAddr; + v_addr_ISA[2] = v_addr_ISA[1]; + v_addr_ISA[1] = v_addr_ISA[0]; + v_addr_ISA[0] = matchingISA; addr_exact_match_idx = idx; } diff --git a/decoder/include/etmv4/trc_pkt_types_etmv4.h b/decoder/include/etmv4/trc_pkt_types_etmv4.h index 7f017370bb25..dc4b3f3b453b 100644 --- a/decoder/include/etmv4/trc_pkt_types_etmv4.h +++ b/decoder/include/etmv4/trc_pkt_types_etmv4.h @@ -168,8 +168,8 @@ typedef struct _ocsd_etmv4_i_pkt //** intra-packet data - valid across packets. - ocsd_pkt_vaddr v_addr; //!< most recently broadcast address packet - uint8_t v_addr_ISA; //!< ISA for the address packet. (0 = IS0 / 1 = IS1) + ocsd_pkt_vaddr v_addr[3]; //!< most recently broadcast address packets + uint8_t v_addr_ISA[3]; //!< ISA for the address packets. (0 = IS0 / 1 = IS1) etmv4_context_t context; //!< current context for PE diff --git a/decoder/source/etmv4/trc_pkt_elem_etmv4i.cpp b/decoder/source/etmv4/trc_pkt_elem_etmv4i.cpp index 082198eae2ae..e98631794f3e 100644 --- a/decoder/source/etmv4/trc_pkt_elem_etmv4i.cpp +++ b/decoder/source/etmv4/trc_pkt_elem_etmv4i.cpp @@ -52,9 +52,12 @@ void EtmV4ITrcPacket::initStartState() pkt_valid.val = 0; // virtual address - v_addr.pkt_bits = 0; - v_addr.valid_bits = 0; - v_addr_ISA = 0; + for (uint8_t i = 0; i < 3; i++) + { + v_addr[i].pkt_bits = 0; + v_addr[i].valid_bits = 0; + v_addr_ISA[i] = 0; + } // timestamp ts.bits_changed = 0; @@ -100,7 +103,7 @@ void EtmV4ITrcPacket::toString(std::string &str) const contextStr(ctxtStr); case ETM4_PKT_I_ADDR_L_32IS0: case ETM4_PKT_I_ADDR_L_32IS1: - trcPrintableElem::getValStr(valStr, (v_addr.size == VA_64BIT) ? 64 : 32, v_addr.valid_bits, v_addr.val, true, (v_addr.pkt_bits < 32) ? v_addr.pkt_bits : 0); + trcPrintableElem::getValStr(valStr, (v_addr[0].size == VA_64BIT) ? 64 : 32, v_addr[0].valid_bits, v_addr[0].val, true, (v_addr[0].pkt_bits < 32) ? v_addr[0].pkt_bits : 0); str += "; Addr=" + valStr + "; " + ctxtStr; break; @@ -109,7 +112,7 @@ void EtmV4ITrcPacket::toString(std::string &str) const contextStr(ctxtStr); case ETM4_PKT_I_ADDR_L_64IS0: case ETM4_PKT_I_ADDR_L_64IS1: - trcPrintableElem::getValStr(valStr, (v_addr.size == VA_64BIT) ? 64 : 32, v_addr.valid_bits, v_addr.val, true, (v_addr.pkt_bits < 64) ? v_addr.pkt_bits : 0); + trcPrintableElem::getValStr(valStr, (v_addr[0].size == VA_64BIT) ? 64 : 32, v_addr[0].valid_bits, v_addr[0].val, true, (v_addr[0].pkt_bits < 64) ? v_addr[0].pkt_bits : 0); str += "; Addr=" + valStr + "; " + ctxtStr; break; @@ -120,7 +123,7 @@ void EtmV4ITrcPacket::toString(std::string &str) const case ETM4_PKT_I_ADDR_S_IS0: case ETM4_PKT_I_ADDR_S_IS1: - trcPrintableElem::getValStr(valStr, (v_addr.size == VA_64BIT) ? 64 : 32, v_addr.valid_bits, v_addr.val, true, v_addr.pkt_bits); + trcPrintableElem::getValStr(valStr, (v_addr[0].size == VA_64BIT) ? 64 : 32, v_addr[0].valid_bits, v_addr[0].val, true, v_addr[0].pkt_bits); str += "; Addr=" + valStr; break;