aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Leach <mike.leach@linaro.org>2020-04-23 00:49:02 +0100
committerMike Leach <mike.leach@linaro.org>2021-01-08 17:05:25 +0000
commit441aafd04770beadd2eb2f1594e0e63ef4fc1958 (patch)
treef220deda270f2c89d3745a4ed33fee3d46f69a5e
parent0fd01c1ec0f06555cf3fefd54ab6ca3810a7d119 (diff)
downloadOpenCSD-441aafd04770beadd2eb2f1594e0e63ef4fc1958.tar.gz
opencsd: ete: Add handler for ETE timestamp marker.
ETE 1.1 adds a new Timestamp marker packet to locate position of late emitted timestamp packets in the trace stream. Signed-off-by: Mike Leach <mike.leach@linaro.org>
-rw-r--r--decoder/include/opencsd/etmv4/trc_cmp_cfg_etmv4.h6
-rw-r--r--decoder/include/opencsd/etmv4/trc_pkt_decode_etmv4i.h1
-rw-r--r--decoder/include/opencsd/etmv4/trc_pkt_types_etmv4.h3
-rw-r--r--decoder/source/etmv4/trc_pkt_decode_etmv4i.cpp20
-rw-r--r--decoder/source/etmv4/trc_pkt_elem_etmv4i.cpp5
-rw-r--r--decoder/source/etmv4/trc_pkt_proc_etmv4i.cpp6
6 files changed, 38 insertions, 3 deletions
diff --git a/decoder/include/opencsd/etmv4/trc_cmp_cfg_etmv4.h b/decoder/include/opencsd/etmv4/trc_cmp_cfg_etmv4.h
index 27ed33c..e46b71d 100644
--- a/decoder/include/opencsd/etmv4/trc_cmp_cfg_etmv4.h
+++ b/decoder/include/opencsd/etmv4/trc_cmp_cfg_etmv4.h
@@ -81,6 +81,7 @@ public:
const bool hasCycleCountI() const;
const bool hasRetStack() const;
const uint8_t numEvents() const;
+ const bool eteHasTSMarker() const;
typedef enum _condType {
COND_PASS_FAIL,
@@ -254,6 +255,11 @@ inline const bool EtmV4Config::hasTrcExcpData() const
return (bool)((m_cfg.reg_idr0 & 0x20000) == 0x20000);
}
+inline const bool EtmV4Config::eteHasTSMarker() const
+{
+ return (FullVersion() >= 0x51) && ((m_cfg.reg_idr0 & 0x800000) == 0x800000);
+}
+
inline const uint32_t EtmV4Config::TimeStampSize() const
{
uint32_t tsSizeF = (m_cfg.reg_idr0 >> 24) & 0x1F;
diff --git a/decoder/include/opencsd/etmv4/trc_pkt_decode_etmv4i.h b/decoder/include/opencsd/etmv4/trc_pkt_decode_etmv4i.h
index 0223db9..607e21d 100644
--- a/decoder/include/opencsd/etmv4/trc_pkt_decode_etmv4i.h
+++ b/decoder/include/opencsd/etmv4/trc_pkt_decode_etmv4i.h
@@ -150,6 +150,7 @@ private:
// timestamping
uint64_t m_timestamp; // last broadcast global Timestamp.
+ bool m_ete_first_ts_marker;
// state and context
uint32_t m_context_id; // most recent context ID
diff --git a/decoder/include/opencsd/etmv4/trc_pkt_types_etmv4.h b/decoder/include/opencsd/etmv4/trc_pkt_types_etmv4.h
index 85da83b..dd241a0 100644
--- a/decoder/include/opencsd/etmv4/trc_pkt_types_etmv4.h
+++ b/decoder/include/opencsd/etmv4/trc_pkt_types_etmv4.h
@@ -119,7 +119,8 @@ typedef enum _ocsd_etmv4_i_pkt_type
ETM4_PKT_I_ADDR_CTXT_L_64IS0 = 0x85, /*!< b10000101 */
ETM4_PKT_I_ADDR_CTXT_L_64IS1, /*!< b10000110 */
/* unused encoding 0x87 b10000111 */
- /* unused encodings 0x88-0x8F b10001xxx */
+ ETE_PKT_I_TS_MARKER = 0x88, /*!< b10001000 */
+ /* unused encodings 0x89-0x8F b10001001 to b10001111 */
ETM4_PKT_I_ADDR_MATCH = 0x90, /*!< b10010000 to b10010010 0x92 */
/* unused encodings 0x93-0x94 b10010011 to b10010010 */
ETM4_PKT_I_ADDR_S_IS0 = 0x95, /*!< b10010101 */
diff --git a/decoder/source/etmv4/trc_pkt_decode_etmv4i.cpp b/decoder/source/etmv4/trc_pkt_decode_etmv4i.cpp
index 2c97735..e4caf0a 100644
--- a/decoder/source/etmv4/trc_pkt_decode_etmv4i.cpp
+++ b/decoder/source/etmv4/trc_pkt_decode_etmv4i.cpp
@@ -270,6 +270,7 @@ void TrcPktDecodeEtmV4I::resetDecoder()
m_out_elem.resetElemStack();
m_last_IS = 0;
clearElemRes();
+ m_ete_first_ts_marker = false;
// elements associated with data trace
#ifdef DATA_TRACE_SUPPORTED
@@ -465,6 +466,16 @@ ocsd_err_t TrcPktDecodeEtmV4I::decodePacket()
}
break;
+ case ETE_PKT_I_TS_MARKER:
+ {
+ trace_marker_payload_t marker;
+ marker.type = ELEM_MARKER_TS;
+ marker.value = 0;
+ if (m_P0_stack.createMarkerElem(m_curr_packet_in->getType(), m_index_curr_pkt, marker) == 0)
+ bAllocErr = true;
+ }
+ break;
+
case ETM4_PKT_I_BAD_SEQUENCE:
err = handleBadPacket("Bad byte sequence in packet.");
break;
@@ -1106,6 +1117,8 @@ ocsd_err_t TrcPktDecodeEtmV4I::discardElements()
ocsd_err_t TrcPktDecodeEtmV4I::processTS_CC_EventElem(TrcStackElem *pElem)
{
ocsd_err_t err = OCSD_OK;
+ // ignore ts for ETE if not seen first TS marker on systems that use this.
+ bool bPermitTS = !m_config->eteHasTSMarker() || m_ete_first_ts_marker;
switch (pElem->getP0Type())
{
@@ -1120,7 +1133,7 @@ ocsd_err_t TrcPktDecodeEtmV4I::processTS_CC_EventElem(TrcStackElem *pElem)
case P0_TS:
{
TrcStackElemParam *pParamElem = dynamic_cast<TrcStackElemParam *>(pElem);
- if (pParamElem)
+ if (pParamElem && bPermitTS)
err = addElemTS(pParamElem, false);
}
break;
@@ -1136,7 +1149,7 @@ ocsd_err_t TrcPktDecodeEtmV4I::processTS_CC_EventElem(TrcStackElem *pElem)
case P0_TS_CC:
{
TrcStackElemParam *pParamElem = dynamic_cast<TrcStackElemParam *>(pElem);
- if (pParamElem)
+ if (pParamElem && bPermitTS)
err = addElemTS(pParamElem, true);
}
break;
@@ -1150,6 +1163,9 @@ ocsd_err_t TrcPktDecodeEtmV4I::processMarkerElem(TrcStackElem *pElem)
ocsd_err_t err = OCSD_OK;
TrcStackElemMarker *pMarkerElem = dynamic_cast<TrcStackElemMarker *>(pElem);
+ if (m_config->eteHasTSMarker() && (pMarkerElem->getMarker().type == ELEM_MARKER_TS))
+ m_ete_first_ts_marker = true;
+
if (!err)
{
err = m_out_elem.addElemType(pElem->getRootIndex(), OCSD_GEN_TRC_ELEM_SYNC_MARKER);
diff --git a/decoder/source/etmv4/trc_pkt_elem_etmv4i.cpp b/decoder/source/etmv4/trc_pkt_elem_etmv4i.cpp
index 861d668..b417540 100644
--- a/decoder/source/etmv4/trc_pkt_elem_etmv4i.cpp
+++ b/decoder/source/etmv4/trc_pkt_elem_etmv4i.cpp
@@ -507,6 +507,11 @@ const char *EtmV4ITrcPacket::packetTypeName(const ocsd_etmv4_i_pkt_type type, co
pDesc = "Address & Context, Long, 64 bit, IS1.";
break;
+ case ETE_PKT_I_TS_MARKER:
+ pName = "I_TS_MARKER";
+ pDesc = "Timestamp Marker";
+ break;
+
case ETM4_PKT_I_ADDR_MATCH:
pName = "I_ADDR_MATCH";
pDesc = "Exact Address Match.";
diff --git a/decoder/source/etmv4/trc_pkt_proc_etmv4i.cpp b/decoder/source/etmv4/trc_pkt_proc_etmv4i.cpp
index aef659a..81ae9d7 100644
--- a/decoder/source/etmv4/trc_pkt_proc_etmv4i.cpp
+++ b/decoder/source/etmv4/trc_pkt_proc_etmv4i.cpp
@@ -1501,6 +1501,12 @@ void TrcPktProcEtmV4I::BuildIPacketTable()
m_i_table[0x85+i].pptkFn = &TrcPktProcEtmV4I::iPktAddrCtxt;
}
+ // 0b1000 1000 - ETE 1.1 TS Marker
+ if (m_config.MajVersion() >= 0x5)
+ {
+ m_i_table[0x88].pkt_type = ETE_PKT_I_TS_MARKER;
+ m_i_table[0x88].pptkFn = &TrcPktProcEtmV4I::iPktNoPayload;
+ }
// 0b1001 0000 to b1001 0010 - exact match addr
for(int i = 0; i < 3; i++)
{