2 * \file trc_pkt_elem_stm.cpp
3 * \brief OpenCSD : STM decode - packet class
5 * \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
9 * Redistribution and use in source and binary forms, with or without modification,
10 * are permitted provided that the following conditions are met:
12 * 1. Redistributions of source code must retain the above copyright notice,
13 * this list of conditions and the following disclaimer.
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.
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.
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.
37 #include "opencsd/stm/trc_pkt_elem_stm.h"
39 StmTrcPacket::StmTrcPacket()
44 StmTrcPacket &StmTrcPacket::operator =(const ocsd_stm_pkt *p_pkt)
46 *dynamic_cast<ocsd_stm_pkt *>(this) = *p_pkt;
50 void StmTrcPacket::initStartState()
55 ts_type = STM_TS_UNKNOWN;
56 type = STM_PKT_NOTSYNC;
60 void StmTrcPacket::initNextPacket()
62 err_type = STM_PKT_NO_ERR_TYPE;
68 void StmTrcPacket::setTS(const uint64_t ts_val, const uint8_t updatedBits)
76 uint64_t mask = (0x1ULL << updatedBits) - 1;
78 timestamp |= ts_val & mask;
80 pkt_ts_bits = updatedBits; // mark number of bits
85 void StmTrcPacket::toString(std::string &str) const
87 std::string name, desc;
88 std::ostringstream oss;
90 pktTypeName(type,name, desc);
91 str = name + ":" + desc;
93 // extended information
96 case STM_PKT_INCOMPLETE_EOT:
97 case STM_PKT_BAD_SEQUENCE:
98 pktTypeName(err_type,name, desc);
99 str+= "[" + name + "]";
102 case STM_PKT_VERSION:
103 oss << "; Ver=" << (uint16_t)payload.D8;
108 oss << "; Freq=" << std::dec << payload.D32 << "Hz";
113 oss << "; TrigData=0x" << std::hex << std::setw(2) << std::setfill('0') << (uint16_t)payload.D8;
118 oss << "; Master=0x" << std::hex << std::setw(2) << std::setfill('0') << (uint16_t)master;
124 oss << "; Chan=0x" << std::hex << std::setw(4) << std::setfill('0') << channel;
129 oss << "; Data=0x" << std::hex << std::setw(1) << (uint16_t)(payload.D8 & 0xF);
134 oss << "; Data=0x" << std::hex << std::setw(2) << std::setfill('0') << (uint16_t)payload.D8;
139 oss << "; Data=0x" << std::hex << std::setw(4) << std::setfill('0') << payload.D16;
144 oss << "; Data=0x" << std::hex << std::setw(8) << std::setfill('0') << payload.D32;
149 oss << "; Data=0x" << std::hex << std::setw(16) << std::setfill('0') << payload.D64;
157 trcPrintableElem::getValStr(valStr,64,64,timestamp,true,pkt_ts_bits);
158 str += "; TS=" + valStr;
162 void StmTrcPacket::toStringFmt(const uint32_t fmtFlags, std::string &str) const
164 // no formatting for now.
168 void StmTrcPacket::pktTypeName(const ocsd_stm_pkt_type pkt_type, std::string &name, std::string &desc) const
170 std::ostringstream oss_name;
171 std::ostringstream oss_desc;
172 bool addMarkerTS = false;
177 case STM_PKT_RESERVED:
178 oss_name << "RESERVED";
179 oss_desc << "Reserved Packet Header";
182 case STM_PKT_NOTSYNC:
183 oss_name << "NOTSYNC";
184 oss_desc << "STM not synchronised";
187 case STM_PKT_INCOMPLETE_EOT:
188 oss_name << "INCOMPLETE_EOT";
189 oss_desc << "Incomplete packet flushed at end of trace";
192 case STM_PKT_NO_ERR_TYPE:
193 oss_name << "NO_ERR_TYPE";
194 oss_desc << "Error type not set";
197 case STM_PKT_BAD_SEQUENCE:
198 oss_name << "BAD_SEQUENCE";
199 oss_desc << "Invalid sequence in packet";
204 oss_desc << "Alignment synchronisation packet";
207 case STM_PKT_VERSION:
208 oss_name << "VERSION";
209 oss_desc << "Version packet";
214 oss_desc << "Frequency packet";
219 oss_desc << "Null packet";
224 oss_desc << "Trigger packet";
230 oss_desc << "Global Error";
235 oss_desc << "Master Error";
240 oss_desc << "Set current master";
245 oss_desc << "Set current channel";
250 oss_desc << "Set current channel";
255 oss_desc << "Flag packet";
261 oss_desc << "4 bit data";
267 oss_desc << "8 bit data";
273 oss_desc << "16 bit data";
279 oss_desc << "32 bit data";
285 oss_desc << "64 bit data";
290 oss_name << "UNKNOWN";
291 oss_desc << "ERROR: unknown packet type";
300 oss_desc << " + marker";
306 oss_desc << " + timestamp";
309 desc = oss_desc.str();
310 name = oss_name.str();
314 /* End of File trc_pkt_elem_stm.cpp */