diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-28 07:24:57 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-28 07:24:57 +0000 |
commit | 070852d8604cece0c31f28ff3eb8d21d9ba415fb (patch) | |
tree | 9097175a6a5b8b7e37af9a96269ac0b61a0189cd /decoder/source/stm/trc_pkt_elem_stm.cpp | |
parent | Initial commit. (diff) | |
download | libopencsd-070852d8604cece0c31f28ff3eb8d21d9ba415fb.tar.xz libopencsd-070852d8604cece0c31f28ff3eb8d21d9ba415fb.zip |
Adding upstream version 1.3.3.upstream/1.3.3upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'decoder/source/stm/trc_pkt_elem_stm.cpp')
-rw-r--r-- | decoder/source/stm/trc_pkt_elem_stm.cpp | 314 |
1 files changed, 314 insertions, 0 deletions
diff --git a/decoder/source/stm/trc_pkt_elem_stm.cpp b/decoder/source/stm/trc_pkt_elem_stm.cpp new file mode 100644 index 0000000..d9adaf6 --- /dev/null +++ b/decoder/source/stm/trc_pkt_elem_stm.cpp @@ -0,0 +1,314 @@ +/* + * \file trc_pkt_elem_stm.cpp + * \brief OpenCSD : STM decode - packet class + * + * \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved. + */ + +/* + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its contributors + * may be used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <sstream> +#include <iomanip> +#include "opencsd/stm/trc_pkt_elem_stm.h" + +StmTrcPacket::StmTrcPacket() +{ + initStartState(); +} + +StmTrcPacket &StmTrcPacket::operator =(const ocsd_stm_pkt *p_pkt) +{ + *dynamic_cast<ocsd_stm_pkt *>(this) = *p_pkt; + return *this; +} + +void StmTrcPacket::initStartState() +{ + master = 0; + channel = 0; + timestamp = 0; + ts_type = STM_TS_UNKNOWN; + type = STM_PKT_NOTSYNC; + initNextPacket(); +} + +void StmTrcPacket::initNextPacket() +{ + err_type = STM_PKT_NO_ERR_TYPE; + pkt_ts_bits = 0; + pkt_has_marker = 0; + pkt_has_ts = 0; +} + +void StmTrcPacket::setTS(const uint64_t ts_val, const uint8_t updatedBits) +{ + if(updatedBits == 64) + { + timestamp = ts_val; + } + else + { + uint64_t mask = (0x1ULL << updatedBits) - 1; + timestamp &= ~mask; + timestamp |= ts_val & mask; + } + pkt_ts_bits = updatedBits; // mark number of bits + pkt_has_ts = 1; +} + +// printing +void StmTrcPacket::toString(std::string &str) const +{ + std::string name, desc; + std::ostringstream oss; + + pktTypeName(type,name, desc); + str = name + ":" + desc; + + // extended information + switch(type) + { + case STM_PKT_INCOMPLETE_EOT: + case STM_PKT_BAD_SEQUENCE: + pktTypeName(err_type,name, desc); + str+= "[" + name + "]"; + break; + + case STM_PKT_VERSION: + oss << "; Ver=" << (uint16_t)payload.D8; + str+= oss.str(); + break; + + case STM_PKT_FREQ: + oss << "; Freq=" << std::dec << payload.D32 << "Hz"; + str+= oss.str(); + break; + + case STM_PKT_TRIG: + oss << "; TrigData=0x" << std::hex << std::setw(2) << std::setfill('0') << (uint16_t)payload.D8; + str+= oss.str(); + break; + + case STM_PKT_M8: + oss << "; Master=0x" << std::hex << std::setw(2) << std::setfill('0') << (uint16_t)master; + str+= oss.str(); + break; + + case STM_PKT_C8: + case STM_PKT_C16: + oss << "; Chan=0x" << std::hex << std::setw(4) << std::setfill('0') << channel; + str+= oss.str(); + break; + + case STM_PKT_D4: + oss << "; Data=0x" << std::hex << std::setw(1) << (uint16_t)(payload.D8 & 0xF); + str+= oss.str(); + break; + + case STM_PKT_D8: + oss << "; Data=0x" << std::hex << std::setw(2) << std::setfill('0') << (uint16_t)payload.D8; + str+= oss.str(); + break; + + case STM_PKT_D16: + oss << "; Data=0x" << std::hex << std::setw(4) << std::setfill('0') << payload.D16; + str+= oss.str(); + break; + + case STM_PKT_D32: + oss << "; Data=0x" << std::hex << std::setw(8) << std::setfill('0') << payload.D32; + str+= oss.str(); + break; + + case STM_PKT_D64: + oss << "; Data=0x" << std::hex << std::setw(16) << std::setfill('0') << payload.D64; + str+= oss.str(); + break; + } + + if(isTSPkt()) + { + std::string valStr; + trcPrintableElem::getValStr(valStr,64,64,timestamp,true,pkt_ts_bits); + str += "; TS=" + valStr; + } +} + +void StmTrcPacket::toStringFmt(const uint32_t fmtFlags, std::string &str) const +{ + // no formatting for now. + toString(str); +} + +void StmTrcPacket::pktTypeName(const ocsd_stm_pkt_type pkt_type, std::string &name, std::string &desc) const +{ + std::ostringstream oss_name; + std::ostringstream oss_desc; + bool addMarkerTS = false; + + + switch(pkt_type) + { + case STM_PKT_RESERVED: + oss_name << "RESERVED"; + oss_desc << "Reserved Packet Header"; + break; + + case STM_PKT_NOTSYNC: + oss_name << "NOTSYNC"; + oss_desc << "STM not synchronised"; + break; + + case STM_PKT_INCOMPLETE_EOT: + oss_name << "INCOMPLETE_EOT"; + oss_desc << "Incomplete packet flushed at end of trace"; + break; + + case STM_PKT_NO_ERR_TYPE: + oss_name << "NO_ERR_TYPE"; + oss_desc << "Error type not set"; + break; + + case STM_PKT_BAD_SEQUENCE: + oss_name << "BAD_SEQUENCE"; + oss_desc << "Invalid sequence in packet"; + break; + + case STM_PKT_ASYNC: + oss_name << "ASYNC"; + oss_desc << "Alignment synchronisation packet"; + break; + + case STM_PKT_VERSION: + oss_name << "VERSION"; + oss_desc << "Version packet"; + break; + + case STM_PKT_FREQ: + oss_name << "FREQ"; + oss_desc << "Frequency packet"; + break; + + case STM_PKT_NULL: + oss_name << "NULL"; + oss_desc << "Null packet"; + break; + + case STM_PKT_TRIG: + oss_name << "TRIG"; + oss_desc << "Trigger packet"; + addMarkerTS = true; + break; + + case STM_PKT_GERR: + oss_name << "GERR"; + oss_desc << "Global Error"; + break; + + case STM_PKT_MERR: + oss_name << "MERR"; + oss_desc << "Master Error"; + break; + + case STM_PKT_M8: + oss_name << "M8"; + oss_desc << "Set current master"; + break; + + case STM_PKT_C8: + oss_name << "C8"; + oss_desc << "Set current channel"; + break; + + case STM_PKT_C16: + oss_name << "C16"; + oss_desc << "Set current channel"; + break; + + case STM_PKT_FLAG: + oss_name << "FLAG"; + oss_desc << "Flag packet"; + addMarkerTS = true; + break; + + case STM_PKT_D4: + oss_name << "D4"; + oss_desc << "4 bit data"; + addMarkerTS = true; + break; + + case STM_PKT_D8: + oss_name << "D8"; + oss_desc << "8 bit data"; + addMarkerTS = true; + break; + + case STM_PKT_D16: + oss_name << "D16"; + oss_desc << "16 bit data"; + addMarkerTS = true; + break; + + case STM_PKT_D32: + oss_name << "D32"; + oss_desc << "32 bit data"; + addMarkerTS = true; + break; + + case STM_PKT_D64: + oss_name << "D64"; + oss_desc << "64 bit data"; + addMarkerTS = true; + break; + + default: + oss_name << "UNKNOWN"; + oss_desc << "ERROR: unknown packet type"; + break; + } + + if(addMarkerTS) + { + if(isMarkerPkt()) + { + oss_name << "M"; + oss_desc << " + marker"; + } + + if(isTSPkt()) + { + oss_name << "TS"; + oss_desc << " + timestamp"; + } + } + desc = oss_desc.str(); + name = oss_name.str(); +} + + +/* End of File trc_pkt_elem_stm.cpp */ |