1 /*
2  * \file       trc_pkt_proc_etmv4.cpp
3  * \brief      OpenCSD :
4  *
5  * \copyright  Copyright (c) 2015, ARM Limited. All Rights Reserved.
6  */
7 
8 
9 /*
10  * Redistribution and use in source and binary forms, with or without modification,
11  * are permitted provided that the following conditions are met:
12  *
13  * 1. Redistributions of source code must retain the above copyright notice,
14  * this list of conditions and the following disclaimer.
15  *
16  * 2. Redistributions in binary form must reproduce the above copyright notice,
17  * this list of conditions and the following disclaimer in the documentation
18  * and/or other materials provided with the distribution.
19  *
20  * 3. Neither the name of the copyright holder nor the names of its contributors
21  * may be used to endorse or promote products derived from this software without
22  * specific prior written permission.
23  *
24  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
25  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
26  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
27  * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
28  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
29  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
30  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
31  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
33  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34  */
35 
36 #include "opencsd/etmv4/trc_pkt_proc_etmv4.h"
37 #include "trc_pkt_proc_etmv4i_impl.h"
38 #include "common/ocsd_error.h"
39 
40 #ifdef __GNUC__
41 // G++ doesn't like the ## pasting
42 #define ETMV4I_PKTS_NAME "PKTP_ETMV4I"
43 #else
44 // VC++ is fine
45 #define ETMV4I_PKTS_NAME OCSD_CMPNAME_PREFIX_PKTPROC##"_ETMV4I"
46 #endif
47 
48 static const uint32_t ETMV4_SUPPORTED_OP_FLAGS = OCSD_OPFLG_PKTPROC_COMMON;
49 
50 /***************************************************************************/
51 /*******************ETM V4 INSTRUCTION *************************************/
52 /***************************************************************************/
53 
TrcPktProcEtmV4I()54 TrcPktProcEtmV4I::TrcPktProcEtmV4I() : TrcPktProcBase(ETMV4I_PKTS_NAME),
55     m_pProcessor(0)
56 {
57     m_supported_op_flags = ETMV4_SUPPORTED_OP_FLAGS;
58 }
59 
TrcPktProcEtmV4I(int instIDNum)60 TrcPktProcEtmV4I::TrcPktProcEtmV4I(int instIDNum) : TrcPktProcBase(ETMV4I_PKTS_NAME, instIDNum),
61     m_pProcessor(0)
62 {
63     m_supported_op_flags = ETMV4_SUPPORTED_OP_FLAGS;
64 }
65 
~TrcPktProcEtmV4I()66 TrcPktProcEtmV4I::~TrcPktProcEtmV4I()
67 {
68     if(m_pProcessor)
69         delete m_pProcessor;
70     m_pProcessor = 0;
71 }
72 
onProtocolConfig()73 ocsd_err_t TrcPktProcEtmV4I::onProtocolConfig()
74 {
75     if(m_pProcessor == 0)
76     {
77         m_pProcessor = new (std::nothrow) EtmV4IPktProcImpl();
78         if(m_pProcessor == 0)
79         {
80             LogError(ocsdError(OCSD_ERR_SEV_ERROR,OCSD_ERR_MEM));
81             return OCSD_ERR_MEM;
82         }
83         m_pProcessor->Initialise(this);
84     }
85     return m_pProcessor->Configure(m_config);
86 }
87 
processData(const ocsd_trc_index_t index,const uint32_t dataBlockSize,const uint8_t * pDataBlock,uint32_t * numBytesProcessed)88 ocsd_datapath_resp_t TrcPktProcEtmV4I::processData(  const ocsd_trc_index_t index,
89                                                 const uint32_t dataBlockSize,
90                                                 const uint8_t *pDataBlock,
91                                                 uint32_t *numBytesProcessed)
92 {
93     if(m_pProcessor)
94         return m_pProcessor->processData(index,dataBlockSize,pDataBlock,numBytesProcessed);
95     return OCSD_RESP_FATAL_NOT_INIT;
96 }
97 
onEOT()98 ocsd_datapath_resp_t TrcPktProcEtmV4I::onEOT()
99 {
100     if(m_pProcessor)
101         return m_pProcessor->onEOT();
102     return OCSD_RESP_FATAL_NOT_INIT;
103 }
104 
onReset()105 ocsd_datapath_resp_t TrcPktProcEtmV4I::onReset()
106 {
107     if(m_pProcessor)
108         return m_pProcessor->onReset();
109     return OCSD_RESP_FATAL_NOT_INIT;
110 }
111 
onFlush()112 ocsd_datapath_resp_t TrcPktProcEtmV4I::onFlush()
113 {
114     if(m_pProcessor)
115         return m_pProcessor->onFlush();
116     return OCSD_RESP_FATAL_NOT_INIT;
117 }
118 
isBadPacket() const119 const bool TrcPktProcEtmV4I::isBadPacket() const
120 {
121     if(m_pProcessor)
122         return m_pProcessor->isBadPacket();
123     return false;
124 }
125 
126 /* End of File trc_pkt_proc_etmv4.cpp */
127