117f65170SRuslan Bukin /*
217f65170SRuslan Bukin * \file ocsd_error.cpp
317f65170SRuslan Bukin * \brief OpenCSD : Library error class.
417f65170SRuslan Bukin *
517f65170SRuslan Bukin * \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
617f65170SRuslan Bukin */
717f65170SRuslan Bukin
817f65170SRuslan Bukin
917f65170SRuslan Bukin /*
1017f65170SRuslan Bukin * Redistribution and use in source and binary forms, with or without modification,
1117f65170SRuslan Bukin * are permitted provided that the following conditions are met:
1217f65170SRuslan Bukin *
1317f65170SRuslan Bukin * 1. Redistributions of source code must retain the above copyright notice,
1417f65170SRuslan Bukin * this list of conditions and the following disclaimer.
1517f65170SRuslan Bukin *
1617f65170SRuslan Bukin * 2. Redistributions in binary form must reproduce the above copyright notice,
1717f65170SRuslan Bukin * this list of conditions and the following disclaimer in the documentation
1817f65170SRuslan Bukin * and/or other materials provided with the distribution.
1917f65170SRuslan Bukin *
2017f65170SRuslan Bukin * 3. Neither the name of the copyright holder nor the names of its contributors
2117f65170SRuslan Bukin * may be used to endorse or promote products derived from this software without
2217f65170SRuslan Bukin * specific prior written permission.
2317f65170SRuslan Bukin *
2417f65170SRuslan Bukin * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
2517f65170SRuslan Bukin * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
2617f65170SRuslan Bukin * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
2717f65170SRuslan Bukin * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
2817f65170SRuslan Bukin * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
2917f65170SRuslan Bukin * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
3017f65170SRuslan Bukin * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
3117f65170SRuslan Bukin * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3217f65170SRuslan Bukin * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
3317f65170SRuslan Bukin * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3417f65170SRuslan Bukin */
3517f65170SRuslan Bukin
3617f65170SRuslan Bukin #include "common/ocsd_error.h"
3717f65170SRuslan Bukin #include <sstream>
3817f65170SRuslan Bukin #include <iomanip>
3917f65170SRuslan Bukin
4017f65170SRuslan Bukin static const char *s_errorCodeDescs[][2] = {
4117f65170SRuslan Bukin /* general return errors */
4217f65170SRuslan Bukin {"OCSD_OK", "No Error."},
4317f65170SRuslan Bukin {"OCSD_ERR_FAIL","General failure."},
4417f65170SRuslan Bukin {"OCSD_ERR_MEM","Internal memory allocation error."},
4517f65170SRuslan Bukin {"OCSD_ERR_NOT_INIT","Component not initialised."},
4617f65170SRuslan Bukin {"OCSD_ERR_INVALID_ID","Invalid CoreSight Trace Source ID."},
4717f65170SRuslan Bukin {"OCSD_ERR_BAD_HANDLE","Invalid handle passed to component."},
4817f65170SRuslan Bukin {"OCSD_ERR_INVALID_PARAM_VAL","Invalid value parameter passed to component."},
4917f65170SRuslan Bukin {"OCSD_ERR_INVALID_PARAM_TYPE","Type mismatch on abstract interface."},
5017f65170SRuslan Bukin {"OCSD_ERR_FILE_ERROR","File access error"},
5117f65170SRuslan Bukin {"OCSD_ERR_NO_PROTOCOL","Trace protocol unsupported"},
5217f65170SRuslan Bukin /* attachment point errors */
5317f65170SRuslan Bukin {"OCSD_ERR_ATTACH_TOO_MANY","Cannot attach - attach device limit reached."},
5417f65170SRuslan Bukin {"OCSD_ERR_ATTACH_INVALID_PARAM"," Cannot attach - invalid parameter."},
5517f65170SRuslan Bukin {"OCSD_ERR_ATTACH_COMP_NOT_FOUND","Cannot detach - component not found."},
5617f65170SRuslan Bukin /* source reader errors */
5717f65170SRuslan Bukin {"OCSD_ERR_RDR_FILE_NOT_FOUND","source reader - file not found."},
5817f65170SRuslan Bukin {"OCSD_ERR_RDR_INVALID_INIT", "source reader - invalid initialisation parameter."},
5917f65170SRuslan Bukin {"OCSD_ERR_RDR_NO_DECODER", "source reader - not trace decoder set."},
6017f65170SRuslan Bukin /* data path errors */
6117f65170SRuslan Bukin {"OCSD_ERR_DATA_DECODE_FATAL", "A decoder in the data path has returned a fatal error."},
6217f65170SRuslan Bukin /* frame deformatter errors */
6317f65170SRuslan Bukin {"OCSD_ERR_DFMTR_NOTCONTTRACE", "Trace input to deformatter none-continuous"},
64*fc502085SRuslan Bukin {"OCSD_ERR_DFMTR_BAD_FHSYNC", "Bad frame or half frame sync in trace deformatter"},
6517f65170SRuslan Bukin /* packet processor errors - protocol issues etc */
6617f65170SRuslan Bukin {"OCSD_ERR_BAD_PACKET_SEQ","Bad packet sequence"},
6717f65170SRuslan Bukin {"OCSD_ERR_INVALID_PCKT_HDR","Invalid packet header"},
6817f65170SRuslan Bukin {"OCSD_ERR_PKT_INTERP_FAIL","Interpreter failed - cannot recover - bad data or sequence"},
6917f65170SRuslan Bukin /* packet decoder errors */
7017f65170SRuslan Bukin {"OCSD_ERR_UNSUPPORTED_ISA","ISA not supported in decoder"},
7117f65170SRuslan Bukin {"OCSD_ERR_HW_CFG_UNSUPP","Programmed trace configuration not supported by decodUer."},
7217f65170SRuslan Bukin {"OCSD_ERR_UNSUPP_DECODE_PKT","Packet not supported in decoder"},
7317f65170SRuslan Bukin {"OCSD_ERR_BAD_DECODE_PKT","Reserved or unknown packet in decoder."},
7417f65170SRuslan Bukin {"OCSD_ERR_COMMIT_PKT_OVERRUN","Overrun in commit packet stack - tried to commit more than available"},
7517f65170SRuslan Bukin {"OCSD_ERR_MEM_NACC","Unable to access required memory address."},
7617f65170SRuslan Bukin {"OCSD_ERR_RET_STACK_OVERFLOW","Internal return stack overflow checks failed - popped more than we pushed."},
7717f65170SRuslan Bukin /* decode tree errors */
7817f65170SRuslan Bukin {"OCSD_ERR_DCDT_NO_FORMATTER","No formatter in use - operation not valid."},
7917f65170SRuslan Bukin /* target memory access errors */
8017f65170SRuslan Bukin {"OCSD_ERR_MEM_ACC_OVERLAP","Attempted to set an overlapping range in memory access map."},
8117f65170SRuslan Bukin {"OCSD_ERR_MEM_ACC_FILE_NOT_FOUND","Memory access file could not be opened."},
8217f65170SRuslan Bukin {"OCSD_ERR_MEM_ACC_FILE_DIFF_RANGE","Attempt to re-use the same memory access file for a different address range."},
83*fc502085SRuslan Bukin {"OCSD_ERR_MEM_ACC_BAD_LEN","Memory accessor returned a bad read length value (larger than requested."},
8417f65170SRuslan Bukin {"OCSD_ERR_MEM_ACC_RANGE_INVALID","Address range in accessor set to invalid values."},
8517f65170SRuslan Bukin /* test errors - errors generated only by the test code, not the library */
8617f65170SRuslan Bukin {"OCSD_ERR_TEST_SNAPSHOT_PARSE", "Test snapshot file parse error"},
8717f65170SRuslan Bukin {"OCSD_ERR_TEST_SNAPSHOT_PARSE_INFO", "Test snapshot file parse information"},
8817f65170SRuslan Bukin {"OCSD_ERR_TEST_SNAPSHOT_READ","test snapshot reader error"},
8917f65170SRuslan Bukin {"OCSD_ERR_TEST_SS_TO_DECODER","test snapshot to decode tree conversion error"},
9017f65170SRuslan Bukin /* decoder registration */
9117f65170SRuslan Bukin {"OCSD_ERR_DCDREG_NAME_REPEAT","Attempted to register a decoder with the same name as another one."},
9217f65170SRuslan Bukin {"OCSD_ERR_DCDREG_NAME_UNKNOWN","Attempted to find a decoder with a name that is not known in the library."},
9317f65170SRuslan Bukin {"OCSD_ERR_DCDREG_TYPE_UNKNOWN","Attempted to find a decoder with a type that is not known in the library."},
9417f65170SRuslan Bukin /* decoder config */
95*fc502085SRuslan Bukin {"OCSD_ERR_DCD_INTERFACE_UNUSED","Attempt to connect or use and interface not supported by this decoder."},
9617f65170SRuslan Bukin /* end marker*/
9717f65170SRuslan Bukin {"OCSD_ERR_LAST", "No error - error code end marker"}
9817f65170SRuslan Bukin };
9917f65170SRuslan Bukin
ocsdError(const ocsd_err_severity_t sev_type,const ocsd_err_t code)10017f65170SRuslan Bukin ocsdError::ocsdError(const ocsd_err_severity_t sev_type, const ocsd_err_t code) :
10117f65170SRuslan Bukin m_error_code(code),
10217f65170SRuslan Bukin m_sev(sev_type),
10317f65170SRuslan Bukin m_idx(OCSD_BAD_TRC_INDEX),
10417f65170SRuslan Bukin m_chan_ID(OCSD_BAD_CS_SRC_ID)
10517f65170SRuslan Bukin {
10617f65170SRuslan Bukin }
10717f65170SRuslan Bukin
ocsdError(const ocsd_err_severity_t sev_type,const ocsd_err_t code,const ocsd_trc_index_t idx)10817f65170SRuslan Bukin ocsdError::ocsdError(const ocsd_err_severity_t sev_type, const ocsd_err_t code, const ocsd_trc_index_t idx) :
10917f65170SRuslan Bukin m_error_code(code),
11017f65170SRuslan Bukin m_sev(sev_type),
11117f65170SRuslan Bukin m_idx(idx),
11217f65170SRuslan Bukin m_chan_ID(OCSD_BAD_CS_SRC_ID)
11317f65170SRuslan Bukin {
11417f65170SRuslan Bukin }
11517f65170SRuslan Bukin
ocsdError(const ocsd_err_severity_t sev_type,const ocsd_err_t code,const ocsd_trc_index_t idx,const uint8_t chan_id)11617f65170SRuslan Bukin ocsdError::ocsdError(const ocsd_err_severity_t sev_type, const ocsd_err_t code, const ocsd_trc_index_t idx, const uint8_t chan_id) :
11717f65170SRuslan Bukin m_error_code(code),
11817f65170SRuslan Bukin m_sev(sev_type),
11917f65170SRuslan Bukin m_idx(idx),
12017f65170SRuslan Bukin m_chan_ID(chan_id)
12117f65170SRuslan Bukin {
12217f65170SRuslan Bukin }
12317f65170SRuslan Bukin
ocsdError(const ocsd_err_severity_t sev_type,const ocsd_err_t code,const std::string & msg)12417f65170SRuslan Bukin ocsdError::ocsdError(const ocsd_err_severity_t sev_type, const ocsd_err_t code, const std::string &msg) :
12517f65170SRuslan Bukin m_error_code(code),
12617f65170SRuslan Bukin m_sev(sev_type),
12717f65170SRuslan Bukin m_idx(OCSD_BAD_TRC_INDEX),
12817f65170SRuslan Bukin m_chan_ID(OCSD_BAD_CS_SRC_ID),
12917f65170SRuslan Bukin m_err_message(msg)
13017f65170SRuslan Bukin {
13117f65170SRuslan Bukin }
13217f65170SRuslan Bukin
ocsdError(const ocsd_err_severity_t sev_type,const ocsd_err_t code,const ocsd_trc_index_t idx,const std::string & msg)13317f65170SRuslan Bukin ocsdError::ocsdError(const ocsd_err_severity_t sev_type, const ocsd_err_t code, const ocsd_trc_index_t idx, const std::string &msg) :
13417f65170SRuslan Bukin m_error_code(code),
13517f65170SRuslan Bukin m_sev(sev_type),
13617f65170SRuslan Bukin m_idx(idx),
13717f65170SRuslan Bukin m_chan_ID(OCSD_BAD_CS_SRC_ID),
13817f65170SRuslan Bukin m_err_message(msg)
13917f65170SRuslan Bukin {
14017f65170SRuslan Bukin }
14117f65170SRuslan Bukin
ocsdError(const ocsd_err_severity_t sev_type,const ocsd_err_t code,const ocsd_trc_index_t idx,const uint8_t chan_id,const std::string & msg)14217f65170SRuslan Bukin ocsdError::ocsdError(const ocsd_err_severity_t sev_type, const ocsd_err_t code, const ocsd_trc_index_t idx, const uint8_t chan_id, const std::string &msg) :
14317f65170SRuslan Bukin m_error_code(code),
14417f65170SRuslan Bukin m_sev(sev_type),
14517f65170SRuslan Bukin m_idx(idx),
14617f65170SRuslan Bukin m_chan_ID(chan_id),
14717f65170SRuslan Bukin m_err_message(msg)
14817f65170SRuslan Bukin {
14917f65170SRuslan Bukin }
15017f65170SRuslan Bukin
15117f65170SRuslan Bukin
ocsdError(const ocsdError * pError)15217f65170SRuslan Bukin ocsdError::ocsdError(const ocsdError *pError) :
15317f65170SRuslan Bukin m_error_code(pError->getErrorCode()),
15417f65170SRuslan Bukin m_sev(pError->getErrorSeverity()),
15517f65170SRuslan Bukin m_idx(pError->getErrorIndex()),
15617f65170SRuslan Bukin m_chan_ID(pError->getErrorChanID())
15717f65170SRuslan Bukin {
15817f65170SRuslan Bukin setMessage(pError->getMessage());
15917f65170SRuslan Bukin }
16017f65170SRuslan Bukin
ocsdError(const ocsdError & Error)16117f65170SRuslan Bukin ocsdError::ocsdError(const ocsdError &Error) :
16217f65170SRuslan Bukin m_error_code(Error.getErrorCode()),
16317f65170SRuslan Bukin m_sev(Error.getErrorSeverity()),
16417f65170SRuslan Bukin m_idx(Error.getErrorIndex()),
16517f65170SRuslan Bukin m_chan_ID(Error.getErrorChanID())
16617f65170SRuslan Bukin {
16717f65170SRuslan Bukin setMessage(Error.getMessage());
16817f65170SRuslan Bukin }
16917f65170SRuslan Bukin
ocsdError()17017f65170SRuslan Bukin ocsdError::ocsdError():
17117f65170SRuslan Bukin m_error_code(OCSD_ERR_LAST),
17217f65170SRuslan Bukin m_sev(OCSD_ERR_SEV_NONE),
17317f65170SRuslan Bukin m_idx(OCSD_BAD_TRC_INDEX),
17417f65170SRuslan Bukin m_chan_ID(OCSD_BAD_CS_SRC_ID)
17517f65170SRuslan Bukin {
17617f65170SRuslan Bukin }
17717f65170SRuslan Bukin
~ocsdError()17817f65170SRuslan Bukin ocsdError::~ocsdError()
17917f65170SRuslan Bukin {
18017f65170SRuslan Bukin }
18117f65170SRuslan Bukin
getErrorString(const ocsdError & error)18217f65170SRuslan Bukin const std::string ocsdError::getErrorString(const ocsdError &error)
18317f65170SRuslan Bukin {
18417f65170SRuslan Bukin std::string szErrStr = "LIBRARY INTERNAL ERROR: Invalid Error Object";
18517f65170SRuslan Bukin const char *sev_type_sz[] = {
18617f65170SRuslan Bukin "NONE ",
18717f65170SRuslan Bukin "ERROR:",
18817f65170SRuslan Bukin "WARN :",
18917f65170SRuslan Bukin "INFO :"
19017f65170SRuslan Bukin };
19117f65170SRuslan Bukin
19217f65170SRuslan Bukin switch(error.getErrorSeverity())
19317f65170SRuslan Bukin {
19417f65170SRuslan Bukin default:
19517f65170SRuslan Bukin case OCSD_ERR_SEV_NONE:
19617f65170SRuslan Bukin break;
19717f65170SRuslan Bukin
19817f65170SRuslan Bukin case OCSD_ERR_SEV_ERROR:
19917f65170SRuslan Bukin case OCSD_ERR_SEV_WARN:
20017f65170SRuslan Bukin case OCSD_ERR_SEV_INFO:
20117f65170SRuslan Bukin szErrStr = sev_type_sz[(int)error.getErrorSeverity()];
20217f65170SRuslan Bukin appendErrorDetails(szErrStr,error);
20317f65170SRuslan Bukin break;
20417f65170SRuslan Bukin }
20517f65170SRuslan Bukin return szErrStr;
20617f65170SRuslan Bukin }
20717f65170SRuslan Bukin
appendErrorDetails(std::string & errStr,const ocsdError & error)20817f65170SRuslan Bukin void ocsdError::appendErrorDetails(std::string &errStr, const ocsdError &error)
20917f65170SRuslan Bukin {
21017f65170SRuslan Bukin int numerrstr = sizeof(s_errorCodeDescs) / sizeof(s_errorCodeDescs[0]);
21117f65170SRuslan Bukin int code = (int)error.getErrorCode();
21217f65170SRuslan Bukin ocsd_trc_index_t idx = error.getErrorIndex();
21317f65170SRuslan Bukin uint8_t chan_ID = error.getErrorChanID();
21417f65170SRuslan Bukin std::ostringstream oss;
21517f65170SRuslan Bukin
21617f65170SRuslan Bukin oss << "0x" << std::hex << std::setfill('0') << std::setw(4) << code;
21717f65170SRuslan Bukin if(code < numerrstr)
21817f65170SRuslan Bukin oss << " (" << s_errorCodeDescs[code][0] << ") [" << s_errorCodeDescs[code][1] << "]; ";
21917f65170SRuslan Bukin else
22017f65170SRuslan Bukin oss << " (unknown); ";
22117f65170SRuslan Bukin
22217f65170SRuslan Bukin if(idx != OCSD_BAD_TRC_INDEX)
22317f65170SRuslan Bukin oss << "TrcIdx=" << std::dec << idx << "; ";
22417f65170SRuslan Bukin
22517f65170SRuslan Bukin if(chan_ID != OCSD_BAD_CS_SRC_ID)
22617f65170SRuslan Bukin oss << "CS ID=" << std::hex << std::setfill('0') << std::setw(2) << (uint16_t)chan_ID << "; ";
22717f65170SRuslan Bukin
22817f65170SRuslan Bukin oss << error.getMessage();
22917f65170SRuslan Bukin errStr = oss.str();
23017f65170SRuslan Bukin }
23117f65170SRuslan Bukin
23217f65170SRuslan Bukin
getStr()233 const char* ocsdDataRespStr::getStr()
234 {
235 static const char* szRespStr[] = {
236 "OCSD_RESP_CONT: Continue processing.",
237 "OCSD_RESP_WARN_CONT: Continue processing -> a component logged a warning.",
238 "OCSD_RESP_ERR_CONT: Continue processing -> a component logged an error.",
239 "OCSD_RESP_WAIT: Pause processing",
240 "OCSD_RESP_WARN_WAIT: Pause processing -> a component logged a warning.",
241 "OCSD_RESP_ERR_WAIT: Pause processing -> a component logged an error.",
242 "OCSD_RESP_FATAL_NOT_INIT: Processing Fatal Error : component unintialised.",
243 "OCSD_RESP_FATAL_INVALID_OP: Processing Fatal Error : invalid data path operation.",
244 "OCSD_RESP_FATAL_INVALID_PARAM: Processing Fatal Error : invalid parameter in datapath call.",
245 "OCSD_RESP_FATAL_INVALID_DATA: Processing Fatal Error : invalid trace data.",
246 "OCSD_RESP_FATAL_SYS_ERR: Processing Fatal Error : internal system error."
247 };
248 if ((m_type < OCSD_RESP_CONT) || (m_type > OCSD_RESP_FATAL_SYS_ERR))
249 return "Unknown OCSD_RESP type.";
250 return szRespStr[m_type];
251 }
252
253 /* End of File ocsd_error.cpp */
254