summaryrefslogtreecommitdiff
path: root/contrib/opencsd
diff options
context:
space:
mode:
authorAndrew Turner <andrew@FreeBSD.org>2020-06-16 08:57:13 +0000
committerAndrew Turner <andrew@FreeBSD.org>2020-06-16 08:57:13 +0000
commit9619ffaac8b4fd8cc58d5010449b73272a59e806 (patch)
tree283395c0326b73ad56540381bc2e17ea9a57b428 /contrib/opencsd
parent467535dcfaa6be42efe0fe8be9582cafc5dfb812 (diff)
downloadsrc-test2-9619ffaac8b4fd8cc58d5010449b73272a59e806.tar.gz
src-test2-9619ffaac8b4fd8cc58d5010449b73272a59e806.zip
Notes
Diffstat (limited to 'contrib/opencsd')
-rw-r--r--contrib/opencsd/decoder/include/common/comp_attach_notifier_i.h63
-rw-r--r--contrib/opencsd/decoder/include/common/comp_attach_pt_t.h240
-rw-r--r--contrib/opencsd/decoder/include/common/ocsd_code_follower.h237
-rw-r--r--contrib/opencsd/decoder/include/common/ocsd_dcd_mngr.h396
-rw-r--r--contrib/opencsd/decoder/include/common/ocsd_dcd_mngr_i.h98
-rw-r--r--contrib/opencsd/decoder/include/common/ocsd_dcd_tree.h426
-rw-r--r--contrib/opencsd/decoder/include/common/ocsd_dcd_tree_elem.h112
-rw-r--r--contrib/opencsd/decoder/include/common/ocsd_error.h116
-rw-r--r--contrib/opencsd/decoder/include/common/ocsd_error_logger.h89
-rw-r--r--contrib/opencsd/decoder/include/common/ocsd_gen_elem_list.h153
-rw-r--r--contrib/opencsd/decoder/include/common/ocsd_lib_dcd_register.h131
-rw-r--r--contrib/opencsd/decoder/include/common/ocsd_msg_logger.h87
-rw-r--r--contrib/opencsd/decoder/include/common/ocsd_pe_context.h116
-rw-r--r--contrib/opencsd/decoder/include/common/ocsd_version.h46
-rw-r--r--contrib/opencsd/decoder/include/common/trc_component.h149
-rw-r--r--contrib/opencsd/decoder/include/common/trc_core_arch_map.h68
-rw-r--r--contrib/opencsd/decoder/include/common/trc_cs_config.h62
-rw-r--r--contrib/opencsd/decoder/include/common/trc_frame_deformatter.h97
-rw-r--r--contrib/opencsd/decoder/include/common/trc_gen_elem.h209
-rw-r--r--contrib/opencsd/decoder/include/common/trc_pkt_decode_base.h303
-rw-r--r--contrib/opencsd/decoder/include/common/trc_pkt_elem_base.h49
-rw-r--r--contrib/opencsd/decoder/include/common/trc_pkt_proc_base.h412
-rw-r--r--contrib/opencsd/decoder/include/common/trc_printable_elem.h91
-rw-r--r--contrib/opencsd/decoder/include/common/trc_ret_stack.h114
-rw-r--r--contrib/opencsd/decoder/include/i_dec/trc_i_decode.h57
-rw-r--r--contrib/opencsd/decoder/include/i_dec/trc_idec_arminst.h141
-rw-r--r--contrib/opencsd/decoder/include/interfaces/trc_abs_typed_base_i.h58
-rw-r--r--contrib/opencsd/decoder/include/interfaces/trc_data_raw_in_i.h84
-rw-r--r--contrib/opencsd/decoder/include/interfaces/trc_data_rawframe_in_i.h81
-rw-r--r--contrib/opencsd/decoder/include/interfaces/trc_error_log_i.h134
-rw-r--r--contrib/opencsd/decoder/include/interfaces/trc_gen_elem_in_i.h77
-rw-r--r--contrib/opencsd/decoder/include/interfaces/trc_indexer_pkt_i.h77
-rw-r--r--contrib/opencsd/decoder/include/interfaces/trc_indexer_src_i.h124
-rw-r--r--contrib/opencsd/decoder/include/interfaces/trc_instr_decode_i.h66
-rw-r--r--contrib/opencsd/decoder/include/interfaces/trc_pkt_in_i.h80
-rw-r--r--contrib/opencsd/decoder/include/interfaces/trc_pkt_raw_in_i.h83
-rw-r--r--contrib/opencsd/decoder/include/interfaces/trc_tgt_mem_access_i.h91
-rw-r--r--contrib/opencsd/decoder/include/mem_acc/trc_mem_acc.h47
-rw-r--r--contrib/opencsd/decoder/include/mem_acc/trc_mem_acc_base.h245
-rw-r--r--contrib/opencsd/decoder/include/mem_acc/trc_mem_acc_bufptr.h76
-rw-r--r--contrib/opencsd/decoder/include/mem_acc/trc_mem_acc_cache.h149
-rw-r--r--contrib/opencsd/decoder/include/mem_acc/trc_mem_acc_cb.h96
-rw-r--r--contrib/opencsd/decoder/include/mem_acc/trc_mem_acc_cb_if.h71
-rw-r--r--contrib/opencsd/decoder/include/mem_acc/trc_mem_acc_file.h234
-rw-r--r--contrib/opencsd/decoder/include/mem_acc/trc_mem_acc_mapper.h131
-rw-r--r--contrib/opencsd/decoder/include/opencsd.h84
-rw-r--r--contrib/opencsd/decoder/include/opencsd/c_api/ocsd_c_api_cust_fact.h54
-rw-r--r--contrib/opencsd/decoder/include/opencsd/c_api/ocsd_c_api_cust_impl.h158
-rw-r--r--contrib/opencsd/decoder/include/opencsd/c_api/ocsd_c_api_custom.h253
-rw-r--r--contrib/opencsd/decoder/include/opencsd/c_api/ocsd_c_api_types.h106
-rw-r--r--contrib/opencsd/decoder/include/opencsd/c_api/opencsd_c_api.h502
-rw-r--r--contrib/opencsd/decoder/include/opencsd/etmv3/etmv3_decoder.h47
-rw-r--r--contrib/opencsd/decoder/include/opencsd/etmv3/trc_cmp_cfg_etmv3.h235
-rw-r--r--contrib/opencsd/decoder/include/opencsd/etmv3/trc_dcd_mngr_etmv3.h57
-rw-r--r--contrib/opencsd/decoder/include/opencsd/etmv3/trc_pkt_decode_etmv3.h274
-rw-r--r--contrib/opencsd/decoder/include/opencsd/etmv3/trc_pkt_elem_etmv3.h261
-rw-r--r--contrib/opencsd/decoder/include/opencsd/etmv3/trc_pkt_proc_etmv3.h81
-rw-r--r--contrib/opencsd/decoder/include/opencsd/etmv3/trc_pkt_types_etmv3.h178
-rw-r--r--contrib/opencsd/decoder/include/opencsd/etmv4/etmv4_decoder.h48
-rw-r--r--contrib/opencsd/decoder/include/opencsd/etmv4/trc_cmp_cfg_etmv4.h465
-rw-r--r--contrib/opencsd/decoder/include/opencsd/etmv4/trc_dcd_mngr_etmv4i.h31
-rw-r--r--contrib/opencsd/decoder/include/opencsd/etmv4/trc_etmv4_stack_elem.h346
-rw-r--r--contrib/opencsd/decoder/include/opencsd/etmv4/trc_pkt_decode_etmv4i.h190
-rw-r--r--contrib/opencsd/decoder/include/opencsd/etmv4/trc_pkt_elem_etmv4d.h73
-rw-r--r--contrib/opencsd/decoder/include/opencsd/etmv4/trc_pkt_elem_etmv4i.h525
-rw-r--r--contrib/opencsd/decoder/include/opencsd/etmv4/trc_pkt_proc_etmv4.h104
-rw-r--r--contrib/opencsd/decoder/include/opencsd/etmv4/trc_pkt_types_etmv4.h367
-rw-r--r--contrib/opencsd/decoder/include/opencsd/ocsd_if_types.h626
-rw-r--r--contrib/opencsd/decoder/include/opencsd/ocsd_if_version.h65
-rw-r--r--contrib/opencsd/decoder/include/opencsd/ptm/ptm_decoder.h46
-rw-r--r--contrib/opencsd/decoder/include/opencsd/ptm/trc_cmp_cfg_ptm.h210
-rw-r--r--contrib/opencsd/decoder/include/opencsd/ptm/trc_dcd_mngr_ptm.h57
-rw-r--r--contrib/opencsd/decoder/include/opencsd/ptm/trc_pkt_decode_ptm.h197
-rw-r--r--contrib/opencsd/decoder/include/opencsd/ptm/trc_pkt_elem_ptm.h221
-rw-r--r--contrib/opencsd/decoder/include/opencsd/ptm/trc_pkt_proc_ptm.h215
-rw-r--r--contrib/opencsd/decoder/include/opencsd/ptm/trc_pkt_types_ptm.h137
-rw-r--r--contrib/opencsd/decoder/include/opencsd/stm/stm_decoder.h45
-rw-r--r--contrib/opencsd/decoder/include/opencsd/stm/trc_cmp_cfg_stm.h161
-rw-r--r--contrib/opencsd/decoder/include/opencsd/stm/trc_dcd_mngr_stm.h57
-rw-r--r--contrib/opencsd/decoder/include/opencsd/stm/trc_pkt_decode_stm.h103
-rw-r--r--contrib/opencsd/decoder/include/opencsd/stm/trc_pkt_elem_stm.h238
-rw-r--r--contrib/opencsd/decoder/include/opencsd/stm/trc_pkt_proc_stm.h289
-rw-r--r--contrib/opencsd/decoder/include/opencsd/stm/trc_pkt_types_stm.h158
-rw-r--r--contrib/opencsd/decoder/include/opencsd/trc_gen_elem_types.h130
-rw-r--r--contrib/opencsd/decoder/include/opencsd/trc_pkt_types.h137
-rw-r--r--contrib/opencsd/decoder/include/pkt_printers/gen_elem_printer.h95
-rw-r--r--contrib/opencsd/decoder/include/pkt_printers/item_printer.h94
-rw-r--r--contrib/opencsd/decoder/include/pkt_printers/pkt_printer_t.h189
-rw-r--r--contrib/opencsd/decoder/include/pkt_printers/raw_frame_printer.h69
-rw-r--r--contrib/opencsd/decoder/include/pkt_printers/trc_pkt_printers.h43
-rw-r--r--contrib/opencsd/decoder/include/pkt_printers/trc_print_fact.h60
-rw-r--r--contrib/opencsd/decoder/source/c_api/ocsd_c_api.cpp583
-rw-r--r--contrib/opencsd/decoder/source/c_api/ocsd_c_api_custom_obj.cpp431
-rw-r--r--contrib/opencsd/decoder/source/c_api/ocsd_c_api_custom_obj.h189
-rw-r--r--contrib/opencsd/decoder/source/c_api/ocsd_c_api_obj.h182
-rw-r--r--contrib/opencsd/decoder/source/etmv3/trc_cmp_cfg_etmv3.cpp65
-rw-r--r--contrib/opencsd/decoder/source/etmv3/trc_pkt_decode_etmv3.cpp671
-rw-r--r--contrib/opencsd/decoder/source/etmv3/trc_pkt_elem_etmv3.cpp688
-rw-r--r--contrib/opencsd/decoder/source/etmv3/trc_pkt_proc_etmv3.cpp122
-rw-r--r--contrib/opencsd/decoder/source/etmv3/trc_pkt_proc_etmv3_impl.cpp1224
-rw-r--r--contrib/opencsd/decoder/source/etmv3/trc_pkt_proc_etmv3_impl.h175
-rw-r--r--contrib/opencsd/decoder/source/etmv4/trc_cmp_cfg_etmv4.cpp111
-rw-r--r--contrib/opencsd/decoder/source/etmv4/trc_etmv4_stack_elem.cpp116
-rw-r--r--contrib/opencsd/decoder/source/etmv4/trc_pkt_decode_etmv4i.cpp1155
-rw-r--r--contrib/opencsd/decoder/source/etmv4/trc_pkt_elem_etmv4d.cpp57
-rw-r--r--contrib/opencsd/decoder/source/etmv4/trc_pkt_elem_etmv4i.cpp583
-rw-r--r--contrib/opencsd/decoder/source/etmv4/trc_pkt_proc_etmv4.cpp126
-rw-r--r--contrib/opencsd/decoder/source/etmv4/trc_pkt_proc_etmv4d_impl.h71
-rw-r--r--contrib/opencsd/decoder/source/etmv4/trc_pkt_proc_etmv4i_impl.cpp1694
-rw-r--r--contrib/opencsd/decoder/source/etmv4/trc_pkt_proc_etmv4i_impl.h231
-rw-r--r--contrib/opencsd/decoder/source/i_dec/trc_i_decode.cpp250
-rw-r--r--contrib/opencsd/decoder/source/i_dec/trc_idec_arminst.cpp682
-rw-r--r--contrib/opencsd/decoder/source/mem_acc/trc_mem_acc_base.cpp148
-rw-r--r--contrib/opencsd/decoder/source/mem_acc/trc_mem_acc_bufptr.cpp54
-rw-r--r--contrib/opencsd/decoder/source/mem_acc/trc_mem_acc_cache.cpp176
-rw-r--r--contrib/opencsd/decoder/source/mem_acc/trc_mem_acc_cb.cpp34
-rw-r--r--contrib/opencsd/decoder/source/mem_acc/trc_mem_acc_file.cpp391
-rw-r--r--contrib/opencsd/decoder/source/mem_acc/trc_mem_acc_mapper.cpp299
-rw-r--r--contrib/opencsd/decoder/source/ocsd_code_follower.cpp162
-rw-r--r--contrib/opencsd/decoder/source/ocsd_dcd_tree.cpp715
-rw-r--r--contrib/opencsd/decoder/source/ocsd_error.cpp232
-rw-r--r--contrib/opencsd/decoder/source/ocsd_error_logger.cpp159
-rw-r--r--contrib/opencsd/decoder/source/ocsd_gen_elem_list.cpp168
-rw-r--r--contrib/opencsd/decoder/source/ocsd_lib_dcd_register.cpp215
-rw-r--r--contrib/opencsd/decoder/source/ocsd_msg_logger.cpp120
-rw-r--r--contrib/opencsd/decoder/source/ocsd_version.cpp48
-rw-r--r--contrib/opencsd/decoder/source/pkt_printers/raw_frame_printer.cpp104
-rw-r--r--contrib/opencsd/decoder/source/pkt_printers/trc_print_fact.cpp123
-rw-r--r--contrib/opencsd/decoder/source/ptm/trc_cmp_cfg_ptm.cpp59
-rw-r--r--contrib/opencsd/decoder/source/ptm/trc_pkt_decode_ptm.cpp665
-rw-r--r--contrib/opencsd/decoder/source/ptm/trc_pkt_elem_ptm.cpp473
-rw-r--r--contrib/opencsd/decoder/source/ptm/trc_pkt_proc_ptm.cpp1215
-rw-r--r--contrib/opencsd/decoder/source/stm/trc_pkt_decode_stm.cpp299
-rw-r--r--contrib/opencsd/decoder/source/stm/trc_pkt_elem_stm.cpp314
-rw-r--r--contrib/opencsd/decoder/source/stm/trc_pkt_proc_stm.cpp1043
-rw-r--r--contrib/opencsd/decoder/source/trc_component.cpp149
-rw-r--r--contrib/opencsd/decoder/source/trc_core_arch_map.cpp81
-rw-r--r--contrib/opencsd/decoder/source/trc_frame_deformatter.cpp869
-rw-r--r--contrib/opencsd/decoder/source/trc_frame_deformatter_impl.h167
-rw-r--r--contrib/opencsd/decoder/source/trc_gen_elem.cpp259
-rw-r--r--contrib/opencsd/decoder/source/trc_printable_elem.cpp123
-rw-r--r--contrib/opencsd/decoder/source/trc_ret_stack.cpp149
142 files changed, 0 insertions, 32566 deletions
diff --git a/contrib/opencsd/decoder/include/common/comp_attach_notifier_i.h b/contrib/opencsd/decoder/include/common/comp_attach_notifier_i.h
deleted file mode 100644
index e0062ef24bb9..000000000000
--- a/contrib/opencsd/decoder/include/common/comp_attach_notifier_i.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/*!
- * \file comp_attach_notifier_i.h
- * \brief OpenCSD : Component attach point notifier interface.
- *
- * \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.
- */
-
-#ifndef ARM_COMP_ATTACH_NOTIFIER_I_H_INCLUDED
-#define ARM_COMP_ATTACH_NOTIFIER_I_H_INCLUDED
-
-/*!
- * @class IComponentAttachNotifier
- * @addtogroup ocsd_infrastructure
- * @brief Notification interface for attachment.
- *
- * Interface to the componentAttachPt classes that allow notification on component
- * connect and disconnect.
- */
-class IComponentAttachNotifier {
-public:
- IComponentAttachNotifier() {}; /**< Default interface constructor */
- virtual ~IComponentAttachNotifier() {}; /**< Default interface destructor */
-
- /*!
- * Callback called by the componentAttachPt() classes when a component is attached
- * to or detached from the attach point.
- *
- * @param num_attached : number of remaining components attached to the point after the
- * operation that triggered the notification.
- */
- virtual void attachNotify(const int num_attached) = 0;
-};
-
-#endif // ARM_COMP_ATTACH_NOTIFIER_I_H_INCLUDED
-
-/* End of File comp_attach_notifier_i.h */
diff --git a/contrib/opencsd/decoder/include/common/comp_attach_pt_t.h b/contrib/opencsd/decoder/include/common/comp_attach_pt_t.h
deleted file mode 100644
index 71f4c84caa2f..000000000000
--- a/contrib/opencsd/decoder/include/common/comp_attach_pt_t.h
+++ /dev/null
@@ -1,240 +0,0 @@
-/*!
- * \file comp_attach_pt_t.h
- * \brief OpenCSD : Component attachment point interface 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.
- */
-
-#ifndef ARM_COMP_ATTACH_PT_T_H_INCLUDED
-#define ARM_COMP_ATTACH_PT_T_H_INCLUDED
-
-#include <vector>
-#include "opencsd/ocsd_if_types.h"
-
-/** @defgroup ocsd_infrastructure OpenCSD Library : Library Component Infrastructure
-
- @brief Classes providing library infrastructure and auxilary functionality
-@{*/
-
-#include "comp_attach_notifier_i.h"
-
-/*!
- * @class componentAttachPt
- * @brief Single component interface pointer attachment point.
- *
- * This is a class template to standardise the connections between decode components.
- *
- * An attachment point connects a component interface pointer to the component providing the
- * attachment point.
- *
- * This attachment point implementation allows a single interface to be connected.
- *
- */
-template <class T>
-class componentAttachPt {
-public:
- componentAttachPt(); /**< Default constructor */
- virtual ~componentAttachPt(); /**< Default destructor */
-
- /*!
- * Attach an interface of type T to the attachment point.
- *
- * @param component : interface to attach.
- *
- * @return ocsd_err_t : OCSD_OK if successful, OCSD_ERR_ATTACH_TOO_MANY if too many connections.
- */
- virtual ocsd_err_t attach(T* component);
-
- /*!
- * Detach component from the attachment point.
- *
- * @param component : Component to detach.
- *
- * @return virtual ocsd_err_t : OCSD_OK if successful, OCSD_ERR_ATTACH_COMP_NOT_FOUND if no match to component.
- */
- virtual ocsd_err_t detach(T* component);
-
-
- // detach current first if anything attached, connect supplied pointer, remain unattached if pointer 0
- virtual ocsd_err_t replace_first(T* component);
-
- /*!
- * Detach all components.
- */
- virtual void detach_all();
-
- /*!
- * Return the current (first) attached interface pointer.
- * Will return 0 if nothing attached or the attachment point is disabled.
- *
- * @return T* : Current Interface pointer of type T or 0.
- */
- virtual T* first();
-
- /*!
- * Return the next attached interface.
- * The componentAttachPt base implmentation will always return 0 as only a single attachment is possible
- *
- * @return T* : Always returns 0.
- */
- virtual T* next();
-
- /*!
- * Returns the number of interface pointers attached to this attachment point.
- *
- * @return int : number of component interfaces attached.
- */
- virtual int num_attached();
-
- /*!
- * Attach a notifier interface to the attachment point. Will call back on this interface whenever
- * a component is attached or detached.
- *
- * @param *notifier : pointer to the IComponentAttachNotifier interface.
- */
- void set_notifier(IComponentAttachNotifier *notifier);
-
- /* enable state does not affect attach / detach, but can be used to filter access to interfaces */
- const bool enabled() const; /**< return the enabled flag. */
- void set_enabled(const bool enable);
-
-
- /*!
- * Check to see if any attachements. Will return attach state independent of enable state.
- *
- * @return const bool : true if attachment.
- */
- const bool hasAttached() const { return m_hasAttached; };
-
-
- /*!
- * Return both the attachment and enabled state.
- *
- * @return const bool : true if both has attachment and is enabled.
- */
- const bool hasAttachedAndEnabled() const { return m_hasAttached && m_enabled; };
-
-protected:
- bool m_enabled; /**< Flag to indicate if the attachment point is enabled. */
- bool m_hasAttached; /**< Flag indicating at least one attached interface */
- IComponentAttachNotifier *m_notifier; /**< Optional attachement notifier interface. */
- T *m_comp; /**< pointer to the single attached interface */
-};
-
-
-
-template<class T> componentAttachPt<T>::componentAttachPt()
-{
- m_comp = 0;
- m_notifier = 0;
- m_enabled = true;
- m_hasAttached = false;
-}
-
-template<class T> componentAttachPt<T>::~componentAttachPt()
-{
- detach_all();
-}
-
-
-template<class T> ocsd_err_t componentAttachPt<T>::attach(T* component)
-{
- if(m_comp != 0)
- return OCSD_ERR_ATTACH_TOO_MANY;
- m_comp = component;
- if(m_notifier) m_notifier->attachNotify(1);
- m_hasAttached = true;
- return OCSD_OK;
-}
-
-template<class T> ocsd_err_t componentAttachPt<T>::replace_first(T* component)
-{
- if(m_hasAttached)
- detach(m_comp);
-
- if(component == 0)
- return OCSD_OK;
-
- return attach(component);
-}
-
-template<class T> ocsd_err_t componentAttachPt<T>::detach(T* component)
-{
- if(m_comp != component)
- return OCSD_ERR_ATTACH_COMP_NOT_FOUND;
- m_comp = 0;
- m_hasAttached = false;
- if(m_notifier) m_notifier->attachNotify(0);
- return OCSD_OK;
-}
-
-template<class T> T* componentAttachPt<T>::first()
-{
- return (m_enabled) ? m_comp : 0;
-}
-
-template<class T> T* componentAttachPt<T>::next()
-{
- return 0;
-}
-
-template<class T> int componentAttachPt<T>::num_attached()
-{
- return ((m_comp != 0) ? 1 : 0);
-}
-
-template<class T> void componentAttachPt<T>::detach_all()
-{
- m_comp = 0;
- m_hasAttached = false;
- if(m_notifier) m_notifier->attachNotify(0);
-}
-
-template<class T> void componentAttachPt<T>::set_notifier(IComponentAttachNotifier *notifier)
-{
- m_notifier = notifier;
-}
-
-template<class T> const bool componentAttachPt<T>::enabled() const
-{
- return m_enabled;
-}
-
-template<class T> void componentAttachPt<T>::set_enabled(const bool enable)
-{
- m_enabled = enable;
-}
-
-
-/** @}*/
-
-#endif // ARM_COMP_ATTACH_PT_T_H_INCLUDED
-
-/* End of File comp_attach_pt_t.h */
diff --git a/contrib/opencsd/decoder/include/common/ocsd_code_follower.h b/contrib/opencsd/decoder/include/common/ocsd_code_follower.h
deleted file mode 100644
index b024aa02a368..000000000000
--- a/contrib/opencsd/decoder/include/common/ocsd_code_follower.h
+++ /dev/null
@@ -1,237 +0,0 @@
-/*
- * \file ocsd_code_follower.h
- * \brief OpenCSD : Code follower for instruction trace decode
- *
- * \copyright Copyright (c) 2016, 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.
- */
-
-#ifndef ARM_OCSD_CODE_FOLLOWER_H_INCLUDED
-#define ARM_OCSD_CODE_FOLLOWER_H_INCLUDED
-
-#include "opencsd/ocsd_if_types.h"
-#include "opencsd/trc_pkt_types.h"
-#include "comp_attach_pt_t.h"
-#include "interfaces/trc_tgt_mem_access_i.h"
-#include "interfaces/trc_instr_decode_i.h"
-
-/*!
- * @class OcsdCodeFollower
- * @brief The code follower looks for waypoints or addresses.
- *
- * Code follower used to determine the trace ranges for Atom or other waypoint
- * elements. Uses memory accessor and I decoder to follow the code path.
- *
- */
-class OcsdCodeFollower
-{
-public:
- OcsdCodeFollower();
- ~OcsdCodeFollower();
-
-//*********** setup API
- void initInterfaces(componentAttachPt<ITargetMemAccess> *pMemAccess, componentAttachPt<IInstrDecode> *pIDecode);
-
-// set information for decode operation - static or occasionally changing settings
-// per decode values are passed as parameters into the decode API calls.
- void setArchProfile(const ocsd_arch_profile_t profile); //!< core profile
- void setMemSpaceAccess(const ocsd_mem_space_acc_t mem_acc_rule); //!< memory space to use for access (filtered by S/NS, EL etc).
- void setMemSpaceCSID(const uint8_t csid); //!< memory spaces might be partitioned by CSID
- void setISA(const ocsd_isa isa); //!< set the ISA for the decode.
- void setDSBDMBasWP(); //!< DSB and DMB can be treated as WP in some archs.
-
-//********** code following API
-
- // standard WP search - for program flow trace
- //ocsd_err_t followToAtomWP(idec_res_t &op_result, const ocsd_vaddr_t addrStart, const ocsd_atm_val A);
-
- // PTM exception code may require follow to an address
- //ocsd_err_t followToAddress(idec_res_t &op_result, const ocsd_vaddr_t addrStart, const ocsd_atm_val A, const ocsd_vaddr_t addrMatch);
-
- // single instruction atom format such as ETMv3
- ocsd_err_t followSingleAtom(const ocsd_vaddr_t addrStart, const ocsd_atm_val A);
-
- // follow N instructions
- // ocsd_err_t followNInstructions(idec_res_t &op_result) // ETMv4 Q elements
-
-//*********************** results API
- const ocsd_vaddr_t getRangeSt() const; //!< inclusive start address of decoded range (value passed in)
- const ocsd_vaddr_t getRangeEn() const; //!< exclusive end address of decoded range (first instruction _not_ executed / potential next instruction).
- const bool hasRange() const; //!< we have a valid range executed (may be false if nacc).
-
- const bool hasNextAddr() const; //!< we have calulated the next address - otherwise this is needed from trace packets.
- const ocsd_vaddr_t getNextAddr() const; //!< next address - valid if hasNextAddr() true.
-
- // information on last instruction executed in range.
- const ocsd_instr_type getInstrType() const; //!< last instruction type
- const ocsd_instr_subtype getInstrSubType() const; //!< last instruction sub-type
- const bool isCondInstr() const; //!< is a conditional instruction
- const bool isLink() const; //!< is a link (branch with link etc)
- const bool ISAChanged() const; //!< next ISA different from input ISA.
- const ocsd_isa nextISA() const; //!< ISA for next instruction
- const uint8_t getInstrSize() const; //!< Get the last instruction size.
-
- // information on error conditions
- const bool isNacc() const; //!< true if Memory Not Accessible (nacc) error occurred
- void clearNacc(); //!< clear the nacc error flag
- const ocsd_vaddr_t getNaccAddr() const; //!< get the nacc error address.
-
-private:
- bool initFollowerState(); //!< clear all the o/p data and flags, check init valid.
-
- ocsd_err_t decodeSingleOpCode(); //!< decode single opcode address from current m_inst_info packet
-
- ocsd_instr_info m_instr_info;
-
- ocsd_vaddr_t m_st_range_addr; //!< start of excuted range - inclusive address.
- ocsd_vaddr_t m_en_range_addr; //!< end of executed range - exclusive address.
- ocsd_vaddr_t m_next_addr; //!< calcuated next address (could be eo range of branch address, not set for indirect branches)
- bool m_b_next_valid; //!< true if next address valid, false if need address from trace packets.
-
- //! memory space rule to use when accessing memory.
- ocsd_mem_space_acc_t m_mem_acc_rule;
- //! memory space csid to use when accessing memory.
- uint8_t m_mem_space_csid;
-
- ocsd_vaddr_t m_nacc_address; //!< memory address that was inaccessible - failed read @ start, or during follow operation
- bool m_b_nacc_err; //!< memory NACC error - required address was unavailable.
-
- //! pointers to the memory access and i decode interfaces.
- componentAttachPt<ITargetMemAccess> *m_pMemAccess;
- componentAttachPt<IInstrDecode> *m_pIDecode;
-
-};
-
-#endif // ARM_OCSD_CODE_FOLLOWER_H_INCLUDED
-
-//*********** setup API
-inline void OcsdCodeFollower::setArchProfile(const ocsd_arch_profile_t profile)
-{
- m_instr_info.pe_type = profile;
-}
-
-inline void OcsdCodeFollower::setMemSpaceAccess(const ocsd_mem_space_acc_t mem_acc_rule)
-{
- m_mem_acc_rule = mem_acc_rule;
-}
-
-inline void OcsdCodeFollower::setMemSpaceCSID(const uint8_t csid)
-{
- m_mem_space_csid = csid;
-}
-
-inline void OcsdCodeFollower::setISA(const ocsd_isa isa)
-{
- m_instr_info.isa = isa;
-}
-
-inline void OcsdCodeFollower::setDSBDMBasWP()
-{
- m_instr_info.dsb_dmb_waypoints = 1;
-}
-
-//**************************************** results API
-inline const ocsd_vaddr_t OcsdCodeFollower::getRangeSt() const
-{
- return m_st_range_addr;
-}
-
-inline const ocsd_vaddr_t OcsdCodeFollower::getRangeEn() const
-{
- return m_en_range_addr;
-}
-
-inline const bool OcsdCodeFollower::hasRange() const
-{
- return m_st_range_addr < m_en_range_addr;
-}
-
-inline const bool OcsdCodeFollower::hasNextAddr() const
-{
- return m_b_next_valid;
-}
-
-inline const ocsd_vaddr_t OcsdCodeFollower::getNextAddr() const
-{
- return m_next_addr;
-}
-
-// information on last instruction executed in range.
-inline const ocsd_instr_type OcsdCodeFollower::getInstrType() const
-{
- return m_instr_info.type;
-}
-
-inline const ocsd_instr_subtype OcsdCodeFollower::getInstrSubType() const
-{
- return m_instr_info.sub_type;
-}
-
-inline const uint8_t OcsdCodeFollower::getInstrSize() const
-{
- return m_instr_info.instr_size;
-}
-
-inline const bool OcsdCodeFollower::isCondInstr() const
-{
- return (bool)(m_instr_info.is_conditional == 1);
-}
-
-inline const bool OcsdCodeFollower::isLink() const
-{
- return (bool)(m_instr_info.is_link == 1);
-}
-
-inline const bool OcsdCodeFollower::ISAChanged() const
-{
- return (bool)(m_instr_info.isa != m_instr_info.next_isa);
-}
-
-inline const ocsd_isa OcsdCodeFollower::nextISA() const
-{
- return m_instr_info.next_isa;
-}
-
-// information on error conditions
-inline const bool OcsdCodeFollower::isNacc() const
-{
- return m_b_nacc_err;
-}
-
-inline void OcsdCodeFollower::clearNacc()
-{
- m_b_nacc_err = false;
-}
-
-inline const ocsd_vaddr_t OcsdCodeFollower::getNaccAddr() const
-{
- return m_nacc_address;
-}
-
-/* End of File ocsd_code_follower.h */
diff --git a/contrib/opencsd/decoder/include/common/ocsd_dcd_mngr.h b/contrib/opencsd/decoder/include/common/ocsd_dcd_mngr.h
deleted file mode 100644
index ba7d8a89c46f..000000000000
--- a/contrib/opencsd/decoder/include/common/ocsd_dcd_mngr.h
+++ /dev/null
@@ -1,396 +0,0 @@
-/*
- * \file ocsd_dcd_mngr.h
- * \brief OpenCSD : Decoder manager base class.
- *
- * \copyright Copyright (c) 2016, 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.
- */
-
-#ifndef ARM_OCSD_DCD_MNGR_H_INCLUDED
-#define ARM_OCSD_DCD_MNGR_H_INCLUDED
-
-#include "opencsd/ocsd_if_types.h"
-#include "common/ocsd_dcd_mngr_i.h"
-#include "common/ocsd_lib_dcd_register.h"
-#include "common/trc_pkt_decode_base.h"
-#include "common/trc_pkt_proc_base.h"
-
-template <class P, class Pt, class Pc>
-class DecoderMngrBase : public IDecoderMngr
-{
-public:
- DecoderMngrBase(const std::string &decoderTypeName, ocsd_trace_protocol_t builtInProtocol);
- virtual ~DecoderMngrBase() {};
-
- // create decoder interface.
- virtual ocsd_err_t createDecoder(const int create_flags, const int instID, const CSConfig *p_config, TraceComponent **p_component);
- virtual ocsd_err_t destroyDecoder(TraceComponent *p_component);
-
- virtual const ocsd_trace_protocol_t getProtocolType() const { return m_builtInProtocol; }
-
-// common
- virtual ocsd_err_t attachErrorLogger(TraceComponent *pComponent, ITraceErrorLog *pIErrorLog);
-
-// pkt decoder
- virtual ocsd_err_t attachInstrDecoder(TraceComponent *pComponent, IInstrDecode *pIInstrDec);
- virtual ocsd_err_t attachMemAccessor(TraceComponent *pComponent, ITargetMemAccess *pMemAccessor);
- virtual ocsd_err_t attachOutputSink(TraceComponent *pComponent, ITrcGenElemIn *pOutSink);
-
-// pkt processor
- virtual ocsd_err_t attachPktMonitor(TraceComponent *pComponent, ITrcTypedBase *pPktRawDataMon);
- virtual ocsd_err_t attachPktIndexer(TraceComponent *pComponent, ITrcTypedBase *pPktIndexer);
- virtual ocsd_err_t attachPktSink(TraceComponent *pComponent, ITrcTypedBase *pPktDataInSink);
-
-// data input connection interface
- virtual ocsd_err_t getDataInputI(TraceComponent *pComponent, ITrcDataIn **ppDataIn);
-
-// generate a Config object from opaque config struct pointer.
- virtual ocsd_err_t createConfigFromDataStruct(CSConfig **pConfigBase, const void *pDataStruct);
-
-// implemented by decoder handler derived classes
- virtual TraceComponent *createPktProc(const bool useInstID, const int instID) = 0;
- virtual TraceComponent *createPktDecode(const bool useInstID, const int instID) { return 0; };
- virtual CSConfig *createConfig(const void *pDataStruct) = 0;
-
-
-private:
- ocsd_trace_protocol_t m_builtInProtocol; //!< Protocol ID if built in type.
-};
-
-template <class P, class Pt, class Pc>
-DecoderMngrBase<P,Pt,Pc>::DecoderMngrBase(const std::string &decoderTypeName, ocsd_trace_protocol_t builtInProtocol)
-{
- OcsdLibDcdRegister *pDcdReg = OcsdLibDcdRegister::getDecoderRegister();
- if(pDcdReg)
- pDcdReg->registerDecoderTypeByName(decoderTypeName,this);
- m_builtInProtocol = builtInProtocol;
-}
-
-template <class P, class Pt, class Pc>
-ocsd_err_t DecoderMngrBase<P,Pt,Pc>::createDecoder(const int create_flags, const int instID, const CSConfig *pConfig, TraceComponent **ppTrcComp)
-{
- TraceComponent *pkt_proc = 0;
- TraceComponent *pkt_dcd = 0;
- bool bUseInstID = (create_flags & OCSD_CREATE_FLG_INST_ID) != 0;
- bool bDecoder = (create_flags & OCSD_CREATE_FLG_FULL_DECODER) != 0;
- bool bUnConfigured = (pConfig == 0);
-
- const Pc *pConf = dynamic_cast< const Pc * >(pConfig);
-
- // check inputs valid...
- if((pConf == 0) && !bUnConfigured)
- return OCSD_ERR_INVALID_PARAM_TYPE;
-
- if((create_flags & (OCSD_CREATE_FLG_PACKET_PROC | OCSD_CREATE_FLG_FULL_DECODER)) == 0)
- return OCSD_ERR_INVALID_PARAM_VAL;
-
- // always need a packet processor
- pkt_proc = createPktProc(bUseInstID, instID);
- if(!pkt_proc)
- return OCSD_ERR_MEM;
-
- // set the configuration
- TrcPktProcBase<P,Pt,Pc> *pProcBase = dynamic_cast< TrcPktProcBase<P,Pt,Pc> *>(pkt_proc);
- if(pProcBase == 0)
- return OCSD_ERR_INVALID_PARAM_TYPE;
-
- if(!bUnConfigured)
- pProcBase->setProtocolConfig(pConf);
-
- *ppTrcComp = pkt_proc;
-
- // may need a packet decoder
- if(bDecoder)
- {
- // create the decoder
- pkt_dcd = createPktDecode(bUseInstID, instID);
- if(!pkt_dcd)
- return OCSD_ERR_MEM;
-
- // get the decoder base
- TrcPktDecodeBase<P,Pc> *pBase = dynamic_cast< TrcPktDecodeBase<P,Pc> *>(pkt_dcd);
- if(pBase == 0)
- return OCSD_ERR_INVALID_PARAM_TYPE;
-
- if(!bUnConfigured)
- pBase->setProtocolConfig(pConf);
-
- // associate decoder with packet processor
- // -> this means a TraceComponent with an associated component is a packet decoder.
- // the associated component is the connected packet processor.
- pkt_dcd->setAssocComponent(pkt_proc);
-
- // connect packet processor and decoder
- pProcBase->getPacketOutAttachPt()->attach(pBase);
-
- *ppTrcComp = pkt_dcd;
- }
- return OCSD_OK;
-}
-
-template <class P, class Pt, class Pc>
-ocsd_err_t DecoderMngrBase<P,Pt,Pc>::destroyDecoder(TraceComponent *pComponent)
-{
- if(pComponent->getAssocComponent() != 0)
- delete pComponent->getAssocComponent();
- delete pComponent;
- return OCSD_OK;
-}
-
-template <class P, class Pt, class Pc>
-ocsd_err_t DecoderMngrBase<P,Pt,Pc>::attachErrorLogger(TraceComponent *pComponent, ITraceErrorLog *pIErrorLog)
-{
- return pComponent->getErrorLogAttachPt()->replace_first(pIErrorLog);
-}
-
-template <class P, class Pt, class Pc>
-ocsd_err_t DecoderMngrBase<P,Pt,Pc>::attachInstrDecoder(TraceComponent *pComponent, IInstrDecode *pIInstrDec)
-{
- ocsd_err_t err = OCSD_ERR_DCD_INTERFACE_UNUSED;
-
- if(pComponent->getAssocComponent() == 0) // no associated component - so this is a packet processor
- return OCSD_ERR_INVALID_PARAM_TYPE;
-
- TrcPktDecodeI *pDcdI = dynamic_cast< TrcPktDecodeI * >(pComponent);
- if(pDcdI == 0)
- return OCSD_ERR_INVALID_PARAM_TYPE;
-
- if(pDcdI->getUsesIDecode())
- err = pDcdI->getInstrDecodeAttachPt()->replace_first(pIInstrDec);
-
- return err;
-}
-
-template <class P, class Pt, class Pc>
-ocsd_err_t DecoderMngrBase<P,Pt,Pc>::attachMemAccessor(TraceComponent *pComponent, ITargetMemAccess *pMemAccessor)
-{
- ocsd_err_t err = OCSD_ERR_DCD_INTERFACE_UNUSED;
-
- if(pComponent->getAssocComponent() == 0) // no associated component - so this is a packet processor
- return OCSD_ERR_INVALID_PARAM_TYPE;
-
- TrcPktDecodeI *pDcdI = dynamic_cast< TrcPktDecodeI * >(pComponent);
- if(pDcdI == 0)
- return OCSD_ERR_INVALID_PARAM_TYPE;
-
- if(pDcdI->getUsesMemAccess())
- err = pDcdI->getMemoryAccessAttachPt()->replace_first(pMemAccessor);
-
- return err;
-}
-
-template <class P, class Pt, class Pc>
-ocsd_err_t DecoderMngrBase<P,Pt,Pc>::attachOutputSink(TraceComponent *pComponent, ITrcGenElemIn *pOutSink)
-{
- ocsd_err_t err = OCSD_ERR_INVALID_PARAM_TYPE;
-
- if(pComponent->getAssocComponent() == 0) // no associated component - so this is a packet processor
- return err;
-
- TrcPktDecodeI *pDcdI = dynamic_cast< TrcPktDecodeI * >(pComponent);
- if(pDcdI == 0)
- return OCSD_ERR_INVALID_PARAM_TYPE;
-
- err = pDcdI->getTraceElemOutAttachPt()->replace_first(pOutSink);
-
- return err;
-}
-
-template <class P, class Pt, class Pc>
-ocsd_err_t DecoderMngrBase<P,Pt,Pc>::getDataInputI(TraceComponent *pComponent, ITrcDataIn **ppDataIn)
-{
- // find the packet processor
- TraceComponent *pPktProc = pComponent;
- if(pComponent->getAssocComponent() != 0)
- pPktProc = pComponent->getAssocComponent();
-
- TrcPktProcI *pPPI = dynamic_cast< TrcPktProcI * >(pPktProc);
- if(pPPI == 0)
- return OCSD_ERR_INVALID_PARAM_TYPE;
-
- *ppDataIn = pPPI;
-
- return OCSD_OK;
-}
-
-template <class P, class Pt, class Pc>
-ocsd_err_t DecoderMngrBase<P,Pt,Pc>::attachPktMonitor(TraceComponent *pComponent, ITrcTypedBase *pPktRawDataMon)
-{
- // find the packet processor
- TraceComponent *pPktProc = pComponent;
- if(pComponent->getAssocComponent() != 0)
- pPktProc = pComponent->getAssocComponent();
-
- // get the packet processor
- TrcPktProcBase<P,Pt,Pc> *pPktProcBase = dynamic_cast< TrcPktProcBase<P,Pt,Pc> * >(pPktProc);
- if(pPktProcBase == 0)
- return OCSD_ERR_INVALID_PARAM_TYPE;
-
- // get the interface
- IPktRawDataMon<P> *p_If = dynamic_cast< IPktRawDataMon<P> * >(pPktRawDataMon);
- if(p_If == 0)
- return OCSD_ERR_INVALID_PARAM_TYPE;
-
- return pPktProcBase->getRawPacketMonAttachPt()->replace_first(p_If);
-}
-
-template <class P, class Pt, class Pc>
-ocsd_err_t DecoderMngrBase<P,Pt,Pc>::attachPktIndexer(TraceComponent *pComponent, ITrcTypedBase *pPktIndexer)
-{
- // find the packet processor
- TraceComponent *pPktProc = pComponent;
- if(pComponent->getAssocComponent() != 0)
- pPktProc = pComponent->getAssocComponent();
-
- // get the packet processor
- TrcPktProcBase<P,Pt,Pc> *pPktProcBase = dynamic_cast< TrcPktProcBase<P,Pt,Pc> * >(pPktProc);
- if(pPktProcBase == 0)
- return OCSD_ERR_INVALID_PARAM_TYPE;
-
- // get the interface
- ITrcPktIndexer<Pt> *p_If = dynamic_cast< ITrcPktIndexer<Pt> * >(pPktIndexer);
- if(p_If == 0)
- return OCSD_ERR_INVALID_PARAM_TYPE;
-
- return pPktProcBase->getTraceIDIndexerAttachPt()->replace_first(p_If);
-}
-
-template <class P, class Pt, class Pc>
-ocsd_err_t DecoderMngrBase<P,Pt,Pc>::attachPktSink(TraceComponent *pComponent, ITrcTypedBase *pPktDataInSink)
-{
- // must be solo packet processor
- if(pComponent->getAssocComponent() != 0)
- return OCSD_ERR_INVALID_PARAM_TYPE;
-
- // interface must be the correct one.
- IPktDataIn<P> *pkt_in_i = dynamic_cast< IPktDataIn<P> * >(pPktDataInSink);
- if(pkt_in_i == 0)
- return OCSD_ERR_INVALID_PARAM_TYPE;
-
- // get the packet processor
- TrcPktProcBase<P,Pt,Pc> *pPktProcBase = dynamic_cast< TrcPktProcBase<P,Pt,Pc> * >(pComponent);
- if(pPktProcBase == 0)
- return OCSD_ERR_INVALID_PARAM_TYPE;
-
- // attach
- return pPktProcBase->getPacketOutAttachPt()->replace_first(pkt_in_i);
-}
-
-template <class P, class Pt, class Pc>
-ocsd_err_t DecoderMngrBase<P,Pt,Pc>::createConfigFromDataStruct(CSConfig **pConfigBase, const void *pDataStruct)
-{
- CSConfig *pConfig = createConfig(pDataStruct);
- if(!pConfig)
- return OCSD_ERR_MEM;
- *pConfigBase = pConfig;
- return OCSD_OK;
-}
-
-/****************************************************************************************************/
-/* Full decoder / packet process pair, templated base for creating decoder objects */
-/****************************************************************************************************/
-
-template< class P, // Packet class.
- class Pt, // Packet enum type ID.
- class Pc, // Processor config class.
- class PcSt, // Processor config struct type
- class PktProc, // Packet processor class.
- class PktDcd> // Packet decoder class.
-class DecodeMngrFullDcd : public DecoderMngrBase<P,Pt,Pc>
-{
-public:
- DecodeMngrFullDcd (const std::string &name, ocsd_trace_protocol_t builtInProtocol)
- : DecoderMngrBase<P,Pt,Pc>(name,builtInProtocol) {};
-
- virtual ~DecodeMngrFullDcd() {};
-
- virtual TraceComponent *createPktProc(const bool useInstID, const int instID)
- {
- TraceComponent *pComp;
- if(useInstID)
- pComp = new (std::nothrow) PktProc(instID);
- else
- pComp = new (std::nothrow) PktProc();
- return pComp;
- }
-
- virtual TraceComponent *createPktDecode(const bool useInstID, const int instID)
- {
- TraceComponent *pComp;
- if(useInstID)
- pComp = new (std::nothrow)PktDcd(instID);
- else
- pComp = new (std::nothrow)PktDcd();
- return pComp;
- }
-
- virtual CSConfig *createConfig(const void *pDataStruct)
- {
- return new (std::nothrow) Pc((PcSt *)pDataStruct);
- }
-};
-
-/****************************************************************************************************/
-/* Packet processor only, templated base for creating decoder objects */
-/****************************************************************************************************/
-
-template< class P, // Packet class.
- class Pt, // Packet enum type ID.
- class Pc, // Processor config class.
- class PcSt, // Processor config struct type
- class PktProc> // Packet processor class.
-class DecodeMngrPktProc : public DecoderMngrBase<P,Pt,Pc>
-{
-public:
- DecodeMngrPktProc (const std::string &name, ocsd_trace_protocol_t builtInProtocol)
- : DecoderMngrBase<P,Pt,Pc>(name,builtInProtocol) {};
-
- virtual ~DecodeMngrPktProc() {};
-
- virtual TraceComponent *createPktProc(const bool useInstID, const int instID)
- {
- TraceComponent *pComp;
- if(useInstID)
- pComp = new (std::nothrow) PktProc(instID);
- else
- pComp = new (std::nothrow) PktProc();
- return pComp;
- }
-
- virtual CSConfig *createConfig(const void *pDataStruct)
- {
- return new (std::nothrow) Pc((PcSt *)pDataStruct);
- }
-};
-
-
-
-#endif // ARM_OCSD_DCD_MNGR_H_INCLUDED
-
-/* End of File ocsd_dcd_mngr.h */
diff --git a/contrib/opencsd/decoder/include/common/ocsd_dcd_mngr_i.h b/contrib/opencsd/decoder/include/common/ocsd_dcd_mngr_i.h
deleted file mode 100644
index 5ecbe31401a8..000000000000
--- a/contrib/opencsd/decoder/include/common/ocsd_dcd_mngr_i.h
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * \file ocsd_dcd_mngr_i.h
- * \brief OpenCSD : Decoder manager interface.
- *
- * \copyright Copyright (c) 2016, 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.
- */
-
-#ifndef ARM_OCSD_DCD_MNGR_I_H_INCLUDED
-#define ARM_OCSD_DCD_MNGR_I_H_INCLUDED
-
-#include "opencsd/ocsd_if_types.h"
-#include "common/trc_cs_config.h"
-#include "common/trc_component.h"
-
-#include "interfaces/trc_error_log_i.h"
-#include "interfaces/trc_data_raw_in_i.h"
-#include "interfaces/trc_instr_decode_i.h"
-#include "interfaces/trc_tgt_mem_access_i.h"
-#include "interfaces/trc_gen_elem_in_i.h"
-#include "interfaces/trc_abs_typed_base_i.h"
-
-class IDecoderMngr
-{
-public:
- IDecoderMngr() {};
- virtual ~IDecoderMngr() {};
-
-// create and destroy decoders
- virtual ocsd_err_t createDecoder(const int create_flags, const int instID, const CSConfig *p_config, TraceComponent **ppComponent) = 0;
- virtual ocsd_err_t destroyDecoder(TraceComponent *pComponent) = 0;
-
- //! Get the built in protocol type ID managed by this instance - extern for custom decoders
- virtual const ocsd_trace_protocol_t getProtocolType() const = 0;
-
-// connect decoders to other components - (replace current / 0 pointer value to detach );
-// compatible with all decoders
- //!attach error logger to ptk-processor, or both of pkt processor and pkt decoder pair
- virtual ocsd_err_t attachErrorLogger(TraceComponent *pComponent, ITraceErrorLog *pIErrorLog) = 0;
-
-// pkt decoder only
- //! attach instruction decoder to pkt decoder
- virtual ocsd_err_t attachInstrDecoder(TraceComponent *pComponent, IInstrDecode *pIInstrDec) = 0;
-
- //! attach memory accessor to pkt decoder
- virtual ocsd_err_t attachMemAccessor(TraceComponent *pComponent, ITargetMemAccess *pMemAccessor) = 0;
-
- //! attach generic output interface to pkt decoder
- virtual ocsd_err_t attachOutputSink(TraceComponent *pComponent, ITrcGenElemIn *pOutSink) = 0;
-
-// pkt processor only
- //! attach a raw packet monitor to pkt processor (solo pkt processor, or pkt processor part of pair)
- virtual ocsd_err_t attachPktMonitor(TraceComponent *pComponent, ITrcTypedBase *pPktRawDataMon) = 0;
-
- //! attach a packet indexer to pkt processor (solo pkt processor, or pkt processor part of pair)
- virtual ocsd_err_t attachPktIndexer(TraceComponent *pComponent, ITrcTypedBase *pPktIndexer) = 0;
-
- //! attach a packet data sink to pkt processor output (solo pkt processor only - instead of decoder when pkt processor only created.)
- virtual ocsd_err_t attachPktSink(TraceComponent *pComponent, ITrcTypedBase *pPktDataInSink) = 0;
-
-// data input connection interface
- //! get raw data input interface from packet processor
- virtual ocsd_err_t getDataInputI(TraceComponent *pComponent, ITrcDataIn **ppDataIn) = 0;
-
-// create configuration from data structure
- virtual ocsd_err_t createConfigFromDataStruct(CSConfig **pConfigBase, const void *pDataStruct) = 0;
-
-};
-
-#endif // ARM_OCSD_DCD_MNGR_I_H_INCLUDED
-
-/* End of File ocsd_dcd_mngr.h */ \ No newline at end of file
diff --git a/contrib/opencsd/decoder/include/common/ocsd_dcd_tree.h b/contrib/opencsd/decoder/include/common/ocsd_dcd_tree.h
deleted file mode 100644
index e4e74f2bc659..000000000000
--- a/contrib/opencsd/decoder/include/common/ocsd_dcd_tree.h
+++ /dev/null
@@ -1,426 +0,0 @@
-/*!
- * \file ocsd_dcd_tree.h
- * \brief OpenCSD : Trace Decode Tree.
- *
- * \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.
- */
-
-#ifndef ARM_OCSD_DCD_TREE_H_INCLUDED
-#define ARM_OCSD_DCD_TREE_H_INCLUDED
-
-#include <vector>
-#include <list>
-
-#include "opencsd.h"
-#include "ocsd_dcd_tree_elem.h"
-
-/** @defgroup dcd_tree OpenCSD Library : Trace Decode Tree.
- @brief Create a multi source decode tree for a single trace capture buffer.
-
- Use to create a connected set of decoder objects to decode a trace buffer.
- There may be multiple trace sources within the capture buffer.
-
-@{*/
-
-/*!
- * @class DecodeTree
- * @brief Class to manage the decoding of data from a single trace sink .
- *
- * Provides functionality to build a tree of decode objects capable of decoding
- * multiple trace sources within a single trace sink (capture buffer).
- *
- */
-class DecodeTree : public ITrcDataIn
-{
-public:
-/** @name Creation and Destruction
-@{*/
- DecodeTree(); //!< default constructor
- ~DecodeTree(); //!< default destructor
-
- /*!
- * @brief Create a decode tree.
- * Automatically creates a trace frame deformatter if required and a default error log component.
- *
- * @param src_type : Data stream source type, can be CoreSight frame formatted trace, or single demuxed trace data stream,
- * @param formatterCfgFlags : Configuration flags for trace de-formatter.
- *
- * @return DecodeTree * : pointer to the decode tree, 0 if creation failed.
- */
- static DecodeTree *CreateDecodeTree(const ocsd_dcd_tree_src_t src_type, const uint32_t formatterCfgFlags);
-
- /** @brief Destroy a decode tree */
- static void DestroyDecodeTree(DecodeTree *p_dcd_tree);
-
-/** @}*/
-
-
-/** @name Error and element Logging
-@{*/
- /** @brief The library default error logger */
- static ocsdDefaultErrorLogger* getDefaultErrorLogger() { return &s_error_logger; };
-
- /** the current error logging interface in use */
- static ITraceErrorLog *getCurrentErrorLogI() { return s_i_error_logger; };
-
- /** set an alternate error logging interface. */
- static void setAlternateErrorLogger(ITraceErrorLog *p_error_logger);
-
- /** get the list of packet printers for this decode tree */
- std::vector<ItemPrinter *> &getPrinterList() { return m_printer_list; };
-
- /** add a protocol packet printer */
- ocsd_err_t addPacketPrinter(uint8_t CSID, bool bMonitor, ItemPrinter **ppPrinter);
-
- /** add a raw frame printer */
- ocsd_err_t addRawFramePrinter(RawFramePrinter **ppPrinter, uint32_t flags);
-
- /** add a generic element output printer */
- ocsd_err_t addGenElemPrinter(TrcGenericElementPrinter **ppPrinter);
-
-
-
-/** @}*/
-
-
-/** @name Trace Data Path
-@{*/
- /** @brief Trace Data input interface (ITrcDataIn)
-
- Decode tree implements the data in interface : ITrcDataIn .
- Captured raw trace data is passed into the deformatter and decoders via this method.
- */
- virtual ocsd_datapath_resp_t TraceDataIn( const ocsd_datapath_op_t op,
- const ocsd_trc_index_t index,
- const uint32_t dataBlockSize,
- const uint8_t *pDataBlock,
- uint32_t *numBytesProcessed);
-
- /*!
- * @brief Decoded Trace output.
- *
- * Client trace analysis program attaches a generic trace element interface to
- * receive the output from the trace decode operations.
- *
- * @param *i_gen_trace_elem : Pointer to the interface.
- */
- void setGenTraceElemOutI(ITrcGenElemIn *i_gen_trace_elem);
-
- /*! @brief Return the connected generic element interface */
- ITrcGenElemIn *getGenTraceElemOutI() const { return m_i_gen_elem_out; };
-
-/** @}*/
-
-/** @name Decoder Management
-@{*/
-
- /*!
- * Creates a decoder that is registered with the library under the supplied name.
- * createFlags determine if a full packet processor / packet decoder pair or
- * packet processor only is created.
- * Uses the supplied configuration structure.
- *
- * @param &decoderName : registered name of decoder
- * @param createFlags : Decoder creation options.
- * @param *pConfig : Pointer to a valid configuration structure for the named decoder.
- *
- * @return ocsd_err_t : Library error code or OCSD_OK if successful.
- */
- ocsd_err_t createDecoder(const std::string &decoderName, const int createFlags, const CSConfig *pConfig);
-
- /* */
- /*!
- * Remove a decoder / packet processor attached to an Trace ID output on the frame de-mux.
- *
- * Once removed another decoder can be created that has a CSConfig using that ID.
- *
- * @param CSID : Trace ID to remove.
- *
- * @return ocsd_err_t : Library error code or OCSD_OK if successful.
- */
- ocsd_err_t removeDecoder(const uint8_t CSID);
-
-
-/* get decoder elements currently in use */
-
- /*!
- * Find a decode tree element associated with a specific CoreSight trace ID. *
- */
- DecodeTreeElement *getDecoderElement(const uint8_t CSID) const;
- /* iterate decoder elements */
-
- /*!
- * Decode tree iteration. Return the first tree element 0 if no elements avaiable.
- *
- * @param &elemID : CoreSight Trace ID associated with this element
- */
- DecodeTreeElement *getFirstElement(uint8_t &elemID);
- /*!
- * Return the next tree element - or 0 if no futher elements avaiable.
- *
- * @param &elemID : CoreSight Trace ID associated with this element
- */
- DecodeTreeElement *getNextElement(uint8_t &elemID);
-
-/* set key interfaces - attach / replace on any existing tree components */
-
- /*!
- * Set an ARM instruction opcode decoder.
- *
- * @param *i_instr_decode : Pointer to the interface.
- */
- void setInstrDecoder(IInstrDecode *i_instr_decode);
- /*!
- * Set a target memory access interface - used to access program image memory for instruction
- * trace decode.
- *
- * @param *i_mem_access : Pointer to the interface.
- */
- void setMemAccessI(ITargetMemAccess *i_mem_access);
-
-
-/** @}*/
-
-/** @name Memory Access Mapper
-
- A memory mapper is used to organise a collection of memory accessor objects that contain the
- memory images for different areas of traced instruction memory. These areas could be the executed
- program and a set of loaded .so libraries for example - each of which would have code sections in
- different memory locations.
-
- A memory accessor represents a snapshot of an area of memory as it appeared during trace capture,
- for a given memory space. Memory spaces are described by the ocsd_mem_space_acc_t enum. The most
- general memory space is OCSD_MEM_SPACE_ANY. This represents memory that can be secure or none-secure,
- available at any exception level.
-
- The memory mapper will not allow two accessors to overlap in the same memory space.
-
- The trace decdoer will access memory with a memory space parameter that represents the current core
- state - the mapper will find the closest memory space match for the address.
-
- e.g. if the core is accessing secure EL3, then the most specialised matching space will be accessed.
- If an EL3 space matches that will be used, otherwise the any secure, and finally _ANY.
-
- It is no necessary for clients to register memory accessors for all spaces - _ANY will be sufficient
- in many cases.
-
-
-@{*/
-
- /* */
- /*!
- * This creates a memory mapper within the decode tree.
- *
- * @param type : defaults to MEMACC_MAP_GLOBAL (only type available at present)
- *
- * @return ocsd_err_t : Library error code or OCSD_OK if successful.
- */
- ocsd_err_t createMemAccMapper(memacc_mapper_t type = MEMACC_MAP_GLOBAL);
-
- /*!
- * Get a pointer to the memory mapper. Allows a client to add memory accessors directly to the mapper.
- * @return TrcMemAccMapper : Pointer to the mapper.
- */
- TrcMemAccMapper *getMemAccMapper() const { return m_default_mapper; };
-
- /*!
- * Set an external mapper rather than create a mapper in the decode tree.
- * Setting this will also destroy any internal mapper that was previously created.
- *
- * @param pMapper : pointer to the mapper to add.
- */
- void setExternMemAccMapper(TrcMemAccMapper * pMapper);
-
- /*!
- * Return true if a mapper has been set (internal or external
- */
- const bool hasMemAccMapper() const { return (bool)(m_default_mapper != 0); };
-
- void logMappedRanges(); //!< Log the mapped memory ranges to the default message logger.
-
-/** @}*/
-
-/** @name Memory Accessors
- A memory accessor represents a snapshot of an area of memory as it appeared during trace capture.
-
- Memory spaces represent either common global memory, or Secure / none-secure and EL specific spaces.
-
-@{*/
-
- /*!
- * Creates a memory accessor for a memory block in the supplied buffer and adds to the current mapper.
- *
- * @param address : Start address for the memory block in the memory map.
- * @param mem_space : Memory space
- * @param *p_mem_buffer : start of the buffer.
- * @param mem_length : length of the buffer.
- *
- * @return ocsd_err_t : Library error code or OCSD_OK if successful.
- */
- ocsd_err_t addBufferMemAcc(const ocsd_vaddr_t address, const ocsd_mem_space_acc_t mem_space, const uint8_t *p_mem_buffer, const uint32_t mem_length);
-
- /*!
- * Creates a memory accessor for a memory block supplied as a contiguous binary data file, and adds to the current mapper.
- *
- * @param address : Start address for the memory block in the memory map.
- * @param mem_space : Memory space
- * @param &filepath : Path to the binary data file
- *
- * @return ocsd_err_t : Library error code or OCSD_OK if successful.
- */
- ocsd_err_t addBinFileMemAcc(const ocsd_vaddr_t address, const ocsd_mem_space_acc_t mem_space, const std::string &filepath);
-
- /*!
- * Creates a memory accessor for a memory block supplied as a one or more memory regions in a binary file.
- * Region structures are created that describe the memory start address, the offset within the binary file
- * for that address, and the length of the region. This accessor can be used to point to the code section
- * in a program file for example.
- *
- * @param *region_array : array of valid memory regions in the file.
- * @param num_regions : number of regions
- * @param mem_space : Memory space
- * @param &filepath : Path to the binary data file
- *
- * @return ocsd_err_t : Library error code or OCSD_OK if successful.
- */
- ocsd_err_t addBinFileRegionMemAcc(const ocsd_file_mem_region_t *region_array, const int num_regions, const ocsd_mem_space_acc_t mem_space, const std::string &filepath);
-
-
- /*!
- * Updates/adds to a memory accessor for a memory block supplied as a one or more memory regions in a binary file.
- * Region structures are created that describe the memory start address, the offset within the binary file
- * for that address, and the length of the region. This accessor can be used to point to the code section
- * in a program file for example.
- *
- * @param *region_array : array of valid memory regions in the file.
- * @param num_regions : number of regions
- * @param mem_space : Memory space
- * @param &filepath : Path to the binary data file
- *
- * @return ocsd_err_t : Library error code or OCSD_OK if successful.
- */
- ocsd_err_t updateBinFileRegionMemAcc(const ocsd_file_mem_region_t *region_array, const int num_regions, const ocsd_mem_space_acc_t mem_space, const std::string &filepath);
-
- /*!
- * This memory accessor allows the client to supply a callback function for the region
- * defined by the start and end addresses. This can be used to supply a custom memory accessor,
- * or to directly access memory if the decode is running live on a target system.
- *
- * @param st_address : start address of region.
- * @param en_address : end address of region.
- * @param mem_space : Memory space
- * @param p_cb_func : Callback function
- * @param *p_context : client supplied context information
- *
- * @return ocsd_err_t : Library error code or OCSD_OK if successful.
- */
- ocsd_err_t addCallbackMemAcc(const ocsd_vaddr_t st_address, const ocsd_vaddr_t en_address, const ocsd_mem_space_acc_t mem_space, Fn_MemAcc_CB p_cb_func, const void *p_context);
- ocsd_err_t addCallbackIDMemAcc(const ocsd_vaddr_t st_address, const ocsd_vaddr_t en_address, const ocsd_mem_space_acc_t mem_space, Fn_MemAccID_CB p_cb_func, const void *p_context);
-
- /*!
- * Remove the memory accessor from the map, that begins at the given address, for the memory space provided.
- *
- * @param address : Start address of the memory accessor.
- * @param mem_space : Memory space for the memory accessor.
- *
- * @return ocsd_err_t : Library error code or OCSD_OK if successful.
- */
- ocsd_err_t removeMemAccByAddress(const ocsd_vaddr_t address, const ocsd_mem_space_acc_t mem_space);
-
-/** @}*/
-
-/** @name CoreSight Trace Frame De-mux
-@{*/
-
- //! Get the Trace Frame de-mux.
- TraceFormatterFrameDecoder *getFrameDeformatter() const { return m_frame_deformatter_root; };
-
-
- /*! @brief ID filtering - sets the output filter on the trace deformatter.
-
- Only supplied IDs will be decoded.
-
- No effect if no decoder attached for the ID
-
- @param ids : Vector of CS Trace IDs
- */
- ocsd_err_t setIDFilter(std::vector<uint8_t> &ids); // only supplied IDs will be decoded
-
- ocsd_err_t clearIDFilter(); //!< remove filter, all IDs will be decoded
-
-/** @}*/
-
-private:
- bool initialise(const ocsd_dcd_tree_src_t type, uint32_t formatterCfgFlags);
- const bool usingFormatter() const { return (bool)(m_dcd_tree_type == OCSD_TRC_SRC_FRAME_FORMATTED); };
- void setSingleRoot(TrcPktProcI *pComp);
- ocsd_err_t createDecodeElement(const uint8_t CSID);
- void destroyDecodeElement(const uint8_t CSID);
- void destroyMemAccMapper();
- ocsd_err_t initCallbackMemAcc(const ocsd_vaddr_t st_address, const ocsd_vaddr_t en_address,
- const ocsd_mem_space_acc_t mem_space, void *p_cb_func, bool IDfn, const void *p_context);
-
-
- ocsd_dcd_tree_src_t m_dcd_tree_type;
-
- IInstrDecode *m_i_instr_decode;
- ITargetMemAccess *m_i_mem_access;
- ITrcGenElemIn *m_i_gen_elem_out; //!< Output interface for generic elements from decoder.
-
- ITrcDataIn* m_i_decoder_root; /*!< root decoder object interface - either deformatter or single packet processor */
-
- TraceFormatterFrameDecoder *m_frame_deformatter_root;
-
- DecodeTreeElement *m_decode_elements[0x80];
-
- uint8_t m_decode_elem_iter;
-
- TrcMemAccMapper *m_default_mapper; //!< the mem acc mapper to use
- bool m_created_mapper; //!< true if created by decode tree object
-
- std::vector<ItemPrinter *> m_printer_list; //!< list of packet printers.
-
- /* global error logger - all sources */
- static ITraceErrorLog *s_i_error_logger;
- static std::list<DecodeTree *> s_trace_dcd_trees;
-
- /**! default error logger */
- static ocsdDefaultErrorLogger s_error_logger;
-
- /**! default instruction decoder */
- static TrcIDecode s_instruction_decoder;
-};
-
-/** @}*/
-
-#endif // ARM_OCSD_DCD_TREE_H_INCLUDED
-
-/* End of File ocsd_dcd_tree.h */
diff --git a/contrib/opencsd/decoder/include/common/ocsd_dcd_tree_elem.h b/contrib/opencsd/decoder/include/common/ocsd_dcd_tree_elem.h
deleted file mode 100644
index 2b609fbf04f8..000000000000
--- a/contrib/opencsd/decoder/include/common/ocsd_dcd_tree_elem.h
+++ /dev/null
@@ -1,112 +0,0 @@
-/*!
- * \file ocsd_dcd_tree_elem.h
- * \brief OpenCSD : Decode tree element.
- *
- * \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.
- */
-
-#ifndef ARM_OCSD_DCD_TREE_ELEM_H_INCLUDED
-#define ARM_OCSD_DCD_TREE_ELEM_H_INCLUDED
-
-#include "common/ocsd_dcd_mngr_i.h"
-#include "common/trc_component.h"
-
-/** @addtogroup dcd_tree
-@{*/
-
-/*! @struct _decoder_elements
- * @brief Decode tree element base structure.
- *
- * Element describes the protocol supported for this element and
- * contains pointers to the decoder manager interface and component handle.
- */
-typedef struct _decoder_elements
-{
- std::string dcd_name; //!< Registered name of the decoder
- TraceComponent *dcd_handle; //!< handle to the decoder object
- IDecoderMngr *dcd_mngr; //!< pointer to the decoder manager interface for the decodcer
- ocsd_trace_protocol_t protocol;//!< protocol type
- bool created; /**< decode tree created this element (destroy it on tree destruction) */
-} decoder_element;
-
-/*!
- * @class DecodeTreeElement
- * @brief Decode tree element
- *
- * Decoder tree elements are references to individual decoders in the tree.
- * These allow iteration of all decoders in the tree to perform common operations.
- *
- * The DecodeTree contains a list of elements.
- */
-class DecodeTreeElement : protected decoder_element
-{
-public:
- DecodeTreeElement();
- ~DecodeTreeElement() {};
-
- void SetDecoderElement(const std::string &name, IDecoderMngr *dcdMngr, TraceComponent *pHandle, bool bCreated);
- void DestroyElem();
-
- const std::string &getDecoderTypeName() { return dcd_name; };
- IDecoderMngr *getDecoderMngr() { return dcd_mngr; };
- ocsd_trace_protocol_t getProtocol() const { return protocol; };
- TraceComponent *getDecoderHandle() { return dcd_handle; };
-};
-
-inline DecodeTreeElement::DecodeTreeElement()
-{
- dcd_name = "unknown";
- dcd_mngr = 0;
- dcd_handle = 0;
- protocol = OCSD_PROTOCOL_END;
- created = false;
-}
-
-inline void DecodeTreeElement::SetDecoderElement(const std::string &name, IDecoderMngr *dcdMngr, TraceComponent *pHandle, bool bCreated)
-{
- dcd_name = name;
- dcd_mngr = dcdMngr;
- dcd_handle = pHandle;
- protocol = OCSD_PROTOCOL_UNKNOWN;
- if(dcd_mngr)
- protocol = dcd_mngr->getProtocolType();
- created = bCreated;
-}
-
-inline void DecodeTreeElement::DestroyElem()
-{
- if(created && (dcd_mngr != 0) && (dcd_handle != 0))
- dcd_mngr->destroyDecoder(dcd_handle);
-}
-
-/** @}*/
-#endif // ARM_OCSD_DCD_TREE_ELEM_H_INCLUDED
-
-/* End of File ocsd_dcd_tree_elem.h */
diff --git a/contrib/opencsd/decoder/include/common/ocsd_error.h b/contrib/opencsd/decoder/include/common/ocsd_error.h
deleted file mode 100644
index e547f4878033..000000000000
--- a/contrib/opencsd/decoder/include/common/ocsd_error.h
+++ /dev/null
@@ -1,116 +0,0 @@
-/*!
- * \file ocsd_error.h
- * \brief OpenCSD : Library Error 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.
- */
-
-#ifndef ARM_OCSD_ERROR_H_INCLUDED
-#define ARM_OCSD_ERROR_H_INCLUDED
-
-#include "opencsd/ocsd_if_types.h"
-#include <string>
-/** @ingroup ocsd_infrastructure
-@{*/
-
-/*!
- * @class ocsdError
- *
- * This class is the error object for the Ocsd.
- *
- * Errors are created with a severity (ocsd_err_severity_t) and a standard ocsd_err_t error code.
- * Errors can optionally be created with a trace index (offset from start of capture buffer), and
- * trace CoreSight source channel ID.
- *
- * A custom error message can be appended to the error.
- *
- * The ocsdError class contains a static function to output a formatted string representation of an error.
- *
- */
-class ocsdError {
-public:
- ocsdError(const ocsd_err_severity_t sev_type, const ocsd_err_t code); /**< Default error constructor with severity and error code. */
- ocsdError(const ocsd_err_severity_t sev_type, const ocsd_err_t code, const ocsd_trc_index_t idx); /**< Constructor with optional trace index. */
- ocsdError(const ocsd_err_severity_t sev_type, const ocsd_err_t code, const ocsd_trc_index_t idx, const uint8_t chan_id); /**< Constructor with optional trace index and channel ID. */
- ocsdError(const ocsd_err_severity_t sev_type, const ocsd_err_t code, const std::string &msg); /**< Default error constructor with severity and error code - plus message. */
- ocsdError(const ocsd_err_severity_t sev_type, const ocsd_err_t code, const ocsd_trc_index_t idx, const std::string &msg); /**< Constructor with optional trace index - plus message. */
- 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); /**< Constructor with optional trace index and channel ID - plus message. */
-
- ocsdError(const ocsdError *pError); /**< Copy constructor */
- ocsdError(const ocsdError &Error); /**< Copy constructor */
- ~ocsdError(); /**< Destructor */
-
- ocsdError& operator=(const ocsdError *p_err);
- ocsdError& operator=(const ocsdError &err);
-
- void setMessage(const std::string &msg) { m_err_message = msg; }; /**< Set custom error message */
- const std::string &getMessage() const { return m_err_message; }; /**< Get custom error message */
-
- const ocsd_err_t getErrorCode() const { return m_error_code; }; /**< Get error code. */
- const ocsd_err_severity_t getErrorSeverity() const { return m_sev; }; /**< Get error severity. */
- const ocsd_trc_index_t getErrorIndex() const { return m_idx; }; /**< Get trace index associated with the error. */
- const uint8_t getErrorChanID() const { return m_chan_ID; }; /**< Get the trace source channel ID associated with the error. */
-
- static const std::string getErrorString(const ocsdError &error); /**< Generate a formatted error string for the supplied error. */
-
-private:
- static void appendErrorDetails(std::string &errStr, const ocsdError &error); /**< build the error string. */
- ocsdError(); /**< Make no parameter default constructor inaccessible. */
-
- ocsd_err_t m_error_code; /**< Error code for this error */
- ocsd_err_severity_t m_sev; /**< severity for this error */
- ocsd_trc_index_t m_idx; /**< Trace buffer index associated with this error (optional) */
- uint8_t m_chan_ID; /**< trace source ID associated with this error (optional) */
-
- std::string m_err_message; /**< Additional text associated with this error (optional) */
-};
-
-inline ocsdError& ocsdError::operator=(const ocsdError *p_err)
-{
- this->m_error_code = p_err->getErrorCode();
- this->m_sev = p_err->getErrorSeverity();
- this->m_idx = p_err->getErrorIndex();
- this->m_chan_ID = p_err->getErrorChanID();
- this->m_err_message = p_err->getMessage();
- return *this;
-}
-
-inline ocsdError& ocsdError::operator=(const ocsdError &err)
-{
- return (*this = &err);
-}
-
-
-/** @}*/
-
-#endif // ARM_OCSD_ERROR_H_INCLUDED
-
-/* End of File ocsd_error.h */
diff --git a/contrib/opencsd/decoder/include/common/ocsd_error_logger.h b/contrib/opencsd/decoder/include/common/ocsd_error_logger.h
deleted file mode 100644
index 3badd337f655..000000000000
--- a/contrib/opencsd/decoder/include/common/ocsd_error_logger.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/*!
- * \file ocsd_error_logger.h
- * \brief OpenCSD : Library error logger.
- *
- * \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.
- */
-
-#ifndef ARM_OCSD_ERROR_LOGGER_H_INCLUDED
-#define ARM_OCSD_ERROR_LOGGER_H_INCLUDED
-
-#include <string>
-#include <vector>
-//#include <fstream>
-
-#include "interfaces/trc_error_log_i.h"
-#include "ocsd_error.h"
-#include "ocsd_msg_logger.h"
-
-class ocsdDefaultErrorLogger : public ITraceErrorLog
-{
-public:
- ocsdDefaultErrorLogger();
- virtual ~ocsdDefaultErrorLogger();
-
- bool initErrorLogger(const ocsd_err_severity_t verbosity, bool bCreateOutputLogger = false); //!< Initialise the error logger with a severity filter, optionally create an output logger on stderr.
-
- virtual ocsdMsgLogger *getOutputLogger() { return m_output_logger; };
- virtual void setOutputLogger(ocsdMsgLogger *pLogger);
-
- virtual const ocsd_hndl_err_log_t RegisterErrorSource(const std::string &component_name);
-
- virtual void LogError(const ocsd_hndl_err_log_t handle, const ocsdError *Error);
- virtual void LogMessage(const ocsd_hndl_err_log_t handle, const ocsd_err_severity_t filter_level, const std::string &msg );
-
- virtual const ocsd_err_severity_t GetErrorLogVerbosity() const { return m_Verbosity; };
-
- virtual ocsdError *GetLastError() { return m_lastErr; };
- virtual ocsdError *GetLastIDError(const uint8_t chan_id)
- {
- if(OCSD_IS_VALID_CS_SRC_ID(chan_id))
- return m_lastErrID[chan_id];
- return 0;
- };
-
-private:
- void CreateErrorObj(ocsdError **ppErr, const ocsdError *p_from);
-
- ocsdError *m_lastErr;
- ocsdError *m_lastErrID[0x80];
-
- ocsd_err_severity_t m_Verbosity;
-
- ocsdMsgLogger *m_output_logger; // pointer to a standard message output logger;
- bool m_created_output_logger; // true if this class created it's own logger;
-
- std::vector<std::string> m_error_sources;
-};
-
-
-#endif // ARM_OCSD_ERROR_LOGGER_H_INCLUDED
-
-/* End of File ocsd_error_logger.h */
diff --git a/contrib/opencsd/decoder/include/common/ocsd_gen_elem_list.h b/contrib/opencsd/decoder/include/common/ocsd_gen_elem_list.h
deleted file mode 100644
index 0ff1bd59cbbe..000000000000
--- a/contrib/opencsd/decoder/include/common/ocsd_gen_elem_list.h
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * \file ocsd_gen_elem_stack.h
- * \brief OpenCSD : Generic element output stack.
- *
- * \copyright Copyright (c) 2016, 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 <list>
-#include "trc_gen_elem.h"
-#include "comp_attach_pt_t.h"
-#include "interfaces/trc_gen_elem_in_i.h"
-
-/*!
- * @class OcsdGenElemList
- * @brief Maintain a list of elements to be output
- *
- * Each incoming packet can result in multiple output elements.
- * These are stacked in this class prior to entering the output phase of processing.
- *
- * This should remove some of the requirement on the packet processing to be re-enterant,
- * simplifying this code.
- *
- * Last element(s) on this stack can be marked pending to allow for later cancellation.
- * (This required for cancel element in ETMv3 exeception branch).
- *
- * The "list" is actually a ring buffer - maintaining pointers to indicate current valid elements.
- * This buffer can increase on demand, but will only be released at the end of a decode session.
- */
-class OcsdGenElemList
-{
-public:
- OcsdGenElemList();
- ~OcsdGenElemList();
-
- void initSendIf(componentAttachPt<ITrcGenElemIn> *pGenElemIf);
- void initCSID(const uint8_t CSID) { m_CSID = CSID; };
-
- void reset(); //!< reset the element list.
-
- OcsdTraceElement *getNextElem(const ocsd_trc_index_t trc_pkt_idx); //!< get next free element on the stack (add one to the output)
- const int getNumElem() const; //!< return the total number of elements on the stack (inlcuding any pended ones).
-
- const ocsd_gen_trc_elem_t getElemType(const int entryN) const; //!< get the type for the nth element in the stack (0 indexed)
-
- void pendLastNElem(int numPend); //!< Last element to be pended prior to cancel/commit decision.
- void commitAllPendElem(); //!< commit all pended elements.
- void cancelPendElem(); //!< cancel the last pended element on the stack.
- const int numPendElem() const; //!< return the number of pended elements.
-
- /*! Send all of the none pended elements
- Stop sending when all sent or _CONT response.
- */
- ocsd_datapath_resp_t sendElements();
- const bool elemToSend() const; //!< true if any none-pending elements left to send.
-
-private:
-
- void growArray();
- const int getAdjustedIdx(int idxIn) const; //!< get adjusted index into circular buffer.
-
-
- // list element contains pointer and byte index in trace stream
- typedef struct _elemPtr {
- OcsdTraceElement *pElem; //!< pointer to the listed trace element
- ocsd_trc_index_t trc_pkt_idx; //!< packet index in the trace stream
- } elemPtr_t;
-
- elemPtr_t *m_pElemArray; //!< an array of pointers to elements.
- int m_elemArraySize; //!< number of element pointers in the array
-
- int m_firstElemIdx; //!< internal index in array of first element in use.
- int m_numUsed; //!< number of elements in use
- int m_numPend; //!< internal count of pended elements.
-
- uint8_t m_CSID;
-
- componentAttachPt<ITrcGenElemIn> *m_sendIf; //!< element send interface.
-};
-
-inline const int OcsdGenElemList::getAdjustedIdx(int idxIn) const
-{
- if(idxIn >= m_elemArraySize)
- idxIn -= m_elemArraySize;
- return idxIn;
-}
-
-inline const int OcsdGenElemList::getNumElem() const
-{
- return m_numUsed;
-}
-
-inline const int OcsdGenElemList::numPendElem() const
-{
- return m_numPend;
-}
-
-inline void OcsdGenElemList::pendLastNElem(int numPend)
-{
- if(numPend >= getNumElem())
- m_numPend = numPend;
-}
-
-inline void OcsdGenElemList::commitAllPendElem()
-{
- m_numPend = 0;
-}
-
-inline void OcsdGenElemList::cancelPendElem()
-{
- if(m_numPend > 0)
- {
- m_numUsed -= m_numPend;
- }
-}
-
-inline const bool OcsdGenElemList::elemToSend() const
-{
- return ((getNumElem() - m_numPend) > 0);
-}
-
-inline void OcsdGenElemList::initSendIf(componentAttachPt<ITrcGenElemIn> *pGenElemIf)
-{
- m_sendIf = pGenElemIf;
-}
-
-/* End of File ocsd_gen_elem_stack.h */
diff --git a/contrib/opencsd/decoder/include/common/ocsd_lib_dcd_register.h b/contrib/opencsd/decoder/include/common/ocsd_lib_dcd_register.h
deleted file mode 100644
index 6ba4cf82240a..000000000000
--- a/contrib/opencsd/decoder/include/common/ocsd_lib_dcd_register.h
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * \file ocsd_lib_dcd_register.h
- * \brief OpenCSD : Library decoder registration and management.
- *
- * \copyright Copyright (c) 2016, ARM Limited. All Rights Reserved.
- */
-
-#ifndef ARM_OCSD_LIB_DCD_REGISTER_H_INCLUDED
-#define ARM_OCSD_LIB_DCD_REGISTER_H_INCLUDED
-
-
-/*
- * 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 <map>
-
-#include "opencsd/ocsd_if_types.h"
-#include "common/ocsd_dcd_mngr_i.h"
-
-/*!
- * @class OcsdLibDcdRegister : Registers decoders with the library
- *
- * library decoder register class allows decoders to be registered by name, and the register allows clients to access
- * the list of names of registerd decoders.
- *
- * The decoders in the library are accessed through the decoder manager interface. This provides a set of functions to allow
- * the creation, manipulation and destruction of registered decoders
- *
- */
-class OcsdLibDcdRegister
-{
-public:
- static OcsdLibDcdRegister *getDecoderRegister();
-
- static void deregisterAllDecoders(); //!< library cleanup - deregisters decoder managers and destroys the register object.
- static const ocsd_trace_protocol_t getNextCustomProtocolID();
- static void releaseLastCustomProtocolID();
-
- const ocsd_err_t registerDecoderTypeByName(const std::string &name, IDecoderMngr *p_decoder_fact); //!< register a decoder manager interface
- const ocsd_err_t getDecoderMngrByName(const std::string &name, IDecoderMngr **p_decoder_mngr);
- const ocsd_err_t getDecoderMngrByType(const ocsd_trace_protocol_t decoderType, IDecoderMngr **p_decoder_mngr);
-
- const bool isRegisteredDecoder(const std::string &name);
- const bool getFirstNamedDecoder(std::string &name);
- const bool getNextNamedDecoder(std::string &name);
-
- const bool isRegisteredDecoderType(const ocsd_trace_protocol_t decoderType);
-
-private:
- void registerBuiltInDecoders(); //!< register the list of build in decoder managers on first access of getDecoderMngrByName.
- void deRegisterCustomDecoders(); //!< delete all custom decoders registered with the library.
-
- std::map<const std::string, IDecoderMngr *> m_decoder_mngrs; //!< map linking names to decoder manager interfaces.
- std::map<const std::string, IDecoderMngr *>::const_iterator m_iter; //!< iterator for name search.
-
- std::map<const ocsd_trace_protocol_t, IDecoderMngr *> m_typed_decoder_mngrs; //!< map linking decoder managers to protocol type ID
-
- // cache last found by type to speed up repeated quries on same object.
- IDecoderMngr *m_pLastTypedDecoderMngr; //!< last manager we found by type
-
-
-
- // singleton pattern - need just one of these in the library - ensure all default constructors are private.
- OcsdLibDcdRegister();
- OcsdLibDcdRegister(OcsdLibDcdRegister const &) {};
- OcsdLibDcdRegister& operator=(OcsdLibDcdRegister const &){ return *this; };
- ~OcsdLibDcdRegister();
-
- static OcsdLibDcdRegister *m_p_libMngr;
- static bool m_b_registeredBuiltins;
- static ocsd_trace_protocol_t m_nextCustomProtocolID;
-};
-
-/*!
- * Typedef of function signature to create a decoder manager.
- *
- * @param *name : Registered name of the decoder.
- */
-typedef IDecoderMngr *(*CreateMngr)(const std::string &name);
-
-/*!
- * Template function to create a specific decoder manager class object.
- *
- * @param &name : Registered name of the decoder.
- *
- * @return IDecoderMngr * : pointer to the decoder manager base class interface.
- */
-template <typename T> IDecoderMngr *createManagerInst(const std::string &name)
-{
- return new (std::nothrow)T(name);
-}
-
-/*! Structure to contain the information needed to create and register a builtin decoder
- * manager with the library
- */
-typedef struct built_in_decoder_info {
- IDecoderMngr *pMngr; //!< pointer to created decoder manager
- CreateMngr PFn; //!< function to create the decoder manager.
- const char *name; //!< registered name of the decoder.
-} built_in_decoder_info_t;
-
-//! Define to use to fill in an array of built_in_decoder_info_t structures.
-#define CREATE_BUILTIN_ENTRY(C,N) { 0, createManagerInst<C>, N }
-
-#endif // ARM_OCSD_LIB_DCD_REGISTER_H_INCLUDED
-
-/* End of File ocsd_lib_dcd_register.h */
diff --git a/contrib/opencsd/decoder/include/common/ocsd_msg_logger.h b/contrib/opencsd/decoder/include/common/ocsd_msg_logger.h
deleted file mode 100644
index d83a0224e176..000000000000
--- a/contrib/opencsd/decoder/include/common/ocsd_msg_logger.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/*!
- * \file ocsd_msg_logger.h
- * \brief OpenCSD : Generic Message logger / printer
- *
- * \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.
- */
-
-#ifndef ARM_OCSD_MSG_LOGGER_H_INCLUDED
-#define ARM_OCSD_MSG_LOGGER_H_INCLUDED
-
-#include <string>
-#include <fstream>
-
-class ocsdMsgLogStrOutI
-{
-public:
- ocsdMsgLogStrOutI() {};
- virtual ~ocsdMsgLogStrOutI() {};
-
- virtual void printOutStr(const std::string &outStr) = 0;
-};
-
-class ocsdMsgLogger
-{
-public:
- ocsdMsgLogger();
- ~ocsdMsgLogger();
-
- /** Typedef enum providing flags to define the output methods for the message logger.
- */
- typedef enum {
- OUT_NONE = 0, /*!< No output from logger*/
- OUT_FILE = 1, /*!< Output to file */
- OUT_STDERR = 2, /*!< Output to stderr */
- OUT_STDOUT = 4, /*!< Output to stdout */
- OUT_STR_CB = 8 /*!< output to external string callback interface */
- } output_dest;
-
- void setLogOpts(int logOpts); //!< set the output logging flags.
- const int getLogOpts() const //! get the current output logging flags value.
- { return m_outFlags; };
-
- void setLogFileName(const char *fileName); //!< Set the output log filename, and enable logging to file.
- void setStrOutFn(ocsdMsgLogStrOutI *p_IstrOut); //!< Set the output log string callback and enable logging to callback.
-
- void LogMsg(const std::string &msg); //!< Log a message to the current set output channels.
-
- const bool isLogging() const; //!< true if logging active
-
-private:
- int m_outFlags;
-
- std::string m_logFileName;
- std::fstream m_out_file;
- ocsdMsgLogStrOutI *m_pOutStrI;
-};
-
-#endif // ARM_OCSD_MSG_LOGGER_H_INCLUDED
-
-/* End of File ocsd_msg_logger.h */
diff --git a/contrib/opencsd/decoder/include/common/ocsd_pe_context.h b/contrib/opencsd/decoder/include/common/ocsd_pe_context.h
deleted file mode 100644
index 797881cf6985..000000000000
--- a/contrib/opencsd/decoder/include/common/ocsd_pe_context.h
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * \file ocsd_pe_context.h
- * \brief OpenCSD : Wrapper class for PE context
- *
- * \copyright Copyright (c) 2016, 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.
- */
-#ifndef ARM_OCSD_PE_CONTEXT_H_INCLUDED
-#define ARM_OCSD_PE_CONTEXT_H_INCLUDED
-
-#include "opencsd/ocsd_if_types.h"
-
-/*! @class OcsdPeContext
- * @brief Handler for the ocsd_pe_context structure.
- *
- * Reads and writes structure values, enforcing interaction rules between values
- * and flags.
- */
-class OcsdPeContext
-{
-public:
- OcsdPeContext();
- OcsdPeContext(const ocsd_pe_context *context);
- ~OcsdPeContext() {};
-
- OcsdPeContext &operator =(const OcsdPeContext &ctxt);
- OcsdPeContext &operator =(const ocsd_pe_context *context);
-
- void resetCtxt();
-
- void setSecLevel(const ocsd_sec_level sl) { m_context.security_level = sl; };
- void setEL(const ocsd_ex_level el) { m_context.exception_level = el; m_context.el_valid = el > ocsd_EL_unknown ? 1 : 0; };
- void setCtxtID(const uint32_t id) { m_context.context_id = id; m_context.ctxt_id_valid = 1; };
- void setVMID(const uint32_t id) { m_context.vmid = id; m_context.vmid_valid = 1; };
- void set64bit(const bool is64bit) { m_context.bits64 = is64bit ? 1 : 0; };
-
- const ocsd_sec_level getSecLevel() const { return m_context.security_level; };
- const ocsd_ex_level getEL() const { return m_context.exception_level; };
- const bool ELvalid() const { return (m_context.el_valid == 1); };
- const uint32_t getCtxtID() const { return (m_context.ctxt_id_valid == 1) ? m_context.context_id : 0; };
- const bool ctxtIDvalid() const { return (m_context.ctxt_id_valid == 1); };
- const uint32_t getVMID() const { return (m_context.vmid_valid == 1) ? m_context.vmid : 0; };
- const bool VMIDvalid() const { return (m_context.vmid_valid == 1); };
-
- // only allow an immutable copy of the structure out to C-API land.
- operator const ocsd_pe_context &() const { return m_context; };
-
-private:
- ocsd_pe_context m_context;
-};
-
-inline OcsdPeContext::OcsdPeContext()
-{
- resetCtxt();
-}
-
-inline OcsdPeContext::OcsdPeContext(const ocsd_pe_context *context)
-{
- m_context = *context;
-}
-
-inline void OcsdPeContext::resetCtxt()
-{
- // initialise the context
- m_context.bits64 = 0;
- m_context.context_id = 0;
- m_context.ctxt_id_valid = 0;
- m_context.el_valid = 0;
- m_context.exception_level = ocsd_EL_unknown;
- m_context.security_level = ocsd_sec_secure;
- m_context.vmid = 0;
- m_context.vmid_valid = 0;
-}
-
-inline OcsdPeContext & OcsdPeContext::operator =(const OcsdPeContext &ctxt)
-{
- m_context = ctxt;
- return *this;
-}
-
-inline OcsdPeContext & OcsdPeContext::operator =(const ocsd_pe_context *context)
-{
- m_context = *context;
- return *this;
-}
-
-
-#endif // ARM_OCSD_PE_CONTEXT_H_INCLUDED
-
-/* End of File ocsd_pe_context.h */
diff --git a/contrib/opencsd/decoder/include/common/ocsd_version.h b/contrib/opencsd/decoder/include/common/ocsd_version.h
deleted file mode 100644
index b68c85f43022..000000000000
--- a/contrib/opencsd/decoder/include/common/ocsd_version.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * \file ocsd_version.h
- * \brief OpenCSD :
- *
- * \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.
- */
-#ifndef ARM_OCSD_VERSION_H_INCLUDED
-#define ARM_OCSD_VERSION_H_INCLUDED
-
-class ocsdVersion
-{
-public:
- static const uint32_t vers_num();
- static const char *vers_str();
-};
-
-#endif // ARM_OCSD_VERSION_H_INCLUDED
-
-/* End of File ocsd_version.h */
diff --git a/contrib/opencsd/decoder/include/common/trc_component.h b/contrib/opencsd/decoder/include/common/trc_component.h
deleted file mode 100644
index 6096ac70f6f0..000000000000
--- a/contrib/opencsd/decoder/include/common/trc_component.h
+++ /dev/null
@@ -1,149 +0,0 @@
-/*!
- * \file trc_component.h
- * \brief OpenCSD : Base trace decode component.
- *
- * \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.
- */
-
-#ifndef ARM_TRC_COMPONENT_H_INCLUDED
-#define ARM_TRC_COMPONENT_H_INCLUDED
-
-#include <string>
-#include "comp_attach_pt_t.h"
-#include "interfaces/trc_error_log_i.h"
-#include "ocsd_error.h"
-
-class errLogAttachMonitor;
-
-/** @addtogroup ocsd_infrastructure
-@{*/
-
-/*!
- * @class TraceComponent
- * @brief Base class for all decode components in the library.
- *
- * Provides error logging attachment point and component type and instance naming
- * Interface for handling of component operational mode.
- */
-class TraceComponent
-{
-public:
- TraceComponent(const std::string &name);
- TraceComponent(const std::string &name, int instIDNum);
- virtual ~TraceComponent(); /**< Default Destructor */
-
- const std::string &getComponentName() const { return m_name; };
- void setComponentName(const std::string &name) { m_name = name; };
-
- /** Error logger attachment point.*/
- componentAttachPt<ITraceErrorLog> *getErrorLogAttachPt() { return &m_error_logger; };
-
- /*!
- * Set the operational mode for the component.
- * This controls the way the component behaves under error conditions etc.
- * These flags may also control output formats or data.
- * Operation mode flags used are component specific and defined by derived classes.
- *
- * @param op_flags : Set of operation mode flags.
- *
- * @return ocsd_err_t : OCSD_OK if flags supported by this component, error if unsuppored
- */
- ocsd_err_t setComponentOpMode(uint32_t op_flags);
-
- /*!
- * Return the current operational mode flags values
- *
- * @return const uint32_t : Op Mode flags.
- */
- const uint32_t getComponentOpMode() const { return m_op_flags; };
-
- /*!
- * Get the supported operational mode flags for this component.
- * Base class will return nothing supported.
- * Derived class must set the value correctly for the component.
- *
- * @return const uint32_t : Supported flags values.
- */
- const uint32_t getSupportedOpModes() const { return m_supported_op_flags; };
-
- /*!
- * Set associated trace component - used by generic code to track
- * packet processor / packet decoder pairs.
- *
- * @param *assocComp : pointer to the associated component
- */
- void setAssocComponent(TraceComponent *assocComp) { m_assocComp = assocComp; };
-
-
- /*!
- * get associated trace component pointer
- *
- * @return TraceComponent *: associated component.
- */
- TraceComponent *getAssocComponent() { return m_assocComp; };
-
- /*!
- * Log a message at the default severity on this component.
- */
- void LogDefMessage(const std::string &msg)
- {
- LogMessage(m_errVerbosity, msg);
- }
-
-protected:
- friend class errLogAttachMonitor;
-
- void LogError(const ocsdError &Error);
- void LogMessage(const ocsd_err_severity_t filter_level, const std::string &msg);
- const ocsd_err_severity_t getErrorLogLevel() const { return m_errVerbosity; };
- const bool isLoggingErrorLevel(const ocsd_err_severity_t level) const { return level <= m_errVerbosity; };
- void updateErrorLogLevel();
-
- void do_attach_notify(const int num_attached);
- void Init(const std::string &name);
-
- uint32_t m_op_flags; //!< current component operational mode flags.
- uint32_t m_supported_op_flags; //!< supported component operational mode flags - derived class to intialise.
-
-private:
- componentAttachPt<ITraceErrorLog> m_error_logger;
- ocsd_hndl_err_log_t m_errLogHandle;
- ocsd_err_severity_t m_errVerbosity;
- errLogAttachMonitor *m_pErrAttachMon;
-
- std::string m_name;
-
- TraceComponent *m_assocComp; //!< associated component -> if this is a pkt decoder, associated pkt processor.
-};
-/** @}*/
-#endif // ARM_TRC_COMPONENT_H_INCLUDED
-
-/* End of File trc_component.h */
diff --git a/contrib/opencsd/decoder/include/common/trc_core_arch_map.h b/contrib/opencsd/decoder/include/common/trc_core_arch_map.h
deleted file mode 100644
index 5a24149180fc..000000000000
--- a/contrib/opencsd/decoder/include/common/trc_core_arch_map.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/*!
- * \file trc_core_arch_map.h
- * \brief OpenCSD : Map core name strings to architecture profile constants.
- *
- * \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.
- */
-
-#ifndef ARM_TRC_CORE_ARCH_MAP_H_INCLUDED
-#define ARM_TRC_CORE_ARCH_MAP_H_INCLUDED
-
-#include <map>
-#include <string>
-#include "opencsd/ocsd_if_types.h"
-
-class CoreArchProfileMap
-{
-public:
- CoreArchProfileMap();
- ~CoreArchProfileMap() {};
-
- ocsd_arch_profile_t getArchProfile(const std::string &coreName);
-
-private:
-
- std::map<std::string, ocsd_arch_profile_t> core_profiles;
-};
-
-inline ocsd_arch_profile_t CoreArchProfileMap::getArchProfile(const std::string &coreName)
-{
- ocsd_arch_profile_t ap = { ARCH_UNKNOWN, profile_Unknown };
-
- std::map<std::string, ocsd_arch_profile_t>::const_iterator it;
- it = core_profiles.find(coreName);
- if(it != core_profiles.end())
- ap = it->second;
- return ap;
-}
-
-#endif // ARM_TRC_CORE_ARCH_MAP_H_INCLUDED
-
-/* End of File trc_core_arch_map.h */
diff --git a/contrib/opencsd/decoder/include/common/trc_cs_config.h b/contrib/opencsd/decoder/include/common/trc_cs_config.h
deleted file mode 100644
index 9b2c13012f99..000000000000
--- a/contrib/opencsd/decoder/include/common/trc_cs_config.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * \file trc_cs_config.h
- * \brief OpenCSD : Trace component config base class.
- *
- * \copyright Copyright (c) 2016, ARM Limited. All Rights Reserved.
- */
-#ifndef ARM_TRC_CS_CONFIG_H_INCLUDED
-#define ARM_TRC_CS_CONFIG_H_INCLUDED
-
-
-/*
- * 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.
- */
-
-/** @addtogroup ocsd_protocol_cfg
-@{*/
-
-/*!
- * @class CSConfig
- * @brief Base class for configuration data on CoreSight trace component.
- *
- * Defines common access functionality, common to all components.
- * (e.g. trace ID).
- *
- */
-class CSConfig
-{
-public:
- CSConfig() {};
- virtual ~CSConfig() {};
-
- virtual const uint8_t getTraceID() const = 0; //!< CoreSight Trace ID for this device.
-};
-
-/** @}*/
-
-#endif // ARM_TRC_CS_CONFIG_H_INCLUDED
-
-/* End of File trc_cs_config.h */ \ No newline at end of file
diff --git a/contrib/opencsd/decoder/include/common/trc_frame_deformatter.h b/contrib/opencsd/decoder/include/common/trc_frame_deformatter.h
deleted file mode 100644
index e4297a41e8fd..000000000000
--- a/contrib/opencsd/decoder/include/common/trc_frame_deformatter.h
+++ /dev/null
@@ -1,97 +0,0 @@
-/*!
- * \file trc_frame_deformatter.h
- * \brief OpenCSD : De-format CoreSight formatted trace frame.
- *
- * \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.
- */
-#ifndef ARM_TRC_FRAME_DEFORMATTER_H_INCLUDED
-#define ARM_TRC_FRAME_DEFORMATTER_H_INCLUDED
-
-#include "opencsd/ocsd_if_types.h"
-
-#include "interfaces/trc_data_raw_in_i.h"
-#include "comp_attach_pt_t.h"
-
-class ITrcRawFrameIn;
-class ITrcDataMixIDIn;
-class ITrcSrcIndexCreator;
-class ITraceErrorLog;
-class TraceFmtDcdImpl;
-
-/** @defgroup ocsd_deformatter OpenCSD Library : Trace Frame Deformatter
- @brief CoreSight Formatted Trace Frame - deformatting functionality.
-@{*/
-
-class TraceFormatterFrameDecoder : public ITrcDataIn
-{
-public:
- TraceFormatterFrameDecoder();
- TraceFormatterFrameDecoder(int instNum);
- virtual ~TraceFormatterFrameDecoder();
-
- /* the data input interface from the reader */
- virtual ocsd_datapath_resp_t TraceDataIn( const ocsd_datapath_op_t op,
- const ocsd_trc_index_t index,
- const uint32_t dataBlockSize,
- const uint8_t *pDataBlock,
- uint32_t *numBytesProcessed);
-
- /* attach a data processor to a stream ID output */
- componentAttachPt<ITrcDataIn> *getIDStreamAttachPt(uint8_t ID);
-
- /* attach a data processor to the raw frame output */
- componentAttachPt<ITrcRawFrameIn> *getTrcRawFrameAttachPt();
-
- componentAttachPt<ITrcSrcIndexCreator> *getTrcSrcIndexAttachPt();
-
- componentAttachPt<ITraceErrorLog> *getErrLogAttachPt();
-
- /* configuration - set operational mode for incoming stream (has FSYNCS etc) */
- ocsd_err_t Configure(uint32_t cfg_flags);
- const uint32_t getConfigFlags() const;
-
- /* enable / disable ID streams - default as all enabled */
- ocsd_err_t OutputFilterIDs(std::vector<uint8_t> &id_list, bool bEnable);
- ocsd_err_t OutputFilterAllIDs(bool bEnable);
-
- /* decode control */
- ocsd_datapath_resp_t Reset(); /* reset the decode to the start state, drop partial data - propogate to attached components */
- ocsd_datapath_resp_t Flush(); /* flush existing data if possible, retain state - propogate to attached components */
-
-private:
- TraceFmtDcdImpl *m_pDecoder;
- int m_instNum;
-};
-
-/** @}*/
-
-#endif // ARM_TRC_FRAME_DEFORMATTER_H_INCLUDED
-
-/* End of File trc_frame_deformatter.h */ \ No newline at end of file
diff --git a/contrib/opencsd/decoder/include/common/trc_gen_elem.h b/contrib/opencsd/decoder/include/common/trc_gen_elem.h
deleted file mode 100644
index 1c4a47b3aa0a..000000000000
--- a/contrib/opencsd/decoder/include/common/trc_gen_elem.h
+++ /dev/null
@@ -1,209 +0,0 @@
-/*!
- * \file trc_gen_elem.h
- * \brief OpenCSD : Decoder Generic trace element output 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.
- */
-#ifndef ARM_TRC_GEN_ELEM_H_INCLUDED
-#define ARM_TRC_GEN_ELEM_H_INCLUDED
-
-#include "opencsd/trc_gen_elem_types.h"
-#include "trc_printable_elem.h"
-#include "ocsd_pe_context.h"
-
-/** @addtogroup gen_trc_elem
-@{*/
-
-/*!
- * @class OcsdTraceElement
- * @brief Generic trace element class
- *
- */
-class OcsdTraceElement : public trcPrintableElem, public ocsd_generic_trace_elem
-{
-public:
- OcsdTraceElement();
- OcsdTraceElement(ocsd_gen_trc_elem_t type);
- virtual ~OcsdTraceElement() {};
-
- void init();
-
-// set elements API
-
- void setType(const ocsd_gen_trc_elem_t type); //!< set type and init flags
- void updateType(const ocsd_gen_trc_elem_t type); //!< change type only - no init
-
- void setContext(const ocsd_pe_context &new_context) { context = new_context; };
- void setISA(const ocsd_isa isa_update);
-
- void setCycleCount(const uint32_t cycleCount);
- void setEvent(const event_t ev_type, const uint16_t number);
- void setTS(const uint64_t ts, const bool freqChange = false);
-
- void setExcepMarker() { excep_data_marker = 1; };
- void setExceptionNum(uint32_t excepNum) { exception_number = excepNum; };
-
-
- void setTraceOnReason(const trace_on_reason_t reason);
-
- void setAddrRange(const ocsd_vaddr_t st_addr, const ocsd_vaddr_t en_addr, const int num_instr = 1);
- void setLastInstrInfo(const bool exec, const ocsd_instr_type last_i_type, const ocsd_instr_subtype last_i_subtype, const uint8_t size);
- void setAddrStart(const ocsd_vaddr_t st_addr) { this->st_addr = st_addr; };
- void setLastInstrCond(const int is_cond) { this->last_instr_cond = is_cond; };
-
- void setSWTInfo(const ocsd_swt_info_t swt_info) { sw_trace_info = swt_info; };
- void setExtendedDataPtr(const void *data_ptr);
-
-// stringize the element
-
- virtual void toString(std::string &str) const;
-
-// get elements API
-
- OcsdTraceElement &operator =(const ocsd_generic_trace_elem* p_elem);
-
- const ocsd_gen_trc_elem_t getType() const { return elem_type; };
-
- // return current context
- const ocsd_pe_context &getContext() const { return context; };
-
-
-private:
- void printSWInfoPkt(std::ostringstream &oss) const;
- void clearPerPktData(); //!< clear flags that indicate validity / have values on a per packet basis
-
-};
-
-inline OcsdTraceElement::OcsdTraceElement(ocsd_gen_trc_elem_t type)
-{
- elem_type = type;
-}
-
-inline OcsdTraceElement::OcsdTraceElement()
-{
- elem_type = OCSD_GEN_TRC_ELEM_UNKNOWN;
-}
-
-inline void OcsdTraceElement::setCycleCount(const uint32_t cycleCount)
-{
- cycle_count = cycleCount;
- has_cc = 1;
-}
-
-inline void OcsdTraceElement::setEvent(const event_t ev_type, const uint16_t number)
-{
- trace_event.ev_type = (uint16_t)ev_type;
- trace_event.ev_number = ev_type == EVENT_NUMBERED ? number : 0;
-}
-
-inline void OcsdTraceElement::setAddrRange(const ocsd_vaddr_t st_addr, const ocsd_vaddr_t en_addr, const int num_instr /* = 1 */)
-{
- this->st_addr = st_addr;
- this->en_addr = en_addr;
- this->num_instr_range = num_instr;
-}
-
-inline void OcsdTraceElement::setLastInstrInfo(const bool exec, const ocsd_instr_type last_i_type, const ocsd_instr_subtype last_i_subtype, const uint8_t size)
-{
- last_instr_exec = exec ? 1 : 0;
- last_instr_sz = size & 0x7;
- this->last_i_type = last_i_type;
- this->last_i_subtype = last_i_subtype;
-}
-
-inline void OcsdTraceElement::setType(const ocsd_gen_trc_elem_t type)
-{
- // set the type and clear down the per element flags
- elem_type = type;
-
- clearPerPktData();
-}
-
-inline void OcsdTraceElement::updateType(const ocsd_gen_trc_elem_t type)
-{
- elem_type = type;
-}
-
-inline void OcsdTraceElement::init()
-{
- st_addr = en_addr = (ocsd_vaddr_t)-1;
- isa = ocsd_isa_unknown;
-
- cycle_count = 0;
- timestamp = 0;
-
- context.ctxt_id_valid = 0;
- context.vmid_valid = 0;
- context.el_valid = 0;
-
- last_i_type = OCSD_INSTR_OTHER;
- last_i_subtype = OCSD_S_INSTR_NONE;
-
- clearPerPktData();
-}
-
-inline void OcsdTraceElement::clearPerPktData()
-{
- flag_bits = 0; // union with trace_on_reason / trace_event
-
- ptr_extended_data = 0; // extended data pointer
-}
-
-inline void OcsdTraceElement::setTraceOnReason(const trace_on_reason_t reason)
-{
- trace_on_reason = reason;
-}
-
-inline void OcsdTraceElement::setISA(const ocsd_isa isa_update)
-{
- isa = isa_update;
- if(isa > ocsd_isa_unknown)
- isa = ocsd_isa_unknown;
-}
-
-inline void OcsdTraceElement::setTS(const uint64_t ts, const bool freqChange /*= false*/)
-{
- timestamp = ts;
- cpu_freq_change = freqChange ? 1 : 0;
- has_ts = 1;
-}
-
-inline void OcsdTraceElement::setExtendedDataPtr(const void *data_ptr)
-{
- extended_data = 1;
- ptr_extended_data = data_ptr;
-}
-
-
-/** @}*/
-
-#endif // ARM_TRC_GEN_ELEM_H_INCLUDED
-
-/* End of File trc_gen_elem.h */
diff --git a/contrib/opencsd/decoder/include/common/trc_pkt_decode_base.h b/contrib/opencsd/decoder/include/common/trc_pkt_decode_base.h
deleted file mode 100644
index 2bbf5e51d878..000000000000
--- a/contrib/opencsd/decoder/include/common/trc_pkt_decode_base.h
+++ /dev/null
@@ -1,303 +0,0 @@
-/*!
- * \file trc_pkt_decode_base.h
- * \brief OpenCSD : Trace Packet decoder base 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.
- */
-
-#ifndef ARM_TRC_PKT_DECODE_BASE_H_INCLUDED
-#define ARM_TRC_PKT_DECODE_BASE_H_INCLUDED
-
-#include "trc_component.h"
-#include "comp_attach_pt_t.h"
-
-#include "interfaces/trc_pkt_in_i.h"
-#include "interfaces/trc_gen_elem_in_i.h"
-#include "interfaces/trc_tgt_mem_access_i.h"
-#include "interfaces/trc_instr_decode_i.h"
-
-/** @defgroup ocsd_pkt_decode OpenCSD Library : Packet Decoders.
-
- @brief Classes providing Protocol Packet Decoding capability.
-
- Packet decoders convert incoming protocol packets from a packet processor,
- into generic trace elements to be output to an analysis program.
-
- Packet decoders can be:-
- - PE decoders - converting ETM or PTM packets into instruction and data trace elements
- - SW stimulus decoder - converting STM or ITM packets into software generated trace elements.
- - Bus decoders - converting HTM packets into bus transaction elements.
-
-@{*/
-
-
-class TrcPktDecodeI : public TraceComponent
-{
-public:
- TrcPktDecodeI(const char *component_name);
- TrcPktDecodeI(const char *component_name, int instIDNum);
- virtual ~TrcPktDecodeI() {};
-
- componentAttachPt<ITrcGenElemIn> *getTraceElemOutAttachPt() { return &m_trace_elem_out; };
- componentAttachPt<ITargetMemAccess> *getMemoryAccessAttachPt() { return &m_mem_access; };
- componentAttachPt<IInstrDecode> *getInstrDecodeAttachPt() { return &m_instr_decode; };
-
- void setUsesMemAccess(bool bUsesMemaccess) { m_uses_memaccess = bUsesMemaccess; };
- const bool getUsesMemAccess() const { return m_uses_memaccess; };
-
- void setUsesIDecode(bool bUsesIDecode) { m_uses_idecode = bUsesIDecode; };
- const bool getUsesIDecode() const { return m_uses_idecode; };
-
-protected:
-
- /* implementation packet decoding interface */
- virtual ocsd_datapath_resp_t processPacket() = 0;
- virtual ocsd_datapath_resp_t onEOT() = 0;
- virtual ocsd_datapath_resp_t onReset() = 0;
- virtual ocsd_datapath_resp_t onFlush() = 0;
- virtual ocsd_err_t onProtocolConfig() = 0;
- virtual const uint8_t getCoreSightTraceID() = 0;
-
- const bool checkInit();
-
- /* data output */
- ocsd_datapath_resp_t outputTraceElement(const OcsdTraceElement &elem); // use current index
- ocsd_datapath_resp_t outputTraceElementIdx(ocsd_trc_index_t idx, const OcsdTraceElement &elem); // use supplied index (where decoder caches elements)
-
- /* target access */
- ocsd_err_t accessMemory(const ocsd_vaddr_t address, const ocsd_mem_space_acc_t mem_space, uint32_t *num_bytes, uint8_t *p_buffer);
-
- /* instruction decode */
- ocsd_err_t instrDecode(ocsd_instr_info *instr_info);
-
- componentAttachPt<ITrcGenElemIn> m_trace_elem_out;
- componentAttachPt<ITargetMemAccess> m_mem_access;
- componentAttachPt<IInstrDecode> m_instr_decode;
-
- ocsd_trc_index_t m_index_curr_pkt;
-
- bool m_decode_init_ok; //!< set true if all attachments in place for decode. (remove checks in main throughput paths)
- bool m_config_init_ok; //!< set true if config set.
-
- std::string init_err_msg; //!< error message for init error
-
- bool m_uses_memaccess;
- bool m_uses_idecode;
-
-};
-
-inline TrcPktDecodeI::TrcPktDecodeI(const char *component_name) :
- TraceComponent(component_name),
- m_index_curr_pkt(0),
- m_decode_init_ok(false),
- m_config_init_ok(false),
- m_uses_memaccess(true),
- m_uses_idecode(true)
-{
-}
-
-inline TrcPktDecodeI::TrcPktDecodeI(const char *component_name, int instIDNum) :
- TraceComponent(component_name, instIDNum),
- m_index_curr_pkt(0),
- m_decode_init_ok(false),
- m_config_init_ok(false),
- m_uses_memaccess(true),
- m_uses_idecode(true)
-{
-}
-
-inline const bool TrcPktDecodeI::checkInit()
-{
- if(!m_decode_init_ok)
- {
- if(!m_config_init_ok)
- init_err_msg = "No decoder configuration information";
- else if(!m_trace_elem_out.hasAttachedAndEnabled())
- init_err_msg = "No element output interface attached and enabled";
- else if(m_uses_memaccess && !m_mem_access.hasAttachedAndEnabled())
- init_err_msg = "No memory access interface attached and enabled";
- else if(m_uses_idecode && !m_instr_decode.hasAttachedAndEnabled())
- init_err_msg = "No instruction decoder interface attached and enabled";
- else
- m_decode_init_ok = true;
- }
- return m_decode_init_ok;
-}
-
-inline ocsd_datapath_resp_t TrcPktDecodeI::outputTraceElement(const OcsdTraceElement &elem)
-{
- return m_trace_elem_out.first()->TraceElemIn(m_index_curr_pkt,getCoreSightTraceID(), elem);
-}
-
-inline ocsd_datapath_resp_t TrcPktDecodeI::outputTraceElementIdx(ocsd_trc_index_t idx, const OcsdTraceElement &elem)
-{
- return m_trace_elem_out.first()->TraceElemIn(idx, getCoreSightTraceID(), elem);
-}
-
-inline ocsd_err_t TrcPktDecodeI::instrDecode(ocsd_instr_info *instr_info)
-{
- if(m_uses_idecode)
- return m_instr_decode.first()->DecodeInstruction(instr_info);
- return OCSD_ERR_DCD_INTERFACE_UNUSED;
-}
-
-inline ocsd_err_t TrcPktDecodeI::accessMemory(const ocsd_vaddr_t address, const ocsd_mem_space_acc_t mem_space, uint32_t *num_bytes, uint8_t *p_buffer)
-{
- if(m_uses_memaccess)
- return m_mem_access.first()->ReadTargetMemory(address,getCoreSightTraceID(),mem_space, num_bytes,p_buffer);
- return OCSD_ERR_DCD_INTERFACE_UNUSED;
-}
-
-/**********************************************************************/
-template <class P, class Pc>
-class TrcPktDecodeBase : public TrcPktDecodeI, public IPktDataIn<P>
-{
-public:
- TrcPktDecodeBase(const char *component_name);
- TrcPktDecodeBase(const char *component_name, int instIDNum);
- virtual ~TrcPktDecodeBase();
-
- virtual ocsd_datapath_resp_t PacketDataIn( const ocsd_datapath_op_t op,
- const ocsd_trc_index_t index_sop,
- const P *p_packet_in);
-
-
- /* protocol configuration */
- ocsd_err_t setProtocolConfig(const Pc *config);
- const Pc * getProtocolConfig() const { return m_config; };
-
-protected:
- void ClearConfigObj();
-
- /* the protocol configuration */
- Pc * m_config;
- /* the current input packet */
- const P * m_curr_packet_in;
-
-};
-
-
-template <class P, class Pc> TrcPktDecodeBase<P, Pc>::TrcPktDecodeBase(const char *component_name) :
- TrcPktDecodeI(component_name),
- m_config(0)
-{
-}
-
-template <class P, class Pc> TrcPktDecodeBase<P, Pc>::TrcPktDecodeBase(const char *component_name, int instIDNum) :
- TrcPktDecodeI(component_name,instIDNum),
- m_config(0)
-{
-}
-
-template <class P, class Pc> TrcPktDecodeBase<P, Pc>::~TrcPktDecodeBase()
-{
- ClearConfigObj();
-}
-
-template <class P, class Pc> ocsd_datapath_resp_t TrcPktDecodeBase<P, Pc>::PacketDataIn( const ocsd_datapath_op_t op,
- const ocsd_trc_index_t index_sop,
- const P *p_packet_in)
-{
- ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
- if(!checkInit())
- {
- LogError(ocsdError(OCSD_ERR_SEV_ERROR,OCSD_ERR_NOT_INIT,init_err_msg));
- return OCSD_RESP_FATAL_NOT_INIT;
- }
-
- switch(op)
- {
- case OCSD_OP_DATA:
- if(p_packet_in == 0)
- {
- LogError(ocsdError(OCSD_ERR_SEV_ERROR,OCSD_ERR_INVALID_PARAM_VAL));
- resp = OCSD_RESP_FATAL_INVALID_PARAM;
- }
- else
- {
- m_curr_packet_in = p_packet_in;
- m_index_curr_pkt = index_sop;
- resp = processPacket();
- }
- break;
-
- case OCSD_OP_EOT:
- resp = onEOT();
- break;
-
- case OCSD_OP_FLUSH:
- resp = onFlush();
- break;
-
- case OCSD_OP_RESET:
- resp = onReset();
- break;
-
- default:
- LogError(ocsdError(OCSD_ERR_SEV_ERROR,OCSD_ERR_INVALID_PARAM_VAL));
- resp = OCSD_RESP_FATAL_INVALID_OP;
- break;
- }
- return resp;
-}
-
- /* protocol configuration */
-template <class P, class Pc> ocsd_err_t TrcPktDecodeBase<P, Pc>::setProtocolConfig(const Pc *config)
-{
- ocsd_err_t err = OCSD_ERR_INVALID_PARAM_VAL;
- if(config != 0)
- {
- ClearConfigObj(); // remove any current config
- m_config = new (std::nothrow) Pc(*config); // make a copy of the config - don't rely on the object passed in being valid outside the context of the call.
- if(m_config != 0)
- {
- err = onProtocolConfig();
- if(err == OCSD_OK)
- m_config_init_ok = true;
- }
- else
- err = OCSD_ERR_MEM;
- }
- return err;
-}
-
-template <class P, class Pc> void TrcPktDecodeBase<P, Pc>::ClearConfigObj()
-{
- if(m_config)
- {
- delete m_config;
- m_config = 0;
- }
-}
-
-/** @}*/
-#endif // ARM_TRC_PKT_DECODE_BASE_H_INCLUDED
-
-/* End of File trc_pkt_decode_base.h */
diff --git a/contrib/opencsd/decoder/include/common/trc_pkt_elem_base.h b/contrib/opencsd/decoder/include/common/trc_pkt_elem_base.h
deleted file mode 100644
index 07604a664210..000000000000
--- a/contrib/opencsd/decoder/include/common/trc_pkt_elem_base.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * \file trc_pkt_elem_base.h
- * \brief Reference CoreSight Trace Decoder :
- *
- * \copyright Copyright (c) 2016, ARM Limited. All Rights Reserved.
- */
-#ifndef ARM_TRC_PKT_ELEM_BASE_H_INCLUDED
-#define ARM_TRC_PKT_ELEM_BASE_H_INCLUDED
-
-/*
- * 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.
- */
-
-class TrcPacketBase
-{
-public:
- TrcPacketBase() {};
- virtual ~TrcPacketBase() {}
-
- //! return the underlying C API packet structure
- virtual const void *c_pkt() const = 0;
-};
-
-#endif // ARM_TRC_PKT_ELEM_BASE_H_INCLUDED
-
-/* End of File trc_pkt_elem_base.h */ \ No newline at end of file
diff --git a/contrib/opencsd/decoder/include/common/trc_pkt_proc_base.h b/contrib/opencsd/decoder/include/common/trc_pkt_proc_base.h
deleted file mode 100644
index 3098a3d0c0ea..000000000000
--- a/contrib/opencsd/decoder/include/common/trc_pkt_proc_base.h
+++ /dev/null
@@ -1,412 +0,0 @@
-/*!
- * \file trc_pkt_proc_base.h
- * \brief OpenCSD : Trace packet processor base 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.
- */
-
-#ifndef ARM_TRC_PKT_PROC_BASE_H_INCLUDED
-#define ARM_TRC_PKT_PROC_BASE_H_INCLUDED
-
-#include "interfaces/trc_data_raw_in_i.h"
-#include "interfaces/trc_pkt_in_i.h"
-#include "interfaces/trc_pkt_raw_in_i.h"
-#include "interfaces/trc_indexer_pkt_i.h"
-
-#include "trc_component.h"
-#include "comp_attach_pt_t.h"
-
-/** @defgroup ocsd_pkt_proc OpenCSD Library : Packet Processors.
- @brief Classes providing Protocol Packet Processing capability.
-
- Packet processors take an incoming byte stream and convert into discrete packets for the
- required trace protocol.
-@{*/
-
-
-
-/*!
- * @class TrcPktProcI
- * @brief Base Packet processing interface
- *
- * Defines the packet processing methods that protocol specific processors must
- * implement.
- *
- */
-class TrcPktProcI : public TraceComponent, public ITrcDataIn
-{
-public:
- TrcPktProcI(const char *component_name);
- TrcPktProcI(const char *component_name, int instIDNum);
- virtual ~TrcPktProcI() {};
-
- /** Trace byte data input interface - from ITrcDataIn.
- */
- virtual ocsd_datapath_resp_t TraceDataIn( const ocsd_datapath_op_t op,
- const ocsd_trc_index_t index,
- const uint32_t dataBlockSize,
- const uint8_t *pDataBlock,
- uint32_t *numBytesProcessed) = 0;
-
-protected:
-
- /* implementation packet processing interface */
-
- /*! @brief Implementation function for the OCSD_OP_DATA operation */
- virtual ocsd_datapath_resp_t processData( const ocsd_trc_index_t index,
- const uint32_t dataBlockSize,
- const uint8_t *pDataBlock,
- uint32_t *numBytesProcessed) = 0;
-
- virtual ocsd_datapath_resp_t onEOT() = 0; //!< Implementation function for the OCSD_OP_EOT operation
- virtual ocsd_datapath_resp_t onReset() = 0; //!< Implementation function for the OCSD_OP_RESET operation
- virtual ocsd_datapath_resp_t onFlush() = 0; //!< Implementation function for the OCSD_OP_FLUSH operation
- virtual ocsd_err_t onProtocolConfig() = 0; //!< Called when the configuration object is passed to the decoder.
- virtual const bool isBadPacket() const = 0; //!< check if the current packet is an error / bad packet
-};
-
-inline TrcPktProcI::TrcPktProcI(const char *component_name) :
- TraceComponent(component_name)
-{
-}
-
-inline TrcPktProcI::TrcPktProcI(const char *component_name, int instIDNum) :
- TraceComponent(component_name,instIDNum)
-{
-}
-
-/*!
- * @class TrcPktProcBase
- * @brief Packet Processor base class. Provides common infrastructure and interconnections for packet processors.
- *
- * The class is a templated base class.
- * - P - this is the packet object class.
- * - Pt - this is the packet type class.
- * - Pc - this is the packet configuration class.
- *
- * implementations will provide concrete classes for each of these to operate under the common infrastructures.
- * The base provides the trace data in (ITrcDataIn) interface and operates on the incoming operation type.
- *
- * Implementions override the 'onFn()' and data process functions defined in TrcPktProcI,
- * with the base class ensuring consistent ordering of operations.
- *
- */
-template <class P, class Pt, class Pc>
-class TrcPktProcBase : public TrcPktProcI
-{
-public:
- TrcPktProcBase(const char *component_name);
- TrcPktProcBase(const char *component_name, int instIDNum);
- virtual ~TrcPktProcBase();
-
- /** Byte trace data input interface defined in ITrcDataIn
-
- The base class implementation processes the operation to call the
- interface functions on TrcPktProcI.
- */
- virtual ocsd_datapath_resp_t TraceDataIn( const ocsd_datapath_op_t op,
- const ocsd_trc_index_t index,
- const uint32_t dataBlockSize,
- const uint8_t *pDataBlock,
- uint32_t *numBytesProcessed);
-
-
-/* component attachment points */
-
- //! Attachement point for the protocol packet output
- componentAttachPt<IPktDataIn<P>> *getPacketOutAttachPt() { return &m_pkt_out_i; };
- //! Attachment point for the protocol packet monitor
- componentAttachPt<IPktRawDataMon<P>> *getRawPacketMonAttachPt() { return &m_pkt_raw_mon_i; };
-
- //! Attachment point for a packet indexer
- componentAttachPt<ITrcPktIndexer<Pt>> *getTraceIDIndexerAttachPt() { return &m_pkt_indexer_i; };
-
-/* protocol configuration */
- //!< Set the protocol specific configuration for the decoder.
- virtual ocsd_err_t setProtocolConfig(const Pc *config);
- //!< Get the configuration for the decoder.
- virtual const Pc *getProtocolConfig() const { return m_config; };
-
-protected:
-
- /* data output functions */
- ocsd_datapath_resp_t outputDecodedPacket(const ocsd_trc_index_t index_sop, const P *pkt);
-
- void outputRawPacketToMonitor( const ocsd_trc_index_t index_sop,
- const P *pkt,
- const uint32_t size,
- const uint8_t *p_data);
-
- void indexPacket(const ocsd_trc_index_t index_sop, const Pt *packet_type);
-
- ocsd_datapath_resp_t outputOnAllInterfaces(const ocsd_trc_index_t index_sop, const P *pkt, const Pt *pkt_type, std::vector<uint8_t> &pktdata);
-
- ocsd_datapath_resp_t outputOnAllInterfaces(const ocsd_trc_index_t index_sop, const P *pkt, const Pt *pkt_type, const uint8_t *pktdata, uint32_t pktlen);
-
- /*! Let the derived class figure out if it needs to collate and send raw data.
- can improve wait for sync performance if we do not need to save and send unsynced data.
- */
- const bool hasRawMon() const;
-
- /* the protocol configuration */
- const Pc *m_config;
-
- void ClearConfigObj(); // remove our copy of the config
-
- const bool checkInit(); // return true if init (configured and at least one output sink attached), false otherwise.
-
-private:
- /* decode control */
- ocsd_datapath_resp_t Reset(const ocsd_trc_index_t index);
- ocsd_datapath_resp_t Flush();
- ocsd_datapath_resp_t EOT();
-
- componentAttachPt<IPktDataIn<P>> m_pkt_out_i;
- componentAttachPt<IPktRawDataMon<P>> m_pkt_raw_mon_i;
-
- componentAttachPt<ITrcPktIndexer<Pt>> m_pkt_indexer_i;
-
- bool m_b_is_init;
-};
-
-template<class P,class Pt, class Pc> TrcPktProcBase<P, Pt, Pc>::TrcPktProcBase(const char *component_name) :
- TrcPktProcI(component_name),
- m_config(0),
- m_b_is_init(false)
-{
-}
-
-template<class P,class Pt, class Pc> TrcPktProcBase<P, Pt, Pc>::TrcPktProcBase(const char *component_name, int instIDNum) :
- TrcPktProcI(component_name, instIDNum),
- m_config(0),
- m_b_is_init(false)
-{
-}
-
-template<class P,class Pt, class Pc> TrcPktProcBase<P, Pt, Pc>::~TrcPktProcBase()
-{
- ClearConfigObj();
-}
-
-template<class P,class Pt, class Pc> ocsd_datapath_resp_t TrcPktProcBase<P, Pt, Pc>::TraceDataIn( const ocsd_datapath_op_t op,
- const ocsd_trc_index_t index,
- const uint32_t dataBlockSize,
- const uint8_t *pDataBlock,
- uint32_t *numBytesProcessed)
-{
- ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
-
- switch(op)
- {
- case OCSD_OP_DATA:
- if((dataBlockSize == 0) || (pDataBlock == 0) || (numBytesProcessed == 0))
- {
- if(numBytesProcessed)
- *numBytesProcessed = 0; // ensure processed bytes value set to 0.
- LogError(ocsdError(OCSD_ERR_SEV_ERROR,OCSD_ERR_INVALID_PARAM_VAL,"Packet Processor: Zero length data block or NULL pointer error\n"));
- resp = OCSD_RESP_FATAL_INVALID_PARAM;
- }
- else
- resp = processData(index,dataBlockSize,pDataBlock,numBytesProcessed);
- break;
-
- case OCSD_OP_EOT:
- resp = EOT();
- break;
-
- case OCSD_OP_FLUSH:
- resp = Flush();
- break;
-
- case OCSD_OP_RESET:
- resp = Reset(index);
- break;
-
- default:
- LogError(ocsdError(OCSD_ERR_SEV_ERROR,OCSD_ERR_INVALID_PARAM_VAL,"Packet Processor : Unknown Datapath operation\n"));
- resp = OCSD_RESP_FATAL_INVALID_OP;
- break;
- }
- return resp;
-}
-
-
-template<class P,class Pt, class Pc> ocsd_datapath_resp_t TrcPktProcBase<P, Pt, Pc>::Reset(const ocsd_trc_index_t index)
-{
- ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
-
- // reset the trace decoder attachment on main data path.
- if(m_pkt_out_i.hasAttachedAndEnabled())
- resp = m_pkt_out_i.first()->PacketDataIn(OCSD_OP_RESET,index,0);
-
- // reset the packet processor implmentation
- if(!OCSD_DATA_RESP_IS_FATAL(resp))
- resp = onReset();
-
- // packet monitor
- if(m_pkt_raw_mon_i.hasAttachedAndEnabled())
- m_pkt_raw_mon_i.first()->RawPacketDataMon(OCSD_OP_RESET,index,0,0,0);
-
- return resp;
-}
-
-template<class P,class Pt, class Pc> ocsd_datapath_resp_t TrcPktProcBase<P, Pt, Pc>::Flush()
-{
- ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
- ocsd_datapath_resp_t resplocal = OCSD_RESP_CONT;
-
- // the trace decoder attachment on main data path.
- if(m_pkt_out_i.hasAttachedAndEnabled())
- resp = m_pkt_out_i.first()->PacketDataIn(OCSD_OP_FLUSH,0,0); // flush up the data path first.
-
- // if the connected components are flushed, not flush this one.
- if(OCSD_DATA_RESP_IS_CONT(resp))
- resplocal = onFlush(); // local flush
-
- return (resplocal > resp) ? resplocal : resp;
-}
-
-template<class P,class Pt, class Pc> ocsd_datapath_resp_t TrcPktProcBase<P, Pt, Pc>::EOT()
-{
- ocsd_datapath_resp_t resp = onEOT(); // local EOT - mark any part packet as incomplete type and prepare to send
-
- // the trace decoder attachment on main data path.
- if(m_pkt_out_i.hasAttachedAndEnabled() && !OCSD_DATA_RESP_IS_FATAL(resp))
- resp = m_pkt_out_i.first()->PacketDataIn(OCSD_OP_EOT,0,0);
-
- // packet monitor
- if(m_pkt_raw_mon_i.hasAttachedAndEnabled())
- m_pkt_raw_mon_i.first()->RawPacketDataMon(OCSD_OP_EOT,0,0,0,0);
-
- return resp;
-}
-
-template<class P,class Pt, class Pc> ocsd_datapath_resp_t TrcPktProcBase<P, Pt, Pc>::outputDecodedPacket(const ocsd_trc_index_t index, const P *pkt)
-{
- ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
-
- // bad packet filter.
- if((getComponentOpMode() & OCSD_OPFLG_PKTPROC_NOFWD_BAD_PKTS) && isBadPacket())
- return resp;
-
- // send a complete packet over the primary data path
- if(m_pkt_out_i.hasAttachedAndEnabled())
- resp = m_pkt_out_i.first()->PacketDataIn(OCSD_OP_DATA,index,pkt);
- return resp;
-}
-
-template<class P,class Pt, class Pc> void TrcPktProcBase<P, Pt, Pc>::outputRawPacketToMonitor(
- const ocsd_trc_index_t index_sop,
- const P *pkt,
- const uint32_t size,
- const uint8_t *p_data)
-{
- // never output 0 sized packets.
- if(size == 0)
- return;
-
- // bad packet filter.
- if((getComponentOpMode() & OCSD_OPFLG_PKTPROC_NOMON_BAD_PKTS) && isBadPacket())
- return;
-
- // packet monitor - this cannot return CONT / WAIT, but does get the raw packet data.
- if(m_pkt_raw_mon_i.hasAttachedAndEnabled())
- m_pkt_raw_mon_i.first()->RawPacketDataMon(OCSD_OP_DATA,index_sop,pkt,size,p_data);
-}
-
-template<class P,class Pt, class Pc> const bool TrcPktProcBase<P, Pt, Pc>::hasRawMon() const
-{
- return m_pkt_raw_mon_i.hasAttachedAndEnabled();
-}
-
-template<class P,class Pt, class Pc> void TrcPktProcBase<P, Pt, Pc>::indexPacket(const ocsd_trc_index_t index_sop, const Pt *packet_type)
-{
- // packet indexer - cannot return CONT / WAIT, just gets the current index and type.
- if(m_pkt_indexer_i.hasAttachedAndEnabled())
- m_pkt_indexer_i.first()->TracePktIndex(index_sop,packet_type);
-}
-
-template<class P,class Pt, class Pc> ocsd_datapath_resp_t TrcPktProcBase<P, Pt, Pc>::outputOnAllInterfaces(const ocsd_trc_index_t index_sop, const P *pkt, const Pt *pkt_type, std::vector<uint8_t> &pktdata)
-{
- indexPacket(index_sop,pkt_type);
- if(pktdata.size() > 0) // prevent out of range errors for 0 length vector.
- outputRawPacketToMonitor(index_sop,pkt,(uint32_t)pktdata.size(),&pktdata[0]);
- return outputDecodedPacket(index_sop,pkt);
-}
-
-template<class P,class Pt, class Pc> ocsd_datapath_resp_t TrcPktProcBase<P, Pt, Pc>::outputOnAllInterfaces(const ocsd_trc_index_t index_sop, const P *pkt, const Pt *pkt_type, const uint8_t *pktdata, uint32_t pktlen)
-{
- indexPacket(index_sop,pkt_type);
- outputRawPacketToMonitor(index_sop,pkt,pktlen,pktdata);
- return outputDecodedPacket(index_sop,pkt);
-}
-
-template<class P,class Pt, class Pc> ocsd_err_t TrcPktProcBase<P, Pt, Pc>::setProtocolConfig(const Pc *config)
-{
- ocsd_err_t err = OCSD_ERR_INVALID_PARAM_VAL;
- if(config != 0)
- {
- ClearConfigObj();
- m_config = new (std::nothrow) Pc(*config);
- if(m_config != 0)
- err = onProtocolConfig();
- else
- err = OCSD_ERR_MEM;
- }
- return err;
-}
-
-template<class P,class Pt, class Pc> void TrcPktProcBase<P, Pt, Pc>::ClearConfigObj()
-{
- if(m_config)
- {
- delete m_config;
- m_config = 0;
- }
-}
-
-template<class P,class Pt, class Pc> const bool TrcPktProcBase<P, Pt, Pc>::checkInit()
-{
- if(!m_b_is_init)
- {
- if( (m_config != 0) &&
- (m_pkt_out_i.hasAttached() || m_pkt_raw_mon_i.hasAttached())
- )
- m_b_is_init = true;
- }
- return m_b_is_init;
-}
-
-/** @}*/
-
-#endif // ARM_TRC_PKT_PROC_BASE_H_INCLUDED
-
-/* End of File trc_pkt_proc_base.h */
diff --git a/contrib/opencsd/decoder/include/common/trc_printable_elem.h b/contrib/opencsd/decoder/include/common/trc_printable_elem.h
deleted file mode 100644
index 92a47e882b1a..000000000000
--- a/contrib/opencsd/decoder/include/common/trc_printable_elem.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/*!
- * \file trc_printable_elem.h
- * \brief OpenCSD : Standard printable element base 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.
- */
-
-#ifndef ARM_TRC_PRINTABLE_ELEM_H_INCLUDED
-#define ARM_TRC_PRINTABLE_ELEM_H_INCLUDED
-
-#include <string>
-#include <cstdint>
-
-/** @addtogroup ocsd_infrastructure
-@{*/
-
-/*!
- * @class trcPrintableElem
- * @brief Class to provide trace element strings for printing
- *
- * Provide a standard interface to the trace packet classes to allow the packets
- * to be printed in logging or tools.
- *
- * Provides some standard formatting functionality
- *
- */
-class trcPrintableElem
-{
-public:
- trcPrintableElem() {};
- virtual ~trcPrintableElem() {};
- virtual void toString(std::string &str) const;
- virtual void toStringFmt(const uint32_t fmtFlags, std::string &str) const;
-
- // print formatting utilities
- static void getValStr(std::string &valStr, const int valTotalBitSize, const int valValidBits, const uint64_t value, const bool asHex = true, const int updateBits = 0);
-
-};
-
-inline void trcPrintableElem::toString(std::string &str) const
-{
- str = "Trace Element : print not implemented";
-}
-
-inline void trcPrintableElem::toStringFmt(const uint32_t /*fmtFlags*/, std::string &str) const
-{
- toString(str);
-}
-
-/** static template string function - used in "C" API to provide generic printing */
-template<class Pc, class Pt>
-void trcPrintElemToString(const void *p_pkt, std::string &str)
-{
- Pc pktClass;
- pktClass = static_cast<const Pt *>(p_pkt);
- pktClass.toString(str);
-}
-
-/** @}*/
-
-#endif // ARM_TRC_PRINTABLE_ELEM_H_INCLUDED
-
-/* End of File trc_printable_elem.h */
diff --git a/contrib/opencsd/decoder/include/common/trc_ret_stack.h b/contrib/opencsd/decoder/include/common/trc_ret_stack.h
deleted file mode 100644
index a7f53d1cbaeb..000000000000
--- a/contrib/opencsd/decoder/include/common/trc_ret_stack.h
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
-* \file trc_ret_stack.h
-* \brief OpenCSD : trace decoder return stack feature.
-*
-* \copyright Copyright (c) 2017, 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.
-*/
-
-#ifndef ARM_TRC_RET_STACK_H_INCLUDED
-#define ARM_TRC_RET_STACK_H_INCLUDED
-
-#include "opencsd/ocsd_if_types.h"
-
-// uncomment below for return stack logging
-// #define TRC_RET_STACK_DEBUG
-
-#ifdef TRC_RET_STACK_DEBUG
-class TraceComponent;
-#endif
-
-typedef struct _retStackElement
-{
- ocsd_vaddr_t ret_addr;
- ocsd_isa ret_isa;
-} retStackElement;
-
-class TrcAddrReturnStack
-{
-public:
- TrcAddrReturnStack();
- ~TrcAddrReturnStack() {};
-
- void set_active(bool active)
- {
- m_active = active;
- };
-
- bool is_active() const
- {
- return m_active;
- };
-
- void push(const ocsd_vaddr_t addr, const ocsd_isa isa);
- ocsd_vaddr_t pop(ocsd_isa &isa);
- void flush();
-
- bool overflow() const
- {
- return (bool)(num_entries < 0);
- };
-
- void set_pop_pending()
- {
- if (m_active)
- m_pop_pending = true;
- }
-
- void clear_pop_pending()
- {
- m_pop_pending = false;
- }
-
- bool pop_pending() const
- {
- return m_pop_pending;
- };
-
-private:
- bool m_active;
- bool m_pop_pending; // flag for decoder to indicate a pop might be needed depending on the next packet (ETMv4)
-
- int head_idx;
- int num_entries;
- retStackElement m_stack[16];
-
-#ifdef TRC_RET_STACK_DEBUG
-public:
- void set_dbg_logger(TraceComponent *pLogger) { m_p_debug_logger = pLogger; };
-private:
- void LogOp(const char *pszOpString, ocsd_vaddr_t addr, int head_off, ocsd_isa isa);
-
- TraceComponent *m_p_debug_logger;
-#endif // TRC_RET_STACK_DEBUG
-};
-
-#endif // ARM_TRC_RET_STACK_H_INCLUDED
-
-/* End of File trc_ret_stack.h */
diff --git a/contrib/opencsd/decoder/include/i_dec/trc_i_decode.h b/contrib/opencsd/decoder/include/i_dec/trc_i_decode.h
deleted file mode 100644
index 0285f4182523..000000000000
--- a/contrib/opencsd/decoder/include/i_dec/trc_i_decode.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * \file trc_i_decode.h
- * \brief OpenCSD :
- *
- * \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.
- */
-#ifndef ARM_TRC_I_DECODE_H_INCLUDED
-#define ARM_TRC_I_DECODE_H_INCLUDED
-
-#include "interfaces/trc_instr_decode_i.h"
-#include "opencsd/ocsd_if_types.h"
-
-class TrcIDecode : public IInstrDecode
-{
-public:
- TrcIDecode() {};
- virtual ~TrcIDecode() {};
-
- virtual ocsd_err_t DecodeInstruction(ocsd_instr_info *instr_info);
-
-private:
- ocsd_err_t DecodeA32(ocsd_instr_info *instr_info);
- ocsd_err_t DecodeA64(ocsd_instr_info *instr_info);
- ocsd_err_t DecodeT32(ocsd_instr_info *instr_info);
- void SetArchVersion(ocsd_instr_info *instr_info);
-};
-
-#endif // ARM_TRC_I_DECODE_H_INCLUDED
-
-/* End of File trc_i_decode.h */
diff --git a/contrib/opencsd/decoder/include/i_dec/trc_idec_arminst.h b/contrib/opencsd/decoder/include/i_dec/trc_idec_arminst.h
deleted file mode 100644
index 8697f68d676c..000000000000
--- a/contrib/opencsd/decoder/include/i_dec/trc_idec_arminst.h
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * \file trc_idec_arminst.h
- * \brief OpenCSD :
- *
- * \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.
- */
-
-#ifndef ARM_TRC_IDEC_ARMINST_H_INCLUDED
-#define ARM_TRC_IDEC_ARMINST_H_INCLUDED
-
-#ifndef __STDC_CONSTANT_MACROS
-#define __STDC_CONSTANT_MACROS 1
-#endif
-
-#include "opencsd/ocsd_if_types.h"
-#include <cstdint>
-
-/*
-For Thumb2, test if a halfword is the first half of a 32-bit instruction,
-as opposed to a complete 16-bit instruction.
-*/
-inline int is_wide_thumb(uint16_t insthw)
-{
- return (insthw & 0xF800) >= 0xE800;
-}
-
-/*
-In the following queries, 16-bit Thumb2 instructions should be
-passed in as the high halfword, e.g. xxxx0000.
-*/
-
-/*
-Test whether an instruction is a branch (software change of the PC).
-This includes branch instructions and all loads and data-processing
-instructions that write to the PC. It does not include exception
-instructions such as SVC, HVC and SMC.
-(Performance event 0x0C includes these.)
-*/
-int inst_ARM_is_branch(uint32_t inst);
-int inst_Thumb_is_branch(uint32_t inst);
-int inst_A64_is_branch(uint32_t inst);
-
-/*
-Test whether an instruction is a direct (aka immediate) branch.
-Performance event 0x0D counts these.
-*/
-int inst_ARM_is_direct_branch(uint32_t inst);
-int inst_Thumb_is_direct_branch(uint32_t inst);
-int inst_Thumb_is_direct_branch_link(uint32_t inst, uint8_t *is_link, uint8_t *is_cond);
-int inst_A64_is_direct_branch(uint32_t inst);
-int inst_A64_is_direct_branch_link(uint32_t inst, uint8_t *is_link);
-
-/*
-Get branch destination for a direct branch.
-*/
-int inst_ARM_branch_destination(uint32_t addr, uint32_t inst, uint32_t *pnpc);
-int inst_Thumb_branch_destination(uint32_t addr, uint32_t inst, uint32_t *pnpc);
-int inst_A64_branch_destination(uint64_t addr, uint32_t inst, uint64_t *pnpc);
-
-int inst_ARM_is_indirect_branch(uint32_t inst);
-int inst_Thumb_is_indirect_branch_link(uint32_t inst, uint8_t *is_link);
-int inst_Thumb_is_indirect_branch(uint32_t inst);
-int inst_A64_is_indirect_branch_link(uint32_t inst, uint8_t *is_link);
-int inst_A64_is_indirect_branch(uint32_t inst);
-
-int inst_ARM_is_branch_and_link(uint32_t inst);
-int inst_Thumb_is_branch_and_link(uint32_t inst);
-int inst_A64_is_branch_and_link(uint32_t inst);
-
-int inst_ARM_is_conditional(uint32_t inst);
-int inst_Thumb_is_conditional(uint32_t inst);
-int inst_A64_is_conditional(uint32_t inst);
-
-/* For an IT instruction, return the number of instructions conditionalized
- (from 1 to 4). For other instructions, return zero. */
-unsigned int inst_Thumb_is_IT(uint32_t inst);
-
-typedef enum {
- ARM_BARRIER_NONE,
- ARM_BARRIER_ISB,
- ARM_BARRIER_DMB,
- ARM_BARRIER_DSB
-} arm_barrier_t;
-
-arm_barrier_t inst_ARM_barrier(uint32_t inst);
-arm_barrier_t inst_Thumb_barrier(uint32_t inst);
-arm_barrier_t inst_A64_barrier(uint32_t inst);
-
-int inst_ARM_wfiwfe(uint32_t inst);
-int inst_Thumb_wfiwfe(uint32_t inst);
-int inst_A64_wfiwfe(uint32_t inst);
-
-/*
-Test whether an instruction is definitely undefined, e.g. because
-allocated to a "permanently UNDEFINED" space (UDF mnemonic).
-Other instructions besides the ones indicated, may always or
-sometimes cause an undefined instruction trap. This call is
-intended to be helpful in 'runaway decode' prevention.
-*/
-int inst_ARM_is_UDF(uint32_t inst);
-int inst_Thumb_is_UDF(uint32_t inst);
-int inst_A64_is_UDF(uint32_t inst);
-
-
-/* access sub-type information */
-ocsd_instr_subtype get_instr_subtype();
-void clear_instr_subtype();
-
-/* set arch version info. */
-void set_arch_version(uint16_t version);
-
-#endif // ARM_TRC_IDEC_ARMINST_H_INCLUDED
-
-/* End of File trc_idec_arminst.h */
diff --git a/contrib/opencsd/decoder/include/interfaces/trc_abs_typed_base_i.h b/contrib/opencsd/decoder/include/interfaces/trc_abs_typed_base_i.h
deleted file mode 100644
index 0db60770844a..000000000000
--- a/contrib/opencsd/decoder/include/interfaces/trc_abs_typed_base_i.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * \file trc_abs_typed_base_i.h
- * \brief OpenCSD :
- *
- * \copyright Copyright (c) 2016, 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.
- */
-
-#ifndef ARM_TRC_ABS_TYPED_BASE_I_H_INCLUDED
-#define ARM_TRC_ABS_TYPED_BASE_I_H_INCLUDED
-
-/*!
- * @class ITrcTypedBase
- * @brief Abstract base class to for interfaces templated types.
- *
- * This class is used as an abstract base for any interfaces that are specialised using
- * template<> types.
- *
- * Designed to allow interface objects to be passed through generic interfaces into type
- * specific templated implmentation handlers and converted/checked using RTTI.
- */
-class ITrcTypedBase
-{
-public:
- ITrcTypedBase() {};
- virtual ~ITrcTypedBase() {};
-};
-
-#endif // ARM_TRC_ABS_TYPED_BASE_I_H_INCLUDED
-
-/* End of File trc_abs_typed_base_i.h */
diff --git a/contrib/opencsd/decoder/include/interfaces/trc_data_raw_in_i.h b/contrib/opencsd/decoder/include/interfaces/trc_data_raw_in_i.h
deleted file mode 100644
index bf020d706df8..000000000000
--- a/contrib/opencsd/decoder/include/interfaces/trc_data_raw_in_i.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * \file trc_data_raw_in_i.h
- * \brief OpenCSD :
- *
- * \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.
- */
-
-#ifndef ARM_TRCDATA_RAW_IN_I_H_INCLUDED
-#define ARM_TRCDATA_RAW_IN_I_H_INCLUDED
-
-#include "opencsd/ocsd_if_types.h"
-
-/** @class ITrcDataIn
- *
- * @brief Interface to either trace data frame deformatter or packet processor.
- *
- * @ingroup ocsd_interfaces
- *
- * Interface class to a processor that can consume raw formatted trace byte stream from a trace reader
- * or raw source buffer into a deformatter object.
- *
- * Also used to interface a single trace source ID data stream into a packet processor.
- *
- */
-class ITrcDataIn {
-public:
- ITrcDataIn() {}; /**< Default constructor. */
- virtual ~ITrcDataIn() {}; /**< Default destructor. */
-
- /*!
- * Data input method for a component on the Trace decode datapath.
- * Datapath operations passed to the component, which responds with data path response codes.
- *
- * This API is for raw trace data, which can be:-
- * - CoreSight formatted frame data for input to the frame deformatter.
- * - Single binary source data for input to a packet decoder.
- *
- * @param op : Data path operation.
- * @param index : Byte index of start of pDataBlock data as offset from start of captured data. May be zero for none-data operation
- * @param dataBlockSize : Size of data block. Zero for none-data operation.
- * @param *pDataBlock : pointer to data block. Null for none-data operation
- * @param *numBytesProcessed : Pointer to count of data used by processor. Set by processor on data operation. Null for none-data operation
- *
- * @return ocsd_datapath_resp_t : Standard data path response code.
- */
- virtual ocsd_datapath_resp_t TraceDataIn( const ocsd_datapath_op_t op,
- const ocsd_trc_index_t index,
- const uint32_t dataBlockSize,
- const uint8_t *pDataBlock,
- uint32_t *numBytesProcessed) = 0;
-
-};
-
-#endif // ARM_TRCDATA_RAW_IN_I_H_INCLUDED
-
-
-/* End of File trc_data_raw_in_i.h */
diff --git a/contrib/opencsd/decoder/include/interfaces/trc_data_rawframe_in_i.h b/contrib/opencsd/decoder/include/interfaces/trc_data_rawframe_in_i.h
deleted file mode 100644
index 9fc35319b86e..000000000000
--- a/contrib/opencsd/decoder/include/interfaces/trc_data_rawframe_in_i.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * \file trc_data_rawframe_in_i.h
- * \brief OpenCSD :
- *
- * \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.
- */
-
-#ifndef ARM_TRCDATA_RAWFRAME_IN_I_H_INCLUDED
-#define ARM_TRCDATA_RAWFRAME_IN_I_H_INCLUDED
-
-#include "opencsd/ocsd_if_types.h"
-
-/*!
- * @class ITrcRawFrameIn
- *
- * @brief Interface to monitor the raw frame decode progress..
- *
- * @ingroup ocsd_interfaces
- *
- * This interface allows a program to monitor the contents of the CoreSight frames passing through the
- * frame deformatter.
- *
- *
- */
-class ITrcRawFrameIn {
-public:
- ITrcRawFrameIn() {}; /**< Default constructor. */
- virtual ~ITrcRawFrameIn() {}; /**< Default destructor. */
-
- /*!
- * Interface to monitor CoreSight frame data. Output as blocks of data.
- *
- * @param op : Data path operation.
- * @param index : Byte index of start of pDataBlock data as offset from start of captured data. May be zero for none-data operation
- * @param frame_element : Type of frame element being output.
- * @param dataBlockSize : size of frame element.
- * @param *pDataBlock : pointer to frame data.
- * @param traceID : Trace ID when element type ID data.
- *
- * @return ocsd_err_t : Standard library erroc code. Monitor only, not on data path.
- */
- virtual ocsd_err_t TraceRawFrameIn( const ocsd_datapath_op_t op,
- const ocsd_trc_index_t index,
- const ocsd_rawframe_elem_t frame_element,
- const int dataBlockSize,
- const uint8_t *pDataBlock,
- const uint8_t traceID) = 0;
-};
-
-
-#endif // ARM_TRCDATA_RAWFRAME_IN_I_H_INCLUDED
-
-/* End of File trc_data_rawframe_in_i.h */
diff --git a/contrib/opencsd/decoder/include/interfaces/trc_error_log_i.h b/contrib/opencsd/decoder/include/interfaces/trc_error_log_i.h
deleted file mode 100644
index cc65f631e750..000000000000
--- a/contrib/opencsd/decoder/include/interfaces/trc_error_log_i.h
+++ /dev/null
@@ -1,134 +0,0 @@
-/*!
- * \file trc_error_log_i.h
- * \brief OpenCSD :
- *
- * \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.
- */
-
-#ifndef ARM_TRC_ERROR_LOG_I_H_INCLUDED
-#define ARM_TRC_ERROR_LOG_I_H_INCLUDED
-
-#include "opencsd/ocsd_if_types.h"
-#include <string>
-
-class ocsdError;
-class ocsdMsgLogger;
-
-/*!
- * @class ITraceErrorLog
- * @brief Error logging interface.
- * @ingroup ocsd_interfaces
- *
- * This class provides a standard interface to the decoder error logger for all trace decode and
- * reader components.
- *
- * Implementation will determine if and how the errors and messages are logged.
- *
- */
-class ITraceErrorLog
-{
-public:
- ITraceErrorLog() {};
- virtual ~ITraceErrorLog() {};
-
- /*!
- * Register a named component error source. Allows the logger to associate errors with components.
- * returned handle to be used with subsequent error log calls.
- *
- * @param &component_name : name of the component.
- *
- * @return virtual const : Handle associated with the component.
- */
- virtual const ocsd_hndl_err_log_t RegisterErrorSource(const std::string &component_name) = 0;
-
- /*!
- * Return the verbosity level of the logger. Errors of the returned ocsd_err_severity_t severity
- * or lower will be logged, others are ignored.
- *
- * @return ocsd_err_severity_t : Current logging severity level.
- */
- virtual const ocsd_err_severity_t GetErrorLogVerbosity() const = 0;
-
- /*!
- * Log an error.
- * Pass an error object and the component or generic handle to associate with the error.
- * Error will be saved for access by GetLastError().
- *
- * If logger implementation has output print logging enabled then this may be printed to file or screen.
- *
- * @param handle : Component handle or standard generic handle
- * @param *Error : Pointer to an error object.
- */
- virtual void LogError(const ocsd_hndl_err_log_t handle, const ocsdError *Error) = 0;
-
- /*!
- * Log a general message. Associated with component or use generic handle.
- * Message logged to same output as errors if output enabled, but not saved for GetLastError()
- *
- * @param handle : Component handle or standard generic handle.
- * @param filter_level : Verbosity filter.
- * @param msg : Pointer to an error object.
- */
- virtual void LogMessage(const ocsd_hndl_err_log_t handle, const ocsd_err_severity_t filter_level, const std::string &msg ) = 0;
-
- /*!
- * Get a pointer to the last logged error.
- * Returns 0 if no errors have been logged.
- *
- * @return ocsdError *: last error pointer.
- */
- virtual ocsdError *GetLastError() = 0;
-
- /*!
- * Get the last error associated with the given Trace source channel ID.
- * returns a pointer to the error or 0 if no errors associated with the ID.
- *
- * @param chan_id : Trace Source Channel ID (CoreSight Trace ID).
- *
- * @return ocsdError *: last error pointer for ID or 0.
- */
- virtual ocsdError *GetLastIDError(const uint8_t chan_id) = 0;
-
- virtual ocsdMsgLogger *getOutputLogger() = 0;
- virtual void setOutputLogger(ocsdMsgLogger *pLogger) = 0;
-
- enum generic_handles {
- HANDLE_GEN_ERR = 0,
- HANDLE_GEN_WARN,
- HANDLE_GEN_INFO,
- /* last value in list */
- HANDLE_FIRST_REGISTERED_COMPONENT /**< 1st valid handle value for components registered with logger */
- };
-};
-
-#endif // ARM_TRC_ERROR_LOG_I_H_INCLUDED
-
-/* End of File trc_error_log_i.h */
diff --git a/contrib/opencsd/decoder/include/interfaces/trc_gen_elem_in_i.h b/contrib/opencsd/decoder/include/interfaces/trc_gen_elem_in_i.h
deleted file mode 100644
index 5bad293ff13d..000000000000
--- a/contrib/opencsd/decoder/include/interfaces/trc_gen_elem_in_i.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * \file trc_gen_elem_in_i.h
- * \brief OpenCSD : Generic Trace Element interface.
- *
- * \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.
- */
-
-#ifndef ARM_TRC_GEN_ELEM_IN_I_H_INCLUDED
-#define ARM_TRC_GEN_ELEM_IN_I_H_INCLUDED
-
-class OcsdTraceElement;
-
-/*!
- * @class ITrcGenElemIn
-
- * @brief Interface for the input of generic trace elements.
- *
- * @ingroup ocsd_interfaces
- *
- * This interface is the principal output attachment point for the trace packet decoders.
- *
- */
-class ITrcGenElemIn
-{
-public:
- ITrcGenElemIn() {}; /**< Default constructor. */
- virtual ~ITrcGenElemIn() {}; /**< Default destructor. */
-
-
- /*!
- * Interface for analysis blocks that take generic trace elements as their input.
- * Final interface on the decode data path. The index provided is that for the generating
- * trace packet. Multiple generic elements may be produced from a single packet so they will
- * all have the same start index.
- *
- * @param index_sop : Trace index for start of packet generating this element.
- * @param trc_chan_id : CoreSight Trace ID for this source.
- * @param &elem : Generic trace element generated from the deocde data path
- *
- * @return ocsd_datapath_resp_t : Standard data path response.
- */
- virtual ocsd_datapath_resp_t TraceElemIn(const ocsd_trc_index_t index_sop,
- const uint8_t trc_chan_id,
- const OcsdTraceElement &elem) = 0;
-};
-
-#endif // ARM_TRC_GEN_ELEM_IN_I_H_INCLUDED
-
-/* End of File trc_gen_elem_in_i.h */
diff --git a/contrib/opencsd/decoder/include/interfaces/trc_indexer_pkt_i.h b/contrib/opencsd/decoder/include/interfaces/trc_indexer_pkt_i.h
deleted file mode 100644
index 02aecda8b039..000000000000
--- a/contrib/opencsd/decoder/include/interfaces/trc_indexer_pkt_i.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * \file trc_indexer_pkt_i.h
- * \brief OpenCSD : Trace packet indexer
- *
- * \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.
- */
-
-#ifndef ARM_TRC_INDEXER_PKT_I_H_INCLUDED
-#define ARM_TRC_INDEXER_PKT_I_H_INCLUDED
-
-#include "trc_abs_typed_base_i.h"
-
-/*!
- * @class ITrcPktIndexer
-
- * @brief Templated interface class to index packet types.
- *
- * @ingroup ocsd_interfaces
- *
- * Each protocol version will have an associated indexer that will index significant
- * packets such as synchronisation points, timestamps, trigger events.
- *
- * Creating an index is optional at runtime, but will allow any analysis program to synchronise the
- * different trace streams.
- *
- * Indexes need to be created only once and can be saved for re-use.
- *
- * Packet processors should be created to support the attachment of an indexer.
- *
- */
-template <class Pt>
-class ITrcPktIndexer : public ITrcTypedBase
-{
-public:
- ITrcPktIndexer() {}; /**< Default constructor. */
- virtual ~ITrcPktIndexer() {}; /**< Default destructor. */
-
- /*!
- * Interface method for trace packet indexing. Implementated by a channel packet indexer.
- *
- * @param index_sop : trace index at the start of the packet.
- * @param *packet_type : The packet type being indexed.
- */
- virtual void TracePktIndex(const ocsd_trc_index_t index_sop, const Pt *packet_type) = 0;
-};
-
-#endif // ARM_TRC_INDEXER_PKT_I_H_INCLUDED
-
-/* End of File trc_indexer_pkt_i.h */
diff --git a/contrib/opencsd/decoder/include/interfaces/trc_indexer_src_i.h b/contrib/opencsd/decoder/include/interfaces/trc_indexer_src_i.h
deleted file mode 100644
index 078efa515253..000000000000
--- a/contrib/opencsd/decoder/include/interfaces/trc_indexer_src_i.h
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * \file trc_indexer_src_i.h
- * \brief OpenCSD :
- *
- * \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.
- */
-
-
-#ifndef ARM_TRC_INDEXER_SRC_I_H_INCLUDED
-#define ARM_TRC_INDEXER_SRC_I_H_INCLUDED
-
-#include <vector>
-#include "opencsd/ocsd_if_types.h"
-
-/*!
- * @class ITrcSrcIndexCreator
- *
- * @brief Interface class to index the frame formatted trace stream
- *
- * @ingroup ocsd_interfaces
- *
- * This indexer creates an index of trace IDs present in the frame formatted trace stream.
- * It will also index any trigger point markers indicated in the frame format.
- *
- * Indexing is optional at runtime. Indexes can be saved and re-used.
- */
-class ITrcSrcIndexCreator
-{
-public:
- ITrcSrcIndexCreator() {}; /**< Default constructor. */
- virtual ~ITrcSrcIndexCreator() {}; /**< Default destructor. */
-
- /*!
- * The size of block that the indexer will split trace into - this is effectively the
- * index granularity. The indexing will indicate if an indexed element - e.g. a source
- * ID - is present in the block. Smaller granularity will mean a larger index but more
- * resolution in IDs and event positions.
- *
- * Block sizes will be power of 2 aligned, not less 256 bytes (16 frames).
- * Indexer will choose block size based on total trace size and desired granularity.
- *
- * @return uint32_t : Size of indexing block.
- */
- virtual const uint32_t IndexBlockSize() const;
-
- /*!
- * Index a single ID
- *
- * @param src_idx : trace index of source ID
- * @param ID : The source ID.
- *
- * @return virtual ocsd_err_t : OCSD_OK if successful.
- */
- virtual ocsd_err_t TrcIDIndex(const ocsd_trc_index_t src_idx, const uint8_t ID) = 0;
-
- /*!
- * Index a set of IDs in a block.
- * Block is assumed to be one of size IndexBlockSize()
- *
- * May be used by the deformatter to collate IDs and reduce indexing calls.
- * May be used by hardware capture source that has its own index of IDs, to transfer
- * indexing information into the decoder indexer.
- *
- * @param src_idx_start : Index of start of block.
- * @param IDs : IDs within the block.
- *
- * @return virtual ocsd_err_t : OCSD_OK if successful.
- */
- virtual ocsd_err_t TrcIDBlockMap(const ocsd_trc_index_t src_idx_start, const std::vector<uint8_t> IDs) = 0;
-
- /*!
- * The CoreSight frame format can use a reserved ID to indicate trigger or other
- * events programmed into the trace protocol generator.
- * This call indexes these events.
- *
- * @param src_idx : trace index of the event.
- * @param event_type : type of event.
- *
- * @return ocsd_err_t : OCSD_OK if indexed correctly, OCSD_ERR_INVALID_PARAM_VAL if incorrect value used.
- */
- virtual ocsd_err_t TrcEventIndex(const ocsd_trc_index_t src_idx, const int event_type) = 0;
-
-
- /*!
- * When the frame formatter is using frame syncs (typically TPIU output captured on off chip capture
- * device), this index call notes the position of these elements.
- *
- * @param src_idx : trace index of sync point.
- */
- virtual void TrcSyncIndex(const ocsd_trc_index_t src_idx);
-
-};
-
-#endif // ARM_TRC_INDEXER_SRC_I_H_INCLUDED
-
-/* End of File trc_indexer_src_i.h */
diff --git a/contrib/opencsd/decoder/include/interfaces/trc_instr_decode_i.h b/contrib/opencsd/decoder/include/interfaces/trc_instr_decode_i.h
deleted file mode 100644
index 75af19ff796a..000000000000
--- a/contrib/opencsd/decoder/include/interfaces/trc_instr_decode_i.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * \file trc_instr_decode_i.h
- * \brief OpenCSD : Interface for instruction decode.
- *
- * \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.
- */
-
-#ifndef ARM_TRC_INSTR_DECODE_I_H_INCLUDED
-#define ARM_TRC_INSTR_DECODE_I_H_INCLUDED
-
-/*!
- * @class IInstrDecode
- * @ingroup ocsd_interfaces
- * @brief Interface class to an instruction opcode decoder.
- *
- * The opcode decoder needs to be capable of limited decode required for trace
- * execution flow determination.
- *
- */
-class IInstrDecode
-{
-public:
- IInstrDecode() {}; /**< Default constructor. */
- virtual ~IInstrDecode() {}; /**< Default destructor. */
-
- /*!
- * Instruction opcode decode for the packet trace decoder to follow the
- * instruction execution flow.
- *
- * @param *instr_info : Structure to pass current opcode, and receive required decode information.
- *
- * @return ocsd_err_t : OCSD_OK if successful.
- */
- virtual ocsd_err_t DecodeInstruction(ocsd_instr_info *instr_info) = 0;
-};
-
-#endif // ARM_TRC_INSTR_DECODE_I_H_INCLUDED
-
-/* End of File trc_instr_decode_i.h */
diff --git a/contrib/opencsd/decoder/include/interfaces/trc_pkt_in_i.h b/contrib/opencsd/decoder/include/interfaces/trc_pkt_in_i.h
deleted file mode 100644
index 8f6c5eff6db5..000000000000
--- a/contrib/opencsd/decoder/include/interfaces/trc_pkt_in_i.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * \file trc_pkt_in_i.h
- * \brief OpenCSD : Interface for trace protocol packet input
- *
- * \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.
- */
-
-#ifndef ARM_TRC_PKT_IN_I_H_INCLUDED
-#define ARM_TRC_PKT_IN_I_H_INCLUDED
-
-#include "trc_abs_typed_base_i.h"
-
-/*!
- * @class IPktDataIn
- * @ingroup ocsd_interfaces
- * @brief Interface class providing an input for discrete protocol packets.
- *
- * Implemented by trace protocol packet decoders to convert packets into
- * generic trace elements.
- *
- * Packet class used will contain information on the latest packet,
- * and any intra-packet state.
- *
- */
-template<class P>
-class IPktDataIn : public ITrcTypedBase
-{
-public:
- IPktDataIn() {}; /**< Default constructor. */
- virtual ~IPktDataIn() {}; /**< Default destructor. */
-
- /*!
- * Interface function to process a single protocol packet.
- * Pass a trace index for the start of packet and a pointer to a packet when the
- * datapath operation is OCSD_OP_DATA.
- *
- * @param op : Datapath operation.
- * @param index_sop : Trace index for the start of the packet, 0 if not OCSD_OP_DATA.
- * @param *p_packet_in : Protocol Packet - when data path operation is OCSD_OP_DATA. null otherwise.
- *
- * @return ocsd_datapath_resp_t : Standard data path response.
- */
- virtual ocsd_datapath_resp_t PacketDataIn( const ocsd_datapath_op_t op,
- const ocsd_trc_index_t index_sop,
- const P *p_packet_in) = 0;
-
-
-};
-
-#endif // ARM_TRC_PKT_IN_I_H_INCLUDED
-
-/* End of File trc_proc_pkt_in_i.h */
diff --git a/contrib/opencsd/decoder/include/interfaces/trc_pkt_raw_in_i.h b/contrib/opencsd/decoder/include/interfaces/trc_pkt_raw_in_i.h
deleted file mode 100644
index 6f7b21383024..000000000000
--- a/contrib/opencsd/decoder/include/interfaces/trc_pkt_raw_in_i.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * \file trc_pkt_raw_in_i.h
- * \brief OpenCSD :
- *
- * \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.
- */
-
-#ifndef ARM_TRC_PKT_RAW_IN_I_H_INCLUDED
-#define ARM_TRC_PKT_RAW_IN_I_H_INCLUDED
-
-#include "trc_abs_typed_base_i.h"
-
-/*!
- * @class IPktRawDataMon
- *
- * @brief Interface class for packet processor monitor.
- *
- * @addtogroup ocsd_interfaces
- *
- * This interface provides a monitor point for the packet processor block.
- * The templated interface is called with a complete packet of the given
- * type, plus the raw packet bytes. Use for tools which need to display compplete
- * packets or require additional processing on raw packet data.
- *
- * This interface is not part of the data decode path and cannot provide feedback.
- *
- */
-template<class P>
-class IPktRawDataMon : public ITrcTypedBase
-{
-public:
- IPktRawDataMon() {}; /**< Default constructor. */
- virtual ~IPktRawDataMon() {}; /**< Default destructor. */
-
- /*!
- * Interface monitor function called with a complete packet, or other
- * data path operation.
- *
- * @param op : Datapath operation
- * @param index_sop : start of packet index
- * @param *pkt : The expanded packet
- * @param size : size of packet data bytes
- * @param *p_data : the packet data bytes.
- *
- */
- virtual void RawPacketDataMon( const ocsd_datapath_op_t op,
- const ocsd_trc_index_t index_sop,
- const P *pkt,
- const uint32_t size,
- const uint8_t *p_data) = 0;
-};
-
-#endif // ARM_TRC_PKT_RAW_IN_I_H_INCLUDED
-
-/* End of File trc_pkt_raw_in_i.h */
diff --git a/contrib/opencsd/decoder/include/interfaces/trc_tgt_mem_access_i.h b/contrib/opencsd/decoder/include/interfaces/trc_tgt_mem_access_i.h
deleted file mode 100644
index effc9b5e161e..000000000000
--- a/contrib/opencsd/decoder/include/interfaces/trc_tgt_mem_access_i.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * \file trc_tgt_mem_access_i.h
- * \brief OpenCSD : Target memory read interface.
- *
- * \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.
- */
-
-#ifndef ARM_TRC_TGT_MEM_ACCESS_I_H_INCLUDED
-#define ARM_TRC_TGT_MEM_ACCESS_I_H_INCLUDED
-
-/*!
- * @class ITargetMemAccess
- *
- * @brief Interface to target memory access.
- *
- * @ingroup ocsd_interfaces
- *
- * Read Target memory call is used by the decoder to access the memory location in the
- * target memory space for the next instruction(s) to be traced.
- *
- * Memory data returned is to be little-endian.
- *
- * The implementator of this interface could either use file(s) containing dumps of memory
- * locations from the target, be an elf file reader extracting code, or a live target
- * connection, depending on the tool execution context.
- *
- *
- */
-class ITargetMemAccess
-{
-public:
- ITargetMemAccess() {}; /**< default interface constructor */
- virtual ~ITargetMemAccess() {}; /**< default interface destructor */
-
- /*!
- * Read a block of target memory into supplied buffer.
- *
- * Bytes read set less than bytes required, along with a success return code indicates full memory
- * location not accessible. Function will return all accessible bytes from the address up to the point
- * where the first inaccessible location appears.
- *
- * The cs_trace_id associates a memory read with a core. Different cores may have different memory spaces,
- * the memory access may take this into account. Access will first look in the registered memory areas
- * associated with the ID, failing that will look into any global memory spaces.
- *
- * @param address : Address to access.
- * @param cs_trace_id : protocol source trace ID.
- * @param mem_space : Memory space to access, (secure, non-secure, optionally with EL, or any).
- * @param num_bytes : [in] Number of bytes required. [out] Number of bytes actually read.
- * @param *p_buffer : Buffer to fill with the bytes.
- *
- * @return ocsd_err_t : OCSD_OK on successful access (including memory not available)
- */
- virtual ocsd_err_t ReadTargetMemory( const ocsd_vaddr_t address,
- const uint8_t cs_trace_id,
- const ocsd_mem_space_acc_t mem_space,
- uint32_t *num_bytes,
- uint8_t *p_buffer) = 0;
-};
-
-
-#endif // ARM_TRC_TGT_MEM_ACCESS_I_H_INCLUDED
-
-/* End of File trc_tgt_mem_access_i.h */
diff --git a/contrib/opencsd/decoder/include/mem_acc/trc_mem_acc.h b/contrib/opencsd/decoder/include/mem_acc/trc_mem_acc.h
deleted file mode 100644
index 66f91229da21..000000000000
--- a/contrib/opencsd/decoder/include/mem_acc/trc_mem_acc.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * \file trc_mem_acc.h
- * \brief OpenCSD :
- *
- * \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.
- */
-
-#ifndef ARM_TRC_MEM_ACC_H_INCLUDED
-#define ARM_TRC_MEM_ACC_H_INCLUDED
-
-#include "trc_mem_acc_base.h"
-#include "trc_mem_acc_bufptr.h"
-#include "trc_mem_acc_file.h"
-#include "trc_mem_acc_mapper.h"
-#include "trc_mem_acc_cb.h"
-
-
-#endif // ARM_TRC_MEM_ACC_H_INCLUDED
-
-/* End of File trc_mem_acc.h */
diff --git a/contrib/opencsd/decoder/include/mem_acc/trc_mem_acc_base.h b/contrib/opencsd/decoder/include/mem_acc/trc_mem_acc_base.h
deleted file mode 100644
index 7f17bde125db..000000000000
--- a/contrib/opencsd/decoder/include/mem_acc/trc_mem_acc_base.h
+++ /dev/null
@@ -1,245 +0,0 @@
-/*!
- * \file trc_mem_acc_base.h
- * \brief OpenCSD : Memory accessor base 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.
- */
-
-#ifndef ARM_TRC_MEM_ACC_BASE_H_INCLUDED
-#define ARM_TRC_MEM_ACC_BASE_H_INCLUDED
-
-#include "opencsd/ocsd_if_types.h"
-#include <string>
-
-/*!
- * @class TrcMemAccessorBase
- * @brief Memory range to access by trace decoder.
- *
- * Represents a memory access range for the trace decoder.
- * Range inclusive from m_startAddress to m_endAddress.
- * e.g. a 1k range from 0x1000 has start of 0x1000 and end of 0x13FF
- *
- * Derived classes provide specific access types such as binary files and memory buffers.
- *
- */
-class TrcMemAccessorBase
-{
-public:
-
- /** Describes the storage type of the underlying memory accessor */
- enum MemAccTypes {
- MEMACC_UNKNOWN,
- MEMACC_FILE, //<! Binary data file accessor
- MEMACC_BUFPTR, //<! memory buffer accessor
- MEMACC_CB_IF, //<! callback interface accessor - use for live memory access
- };
-
- /** default constructor */
- TrcMemAccessorBase(MemAccTypes type);
-
- /** costruct with address range values */
- TrcMemAccessorBase(MemAccTypes type, ocsd_vaddr_t startAddr, ocsd_vaddr_t endAddr);
-
- /** default desctructor */
- virtual ~TrcMemAccessorBase() {};
-
- /*!
- * Set the inclusive address range of this accessor.
- *
- * @param startAddr : start address of the range.
- * @param endAddr : end address of the range.
- */
- void setRange(ocsd_vaddr_t startAddr, ocsd_vaddr_t endAddr);
-
- /*!
- * test if an address is in the inclusive range for this accessor
- *
- * @param s_address : Address to test.
- *
- * @return const bool : true if the address is in range.
- */
- virtual const bool addrInRange(const ocsd_vaddr_t s_address) const;
-
-
- /*!
- * test if an address is the start of range for this accessor
- *
- * @param s_address : Address to test.
- *
- * @return const bool : true if the address is start of range.
- */
- virtual const bool addrStartOfRange(const ocsd_vaddr_t s_address) const;
-
- /*!
- * Test number of bytes available from the start address, up to the number of requested bytes.
- * Tests if all the requested bytes are available from the supplied start address.
- * Returns the number available up to full requested amount.
- *
- * @param s_address : Start address within the range.
- * @param reqBytes : Number of bytes needed from the start address.
- *
- * @return const uint32_t : Bytes available, up to reqBytes. 0 is s_address not in range.
- */
- virtual const uint32_t bytesInRange(const ocsd_vaddr_t s_address, const uint32_t reqBytes) const;
-
- /*!
- * test is supplied range accessor overlaps this range.
- *
- * @param *p_test_acc : Accessor to test for overlap.
- *
- * @return bool : true if overlap, false if not.
- */
- virtual const bool overLapRange(const TrcMemAccessorBase *p_test_acc) const;
-
- /*!
- * Read bytes from via the accessor from the memory range.
- *
- * @param s_address : Start address of the read.
- * @param memSpace : memory space for this access.
- * @param trcID : Trace ID of trace source.
- * @param reqBytes : Number of bytes required.
- * @param *byteBuffer : Buffer to copy the bytes into.
- *
- * @return uint32_t : Number of bytes read, 0 if s_address out of range, or mem space not accessible.
- */
- virtual const uint32_t readBytes(const ocsd_vaddr_t s_address, const ocsd_mem_space_acc_t memSpace, const uint8_t trcID, const uint32_t reqBytes, uint8_t *byteBuffer) = 0;
-
- /*!
- * Validate the address range - ensure addresses aligned, different, st < en etc.
- *
- * @return bool : true if valid range.
- */
- virtual const bool validateRange();
-
-
- const enum MemAccTypes getType() const { return m_type; };
-
- /* handle memory spaces */
- void setMemSpace(ocsd_mem_space_acc_t memSpace) { m_mem_space = memSpace; };
- const ocsd_mem_space_acc_t getMemSpace() const { return m_mem_space; };
- const bool inMemSpace(const ocsd_mem_space_acc_t mem_space) const { return (bool)(((uint8_t)m_mem_space & (uint8_t)mem_space) != 0); };
-
- /* memory access info logging */
- virtual void getMemAccString(std::string &accStr) const;
-
-protected:
- ocsd_vaddr_t m_startAddress; /**< accessible range start address */
- ocsd_vaddr_t m_endAddress; /**< accessible range end address */
- const MemAccTypes m_type; /**< memory accessor type */
- ocsd_mem_space_acc_t m_mem_space;
-};
-
-inline TrcMemAccessorBase::TrcMemAccessorBase(MemAccTypes accType, ocsd_vaddr_t startAddr, ocsd_vaddr_t endAddr) :
- m_startAddress(startAddr),
- m_endAddress(endAddr),
- m_type(accType),
- m_mem_space(OCSD_MEM_SPACE_ANY)
-{
-}
-
-inline TrcMemAccessorBase::TrcMemAccessorBase(MemAccTypes accType) :
- m_startAddress(0),
- m_endAddress(0),
- m_type(accType),
- m_mem_space(OCSD_MEM_SPACE_ANY)
-{
-}
-
-inline void TrcMemAccessorBase::setRange(ocsd_vaddr_t startAddr, ocsd_vaddr_t endAddr)
-{
- m_startAddress = startAddr;
- m_endAddress = endAddr;
-}
-
-inline const bool TrcMemAccessorBase::addrInRange(const ocsd_vaddr_t s_address) const
-{
- return (s_address >= m_startAddress) && (s_address <= m_endAddress);
-}
-
-inline const bool TrcMemAccessorBase::addrStartOfRange(const ocsd_vaddr_t s_address) const
-{
- return (s_address == m_startAddress);
-}
-
-
-inline const uint32_t TrcMemAccessorBase::bytesInRange(const ocsd_vaddr_t s_address, const uint32_t reqBytes) const
-{
- ocsd_vaddr_t bytesInRange = 0;
- if(addrInRange(s_address)) // start not in range, return 0.
- {
- // bytes available till end address.
- bytesInRange = m_endAddress - s_address + 1;
- if(bytesInRange > reqBytes)
- bytesInRange = reqBytes;
- }
- return (uint32_t)bytesInRange;
-}
-
-inline const bool TrcMemAccessorBase::overLapRange(const TrcMemAccessorBase *p_test_acc) const
-{
- if( addrInRange(p_test_acc->m_startAddress) ||
- addrInRange(p_test_acc->m_endAddress)
- )
- return true;
- return false;
-}
-
-inline const bool TrcMemAccessorBase::validateRange()
-{
- if(m_startAddress & 0x1) // at least hword aligned for thumb
- return false;
- if((m_endAddress + 1) & 0x1)
- return false;
- if(m_startAddress == m_endAddress) // zero length range.
- return false;
- if(m_startAddress > m_endAddress) // values bakcwards / invalid
- return false;
- return true;
-}
-
-
-class TrcMemAccFactory
-{
-public:
- /** Accessor Creation */
- static ocsd_err_t CreateBufferAccessor(TrcMemAccessorBase **pAccessor, const ocsd_vaddr_t s_address, const uint8_t *p_buffer, const uint32_t size);
- static ocsd_err_t CreateFileAccessor(TrcMemAccessorBase **pAccessor, const std::string &pathToFile, ocsd_vaddr_t startAddr, size_t offset = 0, size_t size = 0);
- static ocsd_err_t CreateCBAccessor(TrcMemAccessorBase **pAccessor, const ocsd_vaddr_t s_address, const ocsd_vaddr_t e_address, const ocsd_mem_space_acc_t mem_space);
-
- /** Accessor Destruction */
- static void DestroyAccessor(TrcMemAccessorBase *pAccessor);
-private:
- TrcMemAccFactory() {};
- ~TrcMemAccFactory() {};
-};
-
-#endif // ARM_TRC_MEM_ACC_BASE_H_INCLUDED
-
-/* End of File trc_mem_acc_base.h */
diff --git a/contrib/opencsd/decoder/include/mem_acc/trc_mem_acc_bufptr.h b/contrib/opencsd/decoder/include/mem_acc/trc_mem_acc_bufptr.h
deleted file mode 100644
index bd9ea8ee1e5d..000000000000
--- a/contrib/opencsd/decoder/include/mem_acc/trc_mem_acc_bufptr.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * \file trc_mem_acc_bufptr.h
- * \brief OpenCSD :
- *
- * \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.
- */
-
-#ifndef ARM_TRC_MEM_ACC_BUFPTR_H_INCLUDED
-#define ARM_TRC_MEM_ACC_BUFPTR_H_INCLUDED
-
-#include "mem_acc/trc_mem_acc_base.h"
-
-/*!
- * @class TrcMemAccBufPtr:
- * @brief Trace memory accessor for a memory buffer.
- *
- * Wraps a memory buffer in an memory range accessor object.
- * Takes a copy of the buffer pointer which must remain valid
- * for the lifetime of the object.
- *
- */
-class TrcMemAccBufPtr: public TrcMemAccessorBase
-{
-public:
- /*!
- * Construct the accessor.
- * uses the start address as the start of range and calculates the end address
- * according to the buffer size
- *
- * @param s_address : Start address in memory map represented by the data in the buffer.
- * @param *p_buffer : pointer to a buffer of binary data.
- * @param size : size of the buffer.
- *
- */
- TrcMemAccBufPtr(const ocsd_vaddr_t s_address, const uint8_t *p_buffer, const uint32_t size);
-
- virtual ~TrcMemAccBufPtr() {}; /**< default destructor */
-
- /** Memory access override - allow decoder to read bytes from the buffer. */
- virtual const uint32_t readBytes(const ocsd_vaddr_t address, const ocsd_mem_space_acc_t memSpace, const uint8_t trcID, const uint32_t reqBytes, uint8_t *byteBuffer);
-
-private:
- const uint8_t *m_p_buffer; /**< pointer to the memory buffer */
- const uint32_t m_size; /**< size of the memory buffer. */
-};
-
-#endif // ARM_TRC_MEM_ACC_BUFPTR_H_INCLUDED
-
-/* End of File trc_mem_acc_bufptr.h */
diff --git a/contrib/opencsd/decoder/include/mem_acc/trc_mem_acc_cache.h b/contrib/opencsd/decoder/include/mem_acc/trc_mem_acc_cache.h
deleted file mode 100644
index 5e81c2a2ea34..000000000000
--- a/contrib/opencsd/decoder/include/mem_acc/trc_mem_acc_cache.h
+++ /dev/null
@@ -1,149 +0,0 @@
-/*!
-* \file trc_mem_acc_cache.h
-* \brief OpenCSD : Memory accessor cache.
-*
-* \copyright Copyright (c) 2018, 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.
-*/
-
-#ifndef ARM_TRC_MEM_ACC_CACHE_H_INCLUDED
-#define ARM_TRC_MEM_ACC_CACHE_H_INCLUDED
-
-#include <string>
-#include "opencsd/ocsd_if_types.h"
-
-#define MEM_ACC_CACHE_PAGE_SIZE 256
-#define MEM_ACC_CACHE_MRU_SIZE 12
-
-class TrcMemAccessorBase;
-class ITraceErrorLog;
-
-typedef struct cache_block {
- ocsd_vaddr_t st_addr;
- uint32_t valid_len;
- uint8_t data[MEM_ACC_CACHE_PAGE_SIZE];
-} cache_block_t;
-
-// enable define to collect stats for debugging / cache performance tests
-//#define LOG_CACHE_STATS
-
-
-/** class TrcMemAccCache - cache small amounts of data from accessors to speed up decode. */
-class TrcMemAccCache
-{
-public:
- TrcMemAccCache();
- ~TrcMemAccCache() {};
-
- void enableCaching(bool bEnable) { m_bCacheEnabled = bEnable; };
- void invalidateAll();
- const bool enabled() const { return m_bCacheEnabled; };
- const bool enabled_for_size(const uint32_t reqSize) const
- {
- return (m_bCacheEnabled && (reqSize <= MEM_ACC_CACHE_PAGE_SIZE));
- }
-
-
- /** read bytes from cache if possible - load new page if needed, bail out if data not available */
- ocsd_err_t readBytesFromCache(TrcMemAccessorBase *p_accessor, const ocsd_vaddr_t address, const ocsd_mem_space_acc_t mem_space, const uint8_t trcID, uint32_t *numBytes, uint8_t *byteBuffer);
-
- void setErrorLog(ITraceErrorLog *log);
- void logAndClearCounts();
-
-private:
- bool blockInCache(const ocsd_vaddr_t address, const uint32_t reqBytes); // run through each page to look for data.
- bool blockInPage(const ocsd_vaddr_t address, const uint32_t reqBytes);
- void logMsg(const std::string &szMsg);
-
- cache_block_t m_mru[MEM_ACC_CACHE_MRU_SIZE];
- int m_mru_idx = 0; // in use index
- int m_mru_next_new = 0; // next new page at this index.
- bool m_bCacheEnabled = false;
-
-#ifdef LOG_CACHE_STATS
- uint32_t m_hits = 0;
- uint32_t m_misses = 0;
- uint32_t m_pages = 0;
- uint32_t m_hit_rl[MEM_ACC_CACHE_MRU_SIZE];
- uint32_t m_hit_rl_max[MEM_ACC_CACHE_MRU_SIZE];
-#endif
-
- ITraceErrorLog *m_err_log = 0;
-};
-
-inline TrcMemAccCache::TrcMemAccCache()
-{
- for (int i = 0; i < MEM_ACC_CACHE_MRU_SIZE; i++)
- {
- m_mru[i].st_addr = 0;
- m_mru[i].valid_len = 0;
-#ifdef LOG_CACHE_STATS
- m_hit_rl[i] = 0;
- m_hit_rl_max[i] = 0;
-#endif
- }
-}
-
-inline bool TrcMemAccCache::blockInPage(const ocsd_vaddr_t address, const uint32_t reqBytes)
-{
- if ((m_mru[m_mru_idx].st_addr <= address) &&
- m_mru[m_mru_idx].st_addr + m_mru[m_mru_idx].valid_len >= (address + reqBytes))
- return true;
- return false;
-}
-
-inline bool TrcMemAccCache::blockInCache(const ocsd_vaddr_t address, const uint32_t reqBytes)
-{
- int tests = MEM_ACC_CACHE_MRU_SIZE;
- while (tests)
- {
- if (blockInPage(address, reqBytes))
- return true; // found address in page
- tests--;
- m_mru_idx++;
- if (m_mru_idx == MEM_ACC_CACHE_MRU_SIZE)
- m_mru_idx = 0;
- }
- return false;
-}
-
-inline void TrcMemAccCache::invalidateAll()
-{
- for (int i = 0; i < MEM_ACC_CACHE_MRU_SIZE; i++)
- {
- m_mru[i].valid_len = 0;
- m_mru[i].st_addr = 0;
- }
- m_mru_idx = 0;
- m_mru_next_new = 0;
-}
-
-#endif // ARM_TRC_MEM_ACC_CACHE_H_INCLUDED
-
-/* End of File trc_mem_acc_cache.h */
diff --git a/contrib/opencsd/decoder/include/mem_acc/trc_mem_acc_cb.h b/contrib/opencsd/decoder/include/mem_acc/trc_mem_acc_cb.h
deleted file mode 100644
index e58c6169f171..000000000000
--- a/contrib/opencsd/decoder/include/mem_acc/trc_mem_acc_cb.h
+++ /dev/null
@@ -1,96 +0,0 @@
-/*!
- * \file trc_mem_acc_cb.h
- * \brief OpenCSD : Callback trace memory accessor.
- *
- * \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.
- */
-
-#ifndef ARM_TRC_MEM_ACC_CB_H_INCLUDED
-#define ARM_TRC_MEM_ACC_CB_H_INCLUDED
-
-#include "mem_acc/trc_mem_acc_base.h"
-#include "mem_acc/trc_mem_acc_cb_if.h"
-
-class TrcMemAccCB : public TrcMemAccessorBase
-{
-public:
- TrcMemAccCB(const ocsd_vaddr_t s_address,
- const ocsd_vaddr_t e_address,
- const ocsd_mem_space_acc_t mem_space);
-
-
- virtual ~TrcMemAccCB() {};
-
- /** Memory access override - allow decoder to read bytes from the buffer. */
- virtual const uint32_t readBytes(const ocsd_vaddr_t address, const ocsd_mem_space_acc_t memSpace, const uint8_t trcID, const uint32_t reqBytes, uint8_t *byteBuffer);
-
- void setCBIfClass(TrcMemAccCBIF *p_if);
- void setCBIfFn(Fn_MemAcc_CB p_fn, const void *p_context);
- void setCBIDIfFn(Fn_MemAccID_CB p_fn, const void *p_context);
-
-private:
- void clearCBptrs();
- TrcMemAccCBIF *m_p_CBclass; //<! callback class.
- Fn_MemAcc_CB m_p_CBfn; //<! callback function.
- Fn_MemAccID_CB m_p_CBIDfn; //<! callback with ID function.
- const void *m_p_cbfn_context; //<! context pointer for callback function.
-};
-
-inline void TrcMemAccCB::clearCBptrs()
-{
- m_p_CBclass = 0;
- m_p_CBfn = 0;
- m_p_CBIDfn = 0;
- m_p_cbfn_context = 0;
-}
-
-inline void TrcMemAccCB::setCBIfClass(TrcMemAccCBIF *p_if)
-{
- clearCBptrs(); // only one callback type per accessor.
- m_p_CBclass = p_if;
-}
-
-inline void TrcMemAccCB::setCBIfFn(Fn_MemAcc_CB p_fn, const void *p_context)
-{
- clearCBptrs(); // only one callback type per accessor.
- m_p_CBfn = p_fn;
- m_p_cbfn_context = p_context;
-}
-
-inline void TrcMemAccCB::setCBIDIfFn(Fn_MemAccID_CB p_fn, const void *p_context)
-{
- clearCBptrs(); // only one callback type per accessor.
- m_p_CBIDfn = p_fn;
- m_p_cbfn_context = p_context;
-}
-
-#endif // ARM_TRC_MEM_ACC_CB_H_INCLUDED
-
-/* End of File trc_mem_acc_cb.h */
diff --git a/contrib/opencsd/decoder/include/mem_acc/trc_mem_acc_cb_if.h b/contrib/opencsd/decoder/include/mem_acc/trc_mem_acc_cb_if.h
deleted file mode 100644
index 54dc1848c45e..000000000000
--- a/contrib/opencsd/decoder/include/mem_acc/trc_mem_acc_cb_if.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/*!
- * \file trc_mem_acc_cb_if.h
- * \brief OpenCSD : Memory Accessor Callback Direct Interface
- *
- * \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.
- */
-
-#ifndef ARM_TRC_MEM_ACC_CB_IF_H_INCLUDED
-#define ARM_TRC_MEM_ACC_CB_IF_H_INCLUDED
-
-#include "opencsd/ocsd_if_types.h"
-
-/*!
- * @class TrcMemAccCBIF
- * @brief Interface class to implement memory accessor callbacks
- *
- * Implement an object with this interface to use in a memory accessor callback type.
- * Callback accesses the memory according to address and memory space.
- * Use for trace decode memory access on live systems, or where the implemented accessor types
- * are not suitable for the memory data being accessed.
- *
- */
-class TrcMemAccCBIF
-{
-public:
- TrcMemAccCBIF() {};
- virtual ~TrcMemAccCBIF() {};
-
- /*!
- * Read bytes from via the accessor from the memory range.
- *
- * @param s_address : Start address of the read.
- * @param memSpace : memory space for this access.
- * @param reqBytes : Number of bytes required.
- * @param *byteBuffer : Buffer to copy the bytes into.
- *
- * @return uint32_t : Number of bytes read, 0 if s_address out of range, or mem space not accessible.
- */
- virtual const uint32_t readBytes(const ocsd_vaddr_t s_address, const ocsd_mem_space_acc_t memSpace, const uint32_t reqBytes, uint8_t *byteBuffer) = 0;
-};
-
-#endif // ARM_TRC_MEM_ACC_CB_IF_H_INCLUDED
-
-/* End of File trc_mem_acc_cb_if.h */
diff --git a/contrib/opencsd/decoder/include/mem_acc/trc_mem_acc_file.h b/contrib/opencsd/decoder/include/mem_acc/trc_mem_acc_file.h
deleted file mode 100644
index 6c9b537407ea..000000000000
--- a/contrib/opencsd/decoder/include/mem_acc/trc_mem_acc_file.h
+++ /dev/null
@@ -1,234 +0,0 @@
-/*
- * \file trc_mem_acc_file.h
- * \brief OpenCSD : Access binary target memory file
- *
- * \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.
- */
-
-#ifndef ARM_TRC_MEM_ACC_FILE_H_INCLUDED
-#define ARM_TRC_MEM_ACC_FILE_H_INCLUDED
-
-#include <map>
-#include <string>
-#include <fstream>
-#include <list>
-
-#include "opencsd/ocsd_if_types.h"
-#include "mem_acc/trc_mem_acc_base.h"
-
-// an add-on region to a file - allows setting of a region at a none-zero offset for a file.
-class FileRegionMemAccessor : public TrcMemAccessorBase
-{
-public:
- FileRegionMemAccessor() : TrcMemAccessorBase(MEMACC_FILE) {};
- virtual ~FileRegionMemAccessor() {};
-
- void setOffset(const size_t offset) { m_file_offset = offset; };
- const size_t getOffset() const { return m_file_offset; };
-
- bool operator<(const FileRegionMemAccessor& rhs) { return this->m_startAddress < rhs.m_startAddress; };
-
- // not going to use these objects to read bytes - defer to the file class for that.
- virtual const uint32_t readBytes(const ocsd_vaddr_t s_address, const ocsd_mem_space_acc_t memSpace, const uint8_t trcID, const uint32_t reqBytes, uint8_t *byteBuffer) { return 0; };
-
- const ocsd_vaddr_t regionStartAddress() const { return m_startAddress; };
-
-private:
- size_t m_file_offset;
-};
-
-/*!
- * @class TrcMemAccessorFile
- * @brief Memory accessor for a binary file.
- *
- * Memory accessor based on a binary file snapshot of some memory.
- *
- * Static creation code to allow reference counted accessor usable for
- * multiple access maps attached to multiple source trees for the same system.
- */
-class TrcMemAccessorFile : public TrcMemAccessorBase
-{
-public:
- /** read bytes override - reads from file */
- virtual const uint32_t readBytes(const ocsd_vaddr_t address, const ocsd_mem_space_acc_t memSpace, const uint8_t trcID, const uint32_t reqBytes, uint8_t *byteBuffer);
-
-protected:
- TrcMemAccessorFile(); /**< protected default constructor */
- virtual ~ TrcMemAccessorFile(); /**< protected default destructor */
-
- /** increment reference counter */
- void IncRefCount() { m_ref_count++; };
-
- /** decrement reference counter */
- void DecRefCount() { m_ref_count--; };
-
- /** get current reference count */
- const int getRefCount() const { return m_ref_count; };
-
- /*!
- * Initialise accessor with file name and path, and start address.
- * File opened and length calculated to determine end address for the range.
- *
- * @param &pathToFile : Binary file path and name
- * @param startAddr : system memory address associated with start of binary datain file.
- *
- * @return bool : true if set up successfully, false if file could not be opened.
- */
- ocsd_err_t initAccessor(const std::string &pathToFile, ocsd_vaddr_t startAddr, size_t offset, size_t size);
-
- /** get the file path */
- const std::string &getFilePath() const { return m_file_path; };
-
- /** get an offset region if extant for the address */
- FileRegionMemAccessor *getRegionForAddress(const ocsd_vaddr_t startAddr) const;
-
- /* validate ranges */
- virtual const bool validateRange();
-
-public:
-
- /*!
- * File may contain multiple none-overlapping ranges in a single file.
- *
- * @param startAddr : Address for beginning of byte data.
- * @param size : size of range in bytes.
- * @param offset : offset into file for that data.
- *
- * @return bool : true if set successfully.
- */
- bool AddOffsetRange(const ocsd_vaddr_t startAddr, const size_t size, const size_t offset);
-
- /*!
- * Override in case we have multiple regions in the file.
- *
- * @param s_address : Address to test.
- *
- * @return const bool : true if the address is in range.
- */
- virtual const bool addrInRange(const ocsd_vaddr_t s_address) const;
-
- /*!
- * test if an address is the start of range for this accessor
- *
- * @param s_address : Address to test.
- *
- * @return const bool : true if the address is start of range.
- */
- virtual const bool addrStartOfRange(const ocsd_vaddr_t s_address) const;
-
- /*!
- * Test number of bytes available from the start address, up to the number of requested bytes.
- * Tests if all the requested bytes are available from the supplied start address.
- * Returns the number available up to full requested amount.
- *
- * @param s_address : Start address within the range.
- * @param reqBytes : Number of bytes needed from the start address.
- *
- * @return const uint32_t : Bytes available, up to reqBytes. 0 is s_address not in range.
- */
- virtual const uint32_t bytesInRange(const ocsd_vaddr_t s_address, const uint32_t reqBytes) const;
-
- /*!
- * test is supplied range accessor overlaps this range.
- *
- * @param *p_test_acc : Accessor to test for overlap.
- *
- * @return bool : true if overlap, false if not.
- */
- virtual const bool overLapRange(const TrcMemAccessorBase *p_test_acc) const;
-
- /*! Override to handle ranges and offset accessors plus add in file name. */
- virtual void getMemAccString(std::string &accStr) const;
-
-
- /*!
- * Create a file accessor based on the supplied path and address.
- * Keeps a list of file accessors created.
- *
- * File will be checked to ensure valid accessor can be created.
- *
- * If an accessor using the supplied file is currently in use then a reference to that
- * accessor will be returned and the accessor reference counter updated.
- *
- * @param &pathToFile : Path to binary file
- * @param startAddr : Start address of data represented by file.
- *
- * @return TrcMemAccessorFile * : pointer to accessor if successful, 0 if it could not be created.
- */
- static ocsd_err_t createFileAccessor(TrcMemAccessorFile **p_acc, const std::string &pathToFile, ocsd_vaddr_t startAddr, size_t offset = 0, size_t size = 0);
-
- /*!
- * Destroy supplied accessor.
- *
- * Reference counter decremented and checked and accessor destroyed if no longer in use.
- *
- * @param *p_accessor : File Accessor to destroy.
- */
- static void destroyFileAccessor(TrcMemAccessorFile *p_accessor);
-
- /*!
- * Test if any accessor is currently using the supplied file path
- *
- * @param &pathToFile : Path to test.
- *
- * @return bool : true if an accessor exists with this file path.
- */
- static const bool isExistingFileAccessor(const std::string &pathToFile);
-
- /*!
- * Get the accessor using the supplied file path
- * Use after createFileAccessor if additional memory ranges need
- * adding to an exiting file accessor.
- *
- * @param &pathToFile : Path to test.
- *
- * @return TrcMemAccessorFile * : none 0 if an accessor exists with this file path.
- */
- static TrcMemAccessorFile * getExistingFileAccessor(const std::string &pathToFile);
-
-
-
-
-private:
- static std::map<std::string, TrcMemAccessorFile *> s_FileAccessorMap; /**< map of file accessors in use. */
-
-private:
- std::ifstream m_mem_file; /**< input binary file stream */
- ocsd_vaddr_t m_file_size; /**< size of the file */
- int m_ref_count; /**< accessor reference count */
- std::string m_file_path; /**< path to input file */
- std::list<FileRegionMemAccessor *> m_access_regions; /**< additional regions in the file at non-zero offsets */
- bool m_base_range_set; /**< true when offset 0 set */
- bool m_has_access_regions; /**< true if single file contains multiple regions */
-};
-
-#endif // ARM_TRC_MEM_ACC_FILE_H_INCLUDED
-
-/* End of File trc_mem_acc_file.h */
diff --git a/contrib/opencsd/decoder/include/mem_acc/trc_mem_acc_mapper.h b/contrib/opencsd/decoder/include/mem_acc/trc_mem_acc_mapper.h
deleted file mode 100644
index a700e9dbd07e..000000000000
--- a/contrib/opencsd/decoder/include/mem_acc/trc_mem_acc_mapper.h
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * \file trc_mem_acc_mapper.h
- * \brief OpenCSD :
- *
- * \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.
- */
-
-#ifndef ARM_TRC_MEM_ACC_MAPPER_H_INCLUDED
-#define ARM_TRC_MEM_ACC_MAPPER_H_INCLUDED
-
-#include <vector>
-
-#include "opencsd/ocsd_if_types.h"
-#include "interfaces/trc_tgt_mem_access_i.h"
-#include "interfaces/trc_error_log_i.h"
-#include "mem_acc/trc_mem_acc_base.h"
-#include "mem_acc/trc_mem_acc_cache.h"
-
-typedef enum _memacc_mapper_t {
- MEMACC_MAP_GLOBAL,
-} memacc_mapper_t;
-
-class TrcMemAccMapper : public ITargetMemAccess
-{
-public:
- TrcMemAccMapper();
- TrcMemAccMapper(bool using_trace_id);
- virtual ~TrcMemAccMapper();
-
-// decoder memory access interface
- virtual ocsd_err_t ReadTargetMemory( const ocsd_vaddr_t address,
- const uint8_t cs_trace_id,
- const ocsd_mem_space_acc_t mem_space,
- uint32_t *num_bytes,
- uint8_t *p_buffer);
-
-// mapper memory area configuration interface
-
- // add an accessor to this map
- virtual ocsd_err_t AddAccessor(TrcMemAccessorBase *p_accessor, const uint8_t cs_trace_id) = 0;
-
- // remove a specific accessor
- virtual ocsd_err_t RemoveAccessor(const TrcMemAccessorBase *p_accessor) = 0;
-
-
- // clear all attached accessors from the map
- void RemoveAllAccessors();
-
- // remove a single accessor based on address.
- ocsd_err_t RemoveAccessorByAddress(const ocsd_vaddr_t st_address, const ocsd_mem_space_acc_t mem_space, const uint8_t cs_trace_id = 0);
-
- // set the error log.
- void setErrorLog(ITraceErrorLog *err_log_i);
-
- // print out the ranges in this mapper.
- virtual void logMappedRanges() = 0;
-
-protected:
- virtual bool findAccessor(const ocsd_vaddr_t address, const ocsd_mem_space_acc_t mem_space, const uint8_t cs_trace_id) = 0; // set m_acc_curr if found valid range, leave unchanged if not.
- virtual bool readFromCurrent(const ocsd_vaddr_t address, const ocsd_mem_space_acc_t mem_space, const uint8_t cs_trace_id) = 0;
- virtual TrcMemAccessorBase *getFirstAccessor() = 0;
- virtual TrcMemAccessorBase *getNextAccessor() = 0;
- virtual void clearAccessorList() = 0;
-
- void LogMessage(const std::string &msg);
- void LogWarn(const ocsd_err_t err, const std::string &msg);
-
- TrcMemAccessorBase *m_acc_curr; // most recently used - try this first.
- uint8_t m_trace_id_curr; // trace ID for the current accessor
- const bool m_using_trace_id; // true if we are using separate memory spaces by TraceID.
- ITraceErrorLog *m_err_log; // error log to print out mappings on request.
- TrcMemAccCache m_cache; // memory accessor caching.
-};
-
-
-// address spaces common to all sources using this mapper.
-// trace id unused.
-class TrcMemAccMapGlobalSpace : public TrcMemAccMapper
-{
-public:
- TrcMemAccMapGlobalSpace();
- virtual ~TrcMemAccMapGlobalSpace();
-
- // mapper creation interface - prevent overlaps
- virtual ocsd_err_t AddAccessor(TrcMemAccessorBase *p_accessor, const uint8_t cs_trace_id);
-
- // print out the ranges in this mapper.
- virtual void logMappedRanges();
-
-protected:
- virtual bool findAccessor(const ocsd_vaddr_t address, const ocsd_mem_space_acc_t mem_space, const uint8_t cs_trace_id);
- virtual bool readFromCurrent(const ocsd_vaddr_t address,const ocsd_mem_space_acc_t mem_space, const uint8_t cs_trace_id);
- virtual TrcMemAccessorBase *getFirstAccessor();
- virtual TrcMemAccessorBase *getNextAccessor();
- virtual void clearAccessorList();
- virtual ocsd_err_t RemoveAccessor(const TrcMemAccessorBase *p_accessor);
-
- std::vector<TrcMemAccessorBase *> m_acc_global;
- std::vector<TrcMemAccessorBase *>::iterator m_acc_it;
-};
-
-#endif // ARM_TRC_MEM_ACC_MAPPER_H_INCLUDED
-
-/* End of File trc_mem_acc_mapper.h */
diff --git a/contrib/opencsd/decoder/include/opencsd.h b/contrib/opencsd/decoder/include/opencsd.h
deleted file mode 100644
index 615bbcafa2d9..000000000000
--- a/contrib/opencsd/decoder/include/opencsd.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/*!
- * \file opencsd.h
- * \brief OpenCSD: Open CoreSight Trace Decoder -Master include file for C++ library
- *
- * \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.
- */
-
-#ifndef ARM_OPENCSD_H_INCLUDED
-#define ARM_OPENCSD_H_INCLUDED
-
-/** C interface types */
-#include "opencsd/ocsd_if_types.h"
-#include "opencsd/trc_pkt_types.h"
-#include "opencsd/trc_gen_elem_types.h"
-
-/* C++ abstract interfaces */
-#include "interfaces/trc_data_raw_in_i.h"
-#include "interfaces/trc_data_rawframe_in_i.h"
-#include "interfaces/trc_error_log_i.h"
-#include "interfaces/trc_gen_elem_in_i.h"
-#include "interfaces/trc_instr_decode_i.h"
-#include "interfaces/trc_pkt_in_i.h"
-#include "interfaces/trc_pkt_raw_in_i.h"
-#include "interfaces/trc_tgt_mem_access_i.h"
-
-/* protocol base classes and generic elements */
-#include "common/ocsd_version.h"
-#include "common/ocsd_error.h"
-#include "common/trc_gen_elem.h"
-#include "common/trc_core_arch_map.h"
-
-/** Implemented Protocol decoders */
-#include "common/trc_frame_deformatter.h"
-
-#include "opencsd/etmv3/etmv3_decoder.h"
-#include "opencsd/etmv4/etmv4_decoder.h"
-#include "opencsd/ptm/ptm_decoder.h"
-#include "opencsd/stm/stm_decoder.h"
-
-/** C++ library object types */
-#include "common/ocsd_error_logger.h"
-#include "common/ocsd_msg_logger.h"
-#include "i_dec/trc_i_decode.h"
-#include "mem_acc/trc_mem_acc.h"
-
-/* printers for builtin packet elements */
-#include "pkt_printers/trc_pkt_printers.h"
-#include "pkt_printers/trc_print_fact.h"
-
-/** The decode tree and decoder register*/
-#include "common/ocsd_lib_dcd_register.h"
-#include "common/ocsd_dcd_tree.h"
-
-
-#endif // ARM_OPENCSD_H_INCLUDED
-
-/* End of File opencsd.h */
diff --git a/contrib/opencsd/decoder/include/opencsd/c_api/ocsd_c_api_cust_fact.h b/contrib/opencsd/decoder/include/opencsd/c_api/ocsd_c_api_cust_fact.h
deleted file mode 100644
index f9e6a95104cc..000000000000
--- a/contrib/opencsd/decoder/include/opencsd/c_api/ocsd_c_api_cust_fact.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
-* \file ocsd_c_api_cust_fact.h
-* \brief OpenCSD : Custom decoder factory API functions
-*
-* \copyright Copyright (c) 2016, 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.
-*/
-#ifndef ARM_OCSD_C_API_CUST_FACT_H_INCLUDED
-#define ARM_OCSD_C_API_CUST_FACT_H_INCLUDED
-
-#include "ocsd_c_api_types.h"
-#include "ocsd_c_api_custom.h"
-
-/* Declarations for the functions implemented in the custom decoder factory. */
-
-/** Required function to create a decoder instance - fills in the decoder struct supplied. */
-ocsd_err_t CreateCustomDecoder(const int create_flags, const void *decoder_cfg, ocsd_extern_dcd_inst_t *p_decoder_inst);
-
-/** Required Function to destroy a decoder instance - indicated by decoder handle */
-ocsd_err_t DestroyCustomDecoder(const void *decoder_handle);
-
-/** Required Function to extract the CoreSight Trace ID from the configuration structure */
-ocsd_err_t GetCSIDFromConfig(const void *decoder_cfg, unsigned char *p_csid);
-
-/** Optional Function to convert a protocol specific trace packet to human readable string */
-ocsd_err_t PacketToString(const void *trc_pkt, char *buffer, const int buflen);
-
-#endif /* ARM_OCSD_C_API_CUST_FACT_H_INCLUDED */
diff --git a/contrib/opencsd/decoder/include/opencsd/c_api/ocsd_c_api_cust_impl.h b/contrib/opencsd/decoder/include/opencsd/c_api/ocsd_c_api_cust_impl.h
deleted file mode 100644
index 245ce162752e..000000000000
--- a/contrib/opencsd/decoder/include/opencsd/c_api/ocsd_c_api_cust_impl.h
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
-* \file ocsd_c_api_cust_impl.h
-* \brief OpenCSD : Custom decoder implementation common API definitions
-*
-* \copyright Copyright (c) 2016, 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.
-*/
-#ifndef ARM_OCSD_C_API_CUST_IMPL_H_INCLUDED
-#define ARM_OCSD_C_API_CUST_IMPL_H_INCLUDED
-
-#include "opencsd/c_api/ocsd_c_api_types.h"
-#include "opencsd/c_api/ocsd_c_api_custom.h"
-
-/** @addtogroup ocsd_ext_dcd
-@{*/
-
-/**@name External decoder - Inline utility functions.
- @brief inline functions used in decoders to call the various library callback functionality.
-
- Functions manipulate and use the ocsd_extern_dcd_cb_fns structure to call into the library,
- with appropriate checking for initialisation and usage flags.
-
-@{*/
-
-static inline ocsd_datapath_resp_t lib_cb_GenElemOp(const ocsd_extern_dcd_cb_fns *callbacks,
- const ocsd_trc_index_t index_sop,
- const uint8_t trc_chan_id,
- const ocsd_generic_trace_elem *elem)
-{
- if (callbacks->fn_gen_elem_out)
- return callbacks->fn_gen_elem_out(callbacks->lib_context, index_sop, trc_chan_id, elem);
- return OCSD_RESP_FATAL_NOT_INIT;
-}
-
-static inline ocsd_err_t lib_cb_LogError(const ocsd_extern_dcd_cb_fns *callbacks,
- const ocsd_err_severity_t filter_level,
- const ocsd_err_t code,
- const ocsd_trc_index_t idx,
- const uint8_t chan_id,
- const char *pMsg)
-{
- if (callbacks->fn_log_error)
- {
- callbacks->fn_log_error(callbacks->lib_context, filter_level, code, idx, chan_id, pMsg);
- return OCSD_OK;
- }
- return OCSD_ERR_NOT_INIT;
-}
-
-static inline ocsd_err_t lib_cb_LogMsg(const ocsd_extern_dcd_cb_fns *callbacks,
- const ocsd_err_severity_t filter_level,
- const char *pMsg)
-{
- if (callbacks->fn_log_msg)
- {
- callbacks->fn_log_msg(callbacks->lib_context, filter_level, pMsg);
- return OCSD_OK;
- }
- return OCSD_ERR_NOT_INIT;
-}
-
-static inline ocsd_err_t lib_cb_DecodeArmInst(const ocsd_extern_dcd_cb_fns *callbacks,
- ocsd_instr_info *instr_info)
-{
- if (callbacks->fn_arm_instruction_decode)
- return callbacks->fn_arm_instruction_decode(callbacks->lib_context, instr_info);
- return OCSD_ERR_NOT_INIT;
-}
-
-static inline ocsd_err_t lib_cb_MemAccess(const ocsd_extern_dcd_cb_fns *callbacks,
- const ocsd_vaddr_t address,
- const uint8_t cs_trace_id,
- const ocsd_mem_space_acc_t mem_space,
- uint32_t *num_bytes,
- uint8_t *p_buffer)
-{
- if (callbacks->fn_memory_access)
- return callbacks->fn_memory_access(callbacks->lib_context, address, cs_trace_id, mem_space, num_bytes, p_buffer);
- return OCSD_ERR_NOT_INIT;
-}
-
-static inline void lib_cb_PktMon(const ocsd_extern_dcd_cb_fns *callbacks,
- const ocsd_datapath_op_t op,
- const ocsd_trc_index_t index_sop,
- const void *pkt,
- const uint32_t size,
- const uint8_t *p_data)
-{
- if (callbacks->packetCBFlags & OCSD_CUST_DCD_PKT_CB_USE_MON)
- {
- if (callbacks->fn_packet_mon)
- callbacks->fn_packet_mon(callbacks->lib_context, op, index_sop, pkt, size, p_data);
- }
-}
-
-static inline int lib_cb_usePktMon(const ocsd_extern_dcd_cb_fns *callbacks)
-{
- return (callbacks->packetCBFlags & OCSD_CUST_DCD_PKT_CB_USE_MON);
-}
-
-/* callback function to connect to the packet sink interface, on the main decode
-data path - used if decoder created as packet processor only */
-static inline ocsd_datapath_resp_t lib_cb_PktDataSink(const ocsd_extern_dcd_cb_fns *callbacks,
- const ocsd_datapath_op_t op,
- const ocsd_trc_index_t index_sop,
- const void *pkt)
-{
- if (callbacks->packetCBFlags & OCSD_CUST_DCD_PKT_CB_USE_SINK)
- {
- if (callbacks->fn_packet_data_sink)
- return callbacks->fn_packet_data_sink(callbacks->lib_context, op, index_sop, pkt);
- else
- return OCSD_RESP_FATAL_NOT_INIT;
- }
- return OCSD_RESP_CONT;
-}
-
-static inline int lib_cb_usePktSink(const ocsd_extern_dcd_cb_fns *callbacks)
-{
- return (callbacks->packetCBFlags & OCSD_CUST_DCD_PKT_CB_USE_SINK);
-}
-
-static inline void lib_cb_updatePktCBFlags(ocsd_extern_dcd_cb_fns *callbacks, const int newFlags)
-{
- callbacks->packetCBFlags = newFlags;
-}
-
-/** @}*/
-
-/** @}*/
-
-#endif /* ARM_OCSD_C_API_CUST_IMPL_H_INCLUDED */
diff --git a/contrib/opencsd/decoder/include/opencsd/c_api/ocsd_c_api_custom.h b/contrib/opencsd/decoder/include/opencsd/c_api/ocsd_c_api_custom.h
deleted file mode 100644
index ada0a68cb3db..000000000000
--- a/contrib/opencsd/decoder/include/opencsd/c_api/ocsd_c_api_custom.h
+++ /dev/null
@@ -1,253 +0,0 @@
-/*
- * \file ocsd_c_api_custom.h
- * \brief OpenCSD : Custom decoder interface types and structures
- *
- * \copyright Copyright (c) 2016, 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.
- */
-#ifndef ARM_OCSD_C_API_CUSTOM_H_INCLUDED
-#define ARM_OCSD_C_API_CUSTOM_H_INCLUDED
-
-#include "ocsd_c_api_types.h"
-
-
- /** @defgroup ocsd_ext_dcd OpenCSD Library : Custom External Decoder C-API
- @brief Set of types, structures and interfaces for attaching custom decoders via the C-API
-
- These types, functions and structures define the required API between a custom external decoder
- and the library, which will allow the decoder to interact with the library and use library
- resources in the same way as the built-in decoders.
-
- The external decoder must implement:-
- - A set of factory functions that allow the creation and destruction of decoder instances.
- - A set of call-in and call-back functions plus data structures allowing interaction with the library.
-
- @{*/
-
-
-/**@name External decoder - Input Interfaces
-@{*/
-
-/* Custom decoder C-API interface types. */
-
-/** Raw trace data input function - a decoder must have one of these
- Implements ITrcDataIn with the addition of a decoder handle to provide context in the decoder.
- */
-typedef ocsd_datapath_resp_t (* fnTraceDataIn)( const void *decoder_handle,
- const ocsd_datapath_op_t op,
- const ocsd_trc_index_t index,
- const uint32_t dataBlockSize,
- const uint8_t *pDataBlock,
- uint32_t *numBytesProcessed);
-
-/** Function to update the in-use flags for the packet sinks
-
- Defines if the fnPktMonCB or fnPktDataSinkCB callbacks are in use by the library.
- If so then it is expected that the decoder should call them when trace protocol packets are generated.
-
- This function must be implemented in the decoder.
-
- @param decoder_handle : handle for decoder accessed by this call.
- @param flags: Values indicating interfaces in use / not in use. [ OCSD_CUST_DCD_PKT_CB_USE_MON or OCSD_CUST_DCD_PKT_CB_USE_SINK]
-*/
-typedef void (* fnUpdatePktMonFlags)(const void *decoder_handle, const int flags);
-
-
-
-/** Flag to indicate the the packet monitor (fnPktMonCB) is in use in the library */
-#define OCSD_CUST_DCD_PKT_CB_USE_MON 0x1
-
-/** Flag to indicate the the packet sink (fnPktDataSinkCB) is in use in the library - only if trace packet processing only mode. */
-#define OCSD_CUST_DCD_PKT_CB_USE_SINK 0x2
-
-/** Owned by the library instance object, this structure is filled in by the ocsd_extern_dcd_fact_t createDecoder() function. */
-typedef struct _ocsd_extern_dcd_inst {
- /* Mandatory decoder call back functions - library initialisation will fail without these. */
- fnTraceDataIn fn_data_in; /**< raw trace data input function to decoder */
- fnUpdatePktMonFlags fn_update_pkt_mon; /**< update the packet monitor / sink usage flags */
-
- /* Decoder instance data */
- void *decoder_handle; /**< Instance handle for the decoder - used by library to call the decoder call in functions */
- char *p_decoder_name; /**< type name of the decoder - may be used in logging */
- uint8_t cs_id; /**< Coresight ID for the instance - extracted from the config on creation. */
-
-} ocsd_extern_dcd_inst_t;
-
-/** @}*/
-
-
-/**@name External decoder - Callback Interfaces
-@{*/
-
-
-/** callback function to connect into the generic element output point
- Implements ITrcGenElemIn::TraceElemIn with addition of library context pointer.
- */
-typedef ocsd_datapath_resp_t (* fnGenElemOpCB)( const void *lib_context,
- const ocsd_trc_index_t index_sop,
- const uint8_t trc_chan_id,
- const ocsd_generic_trace_elem *elem);
-
-/** callback functions to connect into the library error logging mechanism
- Implements ITraceErrorLog::LogError with addition of library context pointer.
-*/
-typedef void (* fnLogErrorCB)( const void *lib_context,
- const ocsd_err_severity_t filter_level,
- const ocsd_err_t code,
- const ocsd_trc_index_t idx,
- const uint8_t chan_id,
- const char *pMsg);
-
-/** callback functions to connect into the library error logging mechanism
- Implements ITraceErrorLog::LogMessage with addition of library context pointer.
-*/
-typedef void (* fnLogMsgCB)(const void *lib_context, const ocsd_err_severity_t filter_level, const char *msg);
-
-/** callback function to connect an ARM instruction decoder
- Implements IInstrDecode::DecodeInstruction with addition of library context pointer.
-*/
-typedef ocsd_err_t (* fnDecodeArmInstCB)(const void *lib_context, ocsd_instr_info *instr_info);
-
-/** callback function to connect the memory accessor interface
- Implements ITargetMemAccess::ReadTargetMemory with addition of library context pointer.
-*/
-typedef ocsd_err_t (* fnMemAccessCB)(const void *lib_context,
- const ocsd_vaddr_t address,
- const uint8_t cs_trace_id,
- const ocsd_mem_space_acc_t mem_space,
- uint32_t *num_bytes,
- uint8_t *p_buffer);
-
-/** callback function to connect to the packet monitor interface of the packet processor
- Implements IPktRawDataMon::RawPacketDataMon <void> with addition of library context pointer.
-*/
-typedef void (* fnPktMonCB)( const void *lib_context,
- const ocsd_datapath_op_t op,
- const ocsd_trc_index_t index_sop,
- const void *pkt,
- const uint32_t size,
- const uint8_t *p_data);
-
-/** callback function to connect to the packet sink interface, on the main decode
- data path - use if decoder created as packet processor only
-
- Implements IPktDataIn::PacketDataIn <void> with addition of library context pointer.
-*/
-typedef ocsd_datapath_resp_t (* fnPktDataSinkCB)( const void *lib_context,
- const ocsd_datapath_op_t op,
- const ocsd_trc_index_t index_sop,
- const void *pkt);
-
-/** an instance of this is owned by the decoder, filled in by the library - allows the CB fns in the library decode tree to be called. */
-typedef struct _ocsd_extern_dcd_cb_fns {
-/* Callback functions */
- fnGenElemOpCB fn_gen_elem_out; /**< Callback to output a generic element. */
- fnLogErrorCB fn_log_error; /**< Callback to output an error. */
- fnLogMsgCB fn_log_msg; /**< Callback to output a message. */
- fnDecodeArmInstCB fn_arm_instruction_decode; /**< Callback to decode an ARM instruction. */
- fnMemAccessCB fn_memory_access; /**< Callback to access memory images related to the trace capture. */
- fnPktMonCB fn_packet_mon; /**< Callback to output trace packet to packet monitor. */
- fnPktDataSinkCB fn_packet_data_sink; /**< Callback to output trace packet to packet sink - if in pack processing only mode. */
-/* CB in use flags. */
- int packetCBFlags; /**< Flags to indicate if the packet sink / packet monitor callbacks are in use. ( OCSD_CUST_DCD_PKT_CB_USE_MON / OCSD_CUST_DCD_PKT_CB_USE_SINK) */
-/* library context */
- const void *lib_context; /**< library context pointer - use in callbacks to allow the library to load the correct context data. */
-} ocsd_extern_dcd_cb_fns;
-
-/** @}*/
-
-/**@name External decoder - Decoder Factory
-@{*/
-
-/** Function to create a decoder instance
-
- Create a decoder instance according to the create_flags parameter and the supplied decoder_cfg structure.
- Fill in the p_decoder_inst structure, copy the p_lib_callbacks information for use in the decoder instance.
-
- Create flags can be:
- - OCSD_CREATE_FLG_PACKET_PROC: decoder will split the incoming trace into trace protocol packets and not further decode them. fnPktDataSinkCB likely to be in use.
- - OCSD_CREATE_FLG_FULL_DECODER: decoder will split the incoming trace into trace protocol packets and further decode them to recreate program flow or other generic trace output.
-
- @param create_flags : Sets the decoder operating mode.
- @param *decoder_cfg : Hardware specific configuration for this trace element.
- @param *p_lib_callbacks : Library callbacks plus context pointer.
- @param *p_decoder_inst : Structure representing the new decoder instance being created. Filled in by create function to contain handle and call-in functions for the library.
-
- @return ocsd_err_t : Library error code - RCDTL_OK if successful
-*/
-typedef ocsd_err_t (* fnCreateCustomDecoder)(const int create_flags, const void *decoder_cfg, const ocsd_extern_dcd_cb_fns *p_lib_callbacks, ocsd_extern_dcd_inst_t *p_decoder_inst);
-
-/** Function to destroy a decoder instance indicated by decoder handle.
-
- @param decoder_handle : Instance handle for decoder.
-
- @return ocsd_err_t : Library error code - RCDTL_OK if successful
-*/
-typedef ocsd_err_t (* fnDestroyCustomDecoder)(const void *decoder_handle);
-
-/** Function to extract the CoreSight Trace ID from the configuration structure.
-
- @param *decoder_cfg : Hardware specific configuration for this trace element.
- @parma *p_csid : location to write CoreSight Trace ID value.
-
- @return ocsd_err_t : Library error code - RCDTL_OK if successful
-*/
-typedef ocsd_err_t (* fnGetCSIDFromConfig)(const void *decoder_cfg, unsigned char *p_csid);
-
-/** Function to convert a protocol specific trace packet to human readable string
-
- @param *trc_pkt : protocol specific packet structure.
- @param *buffer : buffer to fill with string.
- @param buflen : length of string buffer.
-
- @return ocsd_err_t : Library error code - RCDTL_OK if successful
-*/
-typedef ocsd_err_t (* fnPacketToString)(const void *trc_pkt, char *buffer, const int buflen);
-
-/** set of functions and callbacks to create an extern custom decoder in the library
- via the C API interface. This structure is registered with the library by name and
- then decoders of the type can be created on the decode tree.
-*/
-typedef struct _ocsd_extern_dcd_fact {
- fnCreateCustomDecoder createDecoder; /**< Function pointer to create a decoder instance. */
- fnDestroyCustomDecoder destroyDecoder; /**< Function pointer to destroy a decoder instance. */
- fnGetCSIDFromConfig csidFromConfig; /**< Function pointer to extract the CSID from a config structure */
- fnPacketToString pktToString; /**< Function pointer to print a trace protocol packet in this decoder */
-
- ocsd_trace_protocol_t protocol_id; /**< protocol ID assigned during registration. */
-} ocsd_extern_dcd_fact_t;
-
-/** @}*/
-
-/** @}*/
-
-
-#endif // ARM_OCSD_C_API_CUSTOM_H_INCLUDED
-
-/* End of File ocsd_c_api_custom.h */
diff --git a/contrib/opencsd/decoder/include/opencsd/c_api/ocsd_c_api_types.h b/contrib/opencsd/decoder/include/opencsd/c_api/ocsd_c_api_types.h
deleted file mode 100644
index cde351fc525f..000000000000
--- a/contrib/opencsd/decoder/include/opencsd/c_api/ocsd_c_api_types.h
+++ /dev/null
@@ -1,106 +0,0 @@
-/*!
- * \file ocsd_c_api_types.h
- * \brief OpenCSD : Trace Decoder "C" API types.
- *
- * \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.
- */
-
-#ifndef ARM_OCSD_C_API_TYPES_H_INCLUDED
-#define ARM_OCSD_C_API_TYPES_H_INCLUDED
-
-/* select the library types that are C compatible - the interface data types */
-#include "opencsd/ocsd_if_types.h"
-#include "opencsd/ocsd_if_version.h"
-#include "opencsd/trc_gen_elem_types.h"
-#include "opencsd/trc_pkt_types.h"
-
-/* pull in the protocol decoder types. */
-#include "opencsd/etmv3/trc_pkt_types_etmv3.h"
-#include "opencsd/etmv4/trc_pkt_types_etmv4.h"
-#include "opencsd/ptm/trc_pkt_types_ptm.h"
-#include "opencsd/stm/trc_pkt_types_stm.h"
-
-/** @ingroup lib_c_api
-@{*/
-
-
-/* Specific C-API only types */
-
-/** Handle to decode tree */
-typedef void * dcd_tree_handle_t;
-
-/** define invalid handle value for decode tree handle */
-#define C_API_INVALID_TREE_HANDLE (dcd_tree_handle_t)0
-
-/** Logger output printer - no output. */
-#define C_API_MSGLOGOUT_FLG_NONE 0x0
-/** Logger output printer - output to file. */
-#define C_API_MSGLOGOUT_FLG_FILE 0x1
-/** Logger output printer - output to stderr. */
-#define C_API_MSGLOGOUT_FLG_STDERR 0x2
-/** Logger output printer - output to stdout. */
-#define C_API_MSGLOGOUT_FLG_STDOUT 0x4
-/** Logger output printer - mask of valid flags. */
-#define C_API_MSGLOGOUT_MASK 0x7
-
-/** function pointer type for decoder outputs. all protocols, generic data element input */
-typedef ocsd_datapath_resp_t (* FnTraceElemIn)( const void *p_context,
- const ocsd_trc_index_t index_sop,
- const uint8_t trc_chan_id,
- const ocsd_generic_trace_elem *elem);
-
-/** function pointer type for packet processor packet output sink, packet analyser/decoder input - generic declaration */
-typedef ocsd_datapath_resp_t (* FnDefPktDataIn)(const void *p_context,
- const ocsd_datapath_op_t op,
- const ocsd_trc_index_t index_sop,
- const void *p_packet_in);
-
-/** function pointer type for packet processor packet monitor sink, raw packet monitor / display input - generic declaration */
-typedef void (* FnDefPktDataMon)(const void *p_context,
- const ocsd_datapath_op_t op,
- const ocsd_trc_index_t index_sop,
- const void *p_packet_in,
- const uint32_t size,
- const uint8_t *p_data);
-
-/** function pointer tyee for library default logger output to allow client to print zero terminated output string */
-typedef void (* FnDefLoggerPrintStrCB)(const void *p_context, const char *psz_msg_str, const int str_len);
-
-/** Callback interface type when attaching monitor/sink to packet processor */
-typedef enum _ocsd_c_api_cb_types {
- OCSD_C_API_CB_PKT_SINK, /** Attach to the packet processor primary packet output (CB fn is FnDefPktDataIn) */
- OCSD_C_API_CB_PKT_MON, /** Attach to the packet processor packet monitor output (CB fn is FnDefPktDataMon) */
-} ocsd_c_api_cb_types;
-
-/** @}*/
-
-#endif // ARM_OCSD_C_API_TYPES_H_INCLUDED
-
-/* End of File ocsd_c_api_types.h */
diff --git a/contrib/opencsd/decoder/include/opencsd/c_api/opencsd_c_api.h b/contrib/opencsd/decoder/include/opencsd/c_api/opencsd_c_api.h
deleted file mode 100644
index 90201d436e08..000000000000
--- a/contrib/opencsd/decoder/include/opencsd/c_api/opencsd_c_api.h
+++ /dev/null
@@ -1,502 +0,0 @@
-/*!
- * \file opencsd_c_api.h
- * \brief OpenCSD : "C" API
- *
- * \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.
- */
-
-#ifndef ARM_OPENCSD_C_API_H_INCLUDED
-#define ARM_OPENCSD_C_API_H_INCLUDED
-
-/** @defgroup lib_c_api OpenCSD Library : Library "C" API.
- @brief "C" API for the OpenCSD Library
-
- Set of "C" wrapper functions for the OpenCSD library.
-
- Defines API, functions and callback types.
-@{*/
-
-/* ensure C bindings */
-
-#if defined(WIN32) /* windows bindings */
- /** Building the C-API DLL **/
- #ifdef _OCSD_C_API_DLL_EXPORT
- #ifdef __cplusplus
- #define OCSD_C_API extern "C" __declspec(dllexport)
- #else
- #define OCSD_C_API __declspec(dllexport)
- #endif
- #else
- /** building or using the static C-API library **/
- #if defined(_LIB) || defined(OCSD_USE_STATIC_C_API)
- #ifdef __cplusplus
- #define OCSD_C_API extern "C"
- #else
- #define OCSD_C_API
- #endif
- #else
- /** using the C-API DLL **/
- #ifdef __cplusplus
- #define OCSD_C_API extern "C" __declspec(dllimport)
- #else
- #define OCSD_C_API __declspec(dllimport)
- #endif
- #endif
- #endif
-#else /* linux bindings */
- #ifdef __cplusplus
- #define OCSD_C_API extern "C"
- #else
- #define OCSD_C_API
- #endif
-#endif
-
-#include "ocsd_c_api_types.h"
-#include "ocsd_c_api_custom.h"
-
-/** @name Library Version API
-
-@{*/
-/** Get Library version. Return a 32 bit version in form MMMMnnpp - MMMM = major version, nn = minor version, pp = patch version */
-OCSD_C_API uint32_t ocsd_get_version(void);
-
-/** Get library version string */
-OCSD_C_API const char * ocsd_get_version_str(void);
-/** @}*/
-
-/*---------------------- Trace Decode Tree ----------------------------------------------------------------------------------*/
-
-/** @name Library Decode Tree API
-@{*/
-
-/*!
- * Create a decode tree.
- *
- * @param src_type : Type of tree - formatted input, or single source input
- * @param deformatterCfgFlags : Formatter flags - determine presence of frame syncs etc.
- *
- * @return dcd_tree_handle_t : Handle to the decode tree. Handle value set to 0 if creation failed.
- */
-OCSD_C_API dcd_tree_handle_t ocsd_create_dcd_tree(const ocsd_dcd_tree_src_t src_type, const uint32_t deformatterCfgFlags);
-
-/*!
- * Destroy a decode tree.
- *
- * Also destroys all the associated processors and decoders for the tree.
- *
- * @param handle : Handle for decode tree to destroy.
- */
-OCSD_C_API void ocsd_destroy_dcd_tree(const dcd_tree_handle_t handle);
-
-/*!
- * Input trace data into the decoder.
- *
- * Large trace source buffers can be broken down into smaller fragments.
- *
- * @param handle : Handle to decode tree.
- * @param op : Datapath operation.
- * @param index : Trace buffer byte index for the start of the supplied data block.
- * @param dataBlockSize : Size of data block.
- * @param *pDataBlock : Pointer to data block.
- * @param *numBytesProcessed : Number of bytes actually processed by the decoder.
- *
- * @return ocsd_datapath_resp_t : Datapath response code (CONT/WAIT/FATAL)
- */
-OCSD_C_API ocsd_datapath_resp_t ocsd_dt_process_data(const dcd_tree_handle_t handle,
- const ocsd_datapath_op_t op,
- const ocsd_trc_index_t index,
- const uint32_t dataBlockSize,
- const uint8_t *pDataBlock,
- uint32_t *numBytesProcessed);
-
-
-/*---------------------- Generic Trace Element Output --------------------------------------------------------------*/
-
-/*!
- * Set the trace element output callback function.
- *
- * This function will be called for each decoded generic trace element generated by
- * any full trace decoder in the decode tree.
- *
- * A single function is used for all trace source IDs in the decode tree.
- *
- * @param handle : Handle to decode tree.
- * @param pFn : Pointer to the callback function.
- * @param p_context : opaque context pointer value used in callback function.
- *
- * @return ocsd_err_t : Library error code - OCSD_OK if successful.
- */
-OCSD_C_API ocsd_err_t ocsd_dt_set_gen_elem_outfn(const dcd_tree_handle_t handle, FnTraceElemIn pFn, const void *p_context);
-
-/*---------------------- Trace Decoders ----------------------------------------------------------------------------------*/
-/*!
-* Creates a decoder that is registered with the library under the supplied name.
-* Flags determine if a full packet processor / packet decoder pair or
-* packet processor only is created.
-* Uses the supplied configuration structure.
-*
-* @param handle : Handle to decode tree.
-* @param *decoder_name : Registered name of the decoder to create.
-* @param create_flags : Decoder creation options.
-* @param *decoder_cfg : Pointer to a valid configuration structure for the named decoder.
-* @param *pCSID : Pointer to location to return the configured CoreSight trace ID for the decoder.
-*
-* @return ocsd_err_t : Library error code - OCSD_OK if successful.
-*/
-OCSD_C_API ocsd_err_t ocsd_dt_create_decoder(const dcd_tree_handle_t handle,
- const char *decoder_name,
- const int create_flags,
- const void *decoder_cfg,
- unsigned char *pCSID
- );
-
-/*!
-* Remove a decoder from the tree and destroy it.
-*
-* @param handle : Handle to decode tree.
-* @param CSID : Configured CoreSight trace ID for the decoder.
-*
-* @return ocsd_err_t : Library error code - OCSD_OK if successful.
-*/
-OCSD_C_API ocsd_err_t ocsd_dt_remove_decoder( const dcd_tree_handle_t handle,
- const unsigned char CSID);
-
-
-/*!
-* Attach a callback function to the packet processor.
-*
-* The callback_type defines the attachment point, either the main packet output
-* (only if no decoder attached), or the packet monitor.
-*
-* @param handle : Handle to decode tree.
-* @param CSID : Configured CoreSight trace ID for the decoder.
-* @param callback_type : Attachment point
-* @param p_fn_pkt_data_in : Pointer to the callback function.
-* @param p_context : Opaque context pointer value used in callback function.
-*
-* @return ocsd_err_t : Library error code - OCSD_OK if successful.
-*/
-OCSD_C_API ocsd_err_t ocsd_dt_attach_packet_callback( const dcd_tree_handle_t handle,
- const unsigned char CSID,
- const ocsd_c_api_cb_types callback_type,
- void *p_fn_callback_data,
- const void *p_context);
-
-
-
-
-
-
-/** @}*/
-/*---------------------- Memory Access for traced opcodes ----------------------------------------------------------------------------------*/
-/** @name Library Memory Accessor configuration on decode tree.
- @brief Configure the memory regions available for decode.
-
- Full decode requires memory regions set up to allow access to the traced
- opcodes. Add memory buffers or binary file regions to a map of regions.
-
-@{*/
-
-/*!
- * Add a binary file based memory range accessor to the decode tree.
- *
- * Adds the entire binary file as a memory space to be accessed
- *
- * @param handle : Handle to decode tree.
- * @param address : Start address of memory area.
- * @param mem_space : Associated memory space.
- * @param *filepath : Path to binary data file.
- *
- * @return ocsd_err_t : Library error code - RCDTL_OK if successful.
- */
-OCSD_C_API ocsd_err_t ocsd_dt_add_binfile_mem_acc(const dcd_tree_handle_t handle, const ocsd_vaddr_t address, const ocsd_mem_space_acc_t mem_space, const char *filepath);
-
-/*!
- * Add a binary file based memory range accessor to the decode tree.
- *
- * Add a binary file that contains multiple regions of memory with differing
- * offsets wihtin the file.
- *
- * A linked list of file_mem_region_t structures is supplied. Each structure contains an
- * offset into the binary file, the start address for this offset and the size of the region.
- *
- * @param handle : Handle to decode tree.
- * @param region_list : Array of memory regions in the file.
- * @param num_regions : Size of region array
- * @param mem_space : Associated memory space.
- * @param *filepath : Path to binary data file.
- *
- * @return ocsd_err_t : Library error code - RCDTL_OK if successful.
- */
-OCSD_C_API ocsd_err_t ocsd_dt_add_binfile_region_mem_acc(const dcd_tree_handle_t handle, const ocsd_file_mem_region_t *region_array, const int num_regions, const ocsd_mem_space_acc_t mem_space, const char *filepath);
-
-/*!
- * Add a memory buffer based memory range accessor to the decode tree.
- *
- * @param handle : Handle to decode tree.
- * @param address : Start address of memory area.
- * @param mem_space : Associated memory space.
- * @param *p_mem_buffer : pointer to memory buffer.
- * @param mem_length : Size of memory buffer.
- *
- * @return ocsd_err_t : Library error code - RCDTL_OK if successful.
- */
-OCSD_C_API ocsd_err_t ocsd_dt_add_buffer_mem_acc(const dcd_tree_handle_t handle, const ocsd_vaddr_t address, const ocsd_mem_space_acc_t mem_space, const uint8_t *p_mem_buffer, const uint32_t mem_length);
-
-
-/*!
- * Add a memory access callback function. The decoder will call the function for opcode addresses in the
- * address range supplied for the memory spaces covered.
- *
- * @param handle : Handle to decode tree.
- * @param st_address : Start address of memory area covered by the callback.
- * @param en_address : End address of the memory area covered by the callback. (inclusive)
- * @param mem_space : Memory space(s) covered by the callback.
- * @param p_cb_func : Callback function
- * @param p_context : opaque context pointer value used in callback function.
- *
- * @return OCSD_C_API ocsd_err_t : Library error code - RCDTL_OK if successful.
- */
-OCSD_C_API ocsd_err_t ocsd_dt_add_callback_mem_acc(const dcd_tree_handle_t handle, const ocsd_vaddr_t st_address, const ocsd_vaddr_t en_address, const ocsd_mem_space_acc_t mem_space, Fn_MemAcc_CB p_cb_func, const void *p_context);
-
-
-/*!
- * Add a memory access callback function. The decoder will call the function for opcode addresses in the
- * address range supplied for the memory spaces covered.
- *
- * @param handle : Handle to decode tree.
- * @param st_address : Start address of memory area covered by the callback.
- * @param en_address : End address of the memory area covered by the callback. (inclusive)
- * @param mem_space : Memory space(s) covered by the callback.
- * @param p_cb_func : Callback function - Signature for CB with Trace ID passed to client.
- * @param p_context : opaque context pointer value used in callback function.
- *
- * @return OCSD_C_API ocsd_err_t : Library error code - RCDTL_OK if successful.
- */
-OCSD_C_API ocsd_err_t ocsd_dt_add_callback_trcid_mem_acc(const dcd_tree_handle_t handle, const ocsd_vaddr_t st_address, const ocsd_vaddr_t en_address, const ocsd_mem_space_acc_t mem_space, Fn_MemAccID_CB p_cb_func, const void *p_context);
-
-
-/*!
- * Remove a memory accessor by address and memory space.
- *
- * @param handle : Handle to decode tree.
- * @param st_address : Start address of memory accessor.
- * @param mem_space : Memory space(s) covered by the accessor.
- *
- * @return OCSD_C_API ocsd_err_t : Library error code - RCDTL_OK if successful.
- */
-OCSD_C_API ocsd_err_t ocsd_dt_remove_mem_acc(const dcd_tree_handle_t handle, const ocsd_vaddr_t st_address, const ocsd_mem_space_acc_t mem_space);
-
-/*
- * Print the mapped memory accessor ranges to the configured logger.
- *
- * @param handle : Handle to decode tree.
- */
-OCSD_C_API void ocsd_tl_log_mapped_mem_ranges(const dcd_tree_handle_t handle);
-
-/** @}*/
-
-/** @name Library Default Error Log Object API
- @brief Configure the default error logging object in the library.
-
- Objects created by the decode trees will use this error logger. Configure for
- desired error severity, and to enable print or logfile output.
-
-@{*/
-
-/*---------------------- Library Logging and debug ----------------------------------------------------------------------------------*/
-/*!
- * Initialise the library error logger.
- *
- * Choose severity of errors logger, and if the errors will be logged to screen and / or logfile.
- *
- * @param verbosity : Severity of errors that will be logged.
- * @param create_output_logger : Set to none-zero to create an output printer.
- *
- * @return ocsd_err_t : Library error code - RCDTL_OK if successful.
- */
-OCSD_C_API ocsd_err_t ocsd_def_errlog_init(const ocsd_err_severity_t verbosity, const int create_output_logger);
-
-/*!
- * Configure the output logger. Choose STDOUT, STDERR and/or log to file.
- * Optionally provide a log file name.
- *
- * @param output_flags : OR combination of required C_API_MSGLOGOUT_FLG_* flags.
- * @param *log_file_name : optional filename if logging to file. Set to NULL if not needed.
- *
- * @return OCSD_C_API ocsd_err_t : Library error code - RCDTL_OK if successful.
- */
-OCSD_C_API ocsd_err_t ocsd_def_errlog_config_output(const int output_flags, const char *log_file_name);
-
-/*!
- * Configure the library default error logger to send all strings it is outputting back to the client
- * to allow printing within the client application. This is in additional to any other log destinations
- * set in ocsd_def_errlog_init().
- *
- * @param *p_context : opaque context pointer
- * @param p_str_print_cb : client callback function to "print" logstring.
- */
-OCSD_C_API ocsd_err_t ocsd_def_errlog_set_strprint_cb(const dcd_tree_handle_t handle, void *p_context, FnDefLoggerPrintStrCB p_str_print_cb);
-
-/*!
- * Print a message via the library output printer - if enabled.
- *
- * @param *msg : Message to output.
- *
- */
-OCSD_C_API void ocsd_def_errlog_msgout(const char *msg);
-
-
-/** @}*/
-
-/** @name Packet to string interface
-
-@{*/
-
-/*!
- * Take a packet structure and render a string representation of the packet data.
- *
- * Returns a '0' terminated string of (buffer_size - 1) length or less.
- *
- * @param pkt_protocol : Packet protocol type - used to interpret the packet pointer
- * @param *p_pkt : pointer to a valid packet structure of protocol type. cast to void *.
- * @param *buffer : character buffer for string.
- * @param buffer_size : size of character buffer.
- *
- * @return ocsd_err_t : Library error code - RCDTL_OK if successful.
- */
-OCSD_C_API ocsd_err_t ocsd_pkt_str(const ocsd_trace_protocol_t pkt_protocol, const void *p_pkt, char *buffer, const int buffer_size);
-
-/*!
- * Get a string representation of the generic trace element.
- *
- * @param *p_pkt : pointer to valid generic element structure.
- * @param *buffer : character buffer for string.
- * @param buffer_size : size of character buffer.
- *
- * @return ocsd_err_t : Library error code - RCDTL_OK if successful.
- */
-OCSD_C_API ocsd_err_t ocsd_gen_elem_str(const ocsd_generic_trace_elem *p_pkt, char *buffer, const int buffer_size);
-
-
-/*!
- * Init a generic element with type, clearing any flags etc.
- */
-OCSD_C_API void ocsd_gen_elem_init(ocsd_generic_trace_elem *p_pkt, const ocsd_gen_trc_elem_t elem_type);
-
-/** @}*/
-
-/** @name Library packet and data printer control API
- @brief Allows client to use libraries packet and data printers to log packets etc rather than attach callbacks
- to packet output and use packet to string calls.
-@{*/
-
-/*!
- * Set a raw frame printer on the trace frame demuxer. Allows inspection of raw trace data frames for debug.
- * Prints via the library default error logging mechanisms.
- *
- * The flags input determines the data printed. OR combination of one or both of:
- * OCSD_DFRMTR_PACKED_RAW_OUT : Output the undemuxed raw data frames.
- * OCSD_DFRMTR_UNPACKED_RAW_OUT : Output the raw data by trace ID after unpacking the frame.
- *
- * @param handle : Handle to decode tree.
- * @param flags : indicates type of raw frames to print.
- *
- * @return ocsd_err_t : Library error code - RCDTL_OK if successful.
- */
-OCSD_C_API ocsd_err_t ocsd_dt_set_raw_frame_printer(const dcd_tree_handle_t handle, int flags);
-
-/*!
- * Set a library printer on the generic element output of a full decoder.
- *
- * @param handle : Handle to decode tree.
- *
- * @return ocsd_err_t : Library error code - RCDTL_OK if successful.
- */
-OCSD_C_API ocsd_err_t ocsd_dt_set_gen_elem_printer(const dcd_tree_handle_t handle);
-
-/*!
- * Attach a library printer to the packet processor. May be attached to the main packet output, or the monitor
- * output if the main packet output is to be attached to a packet decoder in the datapath.
- *
- * @param handle : Handle to decode tree.
- * @param cs_id : Coresight trace ID for stream to print.
- * @param monitor: 0 to attach printer directly to datapath packet output, 1 to attach to packet monitor output
- *
- * @return ocsd_err_t : Library error code - RCDTL_OK if successful.
- */
-OCSD_C_API ocsd_err_t ocsd_dt_set_pkt_protocol_printer(const dcd_tree_handle_t handle, uint8_t cs_id, int monitor);
-
-/** @}*/
-
-
-/** @name Custom Decoder API functions
-
-@{*/
-
-/** Register a custom decoder with the library
-
- @param *name : Name under which to register the decoder.
- @param *p_dcd_fact : Custom decoder factory structure.
-
- @return ocsd_err_t : Library error code - RCDTL_OK if successful.
-*/
-OCSD_C_API ocsd_err_t ocsd_register_custom_decoder(const char *name, ocsd_extern_dcd_fact_t *p_dcd_fact);
-
-/** Clear all registered decoders - library cleanup
-
- @return ocsd_err_t : Library error code - RCDTL_OK if successful.
-*/
-OCSD_C_API ocsd_err_t ocsd_deregister_decoders(void);
-
-/** Get a string representation of a custom protocol packet.
-
- Specific function to extract the packet string for a custom protocol ID only. Custom IDs are allocated to decoder factories
- during the ocsd_register_custom_decoder() process.
-
- This function is called by ocsd_pkt_str() when the incoming protocol is a custom ID.
-
- @param pkt_protocol : Packet protocol type - must be in the custom ID range ( >= OCSD_PROTOCOL_CUSTOM_0, < OCSD_PROTOCOL_END)
- @param *p_pkt : pointer to a valid packet structure of protocol type. cast to void *.
- @param *buffer : character buffer for string.
- @param buffer_size : size of character buffer.
-
- @return ocsd_err_t : Library error code - RCDTL_OK if successful, OCSD_ERR_NO_PROTOCOL if input ID not in custom range or not in use.
-*/
-OCSD_C_API ocsd_err_t ocsd_cust_protocol_to_str(const ocsd_trace_protocol_t pkt_protocol, const void *trc_pkt, char *buffer, const int buflen);
-
-/** @}*/
-
-
-/** @}*/
-
-#endif // ARM_OPENCSD_C_API_H_INCLUDED
-
-/* End of File opencsd_c_api.h */
diff --git a/contrib/opencsd/decoder/include/opencsd/etmv3/etmv3_decoder.h b/contrib/opencsd/decoder/include/opencsd/etmv3/etmv3_decoder.h
deleted file mode 100644
index 2d5b7281aed6..000000000000
--- a/contrib/opencsd/decoder/include/opencsd/etmv3/etmv3_decoder.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * \file etmv3_decoder.h
- * \brief OpenCSD : Top level header file for ETMv3 decoder
- *
- * \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.
- */
-
-#ifndef ARM_ETMV3_DECODER_H_INCLUDED
-#define ARM_ETMV3_DECODER_H_INCLUDED
-
-#include "opencsd/etmv3/trc_cmp_cfg_etmv3.h"
-#include "opencsd/etmv3/trc_pkt_elem_etmv3.h"
-#include "opencsd/etmv3/trc_pkt_proc_etmv3.h"
-#include "opencsd/etmv3/trc_pkt_types_etmv3.h"
-#include "opencsd/etmv3/trc_pkt_decode_etmv3.h"
-
-#endif // ARM_ETMV3_DECODER_H_INCLUDED
-
-/* End of File etmv3_decoder.h */
diff --git a/contrib/opencsd/decoder/include/opencsd/etmv3/trc_cmp_cfg_etmv3.h b/contrib/opencsd/decoder/include/opencsd/etmv3/trc_cmp_cfg_etmv3.h
deleted file mode 100644
index 509de204a4e6..000000000000
--- a/contrib/opencsd/decoder/include/opencsd/etmv3/trc_cmp_cfg_etmv3.h
+++ /dev/null
@@ -1,235 +0,0 @@
-/*
- * \file trc_cmp_cfg_etmv3.h
- * \brief OpenCSD :
- *
- * \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.
- */
-
-#ifndef ARM_TRC_CMP_CFG_ETMV3_H_INCLUDED
-#define ARM_TRC_CMP_CFG_ETMV3_H_INCLUDED
-
-#include "trc_pkt_types_etmv3.h"
-#include "common/trc_cs_config.h"
-
-
-/** @addtogroup ocsd_protocol_cfg
-@{*/
-
-/** @name ETMV3 configuration
-@{*/
-
-
-/*!
- * @class EtmV3Config
- * @brief Interpreter class for etm v3 config structure.
- *
- * Provides quick value interpretation methods for the ETMv3 config register values.
- * Primarily inlined for efficient code.
- *
- */
-class EtmV3Config : public CSConfig
-{
-public:
- EtmV3Config(); /**< Default constructor */
- EtmV3Config(const ocsd_etmv3_cfg *cfg_regs);
- ~EtmV3Config() {}; /**< Default destructor */
-
- /* register bit constants. */
- static const uint32_t CTRL_DATAVAL = 0x4;
- static const uint32_t CTRL_DATAADDR = 0x8;
- static const uint32_t CTRL_CYCLEACC = 0x1000;
- static const uint32_t CTRL_DATAONLY = 0x100000;
- static const uint32_t CTRL_TS_ENA = (0x1 << 28);
- static const uint32_t CTRL_VMID_ENA = (0x1 << 30);
-
- static const uint32_t CCER_HAS_TS = (0x1 << 22);
- static const uint32_t CCER_VIRTEXT = (0x1 << 26);
- static const uint32_t CCER_TS64BIT = (0x1 << 29);
-
- static const uint32_t IDR_ALTBRANCH = 0x100000;
-
-// operations to convert to and from C-API structure
-
- //! copy assignment operator for C-API base structure into class.
- EtmV3Config & operator=(const ocsd_etmv3_cfg *p_cfg);
-
- //! cast operator returning struct const reference
- operator const ocsd_etmv3_cfg &() const { return m_cfg; };
- //! cast operator returning struct const pointer
- operator const ocsd_etmv3_cfg *() const { return &m_cfg; };
-
- //! combination enum to describe trace mode.
- enum EtmTraceMode {
- TM_INSTR_ONLY, //!< instruction only trace
- TM_I_DATA_VAL, //!< instruction + data value
- TM_I_DATA_ADDR, //!< instruction + data address
- TM_I_DATA_VAL_ADDR, //!< instr + data value + data address
- TM_DATAONLY_VAL, //!< data value trace
- TM_DATAONLY_ADDR, //!< data address trace
- TM_DATAONLY_VAL_ADDR //!< data value + address trace
- };
-
- EtmTraceMode const GetTraceMode() const; //!< return trace mode
-
- const bool isInstrTrace() const; //!< instruction trace present.
- const bool isDataValTrace() const; //!< data value trace present.
- const bool isDataAddrTrace() const; //!< data address trace present.
- const bool isDataTrace() const; //!< either or both data trace types present.
-
- const bool isCycleAcc() const; //!< return true if cycle accurate tracing enabled.
-
- const int MinorRev() const; //!< return X revision in 3.X
-
- const bool isV7MArch() const; //!< source is V7M architecture
- const bool isAltBranch() const; //!< Alternate branch packet encoding used.
-
- const int CtxtIDBytes() const; //!< number of context ID bytes traced 1,2,4;
- const bool hasVirtExt() const; //!< processor has virtualisation extensions.
- const bool isVMIDTrace() const; //!< VMID tracing enabled.
-
- const bool hasTS() const; //!< Timestamps implemented in trace.
- const bool isTSEnabled() const; //!< Timestamp trace is enabled.
- const bool TSPkt64() const; //!< timestamp packet is 64 bits in size.
-
- virtual const uint8_t getTraceID() const; //!< CoreSight Trace ID for this device.
-
- const ocsd_arch_version_t getArchVersion() const; //!< architecture version
- const ocsd_core_profile_t getCoreProfile() const; //!< core profile.
-
-private:
- ocsd_etmv3_cfg m_cfg;
-
-};
-
-
-/* inlines for the bit interpretations */
-
-inline EtmV3Config & EtmV3Config::operator=(const ocsd_etmv3_cfg *p_cfg)
-{
- m_cfg = *p_cfg;
- return *this;
-}
-
-inline const bool EtmV3Config::isCycleAcc() const
-{
- return (bool)((m_cfg.reg_ctrl & CTRL_CYCLEACC) != 0);
-}
-
-//! return X revision in 3.X
-inline const int EtmV3Config::MinorRev() const
-{
- return ((int)m_cfg.reg_idr & 0xF0) >> 4;
-}
-
-inline const bool EtmV3Config::isInstrTrace() const
-{
- return (bool)((m_cfg.reg_ctrl & CTRL_DATAONLY) == 0);
-}
-
-inline const bool EtmV3Config::isDataValTrace() const
-{
- return (bool)((m_cfg.reg_ctrl & CTRL_DATAVAL) != 0);
-}
-
-inline const bool EtmV3Config::isDataAddrTrace() const
-{
- return (bool)((m_cfg.reg_ctrl & CTRL_DATAADDR) != 0);
-}
-
-//! either or both data trace present
-inline const bool EtmV3Config::isDataTrace() const
-{
- return (bool)((m_cfg.reg_ctrl & (CTRL_DATAADDR | CTRL_DATAVAL)) != 0);
-}
-
-inline const bool EtmV3Config::isV7MArch() const
-{
- return (bool)((m_cfg.arch_ver == ARCH_V7) && (m_cfg.core_prof == profile_CortexM));
-}
-
-//! has alternate branch encoding
-inline const bool EtmV3Config::isAltBranch() const
-{
- return (bool)(((m_cfg.reg_idr & IDR_ALTBRANCH) != 0) && (MinorRev() >= 4));
-}
-
-//! processor implements virtualisation extensions.
-inline const bool EtmV3Config::hasVirtExt() const
-{
- return (bool)((m_cfg.reg_ccer & CCER_VIRTEXT) != 0);
-}
-
-//! TS packet is 64 bit.
-inline const bool EtmV3Config::TSPkt64() const
-{
- return (bool)((m_cfg.reg_ccer & CCER_TS64BIT) != 0);
-}
-
-//! TS implemented.
-inline const bool EtmV3Config::hasTS() const
-{
- return (bool)((m_cfg.reg_ccer & CCER_HAS_TS) != 0);
-}
-
-//! TS is enabled in the trace
-inline const bool EtmV3Config::isTSEnabled() const
-{
- return (bool)((m_cfg.reg_ctrl & CTRL_TS_ENA) != 0);
-}
-
-//! tracing VMID
-inline const bool EtmV3Config::isVMIDTrace() const
-{
- return (bool)((m_cfg.reg_ctrl & CTRL_VMID_ENA) != 0);
-}
-
-inline const uint8_t EtmV3Config::getTraceID() const
-{
- return (uint8_t)(m_cfg.reg_trc_id & 0x7F);
-}
-
-inline const ocsd_arch_version_t EtmV3Config::getArchVersion() const
-{
- return m_cfg.arch_ver;
-}
-
-inline const ocsd_core_profile_t EtmV3Config::getCoreProfile() const
-{
- return m_cfg.core_prof;
-}
-
-/** @}*/
-
-/** @}*/
-
-#endif // ARM_TRC_CMP_CFG_ETMV3_H_INCLUDED
-
-/* End of File trc_cmp_cfg_etmv3.h */
diff --git a/contrib/opencsd/decoder/include/opencsd/etmv3/trc_dcd_mngr_etmv3.h b/contrib/opencsd/decoder/include/opencsd/etmv3/trc_dcd_mngr_etmv3.h
deleted file mode 100644
index c3a96ffcb5ee..000000000000
--- a/contrib/opencsd/decoder/include/opencsd/etmv3/trc_dcd_mngr_etmv3.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * \file trc_dcd_mngr_etmv3.h
- * \brief OpenCSD : ETMv3 decoder manager / handler specialisation
- *
- * \copyright Copyright (c) 2016, 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.
- */
-#ifndef ARM_TRC_DCD_MNGR_ETMV3_H_INCLUDED
-#define ARM_TRC_DCD_MNGR_ETMV3_H_INCLUDED
-
-#include "common/ocsd_dcd_mngr.h"
-#include "trc_pkt_decode_etmv3.h"
-#include "trc_pkt_proc_etmv3.h"
-#include "trc_cmp_cfg_etmv3.h"
-#include "trc_pkt_types_etmv3.h"
-
-class DecoderMngrEtmV3 : public DecodeMngrFullDcd< EtmV3TrcPacket,
- ocsd_etmv3_pkt_type,
- EtmV3Config,
- ocsd_etmv3_cfg,
- TrcPktProcEtmV3,
- TrcPktDecodeEtmV3>
-{
-public:
- DecoderMngrEtmV3(const std::string &name) : DecodeMngrFullDcd(name,OCSD_PROTOCOL_ETMV3) {};
- virtual ~DecoderMngrEtmV3() {};
-};
-
-#endif // ARM_TRC_DCD_MNGR_ETMV3_H_INCLUDED
-
-/* End of File trc_dcd_mngr_etmv3.h */
diff --git a/contrib/opencsd/decoder/include/opencsd/etmv3/trc_pkt_decode_etmv3.h b/contrib/opencsd/decoder/include/opencsd/etmv3/trc_pkt_decode_etmv3.h
deleted file mode 100644
index b2139c0d9e68..000000000000
--- a/contrib/opencsd/decoder/include/opencsd/etmv3/trc_pkt_decode_etmv3.h
+++ /dev/null
@@ -1,274 +0,0 @@
-/*!
- * \file trc_pkt_decode_etmv3.h
- * \brief OpenCSD : ETMv3 decode
- *
- * \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.
- */
-
-#ifndef ARM_TRC_PKT_DECODE_ETMV3_H_INCLUDED
-#define ARM_TRC_PKT_DECODE_ETMV3_H_INCLUDED
-
-#include "common/trc_pkt_decode_base.h"
-#include "common/trc_gen_elem.h"
-#include "common/ocsd_pe_context.h"
-#include "common/ocsd_code_follower.h"
-#include "common/ocsd_gen_elem_list.h"
-
-#include "opencsd/etmv3/trc_pkt_elem_etmv3.h"
-#include "opencsd/etmv3/trc_cmp_cfg_etmv3.h"
-
-/**************** Atom handling class **************************************/
-class Etmv3Atoms
-{
-public:
- Etmv3Atoms(const bool isCycleAcc);
- ~Etmv3Atoms() {};
-
- //! initialise the atom and index values
- void initAtomPkt(const EtmV3TrcPacket *in_pkt, const ocsd_trc_index_t &root_index);
-
- const ocsd_atm_val getCurrAtomVal() const;
- const int numAtoms() const; //!< number of atoms
- const ocsd_trc_index_t pktIndex() const; //!< originating packet index
-
- const bool hasAtomCC() const; //!< cycle count for current atom?
- const uint32_t getAtomCC() const; //!< cycle count for current atom
- const uint32_t getRemainCC() const; //!< get residual cycle count for remaining atoms
-
- void clearAtom(); //!< clear the current atom, set the next.
- void clearAll(); //!< clear all
-
-private:
-
- // Atom PHDR packet formats from ETMv3 spec - defines content of header.
- enum {
- ATOM_PHDR_FMT_1 = 1,
- ATOM_PHDR_FMT_2,
- ATOM_PHDR_FMT_3,
- ATOM_PHDR_FMT_4,
- };
-
-
-
- ocsd_pkt_atom m_atom; /**< atom elements - non zero number indicates valid atom count */
- uint8_t m_p_hdr_fmt; /**< if atom elements, associated phdr format */
- uint32_t m_cycle_count;
- ocsd_trc_index_t m_root_index; //!< root index for the atom packet
- bool m_isCCPacket;
-};
-
-
-inline Etmv3Atoms::Etmv3Atoms(const bool isCycleAcc)
-{
- m_isCCPacket = isCycleAcc;
-}
-
-//! initialise the atom and index values
-inline void Etmv3Atoms::initAtomPkt(const EtmV3TrcPacket *in_pkt, const ocsd_trc_index_t &root_index)
-{
- m_atom = in_pkt->getAtom();
- m_p_hdr_fmt = in_pkt->getPHdrFmt();
- m_cycle_count = in_pkt->getCycleCount();
-}
-
-inline const ocsd_atm_val Etmv3Atoms::getCurrAtomVal() const
-{
- return (m_atom.En_bits & 0x1) ? ATOM_E : ATOM_N;
-}
-
-inline const int Etmv3Atoms::numAtoms() const
-{
- return m_atom.num;
-}
-
-inline const ocsd_trc_index_t Etmv3Atoms::pktIndex() const
-{
- return m_root_index;
-}
-
-inline const bool Etmv3Atoms::hasAtomCC() const
-{
- bool hasCC = false;
- if(!m_isCCPacket)
- return hasCC;
-
- switch(m_p_hdr_fmt)
- {
- case ATOM_PHDR_FMT_4:
- default:
- break;
-
- case ATOM_PHDR_FMT_3:
- case ATOM_PHDR_FMT_1:
- hasCC = true;
- break;
-
- case ATOM_PHDR_FMT_2:
- hasCC = (m_atom.num > 1); // first of 2 has W state
- break;
- }
- return hasCC;
-}
-
-inline const uint32_t Etmv3Atoms::getAtomCC() const
-{
- uint32_t CC = 0;
- if(!m_isCCPacket)
- return CC;
-
- switch(m_p_hdr_fmt)
- {
- case ATOM_PHDR_FMT_4: // no CC in format 4
- default:
- break;
-
- case ATOM_PHDR_FMT_3: // single CC with optional E atom
- CC = m_cycle_count;
- break;
-
- case ATOM_PHDR_FMT_2: // single W on first of 2 atoms
- CC = (m_atom.num > 1) ? 1: 0;
- break;
-
- case ATOM_PHDR_FMT_1: // each atom has 1 CC.
- CC = 1;
- break;
- }
- return CC;
-}
-
-inline const uint32_t Etmv3Atoms::getRemainCC() const
-{
- uint32_t CC = 0;
- if(!m_isCCPacket)
- return CC;
-
- switch(m_p_hdr_fmt)
- {
- case ATOM_PHDR_FMT_4: // no CC in format 4
- default:
- break;
-
- case ATOM_PHDR_FMT_3:
- CC = m_cycle_count;
- break;
-
- case ATOM_PHDR_FMT_2:
- CC = (m_atom.num > 1) ? 1: 0;
- break;
-
- case ATOM_PHDR_FMT_1:
- CC = m_atom.num;
- break;
- }
- return CC;
-}
-
-inline void Etmv3Atoms::clearAtom()
-{
- m_atom.En_bits >>=1;
- if(m_atom.num)
- m_atom.num--;
-}
-
-inline void Etmv3Atoms::clearAll()
-{
- m_atom.num = 0;
-}
-
-/********** Main decode class ****************************************************/
-class TrcPktDecodeEtmV3 : public TrcPktDecodeBase<EtmV3TrcPacket, EtmV3Config>
-{
-public:
- TrcPktDecodeEtmV3();
- TrcPktDecodeEtmV3(int instIDNum);
- virtual ~TrcPktDecodeEtmV3();
-
-protected:
- /* implementation packet decoding interface */
- virtual ocsd_datapath_resp_t processPacket();
- virtual ocsd_datapath_resp_t onEOT();
- virtual ocsd_datapath_resp_t onReset();
- virtual ocsd_datapath_resp_t onFlush();
- virtual ocsd_err_t onProtocolConfig();
- virtual const uint8_t getCoreSightTraceID() { return m_CSID; };
-
- /* local decode methods */
- void initDecoder(); //!< initial state on creation (zeros all config)
- void resetDecoder(); //!< reset state to start of decode. (moves state, retains config)
-
- ocsd_datapath_resp_t decodePacket(bool &pktDone); //!< decode a packet
-
- ocsd_datapath_resp_t processISync(const bool withCC, const bool firstSync = false);
- ocsd_datapath_resp_t processBranchAddr();
- ocsd_datapath_resp_t processPHdr();
-
- ocsd_datapath_resp_t sendUnsyncPacket(); //!< send an initial unsync packet when decoder starts
-
- OcsdTraceElement *GetNextOpElem(ocsd_datapath_resp_t &resp); //!< get the next element from the element list.
-
-private:
- void setNeedAddr(bool bNeedAddr);
- void pendExceptionReturn();
- bool preISyncValid(ocsd_etmv3_pkt_type pkt_type);
-//** intra packet state;
-
- OcsdCodeFollower m_code_follower; //!< code follower for instruction trace
-
- ocsd_vaddr_t m_IAddr; //!< next instruction address
- bool m_bNeedAddr; //!< true if an address is needed (current out of date / invalid)
- bool m_bSentUnknown; //!< true if we have sent an unknown address packet for this phase of needing an address.
- bool m_bWaitISync; //!< true if waiting for first ISync packet
-
- OcsdPeContext m_PeContext; //!< save context data before sending in output packet
-
- OcsdGenElemList m_outputElemList; //!< list of output elements
-
-
-//** Other packet decoder state;
-
- // trace decode FSM
- typedef enum {
- NO_SYNC, //!< pre start trace - init state or after reset or overflow, loss of sync.
- WAIT_ASYNC, //!< waiting for a-sync packet.
- WAIT_ISYNC, //!< waiting for i-sync packet.
- DECODE_PKTS, //!< processing a packet
- SEND_PKTS, //!< sending packets.
- } processor_state_t;
-
- processor_state_t m_curr_state;
-
- uint8_t m_CSID; //!< Coresight trace ID for this decoder.
-};
-
-
-#endif // ARM_TRC_PKT_DECODE_ETMV3_H_INCLUDED
-
-/* End of File trc_pkt_decode_etmv3.h */
diff --git a/contrib/opencsd/decoder/include/opencsd/etmv3/trc_pkt_elem_etmv3.h b/contrib/opencsd/decoder/include/opencsd/etmv3/trc_pkt_elem_etmv3.h
deleted file mode 100644
index a874ea30c861..000000000000
--- a/contrib/opencsd/decoder/include/opencsd/etmv3/trc_pkt_elem_etmv3.h
+++ /dev/null
@@ -1,261 +0,0 @@
-/*
- * \file trc_pkt_elem_etmv3.h
- * \brief OpenCSD :
- *
- * \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.
- */
-
-#ifndef ARM_TRC_PKT_ELEM_ETMV3_H_INCLUDED
-#define ARM_TRC_PKT_ELEM_ETMV3_H_INCLUDED
-
-#include "trc_pkt_types_etmv3.h"
-#include "common/trc_printable_elem.h"
-#include "common/trc_pkt_elem_base.h"
-
-/** @addtogroup trc_pkts
-@{*/
-
-/*!
- * @class EtmV3TrcPacket
- * @brief ETMv3 Trace Protocol Packet.
- *
- * This class represents a single ETMv3 trace packet, along with intra packet state.
- *
- */
-class EtmV3TrcPacket : public TrcPacketBase, public trcPrintableElem
-{
-public:
- EtmV3TrcPacket();
- ~EtmV3TrcPacket();
-
-// conversions between C-API struct and C++ object types
- // assign from C-API struct
- EtmV3TrcPacket &operator =(const ocsd_etmv3_pkt* p_pkt);
-
- // allow const cast to C-API struct to pass C++ object
- operator const ocsd_etmv3_pkt*() const { return &m_pkt_data; };
- operator const ocsd_etmv3_pkt&() const { return m_pkt_data; };
-
- // override c_pkt to pass out the packet data struct.
- virtual const void *c_pkt() const { return &m_pkt_data; };
-
-// update interface - set packet values
- void Clear(); //!< clear update data in packet ready for new one.
- void ResetState(); //!< reset intra packet state data -on full decoder reset.
-
- void SetType(const ocsd_etmv3_pkt_type p_type);
- void SetErrType(const ocsd_etmv3_pkt_type e_type);
- void UpdateAddress(const ocsd_vaddr_t partAddrVal, const int updateBits);
- void SetException( const ocsd_armv7_exception type,
- const uint16_t number,
- const bool cancel,
- const bool cm_type,
- const int irq_n = 0,
- const int resume = 0);
- void UpdateNS(const int NS);
- void UpdateAltISA(const int AltISA);
- void UpdateHyp(const int Hyp);
- void UpdateISA(const ocsd_isa isa);
- void UpdateContextID(const uint32_t contextID);
- void UpdateVMID(const uint8_t VMID);
- void UpdateTimestamp(const uint64_t tsVal, const uint8_t updateBits);
-
- bool UpdateAtomFromPHdr(const uint8_t pHdr, const bool cycleAccurate); //!< Interpret P Hdr, return true if valid, false if not.
-
- void SetDataOOOTag(const uint8_t tag);
- void SetDataValue(const uint32_t value);
- void UpdateDataAddress(const uint32_t value, const uint8_t valid_bits);
- void UpdateDataEndian(const uint8_t BE_Val);
- void SetCycleCount(const uint32_t cycleCount);
- void SetISyncReason(const ocsd_iSync_reason reason);
- void SetISyncHasCC();
- void SetISyncIsLSiP();
- void SetISyncNoAddr();
-
-// packet status interface - get packet info.
- const ocsd_etmv3_pkt_type getType() const { return m_pkt_data.type; };
- const bool isBadPacket() const;
-
- const int AltISA() const { return m_pkt_data.context.curr_alt_isa; };
- const ocsd_isa ISA() const { return m_pkt_data.curr_isa; };
- const bool changedISA() const { return m_pkt_data.curr_isa != m_pkt_data.prev_isa; };
-
- // any of the context elements updated?
- const bool isCtxtUpdated() const;
- const bool isCtxtFlagsUpdated() const { return (m_pkt_data.context.updated == 1); };
- const bool isNS() const { return m_pkt_data.context.curr_NS; };
- const bool isHyp() const { return m_pkt_data.context.curr_Hyp; };
-
- const bool isCtxtIDUpdated() const { return (m_pkt_data.context.updated_c == 1); }
- const uint32_t getCtxtID() const { return m_pkt_data.context.ctxtID; };
- const bool isVMIDUpdated() const { return (m_pkt_data.context.updated_v == 1); }
- const uint32_t getVMID() const { return m_pkt_data.context.VMID; };
-
- const uint32_t getCycleCount() const { return m_pkt_data.cycle_count; };
- const uint64_t getTS() const { return m_pkt_data.timestamp; };
-
- const bool isExcepPkt() const { return (m_pkt_data.exception.bits.present == 1); };
- const ocsd_armv7_exception excepType() const { return m_pkt_data.exception.type; };
- const uint16_t excepNum() const { return m_pkt_data.exception.number; };
- const bool isExcepCancel() const { return (m_pkt_data.exception.bits.present == 1) && (m_pkt_data.exception.bits.cancel == 1); };
-
- const ocsd_iSync_reason getISyncReason() const { return m_pkt_data.isync_info.reason; };
- const bool getISyncHasCC() const { return m_pkt_data.isync_info.has_cycle_count; };
- const bool getISyncIsLSiPAddr() const { return m_pkt_data.isync_info.has_LSipAddress; };
- const bool getISyncNoAddr() const { return m_pkt_data.isync_info.no_address; };
-
- const ocsd_vaddr_t getAddr() const { return m_pkt_data.addr.val; };
- const ocsd_vaddr_t getDataAddr() const { return m_pkt_data.data.addr.val; };
-
- const ocsd_pkt_atom &getAtom() const { return m_pkt_data.atom; };
- const uint8_t getPHdrFmt() const { return m_pkt_data.p_hdr_fmt; };
-
-
-// printing
- virtual void toString(std::string &str) const;
- virtual void toStringFmt(const uint32_t fmtFlags, std::string &str) const;
-
-private:
- const char *packetTypeName(const ocsd_etmv3_pkt_type type, const char **ppDesc) const;
- void getBranchAddressStr(std::string &valStr) const;
- void getAtomStr(std::string &valStr) const;
- void getISyncStr(std::string &valStr) const;
- void getISAStr(std::string &isaStr) const;
- void getExcepStr(std::string &excepStr) const;
-
- ocsd_etmv3_pkt m_pkt_data;
-};
-
-inline void EtmV3TrcPacket::UpdateNS(const int NS)
-{
- m_pkt_data.context.curr_NS = NS;
- m_pkt_data.context.updated = 1;
-};
-
-inline void EtmV3TrcPacket::UpdateAltISA(const int AltISA)
-{
- m_pkt_data.context.curr_alt_isa = AltISA;
- m_pkt_data.context.updated = 1;
-}
-
-inline void EtmV3TrcPacket::UpdateHyp(const int Hyp)
-{
- m_pkt_data.context.curr_Hyp = Hyp;
- m_pkt_data.context.updated = 1;
-}
-
-inline void EtmV3TrcPacket::UpdateISA(const ocsd_isa isa)
-{
- m_pkt_data.prev_isa = m_pkt_data.curr_isa;
- m_pkt_data.curr_isa = isa;
-}
-
-inline void EtmV3TrcPacket::SetType(const ocsd_etmv3_pkt_type p_type)
-{
- m_pkt_data.type = p_type;
-}
-
-inline void EtmV3TrcPacket::SetErrType(const ocsd_etmv3_pkt_type e_type)
-{
- m_pkt_data.err_type = m_pkt_data.type;
- m_pkt_data.type = e_type;
-}
-
-inline const bool EtmV3TrcPacket::isBadPacket() const
-{
- return (m_pkt_data.type >= ETM3_PKT_BAD_SEQUENCE);
-}
-
-inline void EtmV3TrcPacket::SetDataOOOTag(const uint8_t tag)
-{
- m_pkt_data.data.ooo_tag = tag;
-}
-
-inline void EtmV3TrcPacket::SetDataValue(const uint32_t value)
-{
- m_pkt_data.data.value = value;
- m_pkt_data.data.update_dval = 1;
-}
-
-inline void EtmV3TrcPacket::UpdateContextID(const uint32_t contextID)
-{
- m_pkt_data.context.updated_c = 1;
- m_pkt_data.context.ctxtID = contextID;
-}
-
-inline void EtmV3TrcPacket::UpdateVMID(const uint8_t VMID)
-{
- m_pkt_data.context.updated_v = 1;
- m_pkt_data.context.VMID = VMID;
-}
-
-inline void EtmV3TrcPacket::UpdateDataEndian(const uint8_t BE_Val)
-{
- m_pkt_data.data.be = BE_Val;
- m_pkt_data.data.update_be = 1;
-}
-
-inline void EtmV3TrcPacket::SetCycleCount(const uint32_t cycleCount)
-{
- m_pkt_data.cycle_count = cycleCount;
-}
-
-inline void EtmV3TrcPacket::SetISyncReason(const ocsd_iSync_reason reason)
-{
- m_pkt_data.isync_info.reason = reason;
-}
-
-inline void EtmV3TrcPacket::SetISyncHasCC()
-{
- m_pkt_data.isync_info.has_cycle_count = 1;
-}
-
-inline void EtmV3TrcPacket::SetISyncIsLSiP()
-{
- m_pkt_data.isync_info.has_LSipAddress = 1;
-}
-
-inline void EtmV3TrcPacket::SetISyncNoAddr()
-{
- m_pkt_data.isync_info.no_address = 1;
-}
-
-inline const bool EtmV3TrcPacket::isCtxtUpdated() const
-{
- return (m_pkt_data.context.updated_v == 1) ||
- (m_pkt_data.context.updated == 1) ||
- (m_pkt_data.context.updated_c == 1);
-}
-
-/** @}*/
-#endif // ARM_TRC_PKT_ELEM_ETMV3_H_INCLUDED
-
-/* End of File trc_pkt_elem_etmv3.h */
diff --git a/contrib/opencsd/decoder/include/opencsd/etmv3/trc_pkt_proc_etmv3.h b/contrib/opencsd/decoder/include/opencsd/etmv3/trc_pkt_proc_etmv3.h
deleted file mode 100644
index 5a7f959df4aa..000000000000
--- a/contrib/opencsd/decoder/include/opencsd/etmv3/trc_pkt_proc_etmv3.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * \file trc_pkt_proc_etmv3.h
- * \brief OpenCSD :
- *
- * \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.
- */
-
-#ifndef ARM_TRC_PKT_PROC_ETMV3_H_INCLUDED
-#define ARM_TRC_PKT_PROC_ETMV3_H_INCLUDED
-
-#include "trc_pkt_types_etmv3.h"
-#include "common/trc_pkt_proc_base.h"
-
-class EtmV3PktProcImpl;
-class EtmV3TrcPacket;
-class EtmV3Config;
-
-/** @addtogroup ocsd_pkt_proc
-@{*/
-
-
-class TrcPktProcEtmV3 : public TrcPktProcBase< EtmV3TrcPacket, ocsd_etmv3_pkt_type, EtmV3Config>
-{
-public:
- TrcPktProcEtmV3();
- TrcPktProcEtmV3(int instIDNum);
- virtual ~TrcPktProcEtmV3();
-
-protected:
- /* implementation packet processing interface */
- virtual ocsd_datapath_resp_t processData( const ocsd_trc_index_t index,
- const uint32_t dataBlockSize,
- const uint8_t *pDataBlock,
- uint32_t *numBytesProcessed);
- virtual ocsd_datapath_resp_t onEOT();
- virtual ocsd_datapath_resp_t onReset();
- virtual ocsd_datapath_resp_t onFlush();
- virtual ocsd_err_t onProtocolConfig();
- virtual const bool isBadPacket() const;
-
- friend class EtmV3PktProcImpl;
-
- EtmV3PktProcImpl *m_pProcessor;
-};
-
-
-#define ETMV3_OPFLG_UNFORMATTED_SOURCE 0x00010000 /**< Single ETM source from bypassed formatter - need to check for EOT markers */
-
-/** @}*/
-
-#endif // ARM_TRC_PKT_PROC_ETMV3_H_INCLUDED
-
-/* End of File trc_pkt_proc_etm.h */
diff --git a/contrib/opencsd/decoder/include/opencsd/etmv3/trc_pkt_types_etmv3.h b/contrib/opencsd/decoder/include/opencsd/etmv3/trc_pkt_types_etmv3.h
deleted file mode 100644
index c2e01147995d..000000000000
--- a/contrib/opencsd/decoder/include/opencsd/etmv3/trc_pkt_types_etmv3.h
+++ /dev/null
@@ -1,178 +0,0 @@
-/*
- * \file trc_pkt_types_etmv3.h
- * \brief OpenCSD :
- *
- * \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.
- */
-
-#ifndef ARM_TRC_ETM3_PKT_TYPES_ETMV3_H_INCLUDED
-#define ARM_TRC_ETM3_PKT_TYPES_ETMV3_H_INCLUDED
-
-#include "opencsd/trc_pkt_types.h"
-
-/** @addtogroup trc_pkts
-@{*/
-
-/** @name ETMv3 Packet Types
-@{*/
-
-typedef enum _ocsd_etmv3_pkt_type
-{
-
-// markers for unknown packets
- ETM3_PKT_NOERROR, //!< no error in packet - supplimentary data.
- ETM3_PKT_NOTSYNC, //!< no sync found yet
- ETM3_PKT_INCOMPLETE_EOT, //!< flushing incomplete/empty packet at end of trace.
-
-// markers for valid packets
- ETM3_PKT_BRANCH_ADDRESS,
- ETM3_PKT_A_SYNC,
- ETM3_PKT_CYCLE_COUNT,
- ETM3_PKT_I_SYNC,
- ETM3_PKT_I_SYNC_CYCLE,
- ETM3_PKT_TRIGGER,
- ETM3_PKT_P_HDR,
- ETM3_PKT_STORE_FAIL,
- ETM3_PKT_OOO_DATA,
- ETM3_PKT_OOO_ADDR_PLC,
- ETM3_PKT_NORM_DATA,
- ETM3_PKT_DATA_SUPPRESSED,
- ETM3_PKT_VAL_NOT_TRACED,
- ETM3_PKT_IGNORE,
- ETM3_PKT_CONTEXT_ID,
- ETM3_PKT_VMID,
- ETM3_PKT_EXCEPTION_ENTRY,
- ETM3_PKT_EXCEPTION_EXIT,
- ETM3_PKT_TIMESTAMP,
-
-// internal processing types
- ETM3_PKT_BRANCH_OR_BYPASS_EOT,
-
-// packet errors
- ETM3_PKT_BAD_SEQUENCE, //!< invalid sequence for packet type
- ETM3_PKT_BAD_TRACEMODE, //!< invalid packet type for this trace mode.
- ETM3_PKT_RESERVED //!< packet type reserved.
-
-} ocsd_etmv3_pkt_type;
-
-typedef struct _ocsd_etmv3_excep {
- ocsd_armv7_exception type; /**< exception type. */
- uint16_t number; /**< exception as number */
- struct {
- uint32_t present:1; /**< exception present in packet */
- uint32_t cancel:1; /**< exception cancels prev instruction traced. */
- uint32_t cm_type:1;
- uint32_t cm_resume:4; /**< M class resume code */
- uint32_t cm_irq_n:9; /**< M class IRQ n */
- } bits;
-} ocsd_etmv3_excep;
-
-typedef struct _etmv3_context_t {
- struct {
- uint32_t curr_alt_isa:1; /**< current Alt ISA flag for Tee / T32 (used if not in present packet) */
- uint32_t curr_NS:1; /**< current NS flag (used if not in present packet) */
- uint32_t curr_Hyp:1; /**< current Hyp flag (used if not in present packet) */
- uint32_t updated:1; /**< context updated */
- uint32_t updated_c:1; /**< updated CtxtID */
- uint32_t updated_v:1; /**< updated VMID */
- };
- uint32_t ctxtID; /**< Context ID */
- uint8_t VMID; /**< VMID */
-} etmv3_context_t;
-
-
-typedef struct _etmv3_data_t {
-
- uint32_t value; /**< Data value */
- ocsd_pkt_vaddr addr; /**< current data address */
-
- struct {
- uint32_t ooo_tag:2; /**< Out of order data tag. */
- uint32_t be:1; /**< data transfers big-endian */
- uint32_t update_be:1; /**< updated Be flag */
- uint32_t update_addr:1; /**< updated address */
- uint32_t update_dval:1; /**< updated data value */
- };
-} etmv3_data_t;
-
-typedef struct _etmv3_isync_t {
- ocsd_iSync_reason reason;
- struct {
- uint32_t has_cycle_count:1; /**< updated cycle count */
- uint32_t has_LSipAddress:1; /**< main address is load-store instuction, data address is overlapping instruction @ start of trace */
- uint32_t no_address:1; /**< data only ISync */
- };
-} etmv3_isync_t;
-
-typedef struct _ocsd_etmv3_pkt
-{
- ocsd_etmv3_pkt_type type; /**< Primary packet type. */
-
- ocsd_isa curr_isa; /**< current ISA */
- ocsd_isa prev_isa; /**< ISA in previous packet */
-
- etmv3_context_t context; /**< current context */
- ocsd_pkt_vaddr addr; /**< current Addr */
-
- etmv3_isync_t isync_info;
-
- ocsd_etmv3_excep exception;
-
- ocsd_pkt_atom atom; /**< atom elements - non zerom number indicates valid atom count */
- uint8_t p_hdr_fmt; /**< if atom elements, associated phdr format */
- uint32_t cycle_count; /**< cycle count associated with this packet (ETMv3 has counts in atom packets and as individual packets */
-
- uint64_t timestamp; /**< current timestamp value */
- uint8_t ts_update_bits; /**< bits of ts updated this packet (if TS packet) */
-
- etmv3_data_t data; /**< data transfer values */
-
- ocsd_etmv3_pkt_type err_type; /**< Basic packet type if primary type indicates error or incomplete. (header type) */
-
-} ocsd_etmv3_pkt;
-
-typedef struct _ocsd_etmv3_cfg
-{
- uint32_t reg_idr; /**< ID register */
- uint32_t reg_ctrl; /**< Control Register */
- uint32_t reg_ccer; /**< CCER register */
- uint32_t reg_trc_id; /**< Trace Stream ID register */
- ocsd_arch_version_t arch_ver; /**< Architecture version */
- ocsd_core_profile_t core_prof; /**< Core Profile */
-} ocsd_etmv3_cfg;
-
-
-#define DATA_ADDR_EXPECTED_FLAG 0x20 /**< Bit set for data trace headers if data address packets follow */
-
-/** @}*/
-/** @}*/
-#endif // ARM_TRC_ETM3_PKT_TYPES_ETMV3_H_INCLUDED
-
-/* End of File trc_pkt_types_etmv3.h */
diff --git a/contrib/opencsd/decoder/include/opencsd/etmv4/etmv4_decoder.h b/contrib/opencsd/decoder/include/opencsd/etmv4/etmv4_decoder.h
deleted file mode 100644
index 05bdd44d683e..000000000000
--- a/contrib/opencsd/decoder/include/opencsd/etmv4/etmv4_decoder.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * \file etmv4_decoder.h
- * \brief OpenCSD : Top level header file for ETMv4 decoders
- *
- * \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.
- */
-
-#ifndef ARM_ETMV4_DECODER_H_INCLUDED
-#define ARM_ETMV4_DECODER_H_INCLUDED
-
-#include "trc_cmp_cfg_etmv4.h"
-#include "trc_pkt_elem_etmv4i.h"
-#include "trc_pkt_elem_etmv4d.h"
-#include "trc_pkt_proc_etmv4.h"
-#include "trc_pkt_types_etmv4.h"
-#include "trc_pkt_decode_etmv4i.h"
-
-#endif // ARM_ETMV4_DECODER_H_INCLUDED
-
-/* End of File etmv4_decoder.h */
diff --git a/contrib/opencsd/decoder/include/opencsd/etmv4/trc_cmp_cfg_etmv4.h b/contrib/opencsd/decoder/include/opencsd/etmv4/trc_cmp_cfg_etmv4.h
deleted file mode 100644
index 1d72d97afe59..000000000000
--- a/contrib/opencsd/decoder/include/opencsd/etmv4/trc_cmp_cfg_etmv4.h
+++ /dev/null
@@ -1,465 +0,0 @@
-/*
- * \file trc_cmp_cfg_etmv4.h
- * \brief OpenCSD :
- *
- * \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.
- */
-
-#ifndef ARM_TRC_CMP_CFG_ETMV4_H_INCLUDED
-#define ARM_TRC_CMP_CFG_ETMV4_H_INCLUDED
-
-#include "trc_pkt_types_etmv4.h"
-#include "common/trc_cs_config.h"
-
-
-/** @addtogroup ocsd_protocol_cfg
-@{*/
-
-/** @name ETMv4 configuration
-@{*/
-
-/*!
- * @class EtmV4Config
- * @brief Interpreter class for etm v4 config structure.
- *
- * Provides quick value interpretation methods for the ETMv4 config register values.
- * Primarily inlined for efficient code.
- */
-class EtmV4Config : public CSConfig // public ocsd_etmv4_cfg
-{
-public:
- EtmV4Config(); /**< Default constructor */
- EtmV4Config(const ocsd_etmv4_cfg *cfg_regs);
- ~EtmV4Config() {}; /**< Default destructor */
-
-// operations to convert to and from C-API structure
-
- //! copy assignment operator for base structure into class.
- EtmV4Config & operator=(const ocsd_etmv4_cfg *p_cfg);
-
- //! cast operator returning struct const reference
- operator const ocsd_etmv4_cfg &() const { return m_cfg; };
- //! cast operator returning struct const pointer
- operator const ocsd_etmv4_cfg *() const { return &m_cfg; };
-
- const ocsd_core_profile_t &coreProfile() const { return m_cfg.core_prof; };
- const ocsd_arch_version_t &archVersion() const { return m_cfg.arch_ver; };
-
- /* idr 0 */
- const bool LSasInstP0() const;
- const bool hasDataTrace() const;
- const bool hasBranchBroadcast() const;
- const bool hasCondTrace() const;
- const bool hasCycleCountI() const;
- const bool hasRetStack() const;
- const uint8_t numEvents() const;
-
- typedef enum _condType {
- COND_PASS_FAIL,
- COND_HAS_ASPR
- } condType;
-
- const condType hasCondType() const;
-
- typedef enum _QSuppType {
- Q_NONE,
- Q_ICOUNT_ONLY,
- Q_NO_ICOUNT_ONLY,
- Q_FULL
- } QSuppType;
-
- const QSuppType getQSuppType();
- const bool hasQElem();
- const bool hasQFilter();
-
- const bool hasTrcExcpData() const;
- const uint32_t TimeStampSize() const;
-
- const bool commitOpt1() const;
-
- /* idr 1 */
- const uint8_t MajVersion() const;
- const uint8_t MinVersion() const;
- const uint8_t FullVersion() const;
-
- /* idr 2 */
- const uint32_t iaSizeMax() const;
- const uint32_t cidSize() const;
- const uint32_t vmidSize();
- const uint32_t daSize() const;
- const uint32_t dvSize() const;
- const uint32_t ccSize() const;
- const bool vmidOpt() const;
- const bool wfiwfeBranch() const;
-
- /* id regs 8-13*/
- const uint32_t MaxSpecDepth() const;
- const uint32_t P0_Key_Max() const;
- const uint32_t P1_Key_Max() const;
- const uint32_t P1_Spcl_Key_Max() const;
- const uint32_t CondKeyMax() const;
- const uint32_t CondSpecKeyMax() const;
- const uint32_t CondKeyMaxIncr() const;
-
- /* trace idr */
- virtual const uint8_t getTraceID() const; //!< CoreSight Trace ID for this device.
-
- /* config R */
- const bool enabledDVTrace() const;
- const bool enabledDATrace() const;
- const bool enabledDataTrace() const;
-
- typedef enum {
- LSP0_NONE,
- LSP0_L,
- LSP0_S,
- LSP0_LS
- } LSP0_t;
-
- const bool enabledLSP0Trace() const;
- const LSP0_t LSP0Type() const;
-
- const bool enabledBrBroad() const;
- const bool enabledCCI() const;
- const bool enabledCID() const;
- const bool enabledVMID() const;
-
- typedef enum {
- COND_TR_DIS,
- COND_TR_LD,
- COND_TR_ST,
- COND_TR_LDST,
- COND_TR_ALL
- } CondITrace_t;
-
- const CondITrace_t enabledCondITrace();
-
- const bool enabledTS() const;
- const bool enabledRetStack() const;
-
- const bool enabledQE() const;
-
-private:
- void PrivateInit();
- void CalcQSupp();
- void CalcVMIDSize();
-
- bool m_QSuppCalc;
- bool m_QSuppFilter;
- QSuppType m_QSuppType;
-
- bool m_VMIDSzCalc;
- uint32_t m_VMIDSize;
-
- bool m_condTraceCalc;
- CondITrace_t m_CondTrace;
-
-protected:
- ocsd_etmv4_cfg m_cfg;
- uint8_t m_MajVer;
- uint8_t m_MinVer;
-
-};
-
-/* idr 0 */
-inline const bool EtmV4Config::LSasInstP0() const
-{
- return (bool)((m_cfg.reg_idr0 & 0x6) == 0x6);
-}
-
-inline const bool EtmV4Config::hasDataTrace() const
-{
- return (bool)((m_cfg.reg_idr0 & 0x18) == 0x18);
-}
-
-inline const bool EtmV4Config::hasBranchBroadcast() const
-{
- return (bool)((m_cfg.reg_idr0 & 0x20) == 0x20);
-}
-
-inline const bool EtmV4Config::hasCondTrace() const
-{
- return (bool)((m_cfg.reg_idr0 & 0x40) == 0x40);
-}
-
-inline const bool EtmV4Config::hasCycleCountI() const
-{
- return (bool)((m_cfg.reg_idr0 & 0x80) == 0x80);
-}
-
-inline const bool EtmV4Config::hasRetStack() const
-{
- return (bool)((m_cfg.reg_idr0 & 0x200) == 0x200);
-}
-
-inline const uint8_t EtmV4Config::numEvents() const
-{
- return ((m_cfg.reg_idr0 >> 10) & 0x3) + 1;
-}
-
-inline const EtmV4Config::condType EtmV4Config::hasCondType() const
-{
- return ((m_cfg.reg_idr0 & 0x3000) == 0x1000) ? EtmV4Config::COND_HAS_ASPR : EtmV4Config::COND_PASS_FAIL;
-}
-
-inline const EtmV4Config::QSuppType EtmV4Config::getQSuppType()
-{
- if(!m_QSuppCalc) CalcQSupp();
- return m_QSuppType;
-}
-
-inline const bool EtmV4Config::hasQElem()
-{
- if(!m_QSuppCalc) CalcQSupp();
- return (bool)(m_QSuppType != Q_NONE);
-}
-
-inline const bool EtmV4Config::hasQFilter()
-{
- if(!m_QSuppCalc) CalcQSupp();
- return m_QSuppFilter;
-}
-
-inline const bool EtmV4Config::hasTrcExcpData() const
-{
- return (bool)((m_cfg.reg_idr0 & 0x20000) == 0x20000);
-}
-
-inline const uint32_t EtmV4Config::TimeStampSize() const
-{
- uint32_t tsSizeF = (m_cfg.reg_idr0 >> 24) & 0x1F;
- if(tsSizeF == 0x6)
- return 48;
- if(tsSizeF == 0x8)
- return 64;
- return 0;
-}
-
-inline const bool EtmV4Config::commitOpt1() const
-{
- return (bool)((m_cfg.reg_idr0 & 0x20000000) == 0x20000000) && hasCycleCountI();
-}
-
- /* idr 1 */
-inline const uint8_t EtmV4Config::MajVersion() const
-{
- return m_MajVer;
-}
-
-inline const uint8_t EtmV4Config::MinVersion() const
-{
- return m_MinVer;
-}
-
-inline const uint8_t EtmV4Config::FullVersion() const
-{
- return (m_MajVer << 4) | m_MinVer;
-}
-
-/* idr 2 */
-inline const uint32_t EtmV4Config::iaSizeMax() const
-{
- return ((m_cfg.reg_idr2 & 0x1F) == 0x8) ? 64 : 32;
-}
-
-inline const uint32_t EtmV4Config::cidSize() const
-{
- return (((m_cfg.reg_idr2 >> 5) & 0x1F) == 0x4) ? 32 : 0;
-}
-
-inline const uint32_t EtmV4Config::vmidSize()
-{
- if(!m_VMIDSzCalc)
- {
- CalcVMIDSize();
- }
- return m_VMIDSize;
-}
-
-inline const uint32_t EtmV4Config::daSize() const
-{
- uint32_t daSizeF = ((m_cfg.reg_idr2 >> 15) & 0x1F);
- if(daSizeF)
- return (((m_cfg.reg_idr2 >> 15) & 0x1F) == 0x8) ? 64 : 32;
- return 0;
-}
-
-inline const uint32_t EtmV4Config::dvSize() const
-{
- uint32_t dvSizeF = ((m_cfg.reg_idr2 >> 20) & 0x1F);
- if(dvSizeF)
- return (((m_cfg.reg_idr2 >> 20) & 0x1F) == 0x8) ? 64 : 32;
- return 0;
-}
-
-inline const uint32_t EtmV4Config::ccSize() const
-{
- return ((m_cfg.reg_idr2 >> 25) & 0xF) + 12;
-}
-
-inline const bool EtmV4Config::vmidOpt() const
-{
- return (bool)((m_cfg.reg_idr2 & 0x20000000) == 0x20000000) && (MinVersion() > 0);
-}
-
-inline const bool EtmV4Config::wfiwfeBranch() const
-{
- return (bool)((m_cfg.reg_idr2 & 0x80000000) && (FullVersion() >= 0x43));
-}
-
-
-/* id regs 8-13*/
-
-inline const uint32_t EtmV4Config::MaxSpecDepth() const
-{
- return m_cfg.reg_idr8;
-}
-
-inline const uint32_t EtmV4Config::P0_Key_Max() const
-{
- return (m_cfg.reg_idr9 == 0) ? 1 : m_cfg.reg_idr9;
-}
-
-inline const uint32_t EtmV4Config::P1_Key_Max() const
-{
- return m_cfg.reg_idr10;
-}
-
-inline const uint32_t EtmV4Config::P1_Spcl_Key_Max() const
-{
- return m_cfg.reg_idr11;
-}
-
-inline const uint32_t EtmV4Config::CondKeyMax() const
-{
- return m_cfg.reg_idr12;
-}
-
-inline const uint32_t EtmV4Config::CondSpecKeyMax() const
-{
- return m_cfg.reg_idr13;
-}
-
-inline const uint32_t EtmV4Config::CondKeyMaxIncr() const
-{
- return m_cfg.reg_idr12 - m_cfg.reg_idr13;
-}
-
-inline const uint8_t EtmV4Config::getTraceID() const
-{
- return (uint8_t)(m_cfg.reg_traceidr & 0x7F);
-}
-
- /* config R */
-inline const bool EtmV4Config::enabledDVTrace() const
-{
- return hasDataTrace() && enabledLSP0Trace() && ((m_cfg.reg_configr & (0x1 << 17)) != 0);
-}
-
-inline const bool EtmV4Config::enabledDATrace() const
-{
- return hasDataTrace() && enabledLSP0Trace() && ((m_cfg.reg_configr & (0x1 << 16)) != 0);
-}
-
-inline const bool EtmV4Config::enabledDataTrace() const
-{
- return enabledDATrace() || enabledDVTrace();
-}
-
-inline const bool EtmV4Config::enabledLSP0Trace() const
-{
- return ((m_cfg.reg_configr & 0x6) != 0);
-}
-
-inline const EtmV4Config::LSP0_t EtmV4Config::LSP0Type() const
-{
- return (LSP0_t)((m_cfg.reg_configr & 0x6) >> 1);
-}
-
-inline const bool EtmV4Config::enabledBrBroad() const
-{
- return ((m_cfg.reg_configr & (0x1 << 3)) != 0);
-}
-
-inline const bool EtmV4Config::enabledCCI() const
-{
- return ((m_cfg.reg_configr & (0x1 << 4)) != 0);
-}
-
-inline const bool EtmV4Config::enabledCID() const
-{
- return ((m_cfg.reg_configr & (0x1 << 6)) != 0);
-}
-
-inline const bool EtmV4Config::enabledVMID() const
-{
- return ((m_cfg.reg_configr & (0x1 << 7)) != 0);
-}
-
-inline const EtmV4Config::CondITrace_t EtmV4Config::enabledCondITrace()
-{
- if(!m_condTraceCalc)
- {
- switch((m_cfg.reg_configr >> 8) & 0x7)
- {
- default:
- case 0: m_CondTrace = COND_TR_DIS; break;
- case 1: m_CondTrace = COND_TR_LD; break;
- case 2: m_CondTrace = COND_TR_ST; break;
- case 3: m_CondTrace = COND_TR_LDST; break;
- case 7: m_CondTrace = COND_TR_ALL; break;
- }
- m_condTraceCalc = true;
- }
- return m_CondTrace;
-}
-
-inline const bool EtmV4Config::enabledTS() const
-{
- return ((m_cfg.reg_configr & (0x1 << 11)) != 0);
-}
-
-inline const bool EtmV4Config::enabledRetStack() const
-{
- return ((m_cfg.reg_configr & (0x1 << 12)) != 0);
-}
-
-inline const bool EtmV4Config::enabledQE() const
-{
- return ((m_cfg.reg_configr & (0x3 << 13)) != 0);
-}
-
-/** @}*/
-/** @}*/
-
-#endif // ARM_TRC_CMP_CFG_ETMV4_H_INCLUDED
-
-/* End of File trc_cmp_cfg_etmv4.h */
diff --git a/contrib/opencsd/decoder/include/opencsd/etmv4/trc_dcd_mngr_etmv4i.h b/contrib/opencsd/decoder/include/opencsd/etmv4/trc_dcd_mngr_etmv4i.h
deleted file mode 100644
index a5b25404fcf3..000000000000
--- a/contrib/opencsd/decoder/include/opencsd/etmv4/trc_dcd_mngr_etmv4i.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * \file trc_dcd_mngr_etmv4i.h
- * \brief Reference CoreSight Trace Decoder :
- *
- * \copyright Copyright (c) 2016, ARM Limited. All Rights Reserved.
- */
-
-#ifndef ARM_TRC_DCD_MNGR_ETMV4I_H_INCLUDED
-#define ARM_TRC_DCD_MNGR_ETMV4I_H_INCLUDED
-
-#include "common/ocsd_dcd_mngr.h"
-#include "trc_pkt_decode_etmv4i.h"
-#include "trc_pkt_proc_etmv4.h"
-#include "trc_cmp_cfg_etmv4.h"
-#include "trc_pkt_types_etmv4.h"
-
-class DecoderMngrEtmV4I : public DecodeMngrFullDcd< EtmV4ITrcPacket,
- ocsd_etmv4_i_pkt_type,
- EtmV4Config,
- ocsd_etmv4_cfg,
- TrcPktProcEtmV4I,
- TrcPktDecodeEtmV4I>
-{
-public:
- DecoderMngrEtmV4I(const std::string &name) : DecodeMngrFullDcd(name,OCSD_PROTOCOL_ETMV4I) {};
- virtual ~DecoderMngrEtmV4I() {};
-};
-
-#endif // ARM_TRC_DCD_MNGR_ETMV4I_H_INCLUDED
-
-/* End of File trc_dcd_mngr_etmv4i.h */
diff --git a/contrib/opencsd/decoder/include/opencsd/etmv4/trc_etmv4_stack_elem.h b/contrib/opencsd/decoder/include/opencsd/etmv4/trc_etmv4_stack_elem.h
deleted file mode 100644
index 15996547163c..000000000000
--- a/contrib/opencsd/decoder/include/opencsd/etmv4/trc_etmv4_stack_elem.h
+++ /dev/null
@@ -1,346 +0,0 @@
-/*
- * \file trc_etmv4_stack_elem.h
- * \brief OpenCSD :
- *
- * \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.
- */
-#ifndef ARM_TRC_ETMV4_STACK_ELEM_H_INCLUDED
-#define ARM_TRC_ETMV4_STACK_ELEM_H_INCLUDED
-
-#include "opencsd/etmv4/trc_pkt_types_etmv4.h"
-
-#include <deque>
-#include <vector>
-
-/* ETMv4 I trace stack elements
- Speculation requires that we stack certain elements till they are committed or
- cancelled. (P0 elements + other associated parts.)
-*/
-
-typedef enum _p0_elem_t
-{
- P0_UNKNOWN,
- P0_ATOM,
- P0_ADDR,
- P0_CTXT,
- P0_TRC_ON,
- P0_EXCEP,
- P0_EXCEP_RET,
- P0_EVENT,
- P0_TS,
- P0_CC,
- P0_TS_CC,
- P0_OVERFLOW,
- P0_FUNC_RET,
-} p0_elem_t;
-
-
-/************************************************************/
-/***Trace stack element base class -
- record originating packet type and index in buffer*/
-
-class TrcStackElem {
-public:
- TrcStackElem(const p0_elem_t p0_type, const bool isP0, const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index);
- virtual ~TrcStackElem() {};
-
- const p0_elem_t getP0Type() const { return m_P0_type; };
- const ocsd_etmv4_i_pkt_type getRootPkt() const { return m_root_pkt; };
- const ocsd_trc_index_t getRootIndex() const { return m_root_idx; };
- const bool isP0() const { return m_is_P0; };
-
-private:
- ocsd_etmv4_i_pkt_type m_root_pkt;
- ocsd_trc_index_t m_root_idx;
- p0_elem_t m_P0_type;
-
-protected:
- bool m_is_P0; // true if genuine P0 - commit / cancellable, false otherwise
-
-};
-
-inline TrcStackElem::TrcStackElem(p0_elem_t p0_type, const bool isP0, ocsd_etmv4_i_pkt_type root_pkt, ocsd_trc_index_t root_index) :
- m_root_pkt(root_pkt),
- m_root_idx(root_index),
- m_P0_type(p0_type),
- m_is_P0(isP0)
-{
-}
-
-/************************************************************/
-/** Address element */
-
-class TrcStackElemAddr : public TrcStackElem
-{
-protected:
- TrcStackElemAddr(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index);
- virtual ~TrcStackElemAddr() {};
-
- friend class EtmV4P0Stack;
-
-public:
- void setAddr(const etmv4_addr_val_t &addr_val) { m_addr_val = addr_val; };
- const etmv4_addr_val_t &getAddr() const { return m_addr_val; };
-
-private:
- etmv4_addr_val_t m_addr_val;
-};
-
-inline TrcStackElemAddr::TrcStackElemAddr(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index) :
- TrcStackElem(P0_ADDR, false, root_pkt,root_index)
-{
- m_addr_val.val = 0;
- m_addr_val.isa = 0;
-}
-
-/************************************************************/
-/** Context element */
-
-class TrcStackElemCtxt : public TrcStackElem
-{
-protected:
- TrcStackElemCtxt(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index);
- virtual ~TrcStackElemCtxt() {};
-
- friend class EtmV4P0Stack;
-
-public:
- void setContext(const etmv4_context_t &ctxt) { m_context = ctxt; };
- const etmv4_context_t &getContext() const { return m_context; };
-
-private:
- etmv4_context_t m_context;
-};
-
-inline TrcStackElemCtxt::TrcStackElemCtxt(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index) :
- TrcStackElem(P0_CTXT, false, root_pkt,root_index)
-{
-}
-
-/************************************************************/
-/** Exception element */
-
-class TrcStackElemExcept : public TrcStackElem
-{
-protected:
- TrcStackElemExcept(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index);
- virtual ~TrcStackElemExcept() {};
-
- friend class EtmV4P0Stack;
-
-public:
- void setPrevSame(bool bSame) { m_prev_addr_same = bSame; };
- const bool getPrevSame() const { return m_prev_addr_same; };
-
- void setExcepNum(const uint16_t num) { m_excep_num = num; };
- const uint16_t getExcepNum() const { return m_excep_num; };
-
-private:
- bool m_prev_addr_same;
- uint16_t m_excep_num;
-};
-
-inline TrcStackElemExcept::TrcStackElemExcept(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index) :
- TrcStackElem(P0_EXCEP, true, root_pkt,root_index),
- m_prev_addr_same(false)
-{
-}
-
-/************************************************************/
-/** Atom element */
-
-class TrcStackElemAtom : public TrcStackElem
-{
-protected:
- TrcStackElemAtom(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index);
- virtual ~TrcStackElemAtom() {};
-
- friend class EtmV4P0Stack;
-
-public:
- void setAtom(const ocsd_pkt_atom &atom) { m_atom = atom; };
-
- const ocsd_atm_val commitOldest();
- int cancelNewest(const int nCancel);
- const bool isEmpty() const { return (m_atom.num == 0); };
-
-private:
- ocsd_pkt_atom m_atom;
-};
-
-inline TrcStackElemAtom::TrcStackElemAtom(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index) :
- TrcStackElem(P0_ATOM, true, root_pkt,root_index)
-{
- m_atom.num = 0;
-}
-
-// commit oldest - get value and remove it from pattern
-inline const ocsd_atm_val TrcStackElemAtom::commitOldest()
-{
- ocsd_atm_val val = (m_atom.En_bits & 0x1) ? ATOM_E : ATOM_N;
- m_atom.num--;
- m_atom.En_bits >>= 1;
- return val;
-}
-
-// cancel newest - just reduce the atom count.
-inline int TrcStackElemAtom::cancelNewest(const int nCancel)
-{
- int nRemove = (nCancel <= m_atom.num) ? nCancel : m_atom.num;
- m_atom.num -= nRemove;
- return nRemove;
-}
-
-/************************************************************/
-/** Generic param element */
-
-class TrcStackElemParam : public TrcStackElem
-{
-protected:
- TrcStackElemParam(const p0_elem_t p0_type, const bool isP0, const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index);
- virtual ~TrcStackElemParam() {};
-
- friend class EtmV4P0Stack;
-
-public:
- void setParam(const uint32_t param, const int nParamNum) { m_param[(nParamNum & 0x3)] = param; };
- const uint32_t &getParam(const int nParamNum) const { return m_param[(nParamNum & 0x3)]; };
-
-private:
- uint32_t m_param[4];
-};
-
-inline TrcStackElemParam::TrcStackElemParam(const p0_elem_t p0_type, const bool isP0, const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index) :
- TrcStackElem(p0_type, isP0, root_pkt,root_index)
-{
-}
-
-/************************************************************/
-/* P0 element stack that allows push of elements, and deletion of elements when done.
-*/
-class EtmV4P0Stack
-{
-public:
- EtmV4P0Stack() {};
- ~EtmV4P0Stack();
-
- void push_front(TrcStackElem *pElem);
- void push_back(TrcStackElem *pElem); // insert element when processing
- void pop_back();
- TrcStackElem *back();
- size_t size();
-
- void delete_all();
- void delete_back();
- void delete_popped();
-
- // creation functions - create and push if successful.
- TrcStackElemParam *createParamElem(const p0_elem_t p0_type, const bool isP0, const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const std::vector<uint32_t> &params);
- TrcStackElem *createParamElemNoParam(const p0_elem_t p0_type, const bool isP0, const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, bool back = false);
- TrcStackElemAtom *createAtomElem (const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const ocsd_pkt_atom &atom);
- TrcStackElemExcept *createExceptElem(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const bool bSame, const uint16_t excepNum);
- TrcStackElemCtxt *createContextElem(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const etmv4_context_t &context);
- TrcStackElemAddr *createAddrElem(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const etmv4_addr_val_t &addr_val);
-
-private:
- std::deque<TrcStackElem *> m_P0_stack; //!< P0 decode element stack
- std::vector<TrcStackElem *> m_popped_elem; //!< save list of popped but not deleted elements.
-
-};
-
-inline EtmV4P0Stack::~EtmV4P0Stack()
-{
- delete_all();
- delete_popped();
-}
-
-// put an element on the front of the stack
-inline void EtmV4P0Stack::push_front(TrcStackElem *pElem)
-{
- m_P0_stack.push_front(pElem);
-}
-
-// put an element on the back of the stack
-inline void EtmV4P0Stack::push_back(TrcStackElem *pElem)
-{
- m_P0_stack.push_back(pElem);
-}
-
-// pop last element pointer off the stack and stash it for later deletion
-inline void EtmV4P0Stack::pop_back()
-{
- m_popped_elem.push_back(m_P0_stack.back());
- m_P0_stack.pop_back();
-}
-
-// pop last element pointer off the stack and delete immediately
-inline void EtmV4P0Stack::delete_back()
-{
- if (m_P0_stack.size() > 0)
- {
- TrcStackElem* pElem = m_P0_stack.back();
- delete pElem;
- m_P0_stack.pop_back();
- }
-}
-
-// get a pointer to the last element on the stack
-inline TrcStackElem *EtmV4P0Stack::back()
-{
- return m_P0_stack.back();
-}
-
-// remove and delete all the elements left on the stack
-inline void EtmV4P0Stack::delete_all()
-{
- while (m_P0_stack.size() > 0)
- delete_back();
- m_P0_stack.clear();
-}
-
-// delete list of popped elements.
-inline void EtmV4P0Stack::delete_popped()
-{
- while (m_popped_elem.size() > 0)
- {
- delete m_popped_elem.back();
- m_popped_elem.pop_back();
- }
- m_popped_elem.clear();
-}
-
-// get current number of elements on the stack
-inline size_t EtmV4P0Stack::size()
-{
- return m_P0_stack.size();
-}
-
-#endif // ARM_TRC_ETMV4_STACK_ELEM_H_INCLUDED
-
-/* End of File trc_etmv4_stack_elem.h */
diff --git a/contrib/opencsd/decoder/include/opencsd/etmv4/trc_pkt_decode_etmv4i.h b/contrib/opencsd/decoder/include/opencsd/etmv4/trc_pkt_decode_etmv4i.h
deleted file mode 100644
index 1c06e5ddf03a..000000000000
--- a/contrib/opencsd/decoder/include/opencsd/etmv4/trc_pkt_decode_etmv4i.h
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- * \file trc_pkt_decode_etmv4i.h
- * \brief OpenCSD : ETMv4 instruction decoder
- *
- * \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.
- */
-
-#ifndef ARM_TRC_PKT_DECODE_ETMV4I_H_INCLUDED
-#define ARM_TRC_PKT_DECODE_ETMV4I_H_INCLUDED
-
-#include "common/trc_pkt_decode_base.h"
-#include "opencsd/etmv4/trc_pkt_elem_etmv4i.h"
-#include "opencsd/etmv4/trc_cmp_cfg_etmv4.h"
-#include "common/trc_gen_elem.h"
-#include "common/trc_ret_stack.h"
-#include "opencsd/etmv4/trc_etmv4_stack_elem.h"
-
-class TrcStackElem;
-class TrcStackElemParam;
-class TrcStackElemCtxt;
-
-class TrcPktDecodeEtmV4I : public TrcPktDecodeBase<EtmV4ITrcPacket, EtmV4Config>
-{
-public:
- TrcPktDecodeEtmV4I();
- TrcPktDecodeEtmV4I(int instIDNum);
- virtual ~TrcPktDecodeEtmV4I();
-
-protected:
- /* implementation packet decoding interface */
- virtual ocsd_datapath_resp_t processPacket();
- virtual ocsd_datapath_resp_t onEOT();
- virtual ocsd_datapath_resp_t onReset();
- virtual ocsd_datapath_resp_t onFlush();
- virtual ocsd_err_t onProtocolConfig();
- virtual const uint8_t getCoreSightTraceID() { return m_CSID; };
-
- /* local decode methods */
- void initDecoder(); // initial state on creation (zeros all config)
- void resetDecoder(); // reset state to start of decode. (moves state, retains config)
-
- ocsd_datapath_resp_t decodePacket(bool &Complete); // return true to indicate decode complete - can change FSM to commit state - return is false.
- ocsd_datapath_resp_t commitElements(bool &Complete); // commit elements - may get wait response, or flag completion.
- ocsd_datapath_resp_t flushEOT();
-
- void doTraceInfoPacket();
- void updateContext(TrcStackElemCtxt *pCtxtElem);
-
- // process atom will output instruction trace, or no memory access trace elements.
- ocsd_datapath_resp_t processAtom(const ocsd_atm_val, bool &bCont);
-
- // process an exception element - output instruction trace + exception generic type.
- ocsd_datapath_resp_t processException();
-
- // process a bad packet
- ocsd_datapath_resp_t handleBadPacket(const char *reason);
-
- ocsd_datapath_resp_t outputCC(TrcStackElemParam *pParamElem);
- ocsd_datapath_resp_t outputTS(TrcStackElemParam *pParamElem, bool withCC);
- ocsd_datapath_resp_t outputEvent(TrcStackElemParam *pParamElem);
-
-private:
- void SetInstrInfoInAddrISA(const ocsd_vaddr_t addr_val, const uint8_t isa);
-
- ocsd_err_t traceInstrToWP(bool &bWPFound, const bool traceToAddrNext = false, const ocsd_vaddr_t nextAddrMatch = 0); //!< follow instructions from the current address to a WP. true if good, false if memory cannot be accessed.
-
- ocsd_datapath_resp_t returnStackPop(); // pop return stack and update instruction address.
-
- ocsd_datapath_resp_t outputTraceRange(const bool executed, ocsd_trc_index_t index);
-
-//** intra packet state (see ETMv4 spec 6.2.1);
-
- // timestamping
- uint64_t m_timestamp; // last broadcast global Timestamp.
-
- // state and context
- uint32_t m_context_id; // most recent context ID
- uint32_t m_vmid_id; // most recent VMID
- bool m_is_secure; // true if Secure
- bool m_is_64bit; // true if 64 bit
-
- // cycle counts
- int m_cc_threshold;
-
- // speculative trace (unsupported at present in the decoder).
- int m_curr_spec_depth;
- int m_max_spec_depth;
-
- // data trace associative elements (unsupported at present in the decoder).
- int m_p0_key;
- int m_p0_key_max;
-
- // conditional non-branch trace - when data trace active (unsupported at present in the decoder)
- int m_cond_c_key;
- int m_cond_r_key;
- int m_cond_key_max_incr;
-
- uint8_t m_CSID; //!< Coresight trace ID for this decoder.
-
- bool m_IASize64; //!< True if 64 bit instruction addresses supported.
-
-//** Other processor state;
-
- // trace decode FSM
- typedef enum {
- NO_SYNC, //!< pre start trace - init state or after reset or overflow, loss of sync.
- WAIT_SYNC, //!< waiting for sync packet.
- WAIT_TINFO, //!< waiting for trace info packet.
- DECODE_PKTS, //!< processing packets - creating decode elements on stack
- COMMIT_ELEM, //!< commit elements for execution - create generic trace elements and pass on.
- } processor_state_t;
-
- processor_state_t m_curr_state;
-
-//** P0 element stack
- EtmV4P0Stack m_P0_stack; //!< P0 decode element stack
-
- int m_P0_commit; //!< number of elements to commit
-
- // packet decode state
- bool m_need_ctxt; //!< need context to continue
- bool m_need_addr; //!< need an address to continue
- bool m_except_pending_addr; //!< next address packet is part of exception.
-
- // exception packet processing state (may need excep elem only, range+excep, range+
- typedef enum {
- EXCEP_POP, // start of processing read exception packets off the stack and analyze
- EXCEP_RANGE, // output a range element
- EXCEP_NACC, // output a nacc element
- EXCEP_CTXT, // output a ctxt element
- EXCEP_EXCEP, // output an ecxeption element.
- } excep_proc_state_t;
-
- struct {
- excep_proc_state_t proc; //!< state of exception processing
- etmv4_addr_val_t addr; //!< excetion return address.
- uint32_t number; //!< exception number.
- ocsd_trc_index_t index; //!< trace index for exception element
- bool addr_b_tgt; //!< return address is also branch tgt address.
- } m_excep_info; //!< exception info when processing exception packets
-
- ocsd_instr_info m_instr_info; //!< instruction info for code follower - in address is the next to be decoded.
-
- bool m_mem_nacc_pending; //!< need to output a memory access failure packet
- ocsd_vaddr_t m_nacc_addr; //!< record unaccessible address
-
- ocsd_pe_context m_pe_context; //!< current context information
- etmv4_trace_info_t m_trace_info; //!< trace info for this trace run.
-
- bool m_prev_overflow;
-
- bool m_flush_EOT; //!< true if doing an end of trace flush - cleans up lingering events / TS / CC
-
- TrcAddrReturnStack m_return_stack;
-
-//** output element
- OcsdTraceElement m_output_elem;
-
-};
-
-#endif // ARM_TRC_PKT_DECODE_ETMV4I_H_INCLUDED
-
-/* End of File trc_pkt_decode_etmv4i.h */
diff --git a/contrib/opencsd/decoder/include/opencsd/etmv4/trc_pkt_elem_etmv4d.h b/contrib/opencsd/decoder/include/opencsd/etmv4/trc_pkt_elem_etmv4d.h
deleted file mode 100644
index bb6a0029c0c0..000000000000
--- a/contrib/opencsd/decoder/include/opencsd/etmv4/trc_pkt_elem_etmv4d.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * \file trc_pkt_elem_etmv4d.h
- * \brief OpenCSD :
- *
- * \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.
- */
-
-#ifndef ARM_TRC_PKT_ELEM_ETMV4D_H_INCLUDED
-#define ARM_TRC_PKT_ELEM_ETMV4D_H_INCLUDED
-
-#include "trc_pkt_types_etmv4.h"
-#include "common/trc_printable_elem.h"
-#include "common/trc_pkt_elem_base.h"
-
-/** @addtogroup trc_pkts
-@{*/
-/*!
- * @class EtmV4DTrcPacket
- * @brief ETMv4 Data Trace Protocol Packet .
- *
- * This class represents a single ETMv4 instruction trace packet, along with intra packet state.
- *
- */
-class EtmV4DTrcPacket : public TrcPacketBase, public ocsd_etmv4_d_pkt, trcPrintableElem
-{
-public:
- EtmV4DTrcPacket();
- ~EtmV4DTrcPacket();
-
- // update interface - set packet values
-
-
-
- // packet status interface - get packet info.
-
-
- // printing
- virtual void toString(std::string &str) const;
- virtual void toStringFmt(const uint32_t fmtFlags, std::string &str) const;
-};
-
-/** @}*/
-
-#endif // ARM_TRC_PKT_ELEM_ETMV4D_H_INCLUDED
-
-/* End of File trc_pkt_elem_etmv4d.h */
diff --git a/contrib/opencsd/decoder/include/opencsd/etmv4/trc_pkt_elem_etmv4i.h b/contrib/opencsd/decoder/include/opencsd/etmv4/trc_pkt_elem_etmv4i.h
deleted file mode 100644
index 02adfc51aa75..000000000000
--- a/contrib/opencsd/decoder/include/opencsd/etmv4/trc_pkt_elem_etmv4i.h
+++ /dev/null
@@ -1,525 +0,0 @@
-/*
- * \file trc_pkt_elem_etmv4i.h
- * \brief OpenCSD :
- *
- * \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.
- */
-
-#ifndef ARM_TRC_PKT_ELEM_ETMV4I_H_INCLUDED
-#define ARM_TRC_PKT_ELEM_ETMV4I_H_INCLUDED
-
-#include "trc_pkt_types_etmv4.h"
-#include "common/trc_printable_elem.h"
-#include "common/trc_pkt_elem_base.h"
-
-/** @addtogroup trc_pkts
-@{*/
-
-/*!
-* @class Etmv4PktAddrStack
-* @brief ETMv4 Address packet values stack
-* @ingroup trc_pkts
-*
-* This class represents a stack of recent broadcast address values -
-* used to fulfil the ExactMatch address type where no address is output.
-*
-*/
-class Etmv4PktAddrStack
-{
-public:
- Etmv4PktAddrStack()
- {
- for (int i = 0; i < 3; i++)
- {
- m_v_addr[i].pkt_bits = 0;
- m_v_addr[i].size = VA_64BIT;
- m_v_addr[i].val = 0;
- m_v_addr[i].valid_bits = 0;
- m_v_addr_ISA[i] = 0;
- }
- }
- ~Etmv4PktAddrStack() {};
-
- void push(const ocsd_pkt_vaddr vaddr, const uint8_t isa)
- {
- m_v_addr[2] = m_v_addr[1];
- m_v_addr[1] = m_v_addr[0];
- m_v_addr[0] = vaddr;
- m_v_addr_ISA[2] = m_v_addr_ISA[1];
- m_v_addr_ISA[1] = m_v_addr_ISA[0];
- m_v_addr_ISA[0] = isa;
- }
-
- void get_idx(const uint8_t idx, ocsd_pkt_vaddr &vaddr, uint8_t &isa)
- {
- if (idx < 3)
- {
- vaddr = m_v_addr[idx];
- isa = m_v_addr_ISA[idx];
- }
- }
-
-private:
- ocsd_pkt_vaddr m_v_addr[3]; //!< most recently broadcast address packet
- uint8_t m_v_addr_ISA[3];
-};
-
-/*!
- * @class EtmV4ITrcPacket
- * @brief ETMv4 Instuction Trace Protocol Packet.
- * @ingroup trc_pkts
- *
- * This class represents a single ETMv4 data trace packet, along with intra packet state.
- *
- */
-class EtmV4ITrcPacket : public TrcPacketBase, public ocsd_etmv4_i_pkt, public trcPrintableElem
-{
-public:
- EtmV4ITrcPacket();
- ~EtmV4ITrcPacket();
-
- EtmV4ITrcPacket &operator =(const ocsd_etmv4_i_pkt* p_pkt);
-
- virtual const void *c_pkt() const { return (const ocsd_etmv4_i_pkt *)this; };
-
- // update interface - set packet values
- void initStartState(); //!< Set to initial state - no intra packet state valid. Use on start of trace / discontinuities.
- void initNextPacket(); //!< clear any single packet only flags / state.
-
- void setType(const ocsd_etmv4_i_pkt_type pkt_type) { type = pkt_type; };
- void updateErrType(const ocsd_etmv4_i_pkt_type err_pkt_type, const uint8_t val = 0);
-
- void clearTraceInfo(); //!< clear all the trace info data prior to setting for new trace info packet.
- void setTraceInfo(const uint32_t infoVal);
- void setTraceInfoKey(const uint32_t keyVal);
- void setTraceInfoSpec(const uint32_t specVal);
- void setTraceInfoCyct(const uint32_t cyctVal);
-
- void setTS(const uint64_t value, const uint8_t bits);
- void setCycleCount(const uint32_t value);
- void setCommitElements(const uint32_t commit_elem);
- void setCancelElements(const uint32_t cancel_elem);
- void setAtomPacket(const ocsd_pkt_atm_type type, const uint32_t En_bits, const uint8_t num);
-
- void setCondIF1(uint32_t const cond_key);
- void setCondIF2(uint8_t const c_elem_idx);
- void setCondIF3(uint8_t const num_c_elem, const bool finalElem);
-
- void setCondRF1(const uint32_t key[2], const uint8_t res[2], const uint8_t CI[2], const bool set2Keys);
- void setCondRF2(const uint8_t key_incr, const uint8_t token);
- void setCondRF3(const uint16_t tokens);
- void setCondRF4(const uint8_t token);
-
- void setContextInfo(const bool update, const uint8_t EL = 0, const uint8_t NS = 0, const uint8_t SF = 0);
- void setContextVMID(const uint32_t VMID);
- void setContextCID(const uint32_t CID);
-
- void setExceptionInfo(const uint16_t excep_type, const uint8_t addr_interp, const uint8_t m_fault_pending, const uint8_t m_type);
-
- void set64BitAddress(const uint64_t addr, const uint8_t IS);
- void set32BitAddress(const uint32_t addr, const uint8_t IS);
- void updateShortAddress(const uint32_t addr, const uint8_t IS, const uint8_t update_bits);
- void setAddressExactMatch(const uint8_t idx);
-
- void setDataSyncMarker(const uint8_t dsm_val);
- void setEvent(const uint8_t event_val);
-
- void setQType(const bool has_count, const uint32_t count, const bool has_addr, const bool addr_match, const uint8_t type);
-
- // packet status interface - get packet info.
- const ocsd_etmv4_i_pkt_type getType() const { return type; };
- const ocsd_etmv4_i_pkt_type getErrType() const { return err_type; };
-
- //! return true if this packet has set the commit packet count.
- const bool hasCommitElementsCount() const
- {
- return pkt_valid.bits.commit_elem_valid ? true : false;
- };
-
- // trace info
- const etmv4_trace_info_t &getTraceInfo() const { return trace_info; };
- const uint32_t getCCThreshold() const;
- const uint32_t getP0Key() const;
- const uint32_t getCurrSpecDepth() const;
-
- // atom
- const ocsd_pkt_atom &getAtom() const { return atom; };
-
- // context
- const etmv4_context_t &getContext() const { return context; };
-
- // address
- const uint8_t &getAddrMatch() const { return addr_exact_match_idx; };
- const ocsd_vaddr_t &getAddrVal() const { return v_addr.val; };
- const uint8_t &getAddrIS() const { return v_addr_ISA; };
- const bool getAddr64Bit() const { return v_addr.size == VA_64BIT; };
-
- // ts
- const uint64_t getTS() const { return pkt_valid.bits.ts_valid ? ts.timestamp : 0; };
-
- // cc
- const uint32_t getCC() const { return pkt_valid.bits.cc_valid ? cycle_count : 0; };
-
- // packet type
- const bool isBadPacket() const;
-
- // printing
- virtual void toString(std::string &str) const;
- virtual void toStringFmt(const uint32_t fmtFlags, std::string &str) const;
-
-private:
- const char *packetTypeName(const ocsd_etmv4_i_pkt_type type, const char **pDesc) const;
- void contextStr(std::string &ctxtStr) const;
- void atomSeq(std::string &valStr) const;
- void addrMatchIdx(std::string &valStr) const;
- void exceptionInfo(std::string &valStr) const;
-
- void push_vaddr();
- void pop_vaddr_idx(const uint8_t idx);
-
- Etmv4PktAddrStack m_addr_stack;
-};
-
-inline void EtmV4ITrcPacket::updateErrType(const ocsd_etmv4_i_pkt_type err_pkt_type, const uint8_t err_val /* = 0 */)
-{
- // set primary type to incoming error type, set packet err type to previous primary type.
- err_type = type;
- type = err_pkt_type;
- err_hdr_val = err_val;
-}
-
-inline void EtmV4ITrcPacket::clearTraceInfo()
-{
- pkt_valid.bits.ts_valid = 0;
- pkt_valid.bits.trace_info_valid = 0;
- pkt_valid.bits.p0_key_valid = 0;
- pkt_valid.bits.spec_depth_valid = 0;
- pkt_valid.bits.cc_thresh_valid = 0;
-
- // set these as defaults - if they don't appear in TINFO this is the state.
- setTraceInfo(0);
- setTraceInfoSpec(0);
-}
-
-inline void EtmV4ITrcPacket::setTraceInfo(const uint32_t infoVal)
-{
- trace_info.val = infoVal;
- pkt_valid.bits.trace_info_valid = 1;
-}
-
-inline void EtmV4ITrcPacket::setTraceInfoKey(const uint32_t keyVal)
-{
- p0_key = keyVal;
- pkt_valid.bits.p0_key_valid = 1;
-}
-
-inline void EtmV4ITrcPacket::setTraceInfoSpec(const uint32_t specVal)
-{
- curr_spec_depth = specVal;
- pkt_valid.bits.spec_depth_valid = 1;
-}
-
-inline void EtmV4ITrcPacket::setTraceInfoCyct(const uint32_t cyctVal)
-{
- cc_threshold = cyctVal;
- pkt_valid.bits.cc_thresh_valid = 1;
-}
-
-inline void EtmV4ITrcPacket::setTS(const uint64_t value, const uint8_t bits)
-{
- uint64_t mask = (uint64_t)-1LL;
- if(bits < 64) mask = (1ULL << bits) - 1;
- ts.timestamp = (ts.timestamp & ~mask) | (value & mask);
- ts.bits_changed = bits;
- pkt_valid.bits.ts_valid = 1;
-}
-
-inline void EtmV4ITrcPacket::setCycleCount(const uint32_t value)
-{
- pkt_valid.bits.cc_valid = 1;
- cycle_count = value;
-}
-
-inline void EtmV4ITrcPacket::setCommitElements(const uint32_t commit_elem)
-{
- pkt_valid.bits.commit_elem_valid = 1;
- commit_elements = commit_elem;
-}
-
-inline const uint32_t EtmV4ITrcPacket::getCCThreshold() const
-{
- if(pkt_valid.bits.cc_thresh_valid)
- return cc_threshold;
- return 0;
-}
-
-inline const uint32_t EtmV4ITrcPacket::getP0Key() const
-{
- if(pkt_valid.bits.p0_key_valid)
- return p0_key;
- return 0;
-}
-
-inline const uint32_t EtmV4ITrcPacket::getCurrSpecDepth() const
-{
- if(pkt_valid.bits.spec_depth_valid)
- return curr_spec_depth;
- return 0;
-}
-
-inline void EtmV4ITrcPacket::setCancelElements(const uint32_t cancel_elem)
-{
- cancel_elements = cancel_elem;
-}
-
-inline void EtmV4ITrcPacket::setAtomPacket(const ocsd_pkt_atm_type type, const uint32_t En_bits, const uint8_t num)
-{
- if(type == ATOM_REPEAT)
- {
- uint32_t bit_patt = En_bits & 0x1;
- if(bit_patt)
- {
- // none zero - all 1s
- bit_patt = (bit_patt << num) - 1;
- }
- atom.En_bits = bit_patt;
- }
- else
- atom.En_bits = En_bits;
- atom.num = num;
-}
-
-inline void EtmV4ITrcPacket::setCondIF1(const uint32_t cond_key)
-{
- cond_instr.cond_key_set = 1;
- cond_instr.f3_final_elem = 0;
- cond_instr.f2_cond_incr = 0;
- cond_instr.num_c_elem = 1;
- cond_instr.cond_c_key = cond_key;
-}
-
-inline void EtmV4ITrcPacket::setCondIF2(const uint8_t c_elem_idx)
-{
- cond_instr.cond_key_set = 0;
- cond_instr.f3_final_elem = 0;
- switch(c_elem_idx & 0x3)
- {
- case 0:
- cond_instr.f2_cond_incr = 1;
- cond_instr.num_c_elem = 1;
- break;
-
- case 1:
- cond_instr.f2_cond_incr = 0;
- cond_instr.num_c_elem = 1;
- break;
-
- case 2:
- cond_instr.f2_cond_incr = 1;
- cond_instr.num_c_elem = 2;
- break;
- }
-}
-
-inline void EtmV4ITrcPacket::setCondIF3(const uint8_t num_c_elem, const bool finalElem)
-{
- cond_instr.cond_key_set = 0;
- cond_instr.f3_final_elem = finalElem ? 1: 0;
- cond_instr.f2_cond_incr = 0;
- cond_instr.num_c_elem = num_c_elem;
-}
-
-inline void EtmV4ITrcPacket::setCondRF1(const uint32_t key[2], const uint8_t res[2], const uint8_t CI[2],const bool set2Keys)
-{
- cond_result.key_res_0_set = 1;
- cond_result.cond_r_key_0 = key[0];
- cond_result.res_0 = res[0];
- cond_result.ci_0 = CI[0];
-
- if(set2Keys)
- {
- cond_result.key_res_1_set = 1;
- cond_result.cond_r_key_1 = key[1];
- cond_result.res_1 = res[1];
- cond_result.ci_1 = CI[1];
- }
-}
-
-
-inline void EtmV4ITrcPacket::setCondRF2(const uint8_t key_incr, const uint8_t token)
-{
- cond_result.key_res_0_set = 0;
- cond_result.key_res_1_set = 0;
- cond_result.f2_key_incr = key_incr;
- cond_result.f2f4_token = token;
-}
-
-inline void EtmV4ITrcPacket::setCondRF3(const uint16_t tokens)
-{
- cond_result.key_res_0_set = 0;
- cond_result.key_res_1_set = 0;
- cond_result.f3_tokens = tokens;
-}
-
-inline void EtmV4ITrcPacket::setCondRF4(const uint8_t token)
-{
- cond_result.key_res_0_set = 0;
- cond_result.key_res_1_set = 0;
- cond_result.f2f4_token = token;
-}
-
-inline void EtmV4ITrcPacket::setContextInfo(const bool update, const uint8_t EL, const uint8_t NS, const uint8_t SF)
-{
- pkt_valid.bits.context_valid = 1;
- if(update)
- {
- context.updated = 1;
- context.EL = EL;
- context.NS = NS;
- context.SF = SF;
- }
-}
-
-inline void EtmV4ITrcPacket::setContextVMID(const uint32_t VMID)
-{
- pkt_valid.bits.context_valid = 1;
- context.updated = 1;
- context.VMID = VMID;
- context.updated_v = 1;
-}
-
-inline void EtmV4ITrcPacket::setContextCID(const uint32_t CID)
-{
- pkt_valid.bits.context_valid = 1;
- context.updated = 1;
- context.ctxtID = CID;
- context.updated_c = 1;
-}
-
-inline void EtmV4ITrcPacket::setExceptionInfo(const uint16_t excep_type, const uint8_t addr_interp, const uint8_t m_fault_pending, const uint8_t m_type)
-{
- exception_info.exceptionType = excep_type;
- exception_info.addr_interp = addr_interp;
- exception_info.m_fault_pending = m_fault_pending;
- exception_info.m_type = m_type;
-}
-
-inline void EtmV4ITrcPacket::set64BitAddress(const uint64_t addr, const uint8_t IS)
-{
- v_addr.pkt_bits = 64;
- v_addr.valid_bits = 64;
- v_addr.size = VA_64BIT;
- v_addr.val = addr;
- v_addr_ISA = IS;
- push_vaddr();
-}
-
-inline void EtmV4ITrcPacket::set32BitAddress(const uint32_t addr, const uint8_t IS)
-{
- uint64_t mask = OCSD_BIT_MASK(32);
- v_addr.pkt_bits = 32;
-
- if (pkt_valid.bits.context_valid && context.SF)
- {
- v_addr.size = VA_64BIT;
- if (v_addr.valid_bits < 32) // may be updating a 64 bit address so only set 32 if currently less.
- v_addr.valid_bits = 32;
- v_addr.val = (v_addr.val & ~mask) | (addr & mask);
- }
- else
- {
- v_addr.val = addr;
- v_addr.size = VA_32BIT;
- v_addr.valid_bits = 32;
- }
-
- v_addr_ISA = IS;
- push_vaddr();
-}
-
-inline void EtmV4ITrcPacket::updateShortAddress(const uint32_t addr, const uint8_t IS, const uint8_t update_bits)
-{
- ocsd_vaddr_t update_mask = OCSD_BIT_MASK(update_bits);
- v_addr.pkt_bits = update_bits;
- if(v_addr.valid_bits < update_bits)
- v_addr.valid_bits = update_bits;
-
- v_addr.val = (v_addr.val & ~update_mask) | (addr & update_mask);
- v_addr_ISA = IS;
- push_vaddr();
-}
-
-inline void EtmV4ITrcPacket::setAddressExactMatch(const uint8_t idx)
-{
- addr_exact_match_idx = idx;
- pop_vaddr_idx(idx);
- push_vaddr();
-}
-
-inline void EtmV4ITrcPacket::setDataSyncMarker(const uint8_t dsm_value)
-{
- dsm_val = dsm_value;
-}
-
-inline void EtmV4ITrcPacket::setEvent(const uint8_t event_value)
-{
- event_val = event_value;
-}
-
-inline void EtmV4ITrcPacket::setQType(const bool has_count, const uint32_t count, const bool has_addr, const bool addr_match, const uint8_t type)
-{
- Q_pkt.q_count = count;
- Q_pkt.q_type = type;
- Q_pkt.count_present = has_count ? 1 : 0;
- Q_pkt.addr_present = has_addr ? 1: 0;
- Q_pkt.addr_match = addr_match ? 1 :0;
-}
-
-inline const bool EtmV4ITrcPacket::isBadPacket() const
-{
- return (type >= ETM4_PKT_I_BAD_SEQUENCE);
-}
-
-inline void EtmV4ITrcPacket::push_vaddr()
-{
- m_addr_stack.push(v_addr, v_addr_ISA);
-}
-
-inline void EtmV4ITrcPacket::pop_vaddr_idx(const uint8_t idx)
-{
- m_addr_stack.get_idx(idx, v_addr, v_addr_ISA);
-}
-
-/** @}*/
-
-#endif // ARM_TRC_PKT_ELEM_ETMV4I_H_INCLUDED
-
-/* End of File trc_pkt_elem_etmv4i.h */
diff --git a/contrib/opencsd/decoder/include/opencsd/etmv4/trc_pkt_proc_etmv4.h b/contrib/opencsd/decoder/include/opencsd/etmv4/trc_pkt_proc_etmv4.h
deleted file mode 100644
index 0d9ccea2be54..000000000000
--- a/contrib/opencsd/decoder/include/opencsd/etmv4/trc_pkt_proc_etmv4.h
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * \file trc_pkt_proc_etmv4.h
- * \brief OpenCSD : ETMv4 packet processor interface classes.
- *
- * \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.
- */
-
-#ifndef ARM_TRC_PKT_PROC_ETMV4_H_INCLUDED
-#define ARM_TRC_PKT_PROC_ETMV4_H_INCLUDED
-
-
-#include "trc_pkt_types_etmv4.h"
-#include "common/trc_pkt_proc_base.h"
-
-class EtmV4IPktProcImpl; /**< ETMv4 I channel packet processor */
-class EtmV4DPktProcImpl; /**< ETMv4 D channel packet processor */
-class EtmV4ITrcPacket;
-class EtmV4DTrcPacket;
-class EtmV4Config;
-
-/** @addtogroup ocsd_pkt_proc
-@{*/
-
-class TrcPktProcEtmV4I : public TrcPktProcBase< EtmV4ITrcPacket, ocsd_etmv4_i_pkt_type, EtmV4Config>
-{
-public:
- TrcPktProcEtmV4I();
- TrcPktProcEtmV4I(int instIDNum);
- virtual ~TrcPktProcEtmV4I();
-
-protected:
- /* implementation packet processing interface */
- virtual ocsd_datapath_resp_t processData( const ocsd_trc_index_t index,
- const uint32_t dataBlockSize,
- const uint8_t *pDataBlock,
- uint32_t *numBytesProcessed);
- virtual ocsd_datapath_resp_t onEOT();
- virtual ocsd_datapath_resp_t onReset();
- virtual ocsd_datapath_resp_t onFlush();
- virtual ocsd_err_t onProtocolConfig();
- virtual const bool isBadPacket() const;
-
- friend class EtmV4IPktProcImpl;
-
- EtmV4IPktProcImpl *m_pProcessor;
-};
-
-
-class TrcPktProcEtmV4D : public TrcPktProcBase< EtmV4DTrcPacket, ocsd_etmv4_d_pkt_type, EtmV4Config>
-{
-public:
- TrcPktProcEtmV4D();
- TrcPktProcEtmV4D(int instIDNum);
- virtual ~TrcPktProcEtmV4D();
-
-protected:
- /* implementation packet processing interface */
- virtual ocsd_datapath_resp_t processData( const ocsd_trc_index_t index,
- const uint32_t dataBlockSize,
- const uint8_t *pDataBlock,
- uint32_t *numBytesProcessed);
- virtual ocsd_datapath_resp_t onEOT();
- virtual ocsd_datapath_resp_t onReset();
- virtual ocsd_datapath_resp_t onFlush();
- virtual ocsd_err_t onProtocolConfig();
- virtual const bool isBadPacket() const;
-
- friend class EtmV4DPktProcImpl;
-
- EtmV4DPktProcImpl *m_pProcessor;
-};
-
-/** @}*/
-
-#endif // ARM_TRC_PKT_PROC_ETMV4_H_INCLUDED
-
-/* End of File trc_pkt_proc_etmv4.h */
diff --git a/contrib/opencsd/decoder/include/opencsd/etmv4/trc_pkt_types_etmv4.h b/contrib/opencsd/decoder/include/opencsd/etmv4/trc_pkt_types_etmv4.h
deleted file mode 100644
index dd69a4bf6778..000000000000
--- a/contrib/opencsd/decoder/include/opencsd/etmv4/trc_pkt_types_etmv4.h
+++ /dev/null
@@ -1,367 +0,0 @@
-/*
- * \file trc_pkt_types_etmv4.h
- * \brief OpenCSD : ETMv4 packet info
- *
- * \copyright Copyright (c) 2015,2019 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.
- */
-
-#ifndef ARM_TRC_PKT_TYPES_ETMV4_H_INCLUDED
-#define ARM_TRC_PKT_TYPES_ETMV4_H_INCLUDED
-
-#include "opencsd/trc_pkt_types.h"
-
-/** @addtogroup trc_pkts
-@{*/
-
-/** @name ETMv4 Packet Types
-@{*/
-
-/** I stream packets. */
-typedef enum _ocsd_etmv4_i_pkt_type
-{
-/* state of decode markers */
- ETM4_PKT_I_NOTSYNC = 0x200, /*!< no sync found yet. */
- ETM4_PKT_I_INCOMPLETE_EOT, /*!< flushing incomplete/empty packet at end of trace.*/
- ETM4_PKT_I_NO_ERR_TYPE, /*!< error type not set for packet. */
-
-/* markers for unknown/bad packets */
- ETM4_PKT_I_BAD_SEQUENCE = 0x300, /*!< invalid sequence for packet type. */
- ETM4_PKT_I_BAD_TRACEMODE, /*!< invalid packet type for this trace mode. */
- ETM4_PKT_I_RESERVED, /*!< packet type reserved. */
- ETM4_PKT_I_RESERVED_CFG, /*!< packet type reserved for current configuration */
-
-/* I stream packet types. */
- /* extension header. */
- ETM4_PKT_I_EXTENSION = 0x00, /*!< b00000000 */
-
- /* sync */
- ETM4_PKT_I_TRACE_INFO = 0x01, /*!< b00000001 */
- // timestamp
- ETM4_PKT_I_TIMESTAMP = 0x02, /*!< b0000001x */
- ETM4_PKT_I_TRACE_ON = 0x04, /*!< b00000100 */
- ETM4_PKT_I_FUNC_RET = 0x05, /*!< b00000101 (V8M only) */
- // Exceptions
- ETM4_PKT_I_EXCEPT = 0x06, /*!< b00000110 */
- ETM4_PKT_I_EXCEPT_RTN = 0x07, /*!< b00000111 */
-
- /* unused encodings 0x08-0xB b00001000 to b00001011 */
-
- /* cycle count packets */
- ETM4_PKT_I_CCNT_F2 = 0x0C, /*!< b0000110x */
- ETM4_PKT_I_CCNT_F1 = 0x0E, /*!< b0000111x */
- ETM4_PKT_I_CCNT_F3 = 0x10, /*!< b0001xxxx */
-
- // data synchronisation markers
- ETM4_PKT_I_NUM_DS_MKR = 0x20, /*!< b00100xxx */
- ETM4_PKT_I_UNNUM_DS_MKR = 0x28, /*!< b00101000 to b00101100 0x2C */
-
- // speculation
- ETM4_PKT_I_COMMIT = 0x2D, /*!< b00101101 */
- ETM4_PKT_I_CANCEL_F1 = 0x2E, /*!< b0010111x */
- ETM4_PKT_I_MISPREDICT = 0x30, /*!< b001100xx */
- ETM4_PKT_I_CANCEL_F2 = 0x34, /*!< b001101xx */
- ETM4_PKT_I_CANCEL_F3 = 0x38, /*!< b00111xxx */
-
- /* conditional instruction tracing */
- ETM4_PKT_I_COND_I_F2 = 0x40, /*!< b01000000 - b01000010 */
- ETM4_PKT_I_COND_FLUSH = 0x43, /*!< b01000011 */
- ETM4_PKT_I_COND_RES_F4 = 0x44, /*!< b0100010x, b01000110 */
- /* unused encoding 0x47 b01000111 */
- ETM4_PKT_I_COND_RES_F2 = 0x48, /*!< b0100100x, b01001010, b0100110x, b01001110 */
- /* unused encodings 0x4B,0x4F b01001011, b01001111 */
- ETM4_PKT_I_COND_RES_F3 = 0x50, /*!< b0101xxxx */
- /* unused encodings 0x60-0x67 b01100xxx */
- ETM4_PKT_I_COND_RES_F1 = 0x68, /*!< b011010xx, b0110111x 0x68-0x6B, 0x6e-0x6F */
- ETM4_PKT_I_COND_I_F1 = 0x6C, /*!< b01101100 */
- ETM4_PKT_I_COND_I_F3 = 0x6D, /*!< b01101101 */
-
- // event trace
- ETM4_PKT_I_IGNORE = 0x70, /*!< b01110000 */
- ETM4_PKT_I_EVENT = 0x71, /*!< b01110001 to 0x01111111 0x7F */
-
- /* address and context */
- ETM4_PKT_I_CTXT = 0x80, /*!< b1000000x */
- ETM4_PKT_I_ADDR_CTXT_L_32IS0 = 0x82, /*!< b10000010 */
- ETM4_PKT_I_ADDR_CTXT_L_32IS1, /*!< b10000011 */
- /* unused encoding 0x84 b10000100 */
- 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 */
- 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 */
- ETM4_PKT_I_ADDR_S_IS1, /*!< b10010110 */
- /* unused encodings 0x97 b10010111 to b10011001 0x99 */
- ETM4_PKT_I_ADDR_L_32IS0 = 0x9A, /*!< b10011010 */
- ETM4_PKT_I_ADDR_L_32IS1, /*!< b10011011 */
- /* unused encoding 0x9C b10011100 */
- ETM4_PKT_I_ADDR_L_64IS0 = 0x9D, /*!< b10011101 */
- ETM4_PKT_I_ADDR_L_64IS1, /*!< b10011110 */
- /* unused encoding 0x9F b10011111 */
-
- /* Q packets */
- ETM4_PKT_I_Q = 0xA0, /*!< b1010xxxx */
-
- /* unused encodings 0xB0-0xBF b1011xxxx */
-
- /* Atom packets */
- ETM4_PKT_I_ATOM_F6 = 0xC0, /*!< b11000000 - b11010100 0xC0 - 0xD4, b11100000 - b11110100 0xE0 - 0xF4 */
- ETM4_PKT_I_ATOM_F5 = 0xD5, /*!< b11010101 - b11010111 0xD5 - 0xD7, b11110101 0xF5 */
- ETM4_PKT_I_ATOM_F2 = 0xD8, /*!< b110110xx to 0xDB */
- ETM4_PKT_I_ATOM_F4 = 0xDC, /*!< b110111xx to 0xDF */
- ETM4_PKT_I_ATOM_F1 = 0xF6, /*!< b1111011x to 0xF7 */
- ETM4_PKT_I_ATOM_F3 = 0xF8, /*!< b11111xxx to 0xFF */
-
- // extension packets - follow 0x00 header
- ETM4_PKT_I_ASYNC = 0x100, //!< b00000000
- ETM4_PKT_I_DISCARD = 0x103, //!< b00000011
- ETM4_PKT_I_OVERFLOW = 0x105, //!< b00000101
-
-} ocsd_etmv4_i_pkt_type;
-
-typedef union _etmv4_trace_info_t {
- uint32_t val; //!< trace info full value.
- struct {
- uint32_t cc_enabled:1; //!< 1 if cycle count enabled
- uint32_t cond_enabled:3; //!< conditional trace enabeld type
- uint32_t p0_load:1; //!< 1 if tracing with P0 load elements (for data trace)
- uint32_t p0_store:1; //!< 1 if tracing with P0 store elements (for data trace)
- } bits; //!< bitfields for trace info value.
-} etmv4_trace_info_t;
-
-typedef struct _etmv4_context_t {
- struct {
- uint32_t EL:2; //!< exception level.
- uint32_t SF:1; //!< sixty four bit
- uint32_t NS:1; //!< none secure
- uint32_t updated:1; //!< updated this context packet (otherwise same as last time)
- uint32_t updated_c:1; //!< updated CtxtID
- uint32_t updated_v:1; //!< updated VMID
- };
- uint32_t ctxtID; //!< Current ctxtID
- uint32_t VMID; //!< current VMID
-} etmv4_context_t;
-
-/** a broadcast address value. */
-typedef struct _etmv4_addr_val_t {
- ocsd_vaddr_t val; //!< Address value.
- uint8_t isa; //!< instruction set.
-} etmv4_addr_val_t;
-
-typedef struct _ocsd_etmv4_i_pkt
-{
- ocsd_etmv4_i_pkt_type type; /**< Trace packet type derived from header byte */
-
- //** intra-packet data - valid across packets.
-
- ocsd_pkt_vaddr v_addr; //!< most recently broadcast address packet
- uint8_t v_addr_ISA; //!< ISA for the address packet. (0 = IS0 / 1 = IS1)
-
- etmv4_context_t context; //!< current context for PE
-
- struct {
- uint64_t timestamp; //!< current timestamp value
- uint8_t bits_changed; //!< bits updated in this timestamp packet.
- } ts;
-
- uint32_t cc_threshold; //!< cycle count threshold - from trace info.
-
- // single packet data - only valid for specific packet types on packet instance.
- ocsd_pkt_atom atom; //!< atom elements - number of atoms indicates validity of packet
- uint32_t cycle_count; //!< cycle count
-
- uint32_t curr_spec_depth; //!< current speculation depth
- uint32_t p0_key; //!< current P0 key value for data packet synchronisation
-
- uint32_t commit_elements; //<! commit elements indicated by this packet - valid dependent on the packet type.
- uint32_t cancel_elements; //<! cancel elements indicated by this packet - valid dependent on the packet type.
-
- etmv4_trace_info_t trace_info; //!< trace info structure - programmed configuration of trace capture.
-
- struct {
- uint32_t exceptionType:10; //!< exception number
- uint32_t addr_interp:2; //!< address value interpretation
- uint32_t m_fault_pending:1; //!< M class fault pending.
- uint32_t m_type:1; //!< 1 if M class exception.
- } exception_info;
-
-
- uint8_t addr_exact_match_idx; //!< address match index in this packet.
- uint8_t dsm_val; //!< Data Sync Marker number, or unnumbered atom count - packet type determines.
- uint8_t event_val; //!< Event value on event packet.
-
- struct {
- uint32_t cond_c_key;
- uint8_t num_c_elem;
- struct {
- uint32_t cond_key_set:1;
- uint32_t f3_final_elem:1;
- uint32_t f2_cond_incr:1;
- };
- } cond_instr;
-
- struct {
- uint32_t cond_r_key_0;
- uint32_t cond_r_key_1;
- struct {
- uint32_t res_0:4;
- uint32_t res_1:4;
- uint32_t ci_0:1;
- uint32_t ci_1:1;
- uint32_t key_res_0_set:1;
- uint32_t key_res_1_set:1;
- uint32_t f2_key_incr:2;
- uint32_t f2f4_token:2;
- uint32_t f3_tokens:12;
- };
- } cond_result;
-
- struct {
- uint32_t q_count;
- struct {
- uint32_t addr_present:1;
- uint32_t addr_match:1;
- uint32_t count_present:1;
- uint32_t q_type:4;
- };
- } Q_pkt;
-
- //! valid bits for packet elements (addresses have their own valid bits).
- union {
- uint32_t val;
- struct {
- uint32_t context_valid:1;
- uint32_t ts_valid:1;
- uint32_t spec_depth_valid:1;
- uint32_t p0_key_valid:1;
- uint32_t cond_c_key_valid:1;
- uint32_t cond_r_key_valid:1;
- uint32_t trace_info_valid:1;
- uint32_t cc_thresh_valid:1;
- uint32_t cc_valid:1;
- uint32_t commit_elem_valid:1;
- } bits;
- } pkt_valid;
-
- // original header type when packet type changed to error on decode error.
- ocsd_etmv4_i_pkt_type err_type;
- uint8_t err_hdr_val;
-
-} ocsd_etmv4_i_pkt;
-
-
-// D stream packets
-typedef enum _ocsd_etmv4_d_pkt_type
-{
-// markers for unknown/bad packets
- ETM4_PKT_D_NOTSYNC = 0x200, //!< no sync found yet
- ETM4_PKT_D_BAD_SEQUENCE, //!< invalid sequence for packet type
- ETM4_PKT_D_BAD_TRACEMODE, //!< invalid packet type for this trace mode.
- ETM4_PKT_D_RESERVED, //!< packet type reserved.
- ETM4_PKT_D_INCOMPLETE_EOT, //!< flushing incomplete packet at end of trace.
- ETM4_PKT_D_NO_HEADER, //!< waiting for a header byte
- ETM4_PKT_D_NO_ERR_TYPE, //!< error packet has no header based type. Use with unknown/res packet types.
-
- // data sync markers
- ETM4_PKT_DNUM_DS_MKR = 0x111, // ext packet, b0001xxx1
- // extension header
- ETM4_PKT_D_EXTENSION = 0x00, //!< b00000000
-
- ETM4_PKT_DUNNUM_DS_MKR = 0x01, //!< b00000001
- // event trace
- ETM4_PKT_DEVENT = 0x04, //!< b00000100
- // timestamp
- ETM4_PKT_DTIMESTAMP = 0x02, //!< b00000010
- // P1 Data address
- ETM4_PKT_DADDR_P1_F1 = 0x70, //!< b0111xxxx
- ETM4_PKT_DADDR_P1_F2 = 0x80, //!< b10xxxxxx
- ETM4_PKT_DADDR_P1_F3 = 0x14, //!< b000101xx
- ETM4_PKT_DADDR_P1_F4 = 0x60, //!< b0110xxxx
- ETM4_PKT_DADDR_P1_F5 = 0xF8, //!< b11111xxx
- ETM4_PKT_DADDR_P1_F6 = 0xF6, //!< b1111011x
- ETM4_PKT_DADDR_P1_F7 = 0xF5, //!< b11110101
- // P2 Data value
- ETM4_PKT_DVAL_P2_F1 = 0x20, //!< b0010xxxx
- ETM4_PKT_DVAL_P2_F2 = 0x30, //!< b00110xxx
- ETM4_PKT_DVAL_P2_F3 = 0x40, //!< b010xxxxx
- ETM4_PKT_DVAL_P2_F4 = 0x10, //!< b000100xx
- ETM4_PKT_DVAL_P2_F5 = 0x18, //!< b00011xxx
- ETM4_PKT_DVAL_P2_F6 = 0x38, //!< b00111xxx
- // suppression
- ETM4_PKT_DSUPPRESSION = 0x03, //!< b00000011
- // synchronisation- extension packets - follow 0x00 header
- ETM4_PKT_DTRACE_INFO = 0x101, //!< b00000001
-
- // extension packets - follow 0x00 header
- ETM4_PKT_D_ASYNC = 0x100, //!< b00000000
- ETM4_PKT_D_DISCARD = 0x103, //!< b00000011
- ETM4_PKT_D_OVERFLOW = 0x105 //!< b00000101
-
-} ocsd_etmv4_d_pkt_type;
-
-
-typedef struct _ocsd_etmv4_d_pkt
-{
- ocsd_etmv4_d_pkt_type type;
-
- ocsd_pkt_vaddr d_addr;
-
- uint64_t pkt_val; /**< Packet value -> data value, timestamp value, event value */
-
- ocsd_etmv4_d_pkt_type err_type;
-
-} ocsd_etmv4_d_pkt;
-
-typedef struct _ocsd_etmv4_cfg
-{
- uint32_t reg_idr0; /**< ID0 register */
- uint32_t reg_idr1; /**< ID1 register */
- uint32_t reg_idr2; /**< ID2 register */
- uint32_t reg_idr8;
- uint32_t reg_idr9;
- uint32_t reg_idr10;
- uint32_t reg_idr11;
- uint32_t reg_idr12;
- uint32_t reg_idr13;
- uint32_t reg_configr; /**< Config Register */
- uint32_t reg_traceidr; /**< Trace Stream ID register */
- ocsd_arch_version_t arch_ver; /**< Architecture version */
- ocsd_core_profile_t core_prof; /**< Core Profile */
-} ocsd_etmv4_cfg;
-
-
-/** @}*/
-/** @}*/
-#endif // ARM_TRC_PKT_TYPES_ETMV4_H_INCLUDED
-
-/* End of File trc_pkt_types_etmv4.h */
-
diff --git a/contrib/opencsd/decoder/include/opencsd/ocsd_if_types.h b/contrib/opencsd/decoder/include/opencsd/ocsd_if_types.h
deleted file mode 100644
index 7d74d77c240b..000000000000
--- a/contrib/opencsd/decoder/include/opencsd/ocsd_if_types.h
+++ /dev/null
@@ -1,626 +0,0 @@
-/*!
- * \file opencsd/ocsd_if_types.h
- * \brief OpenCSD : Standard Types used in the library interfaces.
- *
- * \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.
- */
-
-#ifndef ARM_OCSD_IF_TYPES_H_INCLUDED
-#define ARM_OCSD_IF_TYPES_H_INCLUDED
-
-#include <stdint.h>
-#include <stddef.h>
-#if defined(_MSC_VER) && (_MSC_VER < 1900)
-/** VS2010 does not support inttypes - remove when VS2010 support is dropped */
-#define __PRI64_PREFIX "ll"
-#define PRIX64 __PRI64_PREFIX "X"
-#define PRIu64 __PRI64_PREFIX "u"
-#define PRIu32 "u"
-#else
-#include <inttypes.h>
-#endif
-
-
-/** @defgroup ocsd_interfaces OpenCSD Library : Interfaces
- @brief Set of types, structures and virtual interface classes making up the primary API
-
- Set of component interfaces that connect various source reader and decode components into a
- decode tree to allow trace decode for the trace data being output by the source reader.
-
-@{*/
-
-
-
-/** @name Trace Indexing and Channel IDs
-@{*/
-#ifdef ENABLE_LARGE_TRACE_SOURCES
-typedef uint64_t ocsd_trc_index_t; /**< Trace source index type - 64 bit size */
-#define OCSD_TRC_IDX_STR PRIu64
-#else
-typedef uint32_t ocsd_trc_index_t; /**< Trace source index type - 32 bit size */
-#define OCSD_TRC_IDX_STR PRIu32
-#endif
-
-/** Invalid trace index value */
-#define OCSD_BAD_TRC_INDEX ((ocsd_trc_index_t)-1)
-/** Invalid trace source ID value */
-#define OCSD_BAD_CS_SRC_ID ((uint8_t)-1)
-/** macro returing true if trace source ID is in valid range (0x0 < ID < 0x70) */
-#define OCSD_IS_VALID_CS_SRC_ID(id) ((id > 0) && (id < 0x70))
-/** macro returing true if trace source ID is in reserved range (ID == 0x0 || 0x70 <= ID <= 0x7F) */
-#define OCSD_IS_RESERVED_CS_SRC_ID(id) ((id == 0) || ((id >= 0x70) && (id <= 0x7F))
-/** @}*/
-
-/** @name General Library Return and Error Codes
-@{*/
-
-/** Library Error return type */
-typedef enum _ocsd_err_t {
-
- /* general return errors */
- OCSD_OK = 0, /**< No Error. */
- OCSD_ERR_FAIL, /**< General systemic failure. */
- OCSD_ERR_MEM, /**< Internal memory allocation error. */
- OCSD_ERR_NOT_INIT, /**< Component not initialised or initialisation failure. */
- OCSD_ERR_INVALID_ID, /**< Invalid CoreSight Trace Source ID. */
- OCSD_ERR_BAD_HANDLE, /**< Invalid handle passed to component. */
- OCSD_ERR_INVALID_PARAM_VAL, /**< Invalid value parameter passed to component. */
- OCSD_ERR_INVALID_PARAM_TYPE, /**< Type mismatch on abstract interface */
- OCSD_ERR_FILE_ERROR, /**< File access error */
- OCSD_ERR_NO_PROTOCOL, /**< Trace protocol unsupported */
- /* attachment point errors */
- OCSD_ERR_ATTACH_TOO_MANY, /**< Cannot attach - attach device limit reached. */
- OCSD_ERR_ATTACH_INVALID_PARAM, /**< Cannot attach - invalid parameter. */
- OCSD_ERR_ATTACH_COMP_NOT_FOUND,/**< Cannot detach - component not found. */
- /* source reader errors */
- OCSD_ERR_RDR_FILE_NOT_FOUND, /**< source reader - file not found. */
- OCSD_ERR_RDR_INVALID_INIT, /**< source reader - invalid initialisation parameter. */
- OCSD_ERR_RDR_NO_DECODER, /**< source reader - not trace decoder set. */
- /* data path errors */
- OCSD_ERR_DATA_DECODE_FATAL, /**< A decoder in the data path has returned a fatal error. */
- /* frame deformatter errors */
- OCSD_ERR_DFMTR_NOTCONTTRACE, /**< Trace input to deformatter none-continuous */
- OCSD_ERR_DFMTR_BAD_FHSYNC, /**< Bad frame or half frame sync in trace deformatter */
- /* packet processor errors - protocol issues etc */
- OCSD_ERR_BAD_PACKET_SEQ, /**< Bad packet sequence */
- OCSD_ERR_INVALID_PCKT_HDR, /**< Invalid packet header */
- OCSD_ERR_PKT_INTERP_FAIL, /**< Interpreter failed - cannot recover - bad data or sequence */
- /* packet decoder errors */
- OCSD_ERR_UNSUPPORTED_ISA, /**< ISA not supported in decoder. */
- OCSD_ERR_HW_CFG_UNSUPP, /**< Programmed trace configuration not supported by decoder.*/
- OCSD_ERR_UNSUPP_DECODE_PKT, /**< Packet not supported in decoder */
- OCSD_ERR_BAD_DECODE_PKT, /**< reserved or unknown packet in decoder. */
- OCSD_ERR_COMMIT_PKT_OVERRUN, /**< overrun in commit packet stack - tried to commit more than available */
- OCSD_ERR_MEM_NACC, /**< unable to access required memory address */
- OCSD_ERR_RET_STACK_OVERFLOW, /**< internal return stack overflow checks failed - popped more than we pushed. */
- /* decode tree errors */
- OCSD_ERR_DCDT_NO_FORMATTER, /**< No formatter in use - operation not valid. */
- /* target memory access errors */
- OCSD_ERR_MEM_ACC_OVERLAP, /**< Attempted to set an overlapping range in memory access map */
- OCSD_ERR_MEM_ACC_FILE_NOT_FOUND, /**< Memory access file could not be opened */
- OCSD_ERR_MEM_ACC_FILE_DIFF_RANGE, /**< Attempt to re-use the same memory access file for a different address range */
- OCSD_ERR_MEM_ACC_RANGE_INVALID, /**< Address range in accessor set to invalid values */
- OCSD_ERR_MEM_ACC_BAD_LEN, /**< Memory accessor returned a bad read length value (larger than requested */
- /* test errors - errors generated only by the test code, not the library */
- OCSD_ERR_TEST_SNAPSHOT_PARSE, /**< test snapshot file parse error */
- OCSD_ERR_TEST_SNAPSHOT_PARSE_INFO, /**< test snapshot file parse information */
- OCSD_ERR_TEST_SNAPSHOT_READ, /**< test snapshot reader error */
- OCSD_ERR_TEST_SS_TO_DECODER, /**< test snapshot to decode tree conversion error */
- /* decoder registration */
- OCSD_ERR_DCDREG_NAME_REPEAT, /**< attempted to register a decoder with the same name as another one */
- OCSD_ERR_DCDREG_NAME_UNKNOWN, /**< attempted to find a decoder with a name that is not known in the library */
- OCSD_ERR_DCDREG_TYPE_UNKNOWN, /**< attempted to find a decoder with a type that is not known in the library */
- OCSD_ERR_DCDREG_TOOMANY, /**< attempted to register too many custom decoders */
- /* decoder config */
- OCSD_ERR_DCD_INTERFACE_UNUSED, /**< Attempt to connect or use and interface not supported by this decoder. */
- /* end marker*/
- OCSD_ERR_LAST
-} ocsd_err_t;
-
-/* component handle types */
-typedef unsigned int ocsd_hndl_rdr_t; /**< reader control handle */
-typedef unsigned int ocsd_hndl_err_log_t; /**< error logger connection handle */
-
-/* common invalid handle type */
-#define OCSD_INVALID_HANDLE (unsigned int)-1 /**< Global invalid handle value */
-
-/*! Error Severity Type
- *
- * Used to indicate the severity of an error, and also as the
- * error log verbosity level in the error logger.
- *
- * The logger will ignore errors with a severity value higher than the
- * current verbosity level.
- *
- * The value OCSD_ERR_SEV_NONE can only be used as a verbosity level to switch off logging,
- * not as a severity value on an error. The other values can be used as both error severity and
- * logger verbosity values.
- */
-typedef enum _ocsd_err_severity_t {
- OCSD_ERR_SEV_NONE, /**< No error logging. */
- OCSD_ERR_SEV_ERROR, /**< Most severe error - perhaps fatal. */
- OCSD_ERR_SEV_WARN, /**< Warning level. Inconsistent or incorrect data seen but can carry on decode processing */
- OCSD_ERR_SEV_INFO, /**< Information only message. Use for debugging code or suspect input data. */
-} ocsd_err_severity_t;
-
-/** @}*/
-
-/** @name Trace Datapath
-@{*/
-
-/** Trace Datapath operations.
- */
-typedef enum _ocsd_datapath_op_t {
- OCSD_OP_DATA = 0, /**< Standard index + data packet */
- OCSD_OP_EOT, /**< End of available trace data. No data packet. */
- OCSD_OP_FLUSH, /**< Flush existing data where possible, retain decode state. No data packet. */
- OCSD_OP_RESET, /**< Reset decode state - drop any existing partial data. No data packet. */
-} ocsd_datapath_op_t;
-
-/**
- * Trace Datapath responses
- */
-typedef enum _ocsd_datapath_resp_t {
- OCSD_RESP_CONT, /**< Continue processing */
- OCSD_RESP_WARN_CONT, /**< Continue processing : a component logged a warning. */
- OCSD_RESP_ERR_CONT, /**< Continue processing : a component logged an error.*/
- OCSD_RESP_WAIT, /**< Pause processing */
- OCSD_RESP_WARN_WAIT, /**< Pause processing : a component logged a warning. */
- OCSD_RESP_ERR_WAIT, /**< Pause processing : a component logged an error. */
- OCSD_RESP_FATAL_NOT_INIT, /**< Processing Fatal Error : component unintialised. */
- OCSD_RESP_FATAL_INVALID_OP, /**< Processing Fatal Error : invalid data path operation. */
- OCSD_RESP_FATAL_INVALID_PARAM, /**< Processing Fatal Error : invalid parameter in datapath call. */
- OCSD_RESP_FATAL_INVALID_DATA, /**< Processing Fatal Error : invalid trace data */
- OCSD_RESP_FATAL_SYS_ERR, /**< Processing Fatal Error : internal system error. */
-} ocsd_datapath_resp_t;
-
-/*! Macro returning true if datapath response value is FATAL. */
-#define OCSD_DATA_RESP_IS_FATAL(x) (x >= OCSD_RESP_FATAL_NOT_INIT)
-/*! Macro returning true if datapath response value indicates WARNING logged. */
-#define OCSD_DATA_RESP_IS_WARN(x) ((x == OCSD_RESP_WARN_CONT) || (x == OCSD_RESP_WARN_WAIT))
-/*! Macro returning true if datapath response value indicates ERROR logged. */
-#define OCSD_DATA_RESP_IS_ERR(x) ((x == OCSD_RESP_ERR_CONT) || (x == OCSD_RESP_ERR_WAIT))
-/*! Macro returning true if datapath response value indicates WARNING or ERROR logged. */
-#define OCSD_DATA_RESP_IS_WARN_OR_ERR(x) (OCSD_DATA_RESP_IS_ERR(x) || OCSD_DATA_RESP_IS_WARN(x))
-/*! Macro returning true if datapath response value is CONT. */
-#define OCSD_DATA_RESP_IS_CONT(x) (x < OCSD_RESP_WAIT)
-/*! Macro returning true if datapath response value is WAIT. */
-#define OCSD_DATA_RESP_IS_WAIT(x) ((x >= OCSD_RESP_WAIT) && (x < OCSD_RESP_FATAL_NOT_INIT))
-
-/** @}*/
-
-/** @name Trace Decode component types
-@{*/
-
-
-/** Raw frame element data types
- Data blocks types output from ITrcRawFrameIn.
-*/
-typedef enum _rcdtl_rawframe_elem_t {
- OCSD_FRM_NONE, /**< None data operation on data path. (EOT etc.) */
- OCSD_FRM_PACKED, /**< Raw packed frame data */
- OCSD_FRM_HSYNC, /**< HSYNC data */
- OCSD_FRM_FSYNC, /**< Frame Sync Data */
- OCSD_FRM_ID_DATA, /**< unpacked data for ID */
-} ocsd_rawframe_elem_t;
-
-
-/** Indicates if the trace source will be frame formatted or a single protocol source.
- Used in decode tree creation and configuration code.
-*/
-typedef enum _ocsd_dcd_tree_src_t {
- OCSD_TRC_SRC_FRAME_FORMATTED, /**< input source is frame formatted. */
- OCSD_TRC_SRC_SINGLE, /**< input source is from a single protocol generator. */
-} ocsd_dcd_tree_src_t;
-
-#define OCSD_DFRMTR_HAS_FSYNCS 0x01 /**< Deformatter Config : formatted data has fsyncs - input data 4 byte aligned */
-#define OCSD_DFRMTR_HAS_HSYNCS 0x02 /**< Deformatter Config : formatted data has hsyncs - input data 2 byte aligned */
-#define OCSD_DFRMTR_FRAME_MEM_ALIGN 0x04 /**< Deformatter Config : formatted frames are memory aligned, no syncs. Input data 16 byte frame aligned. */
-#define OCSD_DFRMTR_PACKED_RAW_OUT 0x08 /**< Deformatter Config : output raw packed frame data if raw monitor attached. */
-#define OCSD_DFRMTR_UNPACKED_RAW_OUT 0x10 /**< Deformatter Config : output raw unpacked frame data if raw monitor attached. */
-#define OCSD_DFRMTR_RESET_ON_4X_FSYNC 0x20 /**< Deformatter Config : reset downstream decoders if frame aligned 4x consecutive fsyncs spotted. (perf workaround) */
-#define OCSD_DFRMTR_VALID_MASK 0x3F /**< Deformatter Config : valid mask for deformatter configuration */
-
-#define OCSD_DFRMTR_FRAME_SIZE 0x10 /**< CoreSight frame formatter frame size constant in bytes. */
-
-/** @}*/
-
-/** @name Trace Decode Component Name Prefixes
- *
- * Set of standard prefixes to be used for component names
-@{*/
-
-/** Component name prefix for trace source reader components */
-#define OCSD_CMPNAME_PREFIX_SOURCE_READER "SRDR"
-/** Component name prefix for trace frame deformatter component */
-#define OCSD_CMPNAME_PREFIX_FRAMEDEFORMATTER "DFMT"
-/** Component name prefix for trace packet processor. */
-#define OCSD_CMPNAME_PREFIX_PKTPROC "PKTP"
-/** Component name prefix for trace packet decoder. */
-#define OCSD_CMPNAME_PREFIX_PKTDEC "PDEC"
-
-/** @}*/
-
-/** @name Trace Decode Arch and Profile
-@{*/
-
-/** Core Architecture Version */
-typedef enum _ocsd_arch_version {
- ARCH_UNKNOWN, /**< unknown architecture */
- ARCH_CUSTOM, /**< None ARM, custom architecture */
- ARCH_V7, /**< V7 architecture */
- ARCH_V8, /**< V8 architecture */
- ARCH_V8r3, /**< V8.3 architecture */
-} ocsd_arch_version_t;
-
-// macros for arch version comparisons.
-#define OCSD_IS_V8_ARCH(arch) ((arch >= ARCH_V8) && (arch <= ARCH_V8r3))
-#define OCSD_MIN_V8_ARCH(arch) (arch >= ARCH_V8)
-
-/** Core Profile */
-typedef enum _ocsd_core_profile {
- profile_Unknown, /**< Unknown profile */
- profile_CortexM, /**< Cortex-M profile */
- profile_CortexR, /**< Cortex-R profile */
- profile_CortexA, /**< Cortex-A profile */
- profile_Custom, /**< None ARM, custom arch profile */
-} ocsd_core_profile_t;
-
-/** Combined architecture and profile descriptor for a core */
-typedef struct _ocsd_arch_profile_t {
- ocsd_arch_version_t arch; /**< core architecture */
- ocsd_core_profile_t profile; /**< core profile */
-} ocsd_arch_profile_t;
-
-/* may want to use a 32 bit v-addr when running on 32 bit only ARM platforms. */
-#ifdef USE_32BIT_V_ADDR
-typedef uint32_t ocsd_vaddr_t; /**< 32 bit virtual addressing in library - use if compiling on 32 bit platforms */
-#define OCSD_MAX_VA_BITSIZE 32 /**< 32 bit Virtual address bitsize macro */
-#define OCSD_VA_MASK ~0UL /**< 32 bit Virtual address bitsize mask */
-#else
-typedef uint64_t ocsd_vaddr_t; /**< 64 bit virtual addressing in library */
-#define OCSD_MAX_VA_BITSIZE 64 /**< 64 bit Virtual address bitsize macro */
-#define OCSD_VA_MASK ~0ULL /**< 64 bit Virtual address bitsize mask */
-#endif
-
-/** A bit mask for the first 'bits' consecutive bits of an address */
-#define OCSD_BIT_MASK(bits) (bits == OCSD_MAX_VA_BITSIZE) ? OCSD_VA_MASK : ((ocsd_vaddr_t)1 << bits) - 1
-
-/** @}*/
-
-/** @name Instruction Decode Information
-@{*/
-
-/** Instruction Set Architecture type
- *
- */
-typedef enum _ocsd_isa
-{
- ocsd_isa_arm, /**< V7 ARM 32, V8 AArch32 */
- ocsd_isa_thumb2, /**< Thumb2 -> 16/32 bit instructions */
- ocsd_isa_aarch64, /**< V8 AArch64 */
- ocsd_isa_tee, /**< Thumb EE - unsupported */
- ocsd_isa_jazelle, /**< Jazelle - unsupported in trace */
- ocsd_isa_custom, /**< Instruction set - custom arch decoder */
- ocsd_isa_unknown /**< ISA not yet known */
-} ocsd_isa;
-
-/** Security level type
-*/
-typedef enum _ocsd_sec_level
-{
- ocsd_sec_secure, /**< Core is in secure state */
- ocsd_sec_nonsecure /**< Core is in non-secure state */
-} ocsd_sec_level ;
-
-/** Exception level type
-*/
-typedef enum _ocsd_ex_level
-{
- ocsd_EL_unknown = -1, /**< EL unknown / unsupported in trace */
- ocsd_EL0 = 0, /**< EL0 */
- ocsd_EL1, /**< EL1 */
- ocsd_EL2, /**< EL2 */
- ocsd_EL3, /**< EL3 */
-} ocsd_ex_level;
-
-
-/** instruction types - significant for waypoint calculaitons */
-typedef enum _ocsd_instr_type {
- OCSD_INSTR_OTHER, /**< Other instruction - not significant for waypoints. */
- OCSD_INSTR_BR, /**< Immediate Branch instruction */
- OCSD_INSTR_BR_INDIRECT, /**< Indirect Branch instruction */
- OCSD_INSTR_ISB, /**< Barrier : ISB instruction */
- OCSD_INSTR_DSB_DMB, /**< Barrier : DSB or DMB instruction */
- OCSD_INSTR_WFI_WFE, /**< WFI or WFE traced as direct branch */
-} ocsd_instr_type;
-
-/** instruction sub types - addiitonal information passed to the output packets
- for trace analysis tools.
- */
-typedef enum _ocsd_instr_subtype {
- OCSD_S_INSTR_NONE, /**< no subtype set */
- OCSD_S_INSTR_BR_LINK, /**< branch with link */
- OCSD_S_INSTR_V8_RET, /**< v8 ret instruction - subtype of BR_INDIRECT */
- OCSD_S_INSTR_V8_ERET, /**< v8 eret instruction - subtype of BR_INDIRECT */
- OCSD_S_INSTR_V7_IMPLIED_RET, /**< v7 instruction which could imply return e.g. MOV PC, LR; POP { ,pc} */
-} ocsd_instr_subtype;
-
-/** Instruction decode request structure.
- *
- * Used in IInstrDecode interface.
- *
- * Caller fills in the input: information, callee then fills in the decoder: information.
- */
-typedef struct _ocsd_instr_info {
- /* input information */
- ocsd_arch_profile_t pe_type; /**< input: Core Arch and profile */
- ocsd_isa isa; /**< Input: Current ISA. */
- ocsd_vaddr_t instr_addr; /**< Input: Instruction address. */
- uint32_t opcode; /**< Input: Opcode at address. 16 bit opcodes will use MS 16bits of parameter. */
- uint8_t dsb_dmb_waypoints; /**< Input: DMB and DSB are waypoints */
- uint8_t wfi_wfe_branch; /**< Input: WFI, WFE classed as direct branches */
-
- /* instruction decode info */
- ocsd_instr_type type; /**< Decoder: Current instruction type. */
- ocsd_vaddr_t branch_addr; /**< Decoder: Calculated address of branch instrcution (direct branches only) */
- ocsd_isa next_isa; /**< Decoder: ISA for next intruction. */
- uint8_t instr_size; /**< Decoder : size of the decoded instruction */
- uint8_t is_conditional; /**< Decoder : set to 1 if this instruction is conditional */
- uint8_t is_link; /**< Decoder : is a branch with link instruction */
- uint8_t thumb_it_conditions; /**< Decoder : return number of following instructions set with conditions by this Thumb IT instruction */
- ocsd_instr_subtype sub_type; /**< Decoder : current instruction sub-type if known */
-} ocsd_instr_info;
-
-
-/** Core(PE) context structure
- records current security state, exception level, VMID and ContextID for core.
-*/
-typedef struct _ocsd_pe_context {
- ocsd_sec_level security_level; /**< security state */
- ocsd_ex_level exception_level; /**< exception level */
- uint32_t context_id; /**< context ID */
- uint32_t vmid; /**< VMID */
- struct {
- uint32_t bits64:1; /**< 1 if 64 bit operation */
- uint32_t ctxt_id_valid:1; /**< 1 if context ID value valid */
- uint32_t vmid_valid:1; /**< 1 if VMID value is valid */
- uint32_t el_valid:1; /**< 1 if EL value is valid (ETMv4 traces EL, other protocols do not) */
- };
-} ocsd_pe_context;
-
-
-/** @}*/
-
-/** @name Opcode Memory Access
- Types used when accessing memory storage for traced opcodes..
-@{*/
-
-/** memory space bitfield enum for available security states and exception levels used
- when accessing memory. */
-typedef enum _ocsd_mem_space_acc_t {
- OCSD_MEM_SPACE_EL1S = 0x1, /**< S EL1/0 */
- OCSD_MEM_SPACE_EL1N = 0x2, /**< NS EL1/0 */
- OCSD_MEM_SPACE_EL2 = 0x4, /**< NS EL2 */
- OCSD_MEM_SPACE_EL3 = 0x8, /**< S EL3 */
- OCSD_MEM_SPACE_S = 0x9, /**< Any S */
- OCSD_MEM_SPACE_N = 0x6, /**< Any NS */
- OCSD_MEM_SPACE_ANY = 0xF, /**< Any sec level / EL - live system use current EL + sec state */
-} ocsd_mem_space_acc_t;
-
-/**
- * Callback function definition for callback function memory accessor type.
- *
- * When using callback memory accessor, the decoder will call this function to obtain the
- * memory at the address for the current opcodes. The memory space will represent the current
- * exception level and security context of the traced code.
- *
- * Return the number of bytes read, which can be less than the amount requested if this would take the
- * access address outside the range of addresses defined when this callback was registered with the decoder.
- *
- * Return 0 bytes if start address out of covered range, or memory space is not one of those defined as supported
- * when the callback was registered.
- *
- * @param p_context : opaque context pointer set by callback client.
- * @param address : start address of memory to be accessed
- * @param mem_space : memory space of accessed memory (current EL & security state)
- * @param reqBytes : number of bytes required
- * @param *byteBuffer : buffer for data.
- *
- * @return uint32_t : Number of bytes actually read, or 0 for access error.
- */
-typedef uint32_t (* Fn_MemAcc_CB)(const void *p_context, const ocsd_vaddr_t address, const ocsd_mem_space_acc_t mem_space, const uint32_t reqBytes, uint8_t *byteBuffer);
-
-/**
-* Callback function definition for callback function memory accessor type.
-*
-* When using callback memory accessor, the decoder will call this function to obtain the
-* memory at the address for the current opcodes. The memory space will represent the current
-* exception level and security context of the traced code.
-*
-* Return the number of bytes read, which can be less than the amount requested if this would take the
-* access address outside the range of addresses defined when this callback was registered with the decoder.
-*
-* Return 0 bytes if start address out of covered range, or memory space is not one of those defined as supported
-* when the callback was registered.
-*
-* @param p_context : opaque context pointer set by callback client.
-* @param address : start address of memory to be accessed
-* @param mem_space : memory space of accessed memory (current EL & security state)
-* @param trcID : Trace ID for source of trace - allow CB to client to associate mem req with source cpu.
-* @param reqBytes : number of bytes required
-* @param *byteBuffer : buffer for data.
-*
-* @return uint32_t : Number of bytes actually read, or 0 for access error.
-*/
-typedef uint32_t (* Fn_MemAccID_CB)(const void *p_context, const ocsd_vaddr_t address, const ocsd_mem_space_acc_t mem_space, const uint8_t trcID, const uint32_t reqBytes, uint8_t *byteBuffer);
-
-
-/** memory region type for adding multi-region binary files to memory access interface */
-typedef struct _ocsd_file_mem_region {
- size_t file_offset; /**< Offset from start of file for memory region */
- ocsd_vaddr_t start_address; /**< Start address of memory region */
- size_t region_size; /**< size in bytes of memory region */
-} ocsd_file_mem_region_t;
-
-/** @}*/
-
-/** @name Packet Processor Operation Control Flags
- common operational flags - bottom 16 bits,
- component specific - top 16 bits.
-@{*/
-
-#define OCSD_OPFLG_PKTPROC_NOFWD_BAD_PKTS 0x00000001 /**< don't forward bad packets up data path */
-#define OCSD_OPFLG_PKTPROC_NOMON_BAD_PKTS 0x00000002 /**< don't forward bad packets to monitor interface */
-#define OCSD_OPFLG_PKTPROC_ERR_BAD_PKTS 0x00000004 /**< throw error for bad packets - halt decoding. */
-#define OCSD_OPFLG_PKTPROC_UNSYNC_ON_BAD_PKTS 0x00000008 /**< switch to unsynced state on bad packets - wait for next sync point */
-
-/** mask to combine all common packet processor operational control flags */
-#define OCSD_OPFLG_PKTPROC_COMMON (OCSD_OPFLG_PKTPROC_NOFWD_BAD_PKTS | \
- OCSD_OPFLG_PKTPROC_NOMON_BAD_PKTS | \
- OCSD_OPFLG_PKTPROC_ERR_BAD_PKTS | \
- OCSD_OPFLG_PKTPROC_UNSYNC_ON_BAD_PKTS )
-
-/** @}*/
-
-/** @name Packet Decoder Operation Control Flags
- common operational flags - bottom 16 bits,
- component specific - top 16 bits.
-@{*/
-
-#define OCSD_OPFLG_PKTDEC_ERROR_BAD_PKTS 0x00000001 /**< throw error on bad packets input (default is to unsync and wait) */
-
-/** mask to combine all common packet processor operational control flags */
-#define OCSD_OPFLG_PKTDEC_COMMON (OCSD_OPFLG_PKTDEC_ERROR_BAD_PKTS)
-
-/** @}*/
-
-/** @name Decoder creation information
-
- Flags to use when creating decoders by name
-
- Builtin decoder names.
-
- Protocol type enum.
-@{*/
-
-#define OCSD_CREATE_FLG_PACKET_PROC 0x01 /**< Create packet processor only. */
-#define OCSD_CREATE_FLG_FULL_DECODER 0x02 /**< Create packet processor + decoder pair */
-#define OCSD_CREATE_FLG_INST_ID 0x04 /**< Use instance ID in decoder instance name */
-
-#define OCSD_BUILTIN_DCD_STM "STM" /**< STM decoder */
-#define OCSD_BUILTIN_DCD_ETMV3 "ETMV3" /**< ETMv3 decoder */
-#define OCSD_BUILTIN_DCD_ETMV4I "ETMV4I" /**< ETMv4 instruction decoder */
-#define OCSD_BUILTIN_DCD_ETMV4D "ETMV4D" /**< ETMv4 data decoder */
-#define OCSD_BUILTIN_DCD_PTM "PTM" /**< PTM decoder */
-
-/*! Trace Protocol Builtin Types + extern
- */
-typedef enum _ocsd_trace_protocol_t {
- OCSD_PROTOCOL_UNKNOWN = 0, /**< Protocol unknown */
-
-/* Built in library decoders */
- OCSD_PROTOCOL_ETMV3, /**< ETMV3 instruction and data trace protocol decoder. */
- OCSD_PROTOCOL_ETMV4I, /**< ETMV4 instruction trace protocol decoder. */
- OCSD_PROTOCOL_ETMV4D, /**< ETMV4 data trace protocol decoder. */
- OCSD_PROTOCOL_PTM, /**< PTM program flow instruction trace protocol decoder. */
- OCSD_PROTOCOL_STM, /**< STM system trace protocol decoder. */
-
-/* others to be added here */
- OCSD_PROTOCOL_BUILTIN_END, /**< Invalid protocol - built-in protocol types end marker */
-
-/* Custom / external decoders */
- OCSD_PROTOCOL_CUSTOM_0 = 100, /**< Values from this onwards are assigned to external registered decoders */
- OCSD_PROTOCOL_CUSTOM_1,
- OCSD_PROTOCOL_CUSTOM_2,
- OCSD_PROTOCOL_CUSTOM_3,
- OCSD_PROTOCOL_CUSTOM_4,
- OCSD_PROTOCOL_CUSTOM_5,
- OCSD_PROTOCOL_CUSTOM_6,
- OCSD_PROTOCOL_CUSTOM_7,
- OCSD_PROTOCOL_CUSTOM_8,
- OCSD_PROTOCOL_CUSTOM_9,
-
- OCSD_PROTOCOL_END /**< Invalid protocol - protocol types end marker */
-} ocsd_trace_protocol_t;
-
-/** Test if protocol type is a library built-in decoder */
-#define OCSD_PROTOCOL_IS_BUILTIN(P) ((P > OCSD_PROTOCOL_UNKNOWN) && (P < OCSD_PROTOCOL_BUILTIN_END))
-
-/** Test if protocol type is a custom external registered decoder */
-#define OCSD_PROTOCOL_IS_CUSTOM(P) ((P >= OCSD_PROTOCOL_CUSTOM_0) && (P < OCSD_PROTOCOL_END ))
-
-/** @}*/
-
-
-/** @name Software Trace Packets Info
-
- Contains the information for the generic software trace output packet.
-
- Software trace packet master and channel data.
- Payload info:
- size - packet payload size in bits;
- marker - if this packet has a marker/flag
- timestamp - if this packet has a timestamp associated
- number of packets - packet processor can optionally correlate identically
- sized packets on the same master / channel to be output as a single generic packet
-
- Payload output as separate LE buffer, of sufficient bytes to hold all the packets.
-@{*/
-
-typedef struct _ocsd_swt_info {
- uint16_t swt_master_id;
- uint16_t swt_channel_id;
- union {
- struct {
- uint32_t swt_payload_pkt_bitsize:8; /**< [bits 0:7 ] Packet size in bits of the payload packets */
- uint32_t swt_payload_num_packets:8; /**< [bits 8:15 ] number of consecutive packets of this type in the payload data */
- uint32_t swt_marker_packet:1; /**< [bit 16 ] packet is marker / flag packet */
- uint32_t swt_has_timestamp:1; /**< [bit 17 ] packet has timestamp. */
- uint32_t swt_marker_first:1; /**< [bit 18 ] for multiple packet payloads, this indicates if any marker is on first or last packet */
- uint32_t swt_master_err:1; /**< [bit 19 ] current master has error - payload is error code */
- uint32_t swt_global_err:1; /**< [bit 20 ] global error - payload is error code - master and channel ID not valid */
- uint32_t swt_trigger_event:1; /**< [bit 21 ] trigger event packet - payload is event number */
- uint32_t swt_frequency:1; /**< [bit 22 ] frequency packet - payload is frequency */
- uint32_t swt_id_valid:1; /**< [bit 23 ] master & channel ID has been set by input stream */
- };
- uint32_t swt_flag_bits;
- };
-} ocsd_swt_info_t;
-
-/** mask for the swt_id_valid flag - need to retain between packets */
-#define SWT_ID_VALID_MASK (0x1 << 23)
-
-/** @}*/
-
-/** @}*/
-#endif // ARM_OCSD_IF_TYPES_H_INCLUDED
-
-/* End of File opencsd/ocsd_if_types.h */
diff --git a/contrib/opencsd/decoder/include/opencsd/ocsd_if_version.h b/contrib/opencsd/decoder/include/opencsd/ocsd_if_version.h
deleted file mode 100644
index 70c8df41f52b..000000000000
--- a/contrib/opencsd/decoder/include/opencsd/ocsd_if_version.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * \file ocsd_if_version.h
- * \brief OpenCSD : Library API versioning
- *
- * \copyright Copyright (c) 2016, 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.
- */
-
-#ifndef ARM_OCSD_IF_VERSION_H_INCLUDED
-#define ARM_OCSD_IF_VERSION_H_INCLUDED
-
-#include <stdint.h>
-
-/** @addtogroup ocsd_interfaces
-@{*/
-
-/** @name Library Versioning
-@{*/
-#define OCSD_VER_MAJOR 0x0 /**< Library Major Version */
-#define OCSD_VER_MINOR 0xC /**< Library Minor Version */
-#define OCSD_VER_PATCH 0x0 /**< Library Patch Version */
-
-/** Library version number - MMMMnnpp format.
- MMMM = major version,
- nn = minor version,
- pp = patch version
-*/
-#define OCSD_VER_NUM ((OCSD_VER_MAJOR << 16) | (OCSD_VER_MINOR << 8) | OCSD_VER_PATCH)
-
-#define OCSD_VER_STRING "0.12.0" /**< Library Version string */
-#define OCSD_LIB_NAME "OpenCSD Library" /**< Library name string */
-#define OCSD_LIB_SHORT_NAME "OCSD" /**< Library Short name string */
-/** @}*/
-
-/** @}*/
-
-#endif // ARM_OCSD_IF_VERSION_H_INCLUDED
-
-/* End of File ocsd_if_version.h */
diff --git a/contrib/opencsd/decoder/include/opencsd/ptm/ptm_decoder.h b/contrib/opencsd/decoder/include/opencsd/ptm/ptm_decoder.h
deleted file mode 100644
index 80086d2ea54f..000000000000
--- a/contrib/opencsd/decoder/include/opencsd/ptm/ptm_decoder.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * \file ptm_decoder.h
- * \brief OpenCSD :
- *
- * \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.
- */
-
-#ifndef ARM_PTM_DECODER_H_INCLUDED
-#define ARM_PTM_DECODER_H_INCLUDED
-
-#include "trc_cmp_cfg_ptm.h"
-#include "trc_pkt_elem_ptm.h"
-#include "trc_pkt_proc_ptm.h"
-#include "trc_pkt_types_ptm.h"
-#include "trc_pkt_decode_ptm.h"
-
-#endif // ARM_PTM_DECODER_H_INCLUDED
-
-/* End of File ptm_decoder.h */
diff --git a/contrib/opencsd/decoder/include/opencsd/ptm/trc_cmp_cfg_ptm.h b/contrib/opencsd/decoder/include/opencsd/ptm/trc_cmp_cfg_ptm.h
deleted file mode 100644
index e086aae8e446..000000000000
--- a/contrib/opencsd/decoder/include/opencsd/ptm/trc_cmp_cfg_ptm.h
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- * \file trc_cmp_cfg_ptm.h
- * \brief OpenCSD :
- *
- * \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.
- */
-
-#ifndef ARM_TRC_CMP_CFG_PTM_H_INCLUDED
-#define ARM_TRC_CMP_CFG_PTM_H_INCLUDED
-
-#include "trc_pkt_types_ptm.h"
-#include "common/trc_cs_config.h"
-
-/** @defgroup ocsd_protocol_cfg OpenCSD Library : Trace Source Protocol Configuration.
-
- @brief Classes describing the trace capture time configuration of the trace source hardware.
-
- Protocol configuration represents the trace capture time settings for the CoreSight hardware
- component generating the trace. The packet processors and packet decoders require this configuration
- information to correctly interpret packets and decode trace.
-
-@{*/
-
-/** @name PTM configuration
-@{*/
-
-/*!
- * @class PtmConfig
- * @brief Interpreter class for PTM Hardware configuration.
- *
- * Provides quick value interpretation methods for the PTM config register values.
- * Primarily inlined for efficient code.
- */
-class PtmConfig : public CSConfig // public ocsd_ptm_cfg
-{
-public:
- PtmConfig(); /**< Default constructor */
- PtmConfig(const ocsd_ptm_cfg *cfg_regs);
- ~PtmConfig() {}; /**< Default destructor */
-
- /* register bit constants. */
- static const uint32_t CTRL_BRANCH_BCAST = (0x1 << 8);
- static const uint32_t CTRL_CYCLEACC = (0x1 << 12);
- static const uint32_t CTRL_TS_ENA = (0x1 << 28);
- static const uint32_t CTRL_RETSTACK_ENA = (0x1 << 29);
- static const uint32_t CTRL_VMID_ENA = (0x1 << 30);
-
- static const uint32_t CCER_TS_IMPL = (0x1 << 22);
- static const uint32_t CCER_RESTACK_IMPL = (0x1 << 23);
- static const uint32_t CCER_DMSB_WPT = (0x1 << 24);
- static const uint32_t CCER_TS_DMSB = (0x1 << 25);
- static const uint32_t CCER_VIRTEXT = (0x1 << 26);
- static const uint32_t CCER_TS_ENC_NAT = (0x1 << 28);
- static const uint32_t CCER_TS_64BIT = (0x1 << 29);
-
-// operations to convert to and from C-API structure
-
- //! copy assignment operator for base structure into class.
- PtmConfig & operator=(const ocsd_ptm_cfg *p_cfg);
-
- //! cast operator returning struct const reference
- operator const ocsd_ptm_cfg &() const { return m_cfg; };
- //! cast operator returning struct const pointer
- operator const ocsd_ptm_cfg *() const { return &m_cfg; };
-
-// access functions
-
- const bool enaBranchBCast() const; //!< Branch broadcast enabled.
- const bool enaCycleAcc() const; //!< cycle accurate tracing enabled.
-
- const bool enaRetStack() const; //!< return stack enabled.
- const bool hasRetStack() const; //!< return stack implemented.
-
- const int MinorRev() const; //!< return X revision in 1.X
-
- const bool hasTS() const; //!< Timestamps implemented in trace.
- const bool enaTS() const; //!< Timestamp trace is enabled.
- const bool TSPkt64() const; //!< timestamp packet is 64 bits in size.
- const bool TSBinEnc() const; //!< Timestamp encoded as natural binary number.
-
- const int CtxtIDBytes() const; //!< number of context ID bytes traced 1,2,4;
- const bool hasVirtExt() const; //!< processor has virtualisation extensions.
- const bool enaVMID() const; //!< VMID tracing enabled.
-
- const bool dmsbGenTS() const; //!< TS generated for DMB and DSB
- const bool dmsbWayPt() const; //!< DMB and DSB are waypoint instructions.
-
- virtual const uint8_t getTraceID() const; //!< CoreSight Trace ID for this device.
-
- const ocsd_core_profile_t &coreProfile() const { return m_cfg.core_prof; };
- const ocsd_arch_version_t &archVersion() const { return m_cfg.arch_ver; };
-
-private:
- ocsd_ptm_cfg m_cfg;
-};
-
-/* inlines */
-
-inline PtmConfig & PtmConfig::operator=(const ocsd_ptm_cfg *p_cfg)
-{
- // object of base class ocsd_ptm_cfg
- m_cfg = *p_cfg;
- return *this;
-}
-
-inline const bool PtmConfig::enaBranchBCast() const
-{
- return (bool)((m_cfg.reg_ctrl & CTRL_BRANCH_BCAST) != 0);
-}
-
-inline const bool PtmConfig::enaCycleAcc() const
-{
- return (bool)((m_cfg.reg_ctrl & CTRL_CYCLEACC) != 0);
-}
-
-inline const bool PtmConfig::enaRetStack() const
-{
- return (bool)((m_cfg.reg_ctrl & CTRL_RETSTACK_ENA) != 0);
-}
-
-inline const bool PtmConfig::hasRetStack() const
-{
- return (bool)((m_cfg.reg_ccer & CCER_RESTACK_IMPL) != 0);
-}
-
-inline const int PtmConfig::MinorRev() const
-{
- return ((int)m_cfg.reg_idr & 0xF0) >> 4;
-}
-
-inline const bool PtmConfig::hasTS() const
-{
- return (bool)((m_cfg.reg_ccer & CCER_TS_IMPL) != 0);
-}
-
-inline const bool PtmConfig::enaTS() const
-{
- return (bool)((m_cfg.reg_ctrl & CTRL_TS_ENA) != 0);
-}
-
-inline const bool PtmConfig::TSPkt64() const
-{
- if(MinorRev() == 0) return false;
- return (bool)((m_cfg.reg_ccer & CCER_TS_64BIT) != 0);
-}
-
-inline const bool PtmConfig::TSBinEnc() const
-{
- if(MinorRev() == 0) return false;
- return (bool)((m_cfg.reg_ccer & CCER_TS_ENC_NAT) != 0);
-}
-
-inline const bool PtmConfig::hasVirtExt() const
-{
- return (bool)((m_cfg.reg_ccer & CCER_VIRTEXT) != 0);
-}
-
-inline const bool PtmConfig::enaVMID() const
-{
- return (bool)((m_cfg.reg_ctrl & CTRL_VMID_ENA) != 0);
-}
-
-inline const bool PtmConfig::dmsbGenTS() const
-{
- return (bool)((m_cfg.reg_ccer & CCER_TS_DMSB) != 0);
-}
-
-inline const bool PtmConfig::dmsbWayPt() const
-{
- return (bool)((m_cfg.reg_ccer & CCER_DMSB_WPT) != 0);
-}
-
-inline const uint8_t PtmConfig::getTraceID() const
-{
- return (uint8_t)(m_cfg.reg_trc_id & 0x7F);
-}
-
-/** @}*/
-/** @}*/
-#endif // ARM_TRC_CMP_CFG_PTM_H_INCLUDED
-
-/* End of File trc_cmp_cfg_ptm.h */
diff --git a/contrib/opencsd/decoder/include/opencsd/ptm/trc_dcd_mngr_ptm.h b/contrib/opencsd/decoder/include/opencsd/ptm/trc_dcd_mngr_ptm.h
deleted file mode 100644
index 0defb0d2a590..000000000000
--- a/contrib/opencsd/decoder/include/opencsd/ptm/trc_dcd_mngr_ptm.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * \file trc_dcd_mngr_ptm.h
- * \brief OpenCSD : PTM decoder manager / handler specialisation
- *
- * \copyright Copyright (c) 2016, 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.
- */
-#ifndef ARM_TRC_DCD_MNGR_PTM_H_INCLUDED
-#define ARM_TRC_DCD_MNGR_PTM_H_INCLUDED
-
-#include "common/ocsd_dcd_mngr.h"
-#include "trc_pkt_decode_ptm.h"
-#include "trc_pkt_proc_ptm.h"
-#include "trc_cmp_cfg_ptm.h"
-#include "trc_pkt_types_ptm.h"
-
-class DecoderMngrPtm : public DecodeMngrFullDcd< PtmTrcPacket,
- ocsd_ptm_pkt_type,
- PtmConfig,
- ocsd_ptm_cfg,
- TrcPktProcPtm,
- TrcPktDecodePtm>
-{
-public:
- DecoderMngrPtm(const std::string &name) : DecodeMngrFullDcd(name,OCSD_PROTOCOL_PTM) {};
- virtual ~DecoderMngrPtm() {};
-};
-
-#endif // ARM_TRC_DCD_MNGR_PTM_H_INCLUDED
-
-/* End of File trc_dcd_mngr_ptm.h */
diff --git a/contrib/opencsd/decoder/include/opencsd/ptm/trc_pkt_decode_ptm.h b/contrib/opencsd/decoder/include/opencsd/ptm/trc_pkt_decode_ptm.h
deleted file mode 100644
index 395b316cda06..000000000000
--- a/contrib/opencsd/decoder/include/opencsd/ptm/trc_pkt_decode_ptm.h
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
- * \file trc_pkt_decode_ptm.h
- * \brief OpenCSD : PTM packet decoder.
- *
- * \copyright Copyright (c) 2016, 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.
- */
-#ifndef ARM_TRC_PKT_DECODE_PTM_H_INCLUDED
-#define ARM_TRC_PKT_DECODE_PTM_H_INCLUDED
-
-#include "common/trc_pkt_decode_base.h"
-#include "opencsd/ptm/trc_pkt_elem_ptm.h"
-#include "opencsd/ptm/trc_cmp_cfg_ptm.h"
-#include "common/trc_gen_elem.h"
-#include "common/trc_ret_stack.h"
-
-/**************** Atom handling class **************************************/
-class PtmAtoms
-{
-public:
- PtmAtoms() {};
- ~PtmAtoms() {};
-
- //! initialise the atom and index values
- void initAtomPkt(const ocsd_pkt_atom &atom, const ocsd_trc_index_t &root_index);
-
- const ocsd_atm_val getCurrAtomVal() const;
- const int numAtoms() const; //!< number of atoms
- const ocsd_trc_index_t pktIndex() const; //!< originating packet index
-
- void clearAtom(); //!< clear the current atom, set the next.
- void clearAll(); //!< clear all
-
-private:
- ocsd_pkt_atom m_atom;
- ocsd_trc_index_t m_root_index; //!< root index for the atom packet
-};
-
-inline void PtmAtoms::initAtomPkt(const ocsd_pkt_atom &atom, const ocsd_trc_index_t &root_index)
-{
- m_atom = atom;
- m_root_index = root_index;
-}
-
-inline const ocsd_atm_val PtmAtoms::getCurrAtomVal() const
-{
- return (m_atom.En_bits & 0x1) ? ATOM_E : ATOM_N;
-}
-
-inline const int PtmAtoms::numAtoms() const
-{
- return m_atom.num;
-}
-
-inline const ocsd_trc_index_t PtmAtoms::pktIndex() const
-{
- return m_root_index;
-}
-
-inline void PtmAtoms::clearAtom()
-{
- if(m_atom.num)
- {
- m_atom.num--;
- m_atom.En_bits >>=1;
- }
-}
-
-inline void PtmAtoms::clearAll()
-{
- m_atom.num = 0;
-}
-
-/********** Main decode class ****************************************************/
-class TrcPktDecodePtm : public TrcPktDecodeBase<PtmTrcPacket, PtmConfig>
-{
-public:
- TrcPktDecodePtm();
- TrcPktDecodePtm(int instIDNum);
- virtual ~TrcPktDecodePtm();
-
-protected:
- /* implementation packet decoding interface */
- virtual ocsd_datapath_resp_t processPacket();
- virtual ocsd_datapath_resp_t onEOT();
- virtual ocsd_datapath_resp_t onReset();
- virtual ocsd_datapath_resp_t onFlush();
- virtual ocsd_err_t onProtocolConfig();
- virtual const uint8_t getCoreSightTraceID() { return m_CSID; };
-
- /* local decode methods */
-
-private:
- /** operation for the trace instruction follower */
- typedef enum {
- TRACE_WAYPOINT, //!< standard operation - trace to waypoint - default op
- TRACE_TO_ADDR_EXCL, //!< trace to supplied address - address is 1st instuction not executed.
- TRACE_TO_ADDR_INCL //!< trace to supplied address - address is last instruction executed.
- } waypoint_trace_t;
-
- void initDecoder();
- void resetDecoder();
-
- ocsd_datapath_resp_t decodePacket();
- ocsd_datapath_resp_t contProcess();
- ocsd_datapath_resp_t processIsync();
- ocsd_datapath_resp_t processBranch();
- ocsd_datapath_resp_t processWPUpdate();
- ocsd_datapath_resp_t processAtom();
- ocsd_err_t traceInstrToWP(bool &bWPFound, const waypoint_trace_t traceWPOp = TRACE_WAYPOINT, const ocsd_vaddr_t nextAddrMatch = 0); //!< follow instructions from the current address to a WP. true if good, false if memory cannot be accessed.
- ocsd_datapath_resp_t processAtomRange(const ocsd_atm_val A, const char *pkt_msg, const waypoint_trace_t traceWPOp = TRACE_WAYPOINT, const ocsd_vaddr_t nextAddrMatch = 0);
- void checkPendingNacc(ocsd_datapath_resp_t &resp);
-
- uint8_t m_CSID; //!< Coresight trace ID for this decoder.
-
-//** Other processor state;
-
- // trace decode FSM
- typedef enum {
- NO_SYNC, //!< pre start trace - init state or after reset or overflow, loss of sync.
- WAIT_SYNC, //!< waiting for sync packet.
- WAIT_ISYNC, //!< waiting for isync packet after 1st ASYNC.
- DECODE_PKTS, //!< processing input packet
- CONT_ISYNC, //!< continue processing isync packet after WAIT.
- CONT_ATOM, //!< continue processing atom packet after WAIT.
- CONT_WPUP, //!< continue processing WP update packet after WAIT.
- CONT_BRANCH, //!< continue processing Branch packet after WAIT.
- } processor_state_t;
-
- processor_state_t m_curr_state;
-
- const bool processStateIsCont() const;
-
- // PE decode state - address and isa
-
- //! Structure to contain the PE addr and ISA state.
- typedef struct _ptm_pe_addr_state {
- ocsd_isa isa; //!< current isa.
- ocsd_vaddr_t instr_addr; //!< current address.
- bool valid; //!< address valid - false if we need an address to continue decode.
- } ptm_pe_addr_state;
-
- ptm_pe_addr_state m_curr_pe_state; //!< current instruction state for PTM decode.
- ocsd_pe_context m_pe_context; //!< current context information
-
- // packet decode state
- bool m_need_isync; //!< need context to continue
-
- ocsd_instr_info m_instr_info; //!< instruction info for code follower - in address is the next to be decoded.
-
- bool m_mem_nacc_pending; //!< need to output a memory access failure packet
- ocsd_vaddr_t m_nacc_addr; //!< address of memory access failure
-
- bool m_i_sync_pe_ctxt; //!< isync has pe context.
-
- PtmAtoms m_atoms; //!< atoms to process in an atom packet
-
- TrcAddrReturnStack m_return_stack; //!< trace return stack.
-
-//** output element
- OcsdTraceElement m_output_elem;
-};
-
-inline const bool TrcPktDecodePtm::processStateIsCont() const
-{
- return (bool)(m_curr_state >= CONT_ISYNC);
-}
-
-#endif // ARM_TRC_PKT_DECODE_PTM_H_INCLUDED
-
-/* End of File trc_pkt_decode_ptm.h */
diff --git a/contrib/opencsd/decoder/include/opencsd/ptm/trc_pkt_elem_ptm.h b/contrib/opencsd/decoder/include/opencsd/ptm/trc_pkt_elem_ptm.h
deleted file mode 100644
index 266bd2b692a0..000000000000
--- a/contrib/opencsd/decoder/include/opencsd/ptm/trc_pkt_elem_ptm.h
+++ /dev/null
@@ -1,221 +0,0 @@
-/*
- * \file trc_pkt_elem_ptm.h
- * \brief OpenCSD :
- *
- * \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.
- */
-
-
-#ifndef ARM_TRC_PKT_ELEM_PTM_H_INCLUDED
-#define ARM_TRC_PKT_ELEM_PTM_H_INCLUDED
-
-#include "trc_pkt_types_ptm.h"
-#include "common/trc_printable_elem.h"
-#include "common/trc_pkt_elem_base.h"
-
-/** @addtogroup trc_pkts
-@{*/
-
-
-class PtmTrcPacket : public TrcPacketBase, public ocsd_ptm_pkt, trcPrintableElem
-{
-public:
- PtmTrcPacket();
- ~PtmTrcPacket();
-
- PtmTrcPacket &operator =(const ocsd_ptm_pkt* p_pkt);
-
- virtual const void *c_pkt() const { return (const ocsd_ptm_pkt *)this; };
-
- // update interface - set packet values
-
- void Clear(); //!< clear update data in packet ready for new one.
- void ResetState(); //!< reset intra packet state data - on full decoder reset.
-
- void SetType(const ocsd_ptm_pkt_type p_type);
- void SetErrType(const ocsd_ptm_pkt_type e_type);
-
- void SetException( const ocsd_armv7_exception type,
- const uint16_t number);
- void SetISyncReason(const ocsd_iSync_reason reason);
- void SetCycleCount(const uint32_t cycleCount);
- void SetAtomFromPHdr(const uint8_t pHdr);
- void SetCycleAccAtomFromPHdr(const uint8_t pHdr);
-
- void UpdateAddress(const ocsd_vaddr_t partAddrVal, const int updateBits);
- void UpdateNS(const int NS);
- void UpdateAltISA(const int AltISA);
- void UpdateHyp(const int Hyp);
- void UpdateISA(const ocsd_isa isa);
- void UpdateContextID(const uint32_t contextID);
- void UpdateVMID(const uint8_t VMID);
- void UpdateTimestamp(const uint64_t tsVal, const uint8_t updateBits);
-
- // packet status interface
-
- // get packet info.
- const bool isBadPacket() const;
- const ocsd_ptm_pkt_type getType() const;
-
- // isa
- const ocsd_isa getISA() const;
- const bool ISAChanged() const { return (bool)(curr_isa != prev_isa); };
- const uint8_t getAltISA() const { return context.curr_alt_isa; };
- const uint8_t getNS() const { return context.curr_NS; };
- const uint8_t getHyp() const { return context.curr_Hyp; };
-
- // address
- const ocsd_vaddr_t getAddrVal() const { return addr.val; };
-
- // pe context information
- const bool CtxtIDUpdated() const { return (bool)(context.updated_c == 1); };
- const bool VMIDUpdated() const { return (bool)(context.updated_v == 1); };
- const uint32_t getCtxtID() const { return context.ctxtID; };
- const uint8_t getVMID() const { return context.VMID; };
- const bool PEContextUpdated() const { return context.updated; };
-
- // atom info
- const ocsd_pkt_atom &getAtom() const { return atom; };
-
- // branch address info
- const bool isBranchExcepPacket() const { return (exception.bits.present == 1); };
- const ocsd_armv7_exception excepType() const { return exception.type; };
- const uint16_t excepNum() const { return exception.number; };
-
- // isync
- const ocsd_iSync_reason iSyncReason() const { return i_sync_reason; };
-
- // cycle count
- const bool hasCC() const { return (cc_valid == 1); };
- const uint32_t getCCVal() const { return cycle_count; };
-
- // printing
- virtual void toString(std::string &str) const;
- virtual void toStringFmt(const uint32_t fmtFlags, std::string &str) const;
-
-private:
- void packetTypeName(const ocsd_ptm_pkt_type pkt_type, std::string &name, std::string &desc) const;
- void getAtomStr(std::string &valStr) const;
- void getBranchAddressStr(std::string &valStr) const;
- void getExcepStr(std::string &excepStr) const;
- void getISAStr(std::string &isaStr) const;
- void getCycleCountStr(std::string &subStr) const;
- void getISyncStr(std::string &valStr) const;
- void getTSStr(std::string &valStr) const;
-};
-
-
-//*** update interface - set packet values
-inline void PtmTrcPacket::SetType(const ocsd_ptm_pkt_type p_type)
-{
- type = p_type;
-}
-
-inline void PtmTrcPacket::SetErrType(const ocsd_ptm_pkt_type e_type)
-{
- err_type = type;
- type = e_type;
-}
-
-inline void PtmTrcPacket::UpdateNS(const int NS)
-{
- context.curr_NS = NS;
- context.updated = 1;
-};
-
-inline void PtmTrcPacket::UpdateAltISA(const int AltISA)
-{
- context.curr_alt_isa = AltISA;
- context.updated = 1;
-}
-
-inline void PtmTrcPacket::UpdateHyp(const int Hyp)
-{
- context.curr_Hyp = Hyp;
- context.updated = 1;
-}
-
-inline void PtmTrcPacket::UpdateISA(const ocsd_isa isa)
-{
- prev_isa = curr_isa;
- curr_isa = isa;
-}
-
-inline void PtmTrcPacket::UpdateContextID(const uint32_t contextID)
-{
- context.ctxtID = contextID;
- context.updated_c = 1;
-}
-
-inline void PtmTrcPacket::UpdateVMID(const uint8_t VMID)
-{
- context.VMID = VMID;
- context.updated_v = 1;
-}
-
-inline void PtmTrcPacket::SetException( const ocsd_armv7_exception type, const uint16_t number)
-{
- exception.bits.present = 1;
- exception.number = number;
- exception.type = type;
-}
-
-inline void PtmTrcPacket::SetISyncReason(const ocsd_iSync_reason reason)
-{
- i_sync_reason = reason;
-}
-
-inline void PtmTrcPacket::SetCycleCount(const uint32_t cycleCount)
-{
- cycle_count = cycleCount;
- cc_valid = 1;
-}
-
-//*** packet status interface - get packet info.
-inline const bool PtmTrcPacket::isBadPacket() const
-{
- return (bool)(type >= PTM_PKT_BAD_SEQUENCE);
-}
-
-inline const ocsd_ptm_pkt_type PtmTrcPacket::getType() const
-{
- return type;
-}
-
-inline const ocsd_isa PtmTrcPacket::getISA() const
-{
- return curr_isa;
-}
-
-/** @}*/
-#endif // ARM_TRC_PKT_ELEM_PTM_H_INCLUDED
-
-/* End of File trc_pkt_elem_ptm.h */
diff --git a/contrib/opencsd/decoder/include/opencsd/ptm/trc_pkt_proc_ptm.h b/contrib/opencsd/decoder/include/opencsd/ptm/trc_pkt_proc_ptm.h
deleted file mode 100644
index 87e933a3225d..000000000000
--- a/contrib/opencsd/decoder/include/opencsd/ptm/trc_pkt_proc_ptm.h
+++ /dev/null
@@ -1,215 +0,0 @@
-/*
- * \file trc_pkt_proc_ptm.h
- * \brief OpenCSD :
- *
- * \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.
- */
-
-#ifndef ARM_TRC_PKT_PROC_PTM_H_INCLUDED
-#define ARM_TRC_PKT_PROC_PTM_H_INCLUDED
-
-#include "trc_pkt_types_ptm.h"
-#include "common/trc_pkt_proc_base.h"
-#include "trc_pkt_elem_ptm.h"
-#include "trc_cmp_cfg_ptm.h"
-
-class PtmTrcPacket;
-class PtmConfig;
-
-/** @addtogroup ocsd_pkt_proc
-@{*/
-
-
-
-class TrcPktProcPtm : public TrcPktProcBase< PtmTrcPacket, ocsd_ptm_pkt_type, PtmConfig>
-{
-public:
- TrcPktProcPtm();
- TrcPktProcPtm(int instIDNum);
- virtual ~TrcPktProcPtm();
-
-protected:
- /* implementation packet processing interface */
- virtual ocsd_datapath_resp_t processData( const ocsd_trc_index_t index,
- const uint32_t dataBlockSize,
- const uint8_t *pDataBlock,
- uint32_t *numBytesProcessed);
- virtual ocsd_datapath_resp_t onEOT();
- virtual ocsd_datapath_resp_t onReset();
- virtual ocsd_datapath_resp_t onFlush();
- virtual ocsd_err_t onProtocolConfig();
- virtual const bool isBadPacket() const;
-
- void InitPacketState(); // clear current packet state.
- void InitProcessorState(); // clear all previous process state
-
- ocsd_datapath_resp_t outputPacket();
-
- typedef enum _process_state {
- WAIT_SYNC,
- PROC_HDR,
- PROC_DATA,
- SEND_PKT,
- } process_state;
-
- process_state m_process_state; // process algorithm state.
-
- std::vector<uint8_t> m_currPacketData; // raw data
- uint32_t m_currPktIdx; // index into packet when expanding
- PtmTrcPacket m_curr_packet; // expanded packet
- ocsd_trc_index_t m_curr_pkt_index; // trace index at start of packet.
-
- const bool readByte(uint8_t &currByte);
- const bool readByte(); // just read into buffer, don't need the value
- void unReadByte(); // remove last byte from the buffer.
-
- uint8_t m_chanIDCopy;
-
- // current data block being processed.
- const uint8_t *m_pDataIn;
- uint32_t m_dataInLen;
- uint32_t m_dataInProcessed;
- ocsd_trc_index_t m_block_idx; // index start for current block
-
- // processor synchronisation
- const bool isSync() const;
- ocsd_datapath_resp_t waitASync(); //!< look for first synchronisation point in the packet stream
- bool m_waitASyncSOPkt;
- bool m_bAsyncRawOp;
- bool m_bOPNotSyncPkt; //!< true if output not sync packet when waiting for ASYNC
-
- // ** packet processing functions.
- void pktASync();
- void pktISync();
- void pktTrigger();
- void pktWPointUpdate();
- void pktIgnore();
- void pktCtxtID();
- void pktVMID();
- void pktAtom();
- void pktTimeStamp();
- void pktExceptionRet();
- void pktBranchAddr();
- void pktReserved();
-
- // async finder
- typedef enum _async_result {
- ASYNC, //!< pattern confirmed async 0x00 x 5, 0x80
- NOT_ASYNC, //!< pattern confirmed not async
- ASYNC_EXTRA_0, //!< pattern confirmed 0x00 x N + ASYNC
- THROW_0, //!< long pattern of 0x00 - throw some away.
- ASYNC_INCOMPLETE, //!< not enough input data.
- } async_result_t;
-
- async_result_t findAsync();
-
- int m_async_0; // number of current consecutive async 0s
-
- bool m_part_async;
-
- // number of extra 0s before we throw 0 on async detect.
- #define ASYNC_PAD_0_LIMIT 11
- // number of 0s minimum to form an async
- #define ASYNC_REQ_0 5
-
- // extraction sub-routines
- void extractCtxtID(int idx, uint32_t &ctxtID);
- void extractCycleCount(int idx, uint32_t &cycleCount);
- int extractTS(uint64_t &tsVal, uint8_t &tsUpdateBits);
- uint32_t extractAddress(const int offset,uint8_t &total_bits);
-
- // number of bytes required for a complete packet - used in some multi byte packets
- int m_numPktBytesReq;
-
- // packet processing state
- bool m_needCycleCount;
- bool m_gotCycleCount;
- int m_gotCCBytes; // number of CC bytes read so far
-
- int m_numCtxtIDBytes;
- int m_gotCtxtIDBytes;
-
- bool m_gotTSBytes; //!< got all TS bytes
- int m_tsByteMax; //!< max size for TS portion of TS packet.
-
- // branch address state
- bool m_gotAddrBytes; //!< got all Addr bytes in branch packet
- int m_numAddrBytes; //!< number of address bytes
- bool m_gotExcepBytes; //!< got all needed exception bytes
- int m_numExcepBytes; //!< got 1st exception byte
- ocsd_isa m_addrPktIsa; //!< ISA of the branch address packet
- int m_excepAltISA; //!< Alt ISA bit iff exception bytes
-
- // bad packets
- void throwMalformedPacketErr(const char *pszErrMsg);
- void throwPacketHeaderErr(const char *pszErrMsg);
-
-
- // packet processing function table
- typedef void (TrcPktProcPtm::*PPKTFN)(void);
- PPKTFN m_pIPktFn;
-
- struct _pkt_i_table_t {
- ocsd_ptm_pkt_type pkt_type;
- PPKTFN pptkFn;
- } m_i_table[256];
-
- void BuildIPacketTable();
-
-};
-
-inline const bool TrcPktProcPtm::isSync() const
-{
- return (bool)(m_curr_packet.getType() == PTM_PKT_NOTSYNC);
-}
-
-inline void TrcPktProcPtm::throwMalformedPacketErr(const char *pszErrMsg)
-{
- m_curr_packet.SetErrType(PTM_PKT_BAD_SEQUENCE);
- throw ocsdError(OCSD_ERR_SEV_ERROR,OCSD_ERR_BAD_PACKET_SEQ,m_curr_pkt_index,m_chanIDCopy,pszErrMsg);
-}
-
-inline void TrcPktProcPtm::throwPacketHeaderErr(const char *pszErrMsg)
-{
- throw ocsdError(OCSD_ERR_SEV_ERROR,OCSD_ERR_INVALID_PCKT_HDR,m_curr_pkt_index,m_chanIDCopy,pszErrMsg);
-}
-
-inline const bool TrcPktProcPtm::readByte()
-{
- uint8_t currByte;
- return readByte(currByte);
-}
-
-/** @}*/
-
-#endif // ARM_TRC_PKT_PROC_PTM_H_INCLUDED
-
-/* End of File trc_pkt_proc_ptm.h */
diff --git a/contrib/opencsd/decoder/include/opencsd/ptm/trc_pkt_types_ptm.h b/contrib/opencsd/decoder/include/opencsd/ptm/trc_pkt_types_ptm.h
deleted file mode 100644
index 45d994d59b50..000000000000
--- a/contrib/opencsd/decoder/include/opencsd/ptm/trc_pkt_types_ptm.h
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * \file trc_pkt_ptm_types.h
- * \brief OpenCSD : PTM specific types
- *
- * \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.
- */
-
-#ifndef ARM_TRC_PKT_PTM_TYPES_H_INCLUDED
-#define ARM_TRC_PKT_PTM_TYPES_H_INCLUDED
-
-#include "opencsd/trc_pkt_types.h"
-
-/** @addtogroup trc_pkts
-@{*/
-
-/** @name PTM Packet Types
-@{*/
-
-typedef enum _ocsd_ptm_pkt_type
-{
-// markers for unknown packets
- PTM_PKT_NOTSYNC, //!< no sync found yet
- PTM_PKT_INCOMPLETE_EOT, //!< flushing incomplete packet at end of trace.
- PTM_PKT_NOERROR, //!< no error base type packet.
-
-// markers for valid packets
- PTM_PKT_BRANCH_ADDRESS, //!< Branch address with optional exception.
- PTM_PKT_A_SYNC, //!< Alignment Synchronisation.
- PTM_PKT_I_SYNC, //!< Instruction sync with address.
- PTM_PKT_TRIGGER, //!< trigger packet
- PTM_PKT_WPOINT_UPDATE, //!< Waypoint update.
- PTM_PKT_IGNORE, //!< ignore packet.
- PTM_PKT_CONTEXT_ID, //!< context id packet.
- PTM_PKT_VMID, //!< VMID packet
- PTM_PKT_ATOM, //!< atom waypoint packet.
- PTM_PKT_TIMESTAMP, //!< timestamp packet.
- PTM_PKT_EXCEPTION_RET, //!< exception return.
- PTM_PKT_BRANCH_OR_BYPASS_EOT, // interpreter FSM 'state' : unsure if branch 0 packet or bypass flush end of trace
- PTM_PKT_TPIU_PAD_EOB, // pad end of a buffer - no valid trace at this point
-
-// markers for bad packets
- PTM_PKT_BAD_SEQUENCE, //!< invalid sequence for packet type
- PTM_PKT_RESERVED, //!< Reserved packet encoding
-
-} ocsd_ptm_pkt_type;
-
-typedef struct _ptm_context_t {
- struct {
- uint32_t curr_alt_isa:1; /**< current Alt ISA flag for Tee / T32 (used if not in present packet) */
- uint32_t curr_NS:1; /**< current NS flag (used if not in present packet) */
- uint32_t curr_Hyp:1; /**< current Hyp flag (used if not in present packet) */
- uint32_t updated:1; /**< context updated */
- uint32_t updated_c:1; /**< updated CtxtID */
- uint32_t updated_v:1; /**< updated VMID */
- };
- uint32_t ctxtID; /**< Context ID */
- uint8_t VMID; /**< VMID */
-} ptm_context_t;
-
-typedef struct _ocsd_ptm_excep {
- ocsd_armv7_exception type; /**< exception type. */
- uint16_t number; /**< exception as number */
- struct {
- uint32_t present:1; /**< exception present in packet */
- } bits;
-} ocsd_ptm_excep;
-
-
-typedef struct _ocsd_ptm_pkt
-{
- ocsd_ptm_pkt_type type; /**< Primary packet type. */
-
- ocsd_isa curr_isa; /**< current ISA. */
- ocsd_isa prev_isa; /**< previous ISA */
-
- ocsd_pkt_vaddr addr; /**< current address. */
- ptm_context_t context; /**< current context. */
- ocsd_pkt_atom atom;
-
- ocsd_iSync_reason i_sync_reason; /**< reason for ISync Packet. */
-
- uint32_t cycle_count; /**< cycle count value associated with this packet. */
- uint8_t cc_valid; /**< cycle count value valid. */
-
- uint64_t timestamp; /**< timestamp value. */
- uint8_t ts_update_bits; /**< bits of ts updated this packet. (if TS packet) */
-
- ocsd_ptm_excep exception; /**< exception information in packet */
-
- ocsd_ptm_pkt_type err_type; /**< Basic packet type if primary type indicates error or incomplete. */
-
-} ocsd_ptm_pkt;
-
-typedef struct _ocsd_ptm_cfg
-{
- uint32_t reg_idr; /**< PTM ID register */
- uint32_t reg_ctrl; /**< Control Register */
- uint32_t reg_ccer; /**< Condition code extension register */
- uint32_t reg_trc_id; /**< CoreSight Trace ID register */
- ocsd_arch_version_t arch_ver; /**< Architecture version */
- ocsd_core_profile_t core_prof; /**< Core Profile */
-} ocsd_ptm_cfg;
-
-/** @}*/
-
-
-/** @}*/
-#endif // ARM_TRC_PKT_PTM_TYPES_H_INCLUDED
-
-/* End of File trc_pkt_ptm_types.h */
diff --git a/contrib/opencsd/decoder/include/opencsd/stm/stm_decoder.h b/contrib/opencsd/decoder/include/opencsd/stm/stm_decoder.h
deleted file mode 100644
index 1367cad5d159..000000000000
--- a/contrib/opencsd/decoder/include/opencsd/stm/stm_decoder.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * \file stm_decoder.h
- * \brief OpenCSD : STM decoder
- *
- * \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.
- */
-
-#ifndef ARM_STM_DECODER_H_INCLUDED
-#define ARM_STM_DECODER_H_INCLUDED
-
-#include "trc_pkt_types_stm.h"
-#include "trc_pkt_elem_stm.h"
-#include "trc_pkt_proc_stm.h"
-
-
-#endif // ARM_STM_DECODER_H_INCLUDED
-
-/* End of File stm_decoder.h */
diff --git a/contrib/opencsd/decoder/include/opencsd/stm/trc_cmp_cfg_stm.h b/contrib/opencsd/decoder/include/opencsd/stm/trc_cmp_cfg_stm.h
deleted file mode 100644
index 41003ece3d91..000000000000
--- a/contrib/opencsd/decoder/include/opencsd/stm/trc_cmp_cfg_stm.h
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- * \file trc_cmp_cfg_stm.h
- * \brief OpenCSD : STM compnent configuration.
- *
- * \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.
- */
-
-#ifndef ARM_TRC_CMP_CFG_STM_H_INCLUDED
-#define ARM_TRC_CMP_CFG_STM_H_INCLUDED
-
-#include "trc_pkt_types_stm.h"
-#include "common/trc_cs_config.h"
-
-/** @addtogroup ocsd_protocol_cfg
-@{*/
-
-/** @name STM configuration
-@{*/
-
-/*!
- * @class STMConfig
- * @brief STM hardware configuration data.
- *
- * Represents the programmed and hardware configured state of an STM device.
- * Creates default values for most RO register values to effect a default STM
- * with values of 256 masters, 65536 channels, HW event trace not present / disabled.
- *
- * If this default is sufficient a single call to setTraceID() will be all that is
- * required to decode the STM protocol.
- *
- * Can also be initialised with a fully populated ocsd_stm_cfg structure.
- */
-class STMConfig : public CSConfig // public ocsd_stm_cfg
-{
-public:
- STMConfig(); //!< Constructor - creates a default configuration
- STMConfig(const ocsd_stm_cfg *cfg_regs);
- ~STMConfig() {};
-
-// operations to convert to and from C-API structure
-
- STMConfig & operator=(const ocsd_stm_cfg *p_cfg); //!< set from full configuration structure.
- //! cast operator returning struct const reference
- operator const ocsd_stm_cfg &() const { return m_cfg; };
- //! cast operator returning struct const pointer
- operator const ocsd_stm_cfg *() const { return &m_cfg; };
-
-// access functions
- void setTraceID(const uint8_t traceID); //!< Set the CoreSight trace ID.
- void setHWTraceFeat(const hw_event_feat_t hw_feat); //!< set usage of STM HW event trace.
-
- virtual const uint8_t getTraceID() const; //!< Get the CoreSight trace ID.
- const uint8_t getMaxMasterIdx() const; //!< Get the maximum master index
- const uint16_t getMaxChannelIdx() const; //!< Get the maximum channel index.
- const uint16_t getHWTraceMasterIdx() const; //!< Get the master used for HW event trace.
- bool getHWTraceEn() const; //!< return true if HW trace is present and enabled.
-
-private:
- bool m_bHWTraceEn;
- ocsd_stm_cfg m_cfg;
-};
-
-inline STMConfig::STMConfig()
-{
- m_cfg.reg_tcsr = 0;
- m_cfg.reg_devid = 0xFF; // default to 256 masters.
- m_cfg.reg_feat3r = 0x10000; // default to 65536 channels.
- m_cfg.reg_feat1r = 0x0;
- m_cfg.reg_hwev_mast = 0; // default hwtrace master = 0;
- m_cfg.hw_event = HwEvent_Unknown_Disabled; // default to not present / disabled.
- m_bHWTraceEn = false;
-}
-
-inline STMConfig::STMConfig(const ocsd_stm_cfg *cfg_regs)
-{
- m_cfg = *cfg_regs;
- setHWTraceFeat(m_cfg.hw_event);
-}
-
-inline STMConfig & STMConfig::operator=(const ocsd_stm_cfg *p_cfg)
-{
- m_cfg = *p_cfg;
- setHWTraceFeat(p_cfg->hw_event);
- return *this;
-}
-
-inline void STMConfig::setTraceID(const uint8_t traceID)
-{
- uint32_t IDmask = 0x007F0000;
- m_cfg.reg_tcsr &= ~IDmask;
- m_cfg.reg_tcsr |= (((uint32_t)traceID) << 16) & IDmask;
-}
-
-inline void STMConfig::setHWTraceFeat(const hw_event_feat_t hw_feat)
-{
- m_cfg.hw_event = hw_feat;
- m_bHWTraceEn = (m_cfg.hw_event == HwEvent_Enabled);
- if(m_cfg.hw_event == HwEvent_UseRegisters)
- m_bHWTraceEn = (((m_cfg.reg_feat1r & 0xC0000) == 0x80000) && ((m_cfg.reg_tcsr & 0x8) == 0x8));
-}
-
-inline const uint8_t STMConfig::getTraceID() const
-{
- return (uint8_t)((m_cfg.reg_tcsr >> 16) & 0x7F);
-}
-
-inline const uint8_t STMConfig::getMaxMasterIdx() const
-{
- return (uint8_t)(m_cfg.reg_devid & 0xFF);
-}
-
-inline const uint16_t STMConfig::getMaxChannelIdx() const
-{
- return (uint16_t)(m_cfg.reg_feat3r - 1);
-}
-
-inline const uint16_t STMConfig::getHWTraceMasterIdx() const
-{
- return (uint16_t)(m_cfg.reg_hwev_mast & 0xFFFF);
-}
-
-inline bool STMConfig::getHWTraceEn() const
-{
- return m_bHWTraceEn;
-}
-
-
-/** @}*/
-
-/** @}*/
-
-#endif // ARM_TRC_CMP_CFG_STM_H_INCLUDED
-
-/* End of File trc_cmp_cfg_stm.h */
diff --git a/contrib/opencsd/decoder/include/opencsd/stm/trc_dcd_mngr_stm.h b/contrib/opencsd/decoder/include/opencsd/stm/trc_dcd_mngr_stm.h
deleted file mode 100644
index 33632c6d65a7..000000000000
--- a/contrib/opencsd/decoder/include/opencsd/stm/trc_dcd_mngr_stm.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * \file trc_dcd_mngr_stm.h
- * \brief OpenCSD : STM decoder manager / handler specialisation
- *
- * \copyright Copyright (c) 2016, 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.
- */
-#ifndef ARM_TRC_DCD_MNGR_STM_H_INCLUDED
-#define ARM_TRC_DCD_MNGR_STM_H_INCLUDED
-
-#include "common/ocsd_dcd_mngr.h"
-#include "trc_pkt_decode_stm.h"
-#include "trc_pkt_proc_stm.h"
-#include "trc_cmp_cfg_stm.h"
-#include "trc_pkt_types_stm.h"
-
-class DecoderMngrStm : public DecodeMngrFullDcd< StmTrcPacket,
- ocsd_stm_pkt_type,
- STMConfig,
- ocsd_stm_cfg,
- TrcPktProcStm,
- TrcPktDecodeStm>
-{
-public:
- DecoderMngrStm(const std::string &name) : DecodeMngrFullDcd(name,OCSD_PROTOCOL_STM) {};
- virtual ~DecoderMngrStm() {};
-};
-
-#endif // ARM_TRC_DCD_MNGR_STM_H_INCLUDED
-
-/* End of File trc_dcd_mngr_stm.h */
diff --git a/contrib/opencsd/decoder/include/opencsd/stm/trc_pkt_decode_stm.h b/contrib/opencsd/decoder/include/opencsd/stm/trc_pkt_decode_stm.h
deleted file mode 100644
index a4807207eb1e..000000000000
--- a/contrib/opencsd/decoder/include/opencsd/stm/trc_pkt_decode_stm.h
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * \file trc_pkt_decode_stm.h
- * \brief OpenCSD : STM packet decoder
- *
- * Convert the incoming indidvidual STM packets to
- *
- * \copyright Copyright (c) 2016, 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.
- */
-
-
-#ifndef ARM_TRC_PKT_DECODE_STM_H_INCLUDED
-#define ARM_TRC_PKT_DECODE_STM_H_INCLUDED
-
-
-#include "common/trc_pkt_decode_base.h"
-#include "opencsd/stm/trc_pkt_elem_stm.h"
-#include "opencsd/stm/trc_cmp_cfg_stm.h"
-#include "common/trc_gen_elem.h"
-
-class TrcPktDecodeStm : public TrcPktDecodeBase<StmTrcPacket, STMConfig>
-{
-public:
- TrcPktDecodeStm();
- TrcPktDecodeStm(int instIDNum);
- virtual ~TrcPktDecodeStm();
-
-protected:
- /* implementation packet decoding interface */
- virtual ocsd_datapath_resp_t processPacket();
- virtual ocsd_datapath_resp_t onEOT();
- virtual ocsd_datapath_resp_t onReset();
- virtual ocsd_datapath_resp_t onFlush();
- virtual ocsd_err_t onProtocolConfig();
- virtual const uint8_t getCoreSightTraceID() { return m_CSID; };
-
- /* local decode methods */
-
-private:
- void initDecoder();
- void resetDecoder();
- void initPayloadBuffer();
- bool isInit() { return (bool)((m_config != 0) && (m_payload_buffer != 0)); };
- ocsd_datapath_resp_t decodePacket(bool &bPktDone); //!< decode the current incoming packet
- void clearSWTPerPcktInfo();
- void updatePayload(bool &bSendPacket);
-
- typedef enum {
- NO_SYNC, //!< pre start trace - init state or after reset or overflow, loss of sync.
- WAIT_SYNC, //!< waiting for sync packet.
- DECODE_PKTS //!< processing input packet.
- } processor_state_t;
-
- processor_state_t m_curr_state;
-
- ocsd_swt_info_t m_swt_packet_info;
-
- uint8_t *m_payload_buffer; //!< payload buffer - allocated for one or multiple packets according to config
- int m_payload_size; //!< payload buffer total size in bytes.
- int m_payload_used; //!< payload buffer used in bytes - current payload size.
- bool m_payload_odd_nibble; //!< last used byte in payload contains a single 4 bit packet.
- int m_num_pkt_correlation; //!< number of identical payload packets to buffer up before output. - fixed at 1 till later update
-
- uint8_t m_CSID; //!< Coresight trace ID for this decoder.
-
- bool m_decode_pass1; //!< flag to indicate 1st pass of packet decode.
-
-
-
-//** output element
- OcsdTraceElement m_output_elem; //!< output packet
-};
-
-#endif // ARM_TRC_PKT_DECODE_STM_H_INCLUDED
-
-/* End of File trc_pkt_decode_stm.h */
diff --git a/contrib/opencsd/decoder/include/opencsd/stm/trc_pkt_elem_stm.h b/contrib/opencsd/decoder/include/opencsd/stm/trc_pkt_elem_stm.h
deleted file mode 100644
index 738e4522a9c2..000000000000
--- a/contrib/opencsd/decoder/include/opencsd/stm/trc_pkt_elem_stm.h
+++ /dev/null
@@ -1,238 +0,0 @@
-/*!
- * \file trc_pkt_elem_stm.h
- * \brief OpenCSD : STM 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.
- */
-
-#ifndef ARM_TRC_PKT_ELEM_STM_H_INCLUDED
-#define ARM_TRC_PKT_ELEM_STM_H_INCLUDED
-
-#include "trc_pkt_types_stm.h"
-#include "common/trc_printable_elem.h"
-#include "common/trc_pkt_elem_base.h"
-
-/*!
- * @class StmTrcPacket
- * @brief STM trace packet with packet printing functionality
- *
- * This class allows for the update and access of the current STM trace
- * packet, implementing the STM protocol rules as appropriate. Maintains
- * the intra packet state as well as updates on a per packet basis.
- *
- * Based on data structure ocsd_stm_pkt.
- *
- */
-class StmTrcPacket : public TrcPacketBase, public ocsd_stm_pkt, public trcPrintableElem
-{
-public:
- StmTrcPacket();
- ~StmTrcPacket() {};
-
- StmTrcPacket &operator =(const ocsd_stm_pkt *p_pkt);
-
- virtual const void *c_pkt() const { return (const ocsd_stm_pkt *)this; };
-
- void initStartState(); //!< Initialise packet state at start of decoder.
- void initNextPacket(); //!< Initialise state for next packet.
-
- void setPacketType(const ocsd_stm_pkt_type type, const bool bMarker);
- void updateErrType(const ocsd_stm_pkt_type err_type);
- void setMaster(const uint8_t master);
- void setChannel(const uint16_t channel, const bool b8Bit);
- void setTS(const uint64_t ts_val, const uint8_t updatedBits);
- void onVersionPkt(const ocsd_stm_ts_type type);
-
- void setD4Payload(const uint8_t value);
- void setD8Payload(const uint8_t value);
- void setD16Payload(const uint16_t value);
- void setD32Payload(const uint32_t value);
- void setD64Payload(const uint64_t value);
-
- const bool isMarkerPkt() const;
- const bool isTSPkt() const;
-
- const ocsd_stm_pkt_type getPktType() const;
- const ocsd_stm_pkt_type getPktErrType() const;
- const uint8_t getMaster() const;
- const uint16_t getChannel() const;
- const ocsd_stm_ts_type getTSType() const;
- const uint64_t getTSVal() const;
-
- const uint8_t getD4Val() const;
- const uint8_t getD8Val() const;
- const uint16_t getD16Val() const;
- const uint32_t getD32Val() const;
- const uint64_t getD64Val() const;
-
- const bool isBadPacket() const;
-
- // printing
- virtual void toString(std::string &str) const;
- virtual void toStringFmt(const uint32_t fmtFlags, std::string &str) const;
-
-
-private:
- void pktTypeName(const ocsd_stm_pkt_type pkt_type, std::string &name, std::string &desc) const;
-};
-
-inline void StmTrcPacket::setPacketType(const ocsd_stm_pkt_type type, const bool bMarker)
-{
- this->type = type;
- if(bMarker)
- pkt_has_marker = 1;
-}
-
-inline void StmTrcPacket::updateErrType(const ocsd_stm_pkt_type err_type)
-{
- this->err_type = this->type; // original type is the err type;
- this->type = err_type; // mark main type as an error.
-}
-
-inline void StmTrcPacket::setMaster(const uint8_t master)
-{
- this->master = master;
- channel = 0; // M8 forces current channel to 0.
-}
-
-inline void StmTrcPacket::setChannel(const uint16_t channel, const bool b8Bit)
-{
- if(b8Bit)
- this->channel = (this->channel & 0xFF00) | (channel & 0xFF);
- else
- this->channel = channel;
-}
-
-inline void StmTrcPacket::onVersionPkt(const ocsd_stm_ts_type type)
-{
- this->ts_type = type;
- master = 0;
- channel = 0;
-}
-
-inline void StmTrcPacket::setD4Payload(const uint8_t value)
-{
- payload.D8 = value & 0xF;
-}
-
-inline void StmTrcPacket::setD8Payload(const uint8_t value)
-{
- payload.D8 = value;
-}
-
-inline void StmTrcPacket::setD16Payload(const uint16_t value)
-{
- payload.D16 = value;
-}
-
-inline void StmTrcPacket::setD32Payload(const uint32_t value)
-{
- payload.D32 = value;
-}
-
-inline void StmTrcPacket::setD64Payload(const uint64_t value)
-{
- payload.D64 = value;
-}
-
-inline const bool StmTrcPacket::isMarkerPkt() const
-{
- return (pkt_has_marker != 0);
-}
-
-inline const bool StmTrcPacket::isTSPkt() const
-{
- return (pkt_has_ts != 0);
-}
-
-inline const ocsd_stm_pkt_type StmTrcPacket::getPktType() const
-{
- return type;
-}
-
-inline const ocsd_stm_pkt_type StmTrcPacket::getPktErrType() const
-{
- return err_type;
-}
-
-inline const uint8_t StmTrcPacket::getMaster() const
-{
- return master;
-}
-
-inline const uint16_t StmTrcPacket::getChannel() const
-{
- return channel;
-}
-
-inline const ocsd_stm_ts_type StmTrcPacket::getTSType() const
-{
- return ts_type;
-}
-
-inline const uint64_t StmTrcPacket::getTSVal() const
-{
- return timestamp;
-}
-
-inline const uint8_t StmTrcPacket::getD4Val() const
-{
- return payload.D8;
-}
-
-inline const uint8_t StmTrcPacket::getD8Val() const
-{
- return payload.D8;
-}
-
-inline const uint16_t StmTrcPacket::getD16Val() const
-{
- return payload.D16;
-}
-
-inline const uint32_t StmTrcPacket::getD32Val() const
-{
- return payload.D32;
-}
-
-inline const uint64_t StmTrcPacket::getD64Val() const
-{
- return payload.D64;
-}
-
-inline const bool StmTrcPacket::isBadPacket() const
-{
- return (bool)(type >= STM_PKT_BAD_SEQUENCE);
-}
-
-
-#endif // ARM_TRC_PKT_ELEM_STM_H_INCLUDED
-
-/* End of File trc_pkt_elem_stm.h */
diff --git a/contrib/opencsd/decoder/include/opencsd/stm/trc_pkt_proc_stm.h b/contrib/opencsd/decoder/include/opencsd/stm/trc_pkt_proc_stm.h
deleted file mode 100644
index 909ac0cb0566..000000000000
--- a/contrib/opencsd/decoder/include/opencsd/stm/trc_pkt_proc_stm.h
+++ /dev/null
@@ -1,289 +0,0 @@
-/*
- * \file trc_pkt_proc_stm.h
- * \brief OpenCSD : STM packet processing
- *
- * \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.
- */
-
-#ifndef ARM_TRC_PKT_PROC_STM_H_INCLUDED
-#define ARM_TRC_PKT_PROC_STM_H_INCLUDED
-
-#include <vector>
-
-#include "trc_pkt_types_stm.h"
-#include "common/trc_pkt_proc_base.h"
-#include "trc_pkt_elem_stm.h"
-#include "trc_cmp_cfg_stm.h"
-
-/** @addtogroup ocsd_pkt_proc
-@{*/
-
-class TrcPktProcStm : public TrcPktProcBase<StmTrcPacket, ocsd_stm_pkt_type, STMConfig>
-{
-public:
- TrcPktProcStm();
- TrcPktProcStm(int instIDNum);
- virtual ~TrcPktProcStm();
-
-protected:
- /* implementation packet processing interface */
- virtual ocsd_datapath_resp_t processData( const ocsd_trc_index_t index,
- const uint32_t dataBlockSize,
- const uint8_t *pDataBlock,
- uint32_t *numBytesProcessed);
- virtual ocsd_datapath_resp_t onEOT();
- virtual ocsd_datapath_resp_t onReset();
- virtual ocsd_datapath_resp_t onFlush();
- virtual ocsd_err_t onProtocolConfig();
- virtual const bool isBadPacket() const;
-
-
- typedef enum _process_state {
- WAIT_SYNC,
- PROC_HDR,
- PROC_DATA,
- SEND_PKT
- } process_state;
-
- process_state m_proc_state;
-
-private:
-
- void initObj();
- void initProcessorState();
- void initNextPacket();
- void waitForSync(const ocsd_trc_index_t blk_st_index);
-
- ocsd_datapath_resp_t outputPacket(); //!< send packet on output
- void sendPacket(); //!< mark packet for send.
- void setProcUnsynced(); //!< set processor state to unsynced
- void throwBadSequenceError(const char *pszMessage = "");
- void throwReservedHdrError(const char *pszMessage = "");
-
- // packet processing routines
- // 1 nibble opcodes
- void stmPktReserved();
- void stmPktNull();
- void stmPktM8();
- void stmPktMERR();
- void stmPktC8();
- void stmPktD4();
- void stmPktD8();
- void stmPktD16();
- void stmPktD32();
- void stmPktD64();
- void stmPktD4MTS();
- void stmPktD8MTS();
- void stmPktD16MTS();
- void stmPktD32MTS();
- void stmPktD64MTS();
- void stmPktFlagTS();
- void stmPktFExt();
-
- // 2 nibble opcodes 0xFn
- void stmPktReservedFn();
- void stmPktF0Ext();
- void stmPktGERR();
- void stmPktC16();
- void stmPktD4TS();
- void stmPktD8TS();
- void stmPktD16TS();
- void stmPktD32TS();
- void stmPktD64TS();
- void stmPktD4M();
- void stmPktD8M();
- void stmPktD16M();
- void stmPktD32M();
- void stmPktD64M();
- void stmPktFlag();
- void stmPktASync();
-
- // 3 nibble opcodes 0xF0n
- void stmPktReservedF0n();
- void stmPktVersion();
- void stmPktNullTS();
- void stmPktTrigger();
- void stmPktTriggerTS();
- void stmPktFreq();
-
- void stmExtractTS(); // extract a TS in packets that require it.
- void stmExtractVal8(uint8_t nibbles_to_val);
- void stmExtractVal16(uint8_t nibbles_to_val);
- void stmExtractVal32(uint8_t nibbles_to_val);
- void stmExtractVal64(uint8_t nibbles_to_val);
-
- uint64_t bin_to_gray(uint64_t bin_value);
- uint64_t gray_to_bin(uint64_t gray_value);
- void pktNeedsTS(); // init the TS extraction routines
-
- // data processing op function tables
- void buildOpTables();
-
- typedef void (TrcPktProcStm::*PPKTFN)(void);
- PPKTFN m_pCurrPktFn; // current active processing function.
-
- PPKTFN m_1N_ops[0x10];
- PPKTFN m_2N_ops[0x10];
- PPKTFN m_3N_ops[0x10];
-
- // read a nibble from the input data - may read a byte and set spare or return spare.
- // handles setting up packet data block and end of input
- bool readNibble();
-
- const bool dataToProcess() const; //!< true if data to process, or packet to send
-
- void savePacketByte(const uint8_t val); //!< save data to packet buffer if we need it for monitor.
-
- // packet data
- StmTrcPacket m_curr_packet; //!< current packet.
- bool m_bNeedsTS; //!< packet requires a TS
- bool m_bIsMarker;
-
-
- bool m_bStreamSync; //!< packet stream is synced
-
- // input data handling
- uint8_t m_num_nibbles; //!< number of nibbles in the current packet
- uint8_t m_nibble; //!< current nibble being processed.
- uint8_t m_nibble_2nd; //!< 2nd unused nibble from a processed byte.
- bool m_nibble_2nd_valid; //!< 2nd nibble is valid;
- uint8_t m_num_data_nibbles; //!< number of nibbles needed to acheive payload.
-
- const uint8_t *m_p_data_in; //!< pointer to input data.
- uint32_t m_data_in_size; //!< amount of data in.
- uint32_t m_data_in_used; //!< amount of data processed.
- ocsd_trc_index_t m_packet_index; //!< byte index for start of current packet
-
- std::vector<uint8_t> m_packet_data; //!< current packet data (bytes) - only saved if needed to output to monitor.
- bool m_bWaitSyncSaveSuppressed; //!< don't save byte at a time when waitsync
-
- // payload data
- uint8_t m_val8; //!< 8 bit payload.
- uint16_t m_val16; //!< 16 bit payload
- uint32_t m_val32; //!< 32 bit payload
- uint64_t m_val64; //!< 64 bit payload
-
- // timestamp handling
- uint8_t m_req_ts_nibbles;
- uint8_t m_curr_ts_nibbles;
- uint64_t m_ts_update_value;
- bool m_ts_req_set;
-
-
- // sync handling - need to spot sync mid other packet in case of wrap / discontinuity
- uint8_t m_num_F_nibbles; //!< count consecutive F nibbles.
- bool m_sync_start; //!< possible start of sync
- bool m_is_sync; //!< true if found sync at current nibble
- ocsd_trc_index_t m_sync_index; //!< index of start of possible sync packet
-
- void checkSyncNibble(); //!< check current nibble as part of sync.
- void clearSyncCount(); //!< valid packet, so clear sync counters (i.e. a trailing ffff is not part of sync).
-
- class monAttachNotify : public IComponentAttachNotifier
- {
- public:
- monAttachNotify() { m_bInUse = false; };
- virtual ~monAttachNotify() {};
- virtual void attachNotify(const int num_attached) { m_bInUse = (num_attached > 0); };
-
- const bool usingMonitor() const { return m_bInUse; };
-
- private:
- bool m_bInUse;
- } mon_in_use;
-};
-
-inline const bool TrcPktProcStm::dataToProcess() const
-{
- // data to process if
- // 1) not processed all the input bytes
- // 2) there is still a nibble available from the last byte.
- // 3) bytes processed, but there is a full packet to send
- return (m_data_in_used < m_data_in_size) || m_nibble_2nd_valid || (m_proc_state == SEND_PKT);
-}
-
-
-inline void TrcPktProcStm::checkSyncNibble()
-{
- if(m_nibble != 0xF)
- {
- if(!m_sync_start)
- return;
-
- if((m_nibble == 0) && (m_num_F_nibbles >= 21))
- {
- m_is_sync = true; //this nibble marks a sync sequence - keep the F nibble count
- }
- else
- {
- clearSyncCount(); // clear all sync counters
- }
- return;
- }
-
- m_num_F_nibbles++;
- if(!m_sync_start)
- {
- m_sync_start = true;
- m_sync_index = m_packet_index + ((m_num_nibbles - 1) / 2);
- }
-}
-
-inline void TrcPktProcStm::clearSyncCount()
-{
- m_num_F_nibbles = 0;
- m_sync_start = false;
- m_is_sync = false;
-}
-
-inline void TrcPktProcStm::sendPacket()
-{
- m_proc_state = SEND_PKT;
-}
-
-inline void TrcPktProcStm::setProcUnsynced()
-{
- m_proc_state = WAIT_SYNC;
- m_bStreamSync = false;
-}
-
-
-inline void TrcPktProcStm::savePacketByte(const uint8_t val)
-{
- // save packet data if using monitor and synchronised.
- if(mon_in_use.usingMonitor() && !m_bWaitSyncSaveSuppressed)
- m_packet_data.push_back(val);
-}
-
-/** @}*/
-
-#endif // ARM_TRC_PKT_PROC_STM_H_INCLUDED
-
-/* End of File trc_pkt_proc_stm.h */
diff --git a/contrib/opencsd/decoder/include/opencsd/stm/trc_pkt_types_stm.h b/contrib/opencsd/decoder/include/opencsd/stm/trc_pkt_types_stm.h
deleted file mode 100644
index fd44cea939b4..000000000000
--- a/contrib/opencsd/decoder/include/opencsd/stm/trc_pkt_types_stm.h
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * \file trc_pkt_types_stm.h
- * \brief OpenCSD : STM decoder
- *
- * \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.
- */
-#ifndef ARM_TRC_PKT_TYPES_STM_H_INCLUDED
-#define ARM_TRC_PKT_TYPES_STM_H_INCLUDED
-
-#include "opencsd/trc_pkt_types.h"
-
-/** @addtogroup trc_pkts
-@{*/
-
-/** @name STM Packet Types
-@{*/
-
-/** STM protocol packet types.
- Contains both protocol packet types and markers for unsynced processor
- state and bad packet sequences.
-*/
-typedef enum _ocsd_stm_pkt_type
-{
-/* markers for unknown packets / state*/
- STM_PKT_NOTSYNC, /**< Not synchronised */
- STM_PKT_INCOMPLETE_EOT, /**< Incomplete packet flushed at end of trace. */
- STM_PKT_NO_ERR_TYPE, /**< No error in error packet marker. */
-
-/* markers for valid packets*/
- STM_PKT_ASYNC, /**< Alignment synchronisation packet */
- STM_PKT_VERSION, /**< Version packet */
- STM_PKT_FREQ, /**< Frequency packet */
- STM_PKT_NULL, /**< Null packet */
- STM_PKT_TRIG, /**< Trigger event packet. */
-
- STM_PKT_GERR, /**< Global error packet - protocol error but unknown which master had error */
- STM_PKT_MERR, /**< Master error packet - current master detected an error (e.g. dropped trace) */
-
- STM_PKT_M8, /**< Set current master */
- STM_PKT_C8, /**< Set lower 8 bits of current channel */
- STM_PKT_C16, /**< Set current channel */
-
- STM_PKT_FLAG, /**< Flag packet */
-
- STM_PKT_D4, /**< 4 bit data payload packet */
- STM_PKT_D8, /**< 8 bit data payload packet */
- STM_PKT_D16, /**< 16 bit data payload packet */
- STM_PKT_D32, /**< 32 bit data payload packet */
- STM_PKT_D64, /**< 64 bit data payload packet */
-
-/* packet errors.*/
- STM_PKT_BAD_SEQUENCE, /**< Incorrect protocol sequence */
- STM_PKT_RESERVED, /**< Reserved packet header / not supported by CS-STM */
-
-} ocsd_stm_pkt_type;
-
-/** STM timestamp encoding type.
- Extracted from STM version packet.
- CS-STM supports Natural binary and grey encodings.
-*/
-typedef enum _ocsd_stm_ts_type
-{
- STM_TS_UNKNOWN, /**< TS encoding unknown at present. */
- STM_TS_NATBINARY, /**< TS encoding natural binary */
- STM_TS_GREY /**< TS encoding grey coded. */
-} ocsd_stm_ts_type;
-
-/** STM trace packet
-
- Structure containing the packet data for a single STM packet, plus
- data persisting between packets (master, channel, last timestamp).
-*/
-typedef struct _ocsd_stm_pkt
-{
- ocsd_stm_pkt_type type; /**< STM packet type */
-
- uint8_t master; /**< current master */
- uint16_t channel; /**< current channel */
-
- uint64_t timestamp; /**< latest timestamp value -> as binary - packet processor does grey decoding */
- uint8_t pkt_ts_bits; /**< timestamp bits updated this packet */
- uint8_t pkt_has_ts; /**< current packet has associated timestamp (ts bits can be 0 if same value as last time) */
-
- ocsd_stm_ts_type ts_type; /**< timestamp encoding type */
-
- uint8_t pkt_has_marker; /**< flag to indicate current packet has marker */
-
- union {
- uint8_t D8; /**< payload for D8 or D4 data packet, or parameter value for other packets with 8 bit value [VERSION, TRIG, xERR] */
- uint16_t D16; /**< payload for D16 data packet, or reserved opcode in bad packet header (1-3 nibbles) */
- uint32_t D32; /**< payload for D32 data packet, or parameter value for other packets with 32 bit value [FREQ] */
- uint64_t D64; /**< payload for D64 data packet */
- } payload;
-
- ocsd_stm_pkt_type err_type; /**< Initial type of packet if type indicates bad sequence. */
-
-} ocsd_stm_pkt;
-
-/** HW Event trace feature
- Defines if the STM supports or has enabled the HW event trace feature.
- This may not always be able to be determined by the registers, or the feature
- values can override if HW event trace is to be ignored.
-*/
-typedef enum _hw_event_feat {
- HwEvent_Unknown_Disabled, /*!< status of HW event features not known - assume not present or disabled */
- HwEvent_Enabled, /*!< HW event present and enabled - ignore Feat regs, assume hwev_mast value valid */
- HwEvent_UseRegisters /*!< Feature Register values and enable bits used to determine HW event trace status */
-} hw_event_feat_t;
-
-
-/** STM hardware configuration.
- Contains hardware register values at time of trace capture and HW event feature
- field to enable and control decode of STM trace stream.
-*/
-typedef struct _ocsd_stm_cfg
-{
- uint32_t reg_tcsr; /**< Contains CoreSight trace ID, HWTEN */
- uint32_t reg_feat3r; /**< defines number of masters */
- uint32_t reg_devid; /**< defines number of channels per master */
-
- uint32_t reg_feat1r; /**< defines HW trace features */
- uint32_t reg_hwev_mast; /**< master ID for HW event trace */
- hw_event_feat_t hw_event; /**< status of HW event trace */
-} ocsd_stm_cfg;
-
-/** @}*/
-/** @}*/
-
-#endif // ARM_TRC_PKT_TYPES_STM_H_INCLUDED
-
-/* End of File trc_pkt_types_stm.h */
diff --git a/contrib/opencsd/decoder/include/opencsd/trc_gen_elem_types.h b/contrib/opencsd/decoder/include/opencsd/trc_gen_elem_types.h
deleted file mode 100644
index 1d77b53cf8f9..000000000000
--- a/contrib/opencsd/decoder/include/opencsd/trc_gen_elem_types.h
+++ /dev/null
@@ -1,130 +0,0 @@
-/*!
- * \file opencsd/trc_gen_elem_types.h
- * \brief OpenCSD : Decoder Output Generic Element types.
- *
- * \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.
- */
-
-#ifndef ARM_TRC_GEN_ELEM_TYPES_H_INCLUDED
-#define ARM_TRC_GEN_ELEM_TYPES_H_INCLUDED
-
-/** @defgroup gen_trc_elem OpenCSD Library : Generic Trace Elements
- * @brief Generic trace elements output by the PE trace decode and SW stim decode stages.
- *
- *
-@{*/
-
-#include "opencsd/ocsd_if_types.h"
-
-/** Enum for generic element types */
-typedef enum _ocsd_gen_trc_elem_t
-{
- OCSD_GEN_TRC_ELEM_UNKNOWN = 0, /*!< Unknown trace element - default value or indicate error in stream to client */
- OCSD_GEN_TRC_ELEM_NO_SYNC, /*!< Waiting for sync - either at start of decode, or after overflow / bad packet */
- OCSD_GEN_TRC_ELEM_TRACE_ON, /*!< Start of trace - beginning of elements or restart after discontinuity (overflow, trace filtering). */
- OCSD_GEN_TRC_ELEM_EO_TRACE, /*!< end of the available trace in the buffer. */
- OCSD_GEN_TRC_ELEM_PE_CONTEXT, /*!< PE status update / change (arch, ctxtid, vmid etc). */
- OCSD_GEN_TRC_ELEM_INSTR_RANGE, /*!< traced N consecutive instructions from addr (no intervening events or data elements), may have data assoc key */
- OCSD_GEN_TRC_ELEM_ADDR_NACC, /*!< tracing in inaccessible memory area */
- OCSD_GEN_TRC_ELEM_ADDR_UNKNOWN, /*!< address currently unknown - need address packet update */
- OCSD_GEN_TRC_ELEM_EXCEPTION, /*!< exception - start address may be exception target, end address may be preferred ret addr. */
- OCSD_GEN_TRC_ELEM_EXCEPTION_RET, /*!< expection return */
- OCSD_GEN_TRC_ELEM_TIMESTAMP, /*!< Timestamp - preceding elements happeded before this time. */
- OCSD_GEN_TRC_ELEM_CYCLE_COUNT, /*!< Cycle count - cycles since last cycle count value - associated with a preceding instruction range. */
- OCSD_GEN_TRC_ELEM_EVENT, /*!< Event - trigger or numbered event */
- OCSD_GEN_TRC_ELEM_SWTRACE, /*!< Software trace packet - may contain data payload. */
- OCSD_GEN_TRC_ELEM_CUSTOM, /*!< Fully custom packet type - used by none-ARM architecture decoders */
-} ocsd_gen_trc_elem_t;
-
-
-typedef enum _trace_on_reason_t {
- TRACE_ON_NORMAL = 0, /**< Trace on at start of trace or filtering discontinuity */
- TRACE_ON_OVERFLOW, /**< Trace on due to prior trace overflow discontinuity */
- TRACE_ON_EX_DEBUG, /**< Trace restarted due to debug exit */
-} trace_on_reason_t;
-
-typedef struct _trace_event_t {
- uint16_t ev_type; /**< event type - unknown (0) trigger (1), numbered event (2)*/
- uint16_t ev_number; /**< event number if numbered event type */
-} trace_event_t;
-
-typedef struct _ocsd_generic_trace_elem {
- ocsd_gen_trc_elem_t elem_type; /**< Element type - remaining data interpreted according to this value */
- ocsd_isa isa; /**< instruction set for executed instructions */
- ocsd_vaddr_t st_addr; /**< start address for instruction execution range / inaccessible code address / data address */
- ocsd_vaddr_t en_addr; /**< end address (exclusive) for instruction execution range. */
- ocsd_pe_context context; /**< PE Context */
- uint64_t timestamp; /**< timestamp value for TS element type */
- uint32_t cycle_count; /**< cycle count for explicit cycle count element, or count for element with associated cycle count */
- ocsd_instr_type last_i_type; /**< Last instruction type if instruction execution range */
- ocsd_instr_subtype last_i_subtype; /**< sub type for last instruction in range */
-
- //! per element flags
- union {
- struct {
- uint32_t last_instr_exec:1; /**< 1 if last instruction in range was executed; */
- uint32_t last_instr_sz:3; /**< size of last instruction in bytes (2/4) */
- uint32_t has_cc:1; /**< 1 if this packet has a valid cycle count included (e.g. cycle count included as part of instruction range packet, always 1 for pure cycle count packet.*/
- uint32_t cpu_freq_change:1; /**< 1 if this packet indicates a change in CPU frequency */
- uint32_t excep_ret_addr:1; /**< 1 if en_addr is the preferred exception return address on exception packet type */
- uint32_t excep_data_marker:1; /**< 1 if the exception entry packet is a data push marker only, with no address information (used typically in v7M trace for marking data pushed onto stack) */
- uint32_t extended_data:1; /**< 1 if the packet extended data pointer is valid. Allows packet extensions for custom decoders, or additional data payloads for data trace. */
- uint32_t has_ts:1; /**< 1 if the packet has an associated timestamp - e.g. SW/STM trace TS+Payload as a single packet */
- uint32_t last_instr_cond:1; /**< 1 if the last instruction was conditional */
- uint32_t excep_ret_addr_br_tgt:1; /**< 1 if exception return address (en_addr) is also the target of a taken branch addr from the previous range. */
- };
- uint32_t flag_bits;
- };
-
- //! packet specific payloads
- union {
- uint32_t exception_number; /**< exception number for exception type packets */
- trace_event_t trace_event; /**< Trace event - trigger etc */
- trace_on_reason_t trace_on_reason; /**< reason for the trace on packet */
- ocsd_swt_info_t sw_trace_info; /**< software trace packet info */
- uint32_t num_instr_range; /**< number of instructions covered by range packet (for T32 this cannot be calculated from en-st/i_size) */
- };
-
- const void *ptr_extended_data; /**< pointer to extended data buffer (data trace, sw trace payload) / custom structure */
-
-} ocsd_generic_trace_elem;
-
-
-typedef enum _event_t {
- EVENT_UNKNOWN = 0,
- EVENT_TRIGGER,
- EVENT_NUMBERED
-} event_t;
-
-
-/** @}*/
-#endif // ARM_TRC_GEN_ELEM_TYPES_H_INCLUDED
-
-/* End of File opencsd/trc_gen_elem_types.h */
diff --git a/contrib/opencsd/decoder/include/opencsd/trc_pkt_types.h b/contrib/opencsd/decoder/include/opencsd/trc_pkt_types.h
deleted file mode 100644
index 2eb353a1761a..000000000000
--- a/contrib/opencsd/decoder/include/opencsd/trc_pkt_types.h
+++ /dev/null
@@ -1,137 +0,0 @@
-/*!
- * \file opencsd/trc_pkt_types.h
- * \brief OpenCSD: Common "C" types for trace packets.
- *
- * \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.
- */
-
-#ifndef ARM_TRC_PKT_TYPES_H_INCLUDED
-#define ARM_TRC_PKT_TYPES_H_INCLUDED
-
-#include <stdint.h>
-#include "opencsd/ocsd_if_types.h"
-
-/** @defgroup trc_pkts OpenCSD Library : Trace Packet Types
-
- @brief Types used in trace packet description structures.
-
-@{*/
-
-
-/** @name Common Packet Types
-@{*/
-
-typedef enum _ocsd_pkt_va_size
-{
- VA_32BIT,
- VA_64BIT
-} ocsd_pkt_va_size;
-
-typedef struct _ocsd_pkt_vaddr
-{
- ocsd_pkt_va_size size; /**< Virtual address size. */
- ocsd_vaddr_t val; /**< Current value */
- uint8_t pkt_bits; /**< Bits updated this packet */
- uint8_t valid_bits; /**< Currently valid bits */
-} ocsd_pkt_vaddr;
-
-typedef struct _ocsd_pkt_byte_sz_val
-{
- uint32_t val;
- uint8_t size_bytes;
- uint8_t valid_bytes;
-} ocsd_pkt_byte_sz_val;
-
-typedef enum _ocsd_pkt_atm_type
-{
- ATOM_PATTERN, /**< set atom packet using pattern supplied */
- ATOM_REPEAT /**< set atom packet using repeat value (convert to pattern) */
-} ocsd_pkt_atm_type;
-
-typedef enum _ocsd_atm_val {
- ATOM_N,
- ATOM_E
-} ocsd_atm_val;
-
-typedef struct _ocsd_pkt_atom
-{
- /** pattern across num bits.
- Bit sequence:- ls bit = oldest atom (1st instruction executed), ms bit = newest (last instruction executed),
- Bit values :- 1'b1 = E atom, 1'b0 = N atom.
- */
- uint32_t En_bits;
- uint8_t num; /**< number of atoms represented */
-} ocsd_pkt_atom;
-
-/** Isync Reason - common to PTM and ETMv3 **/
-typedef enum _ocsd_iSync_reason {
- iSync_Periodic = 0,
- iSync_TraceEnable,
- iSync_TraceRestartAfterOverflow,
- iSync_DebugExit
-} ocsd_iSync_reason;
-
-
-typedef enum _ocsd_armv7_exception {
- Excp_Reserved,
- Excp_NoException,
- Excp_Reset,
- Excp_IRQ,
- Excp_FIQ,
- Excp_AsyncDAbort,
- Excp_DebugHalt,
- Excp_Jazelle,
- Excp_SVC,
- Excp_SMC,
- Excp_Hyp,
- Excp_Undef,
- Excp_PrefAbort,
- Excp_Generic,
- Excp_SyncDataAbort,
- Excp_CMUsageFault,
- Excp_CMNMI,
- Excp_CMDebugMonitor,
- Excp_CMMemManage,
- Excp_CMPendSV,
- Excp_CMSysTick,
- Excp_CMBusFault,
- Excp_CMHardFault,
- Excp_CMIRQn,
- Excp_ThumbEECheckFail,
-} ocsd_armv7_exception;
-
-/** @}*/
-
-/** @}*/
-
-#endif // ARM_TRC_PKT_TYPES_H_INCLUDED
-
-/* End of File opencsd/trc_pkt_types.h */
diff --git a/contrib/opencsd/decoder/include/pkt_printers/gen_elem_printer.h b/contrib/opencsd/decoder/include/pkt_printers/gen_elem_printer.h
deleted file mode 100644
index ba3138a67f6e..000000000000
--- a/contrib/opencsd/decoder/include/pkt_printers/gen_elem_printer.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * \file gen_elem_printer.h
- * \brief OpenCSD : Generic element printer 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.
- */
-#ifndef ARM_GEN_ELEM_PRINTER_H_INCLUDED
-#define ARM_GEN_ELEM_PRINTER_H_INCLUDED
-
-#include "opencsd.h"
-
-class TrcGenericElementPrinter : public ItemPrinter, public ITrcGenElemIn
-{
-public:
- TrcGenericElementPrinter();
- virtual ~TrcGenericElementPrinter() {};
-
- virtual ocsd_datapath_resp_t TraceElemIn(const ocsd_trc_index_t index_sop,
- const uint8_t trc_chan_id,
- const OcsdTraceElement &elem);
-
- // funtionality to test wait / flush mechanism
- void ackWait() { m_needWaitAck = false; };
- const bool needAckWait() const { return m_needWaitAck; };
-
-protected:
- bool m_needWaitAck;
-};
-
-
-inline TrcGenericElementPrinter::TrcGenericElementPrinter() :
- m_needWaitAck(false)
-{
-}
-
-inline ocsd_datapath_resp_t TrcGenericElementPrinter::TraceElemIn(const ocsd_trc_index_t index_sop,
- const uint8_t trc_chan_id,
- const OcsdTraceElement &elem)
-{
- ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
- std::string elemStr;
- std::ostringstream oss;
- oss << "Idx:" << index_sop << "; ID:"<< std::hex << (uint32_t)trc_chan_id << "; ";
- elem.toString(elemStr);
- oss << elemStr << std::endl;
- itemPrintLine(oss.str());
-
- // funtionality to test wait / flush mechanism
- if(m_needWaitAck)
- {
- oss.str("");
- oss << "WARNING: Generic Element Printer; New element without previous _WAIT acknowledged\n";
- itemPrintLine(oss.str());
- m_needWaitAck = false;
- }
-
- if(getTestWaits())
- {
- resp = OCSD_RESP_WAIT; // return _WAIT for the 1st N packets.
- decTestWaits();
- m_needWaitAck = true;
- }
- return resp;
-}
-
-#endif // ARM_GEN_ELEM_PRINTER_H_INCLUDED
-
-/* End of File gen_elem_printer.h */
diff --git a/contrib/opencsd/decoder/include/pkt_printers/item_printer.h b/contrib/opencsd/decoder/include/pkt_printers/item_printer.h
deleted file mode 100644
index cc3ec37c291e..000000000000
--- a/contrib/opencsd/decoder/include/pkt_printers/item_printer.h
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * \file item_printer.h
- * \brief OpenCSD :
- *
- * \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.
- */
-
-#ifndef ARM_ITEM_PRINTER_H_INCLUDED
-#define ARM_ITEM_PRINTER_H_INCLUDED
-
-#include "opencsd.h"
-#include <string>
-
-class ItemPrinter
-{
-public:
- ItemPrinter();
- virtual ~ItemPrinter();
-
- void setMessageLogger(ocsdMsgLogger *pMsgLogger) { m_pMsgLogger = pMsgLogger; };
- void itemPrintLine(const std::string &msg);
-
- // return wait for the first N packets - test the wait mechanism.
- void setTestWaits(const int num_waits);
- const int getTestWaits() const;
- void decTestWaits();
-
-protected:
- ocsdMsgLogger *m_pMsgLogger;
- int m_test_waits;
-};
-
-inline ItemPrinter::ItemPrinter() :
- m_pMsgLogger(0),
- m_test_waits(0)
-{
-}
-
-inline ItemPrinter::~ItemPrinter()
-{
- m_pMsgLogger = 0;
-}
-
-inline void ItemPrinter::itemPrintLine(const std::string &msg)
-{
- if(m_pMsgLogger)
- m_pMsgLogger->LogMsg(msg);
-}
-
-inline void ItemPrinter::setTestWaits(const int num_waits)
-{
- m_test_waits = num_waits;
-}
-
-inline const int ItemPrinter::getTestWaits() const
-{
- return m_test_waits;
-}
-
-inline void ItemPrinter::decTestWaits()
-{
- m_test_waits--;
-}
-
-#endif // ARM_ITEM_PRINTER_H_INCLUDED
-
-/* End of File item_printer.h */
diff --git a/contrib/opencsd/decoder/include/pkt_printers/pkt_printer_t.h b/contrib/opencsd/decoder/include/pkt_printers/pkt_printer_t.h
deleted file mode 100644
index 9eb37f4e2833..000000000000
--- a/contrib/opencsd/decoder/include/pkt_printers/pkt_printer_t.h
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- * \file pkt_printer_t.h
- * \brief OpenCSD : Test packet printer.
- *
- * \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.
- */
-
-#ifndef ARM_PKT_PRINTER_T_H_INCLUDED
-#define ARM_PKT_PRINTER_T_H_INCLUDED
-
-#include "opencsd.h"
-
-#include <string>
-#include <sstream>
-//#include <iostream>
-#include <iomanip>
-
-template<class P>
-class PacketPrinter : public IPktDataIn<P>, public IPktRawDataMon<P>, public ItemPrinter
-{
-public:
- PacketPrinter(const uint8_t trcID);
- PacketPrinter(const uint8_t trcID, ocsdMsgLogger *pMsgLogger);
- virtual ~PacketPrinter();
-
-
- virtual ocsd_datapath_resp_t PacketDataIn( const ocsd_datapath_op_t op,
- const ocsd_trc_index_t index_sop,
- const P *p_packet_in);
-
- virtual void RawPacketDataMon( const ocsd_datapath_op_t op,
- const ocsd_trc_index_t index_sop,
- const P *pkt,
- const uint32_t size,
- const uint8_t *p_data);
-
-
-private:
- void printIdx_ID(const ocsd_trc_index_t index_sop);
-
- uint8_t m_trcID;
- bool m_bRawPrint;
- std::ostringstream m_oss;
- ocsd_datapath_resp_t m_last_resp;
-
-};
-
-template<class P> PacketPrinter<P>::PacketPrinter(uint8_t trcID) :
- m_trcID(trcID),
- m_bRawPrint(false),
- m_last_resp(OCSD_RESP_CONT)
-{
-}
-
-template<class P> PacketPrinter<P>::PacketPrinter(const uint8_t trcID, ocsdMsgLogger *pMsgLogger) :
- m_trcID(trcID),
- m_bRawPrint(false),
- m_last_resp(OCSD_RESP_CONT)
-{
- setMessageLogger(pMsgLogger);
-}
-
-template<class P> PacketPrinter<P>::~PacketPrinter()
-{
-}
-
-template<class P> ocsd_datapath_resp_t PacketPrinter<P>::PacketDataIn( const ocsd_datapath_op_t op,
- const ocsd_trc_index_t index_sop,
- const P *p_packet_in)
-{
- std::string pktstr;
- ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
-
- // wait / flush test verification
- if(!m_bRawPrint && (m_last_resp == OCSD_RESP_WAIT))
- {
- // expect a flush or a complete reset after a wait.
- if((op != OCSD_OP_FLUSH) || (op != OCSD_OP_RESET))
- {
- m_oss <<"ID:"<< std::hex << (uint32_t)m_trcID << "\tERROR: FLUSH operation expected after wait on trace decode path\n";
- itemPrintLine(m_oss.str());
- m_oss.str("");
- return OCSD_RESP_FATAL_INVALID_OP;
- }
- }
-
- switch(op)
- {
- case OCSD_OP_DATA:
- p_packet_in->toString(pktstr);
- if(!m_bRawPrint)
- printIdx_ID(index_sop);
- m_oss << ";\t" << pktstr << std::endl;
-
- // test the wait/flush response mechnism
- if(getTestWaits() && !m_bRawPrint)
- {
- decTestWaits();
- resp = OCSD_RESP_WAIT;
- }
- break;
-
- case OCSD_OP_EOT:
- m_oss <<"ID:"<< std::hex << (uint32_t)m_trcID << "\tEND OF TRACE DATA\n";
- break;
-
- case OCSD_OP_FLUSH:
- m_oss <<"ID:"<< std::hex << (uint32_t)m_trcID << "\tFLUSH operation on trace decode path\n";
- break;
-
- case OCSD_OP_RESET:
- m_oss <<"ID:"<< std::hex << (uint32_t)m_trcID << "\tRESET operation on trace decode path\n";
- break;
- }
-
- m_last_resp = resp;
- itemPrintLine(m_oss.str());
- m_oss.str("");
- return resp;
-}
-
-template<class P> void PacketPrinter<P>::RawPacketDataMon( const ocsd_datapath_op_t op,
- const ocsd_trc_index_t index_sop,
- const P *pkt,
- const uint32_t size,
- const uint8_t *p_data)
-{
- switch(op)
- {
- case OCSD_OP_DATA:
- printIdx_ID(index_sop);
- m_oss << "; [";
- if((size > 0) && (p_data != 0))
- {
- uint32_t data = 0;
- for(uint32_t i = 0; i < size; i++)
- {
- data = (uint32_t)(p_data[i] & 0xFF);
- m_oss << "0x" << std::hex << std::setw(2) << std::setfill('0') << data << " ";
- }
- }
- m_oss << "]";
- m_bRawPrint = true;
- PacketDataIn(op,index_sop,pkt);
- m_bRawPrint = false;
- break;
-
- default:
- PacketDataIn(op,index_sop,pkt);
- break;
- }
-
-}
-
-template<class P> void PacketPrinter<P>::printIdx_ID(const ocsd_trc_index_t index_sop)
-{
- m_oss << "Idx:" << std::dec << index_sop << "; ID:"<< std::hex << (uint32_t)m_trcID;
-}
-
-#endif // ARM_PKT_PRINTER_T_H_INCLUDED
-
-/* End of File pkt_printer_t.h */
diff --git a/contrib/opencsd/decoder/include/pkt_printers/raw_frame_printer.h b/contrib/opencsd/decoder/include/pkt_printers/raw_frame_printer.h
deleted file mode 100644
index 50caeb89ee00..000000000000
--- a/contrib/opencsd/decoder/include/pkt_printers/raw_frame_printer.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * \file raw_frame_printer.h
- * \brief OpenCSD :
- *
- * \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.
- */
-
-#ifndef ARM_RAW_FRAME_PRINTER_H_INCLUDED
-#define ARM_RAW_FRAME_PRINTER_H_INCLUDED
-
-#include "opencsd.h"
-
-#include <string>
-#include <sstream>
-
-class RawFramePrinter : public ITrcRawFrameIn, public ItemPrinter
-{
-public:
- RawFramePrinter() {};
- RawFramePrinter(ocsdMsgLogger *pMsgLogger);
- virtual ~RawFramePrinter() {};
-
- virtual ocsd_err_t TraceRawFrameIn( const ocsd_datapath_op_t op,
- const ocsd_trc_index_t index,
- const ocsd_rawframe_elem_t frame_element,
- const int dataBlockSize,
- const uint8_t *pDataBlock,
- const uint8_t traceID);
-
-private:
- void createDataString(const int dataSize, const uint8_t *pData, int bytesPerLine, std::string &dataStr);
-
-};
-
-inline RawFramePrinter::RawFramePrinter(ocsdMsgLogger *pMsgLogger)
-{
- setMessageLogger(pMsgLogger);
-}
-
-#endif // ARM_RAW_FRAME_PRINTER_H_INCLUDED
-
-/* End of File raw_frame_printer.h */
diff --git a/contrib/opencsd/decoder/include/pkt_printers/trc_pkt_printers.h b/contrib/opencsd/decoder/include/pkt_printers/trc_pkt_printers.h
deleted file mode 100644
index 439701aea59e..000000000000
--- a/contrib/opencsd/decoder/include/pkt_printers/trc_pkt_printers.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
-* \file trc_pkt_printers.h
-* \brief OpenCSD : Known protocol packet printers.
-*
-* \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.
-*/
-
-#ifndef ARM_TRC_PKT_PRINTERS_H_INCLUDED
-#define ARM_TRC_PKT_PRINTERS_H_INCLUDED
-
-#include "pkt_printers/item_printer.h"
-#include "pkt_printers/pkt_printer_t.h"
-#include "pkt_printers/gen_elem_printer.h"
-#include "pkt_printers/raw_frame_printer.h"
-
-#endif // ARM_TRC_PKT_PRINTERS_H_INCLUDED
diff --git a/contrib/opencsd/decoder/include/pkt_printers/trc_print_fact.h b/contrib/opencsd/decoder/include/pkt_printers/trc_print_fact.h
deleted file mode 100644
index 73dd9dc29118..000000000000
--- a/contrib/opencsd/decoder/include/pkt_printers/trc_print_fact.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
-* \file trc_print_fact.h
-* \brief OpenCSD : Factory for protocol packet printers.
-*
-* \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.
-*/
-
-#ifndef ARM_TRC_PRINT_FACT_H_INCLUDED
-#define ARM_TRC_PRINT_FACT_H_INCLUDED
-
-#include "opencsd.h"
-
-class PktPrinterFact
-{
-public:
- static ItemPrinter *createProtocolPrinter(std::vector<ItemPrinter *> &printer_list, ocsd_trace_protocol_t protocol, uint8_t elemID, ocsdMsgLogger *pMsgLogger = 0);
- static RawFramePrinter *createRawFramePrinter(std::vector<ItemPrinter *> &printer_list, ocsdMsgLogger *pMsgLogger = 0);
- static TrcGenericElementPrinter *createGenElemPrinter(std::vector<ItemPrinter *> &printer_list, ocsdMsgLogger *pMsgLogger = 0);
-
- static void destroyPrinter(std::vector<ItemPrinter *> &printer_list, ItemPrinter *pPrinter);
- static void destroyAllPrinters(std::vector<ItemPrinter *> &printer_list);
- static const int numPrinters(std::vector<ItemPrinter *> &printer_list);
-
-private:
- static void SavePrinter(std::vector<ItemPrinter *> &printer_list, ItemPrinter *pPrinter, ocsdMsgLogger *pMsgLogger);
-
- PktPrinterFact() {};
- ~PktPrinterFact() {};
-};
-
-#endif // ARM_TRC_PRINT_FACT_H_INCLUDED
-
-/* end of file trc_print_fact.h */
diff --git a/contrib/opencsd/decoder/source/c_api/ocsd_c_api.cpp b/contrib/opencsd/decoder/source/c_api/ocsd_c_api.cpp
deleted file mode 100644
index 4824c427e3d1..000000000000
--- a/contrib/opencsd/decoder/source/c_api/ocsd_c_api.cpp
+++ /dev/null
@@ -1,583 +0,0 @@
-/*
- * \file ocsd_c_api.cpp
- * \brief OpenCSD : "C" API libary implementation.
- *
- * \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 <cstring>
-
-/* pull in the C++ decode library */
-#include "opencsd.h"
-
-/* C-API and wrapper objects */
-#include "opencsd/c_api/opencsd_c_api.h"
-#include "ocsd_c_api_obj.h"
-
-/** MSVC2010 unwanted export workaround */
-#ifdef WIN32
-#if (_MSC_VER == 1600)
-#include <new>
-namespace std { const nothrow_t nothrow = nothrow_t(); }
-#endif
-#endif
-
-/*******************************************************************************/
-/* C API internal helper function declarations */
-/*******************************************************************************/
-
-static ocsd_err_t ocsd_create_pkt_sink_cb(ocsd_trace_protocol_t protocol, FnDefPktDataIn pPktInFn, const void *p_context, ITrcTypedBase **ppCBObj );
-static ocsd_err_t ocsd_create_pkt_mon_cb(ocsd_trace_protocol_t protocol, FnDefPktDataMon pPktInFn, const void *p_context, ITrcTypedBase **ppCBObj );
-static ocsd_err_t ocsd_check_and_add_mem_acc_mapper(const dcd_tree_handle_t handle, DecodeTree **ppDT);
-
-/*******************************************************************************/
-/* C library data - additional data on top of the C++ library objects */
-/*******************************************************************************/
-
-/* keep a list of interface objects for a decode tree for later disposal */
-typedef struct _lib_dt_data_list {
- std::vector<ITrcTypedBase *> cb_objs;
- DefLogStrCBObj s_def_log_str_cb;
-} lib_dt_data_list;
-
-/* map lists to handles */
-static std::map<dcd_tree_handle_t, lib_dt_data_list *> s_data_map;
-
-/*******************************************************************************/
-/* C API functions */
-/*******************************************************************************/
-
-/** Get Library version. Return a 32 bit version in form MMMMnnpp - MMMM = major version, nn = minor version, pp = patch version */
-OCSD_C_API uint32_t ocsd_get_version(void)
-{
- return ocsdVersion::vers_num();
-}
-
-/** Get library version string */
-OCSD_C_API const char * ocsd_get_version_str(void)
-{
- return ocsdVersion::vers_str();
-}
-
-
-/*** Decode tree creation etc. */
-
-OCSD_C_API dcd_tree_handle_t ocsd_create_dcd_tree(const ocsd_dcd_tree_src_t src_type, const uint32_t deformatterCfgFlags)
-{
- dcd_tree_handle_t handle = C_API_INVALID_TREE_HANDLE;
- handle = (dcd_tree_handle_t)DecodeTree::CreateDecodeTree(src_type,deformatterCfgFlags);
- if(handle != C_API_INVALID_TREE_HANDLE)
- {
- lib_dt_data_list *pList = new (std::nothrow) lib_dt_data_list;
- if(pList != 0)
- {
- s_data_map.insert(std::pair<dcd_tree_handle_t, lib_dt_data_list *>(handle,pList));
- }
- else
- {
- ocsd_destroy_dcd_tree(handle);
- handle = C_API_INVALID_TREE_HANDLE;
- }
- }
- return handle;
-}
-
-OCSD_C_API void ocsd_destroy_dcd_tree(const dcd_tree_handle_t handle)
-{
- if(handle != C_API_INVALID_TREE_HANDLE)
- {
- GenTraceElemCBObj * pIf = (GenTraceElemCBObj *)(((DecodeTree *)handle)->getGenTraceElemOutI());
- if(pIf != 0)
- delete pIf;
-
- /* need to clear any associated callback data. */
- std::map<dcd_tree_handle_t, lib_dt_data_list *>::iterator it;
- it = s_data_map.find(handle);
- if(it != s_data_map.end())
- {
- std::vector<ITrcTypedBase *>::iterator itcb;
- itcb = it->second->cb_objs.begin();
- while(itcb != it->second->cb_objs.end())
- {
- delete *itcb;
- itcb++;
- }
- it->second->cb_objs.clear();
- delete it->second;
- s_data_map.erase(it);
- }
- DecodeTree::DestroyDecodeTree((DecodeTree *)handle);
- }
-}
-
-/*** Decode tree process data */
-
-OCSD_C_API ocsd_datapath_resp_t ocsd_dt_process_data(const dcd_tree_handle_t handle,
- const ocsd_datapath_op_t op,
- const ocsd_trc_index_t index,
- const uint32_t dataBlockSize,
- const uint8_t *pDataBlock,
- uint32_t *numBytesProcessed)
-{
- ocsd_datapath_resp_t resp = OCSD_RESP_FATAL_NOT_INIT;
- if(handle != C_API_INVALID_TREE_HANDLE)
- resp = ((DecodeTree *)handle)->TraceDataIn(op,index,dataBlockSize,pDataBlock,numBytesProcessed);
- return resp;
-}
-
-/*** Decode tree - decoder management */
-
-OCSD_C_API ocsd_err_t ocsd_dt_create_decoder(const dcd_tree_handle_t handle,
- const char *decoder_name,
- const int create_flags,
- const void *decoder_cfg,
- unsigned char *pCSID
- )
-{
- ocsd_err_t err = OCSD_OK;
- DecodeTree *dt = (DecodeTree *)handle;
- std::string dName = decoder_name;
- IDecoderMngr *pDcdMngr;
- err = OcsdLibDcdRegister::getDecoderRegister()->getDecoderMngrByName(dName,&pDcdMngr);
- if(err != OCSD_OK)
- return err;
-
- CSConfig *pConfig = 0;
- err = pDcdMngr->createConfigFromDataStruct(&pConfig,decoder_cfg);
- if(err != OCSD_OK)
- return err;
-
- err = dt->createDecoder(dName,create_flags,pConfig);
- if(err == OCSD_OK)
- *pCSID = pConfig->getTraceID();
- delete pConfig;
- return err;
-}
-
-OCSD_C_API ocsd_err_t ocsd_dt_remove_decoder( const dcd_tree_handle_t handle,
- const unsigned char CSID)
-{
- return ((DecodeTree *)handle)->removeDecoder(CSID);
-}
-
-OCSD_C_API ocsd_err_t ocsd_dt_attach_packet_callback( const dcd_tree_handle_t handle,
- const unsigned char CSID,
- const ocsd_c_api_cb_types callback_type,
- void *p_fn_callback_data,
- const void *p_context)
-{
- ocsd_err_t err = OCSD_OK;
- DecodeTree *pDT = static_cast<DecodeTree *>(handle);
- DecodeTreeElement *pElem = pDT->getDecoderElement(CSID);
- if(pElem == 0)
- return OCSD_ERR_INVALID_ID; // cannot find entry for that CSID
-
- ITrcTypedBase *pDataInSink = 0; // pointer to a sink callback object
- switch(callback_type)
- {
- case OCSD_C_API_CB_PKT_SINK:
- err = ocsd_create_pkt_sink_cb(pElem->getProtocol(),(FnDefPktDataIn)p_fn_callback_data,p_context,&pDataInSink);
- if(err == OCSD_OK)
- err = pElem->getDecoderMngr()->attachPktSink(pElem->getDecoderHandle(), pDataInSink);
- break;
-
- case OCSD_C_API_CB_PKT_MON:
- err = ocsd_create_pkt_mon_cb(pElem->getProtocol(),(FnDefPktDataMon)p_fn_callback_data,p_context,&pDataInSink);
- if (err == OCSD_OK)
- err = pElem->getDecoderMngr()->attachPktMonitor(pElem->getDecoderHandle(), pDataInSink);
- break;
-
- default:
- err = OCSD_ERR_INVALID_PARAM_VAL;
- }
-
- if(err == OCSD_OK)
- {
- if (err == OCSD_OK)
- {
- // save object pointer for destruction later.
- std::map<dcd_tree_handle_t, lib_dt_data_list *>::iterator it;
- it = s_data_map.find(handle);
- if (it != s_data_map.end())
- it->second->cb_objs.push_back(pDataInSink);
- }
- else
- delete pDataInSink;
- }
- return err;
-}
-
-/*** Decode tree set element output */
-
-OCSD_C_API ocsd_err_t ocsd_dt_set_gen_elem_outfn(const dcd_tree_handle_t handle, FnTraceElemIn pFn, const void *p_context)
-{
-
- GenTraceElemCBObj * pCBObj = new (std::nothrow)GenTraceElemCBObj(pFn, p_context);
- if(pCBObj)
- {
- ((DecodeTree *)handle)->setGenTraceElemOutI(pCBObj);
- return OCSD_OK;
- }
- return OCSD_ERR_MEM;
-}
-
-
-/*** Default error logging */
-
-OCSD_C_API ocsd_err_t ocsd_def_errlog_init(const ocsd_err_severity_t verbosity, const int create_output_logger)
-{
- if(DecodeTree::getDefaultErrorLogger()->initErrorLogger(verbosity,(bool)(create_output_logger != 0)))
- return OCSD_OK;
- return OCSD_ERR_NOT_INIT;
-}
-
-OCSD_C_API ocsd_err_t ocsd_def_errlog_config_output(const int output_flags, const char *log_file_name)
-{
- ocsdMsgLogger *pLogger = DecodeTree::getDefaultErrorLogger()->getOutputLogger();
- if(pLogger)
- {
- pLogger->setLogOpts(output_flags & C_API_MSGLOGOUT_MASK);
- if(log_file_name != NULL)
- {
- pLogger->setLogFileName(log_file_name);
- }
- return OCSD_OK;
- }
- return OCSD_ERR_NOT_INIT;
-}
-
-
-OCSD_C_API ocsd_err_t ocsd_def_errlog_set_strprint_cb(const dcd_tree_handle_t handle, void *p_context, FnDefLoggerPrintStrCB p_str_print_cb)
-{
- ocsdMsgLogger *pLogger = DecodeTree::getDefaultErrorLogger()->getOutputLogger();
- if (pLogger)
- {
- std::map<dcd_tree_handle_t, lib_dt_data_list *>::iterator it;
- it = s_data_map.find(handle);
- if (it != s_data_map.end())
- {
- DefLogStrCBObj *pCBObj = &(it->second->s_def_log_str_cb);
- pCBObj->setCBFn(p_context, p_str_print_cb);
- pLogger->setStrOutFn(pCBObj);
- int logOpts = pLogger->getLogOpts();
- logOpts |= (int)(ocsdMsgLogger::OUT_STR_CB);
- pLogger->setLogOpts(logOpts);
- return OCSD_OK;
- }
- }
- return OCSD_ERR_NOT_INIT;
-}
-
-OCSD_C_API void ocsd_def_errlog_msgout(const char *msg)
-{
- ocsdMsgLogger *pLogger = DecodeTree::getDefaultErrorLogger()->getOutputLogger();
- if(pLogger)
- pLogger->LogMsg(msg);
-}
-
-/*** Convert packet to string */
-
-OCSD_C_API ocsd_err_t ocsd_pkt_str(const ocsd_trace_protocol_t pkt_protocol, const void *p_pkt, char *buffer, const int buffer_size)
-{
- ocsd_err_t err = OCSD_OK;
- if((buffer == NULL) || (buffer_size < 2))
- return OCSD_ERR_INVALID_PARAM_VAL;
-
- std::string pktStr = "";
- buffer[0] = 0;
-
- switch(pkt_protocol)
- {
- case OCSD_PROTOCOL_ETMV4I:
- trcPrintElemToString<EtmV4ITrcPacket,ocsd_etmv4_i_pkt>(p_pkt, pktStr);
- break;
-
- case OCSD_PROTOCOL_ETMV3:
- trcPrintElemToString<EtmV3TrcPacket,ocsd_etmv3_pkt>(p_pkt, pktStr);
- break;
-
- case OCSD_PROTOCOL_STM:
- trcPrintElemToString<StmTrcPacket,ocsd_stm_pkt>(p_pkt, pktStr);
- break;
-
- case OCSD_PROTOCOL_PTM:
- trcPrintElemToString<PtmTrcPacket,ocsd_ptm_pkt>(p_pkt, pktStr);
- break;
-
- default:
- if (OCSD_PROTOCOL_IS_CUSTOM(pkt_protocol))
- err = ocsd_cust_protocol_to_str(pkt_protocol, p_pkt, buffer, buffer_size);
- else
- err = OCSD_ERR_NO_PROTOCOL;
- break;
- }
-
- if(pktStr.size() > 0)
- {
- strncpy(buffer,pktStr.c_str(),buffer_size-1);
- buffer[buffer_size-1] = 0;
- }
- return err;
-}
-
-OCSD_C_API ocsd_err_t ocsd_gen_elem_str(const ocsd_generic_trace_elem *p_pkt, char *buffer, const int buffer_size)
-{
- ocsd_err_t err = OCSD_OK;
- if((buffer == NULL) || (buffer_size < 2))
- return OCSD_ERR_INVALID_PARAM_VAL;
- std::string str;
- trcPrintElemToString<OcsdTraceElement,ocsd_generic_trace_elem>(p_pkt,str);
- if(str.size() > 0)
- {
- strncpy(buffer,str.c_str(),buffer_size -1);
- buffer[buffer_size-1] = 0;
- }
- return err;
-}
-
-/*** Decode tree -- memory accessor control */
-
-OCSD_C_API ocsd_err_t ocsd_dt_add_binfile_mem_acc(const dcd_tree_handle_t handle, const ocsd_vaddr_t address, const ocsd_mem_space_acc_t mem_space, const char *filepath)
-{
- ocsd_err_t err = OCSD_OK;
- DecodeTree *pDT;
- err = ocsd_check_and_add_mem_acc_mapper(handle,&pDT);
- if(err == OCSD_OK)
- err = pDT->addBinFileMemAcc(address,mem_space,filepath);
- return err;
-}
-
-OCSD_C_API ocsd_err_t ocsd_dt_add_binfile_region_mem_acc(const dcd_tree_handle_t handle, const ocsd_file_mem_region_t *region_array, const int num_regions, const ocsd_mem_space_acc_t mem_space, const char *filepath)
-{
- ocsd_err_t err = OCSD_OK;
- DecodeTree *pDT;
- err = ocsd_check_and_add_mem_acc_mapper(handle,&pDT);
- if(err == OCSD_OK)
- err = pDT->addBinFileRegionMemAcc(region_array,num_regions,mem_space,filepath);
- return err;
-}
-
-OCSD_C_API ocsd_err_t ocsd_dt_add_buffer_mem_acc(const dcd_tree_handle_t handle, const ocsd_vaddr_t address, const ocsd_mem_space_acc_t mem_space, const uint8_t *p_mem_buffer, const uint32_t mem_length)
-{
- ocsd_err_t err = OCSD_OK;
- DecodeTree *pDT;
- err = ocsd_check_and_add_mem_acc_mapper(handle,&pDT);
- if(err == OCSD_OK)
- err = pDT->addBufferMemAcc(address,mem_space,p_mem_buffer,mem_length);
- return err;
-}
-
-OCSD_C_API ocsd_err_t ocsd_dt_add_callback_mem_acc(const dcd_tree_handle_t handle, const ocsd_vaddr_t st_address, const ocsd_vaddr_t en_address, const ocsd_mem_space_acc_t mem_space, Fn_MemAcc_CB p_cb_func, const void *p_context)
-{
- ocsd_err_t err = OCSD_OK;
- DecodeTree *pDT;
- err = ocsd_check_and_add_mem_acc_mapper(handle,&pDT);
- if(err == OCSD_OK)
- err = pDT->addCallbackMemAcc(st_address,en_address,mem_space,p_cb_func,p_context);
- return err;
-}
-
-OCSD_C_API ocsd_err_t ocsd_dt_add_callback_trcid_mem_acc(const dcd_tree_handle_t handle, const ocsd_vaddr_t st_address, const ocsd_vaddr_t en_address, const ocsd_mem_space_acc_t mem_space, Fn_MemAccID_CB p_cb_func, const void *p_context)
-{
- ocsd_err_t err = OCSD_OK;
- DecodeTree *pDT;
- err = ocsd_check_and_add_mem_acc_mapper(handle, &pDT);
- if (err == OCSD_OK)
- err = pDT->addCallbackIDMemAcc(st_address, en_address, mem_space, p_cb_func, p_context);
- return err;
-}
-
-
-OCSD_C_API ocsd_err_t ocsd_dt_remove_mem_acc(const dcd_tree_handle_t handle, const ocsd_vaddr_t st_address, const ocsd_mem_space_acc_t mem_space)
-{
- ocsd_err_t err = OCSD_OK;
-
- if(handle != C_API_INVALID_TREE_HANDLE)
- {
- DecodeTree *pDT = static_cast<DecodeTree *>(handle);
- err = pDT->removeMemAccByAddress(st_address,mem_space);
- }
- else
- err = OCSD_ERR_INVALID_PARAM_VAL;
- return err;
-}
-
-OCSD_C_API void ocsd_tl_log_mapped_mem_ranges(const dcd_tree_handle_t handle)
-{
- if(handle != C_API_INVALID_TREE_HANDLE)
- {
- DecodeTree *pDT = static_cast<DecodeTree *>(handle);
- pDT->logMappedRanges();
- }
-}
-
-OCSD_C_API void ocsd_gen_elem_init(ocsd_generic_trace_elem *p_pkt, const ocsd_gen_trc_elem_t elem_type)
-{
- p_pkt->elem_type = elem_type;
- p_pkt->flag_bits = 0;
- p_pkt->ptr_extended_data = 0;
-}
-
-OCSD_C_API ocsd_err_t ocsd_dt_set_raw_frame_printer(const dcd_tree_handle_t handle, int flags)
-{
- if (handle != C_API_INVALID_TREE_HANDLE)
- return ((DecodeTree *)handle)->addRawFramePrinter(0, (uint32_t)flags);
- return OCSD_ERR_NOT_INIT;
-}
-
-OCSD_C_API ocsd_err_t ocsd_dt_set_gen_elem_printer(const dcd_tree_handle_t handle)
-{
- if (handle != C_API_INVALID_TREE_HANDLE)
- return ((DecodeTree *)handle)->addGenElemPrinter(0);
- return OCSD_ERR_NOT_INIT;
-}
-
-OCSD_C_API ocsd_err_t ocsd_dt_set_pkt_protocol_printer(const dcd_tree_handle_t handle, uint8_t cs_id, int monitor)
-{
- ocsd_err_t err = OCSD_ERR_NOT_INIT;
- if (handle != C_API_INVALID_TREE_HANDLE)
- {
- DecodeTree *p_tree = (DecodeTree *)handle;
- err = p_tree->addPacketPrinter(cs_id, (bool)(monitor != 0), 0);
- }
- return err;
-}
-
-/*******************************************************************************/
-/* C API local fns */
-/*******************************************************************************/
-static ocsd_err_t ocsd_create_pkt_sink_cb(ocsd_trace_protocol_t protocol, FnDefPktDataIn pPktInFn, const void *p_context, ITrcTypedBase **ppCBObj )
-{
- ocsd_err_t err = OCSD_OK;
- *ppCBObj = 0;
-
- switch(protocol)
- {
- case OCSD_PROTOCOL_ETMV4I:
- *ppCBObj = new (std::nothrow) PktCBObj<EtmV4ITrcPacket>(pPktInFn,p_context);
- break;
-
- case OCSD_PROTOCOL_ETMV3:
- *ppCBObj = new (std::nothrow) PktCBObj<EtmV3TrcPacket>(pPktInFn,p_context);
- break;
-
- case OCSD_PROTOCOL_PTM:
- *ppCBObj = new (std::nothrow) PktCBObj<PtmTrcPacket>(pPktInFn,p_context);
- break;
-
- case OCSD_PROTOCOL_STM:
- *ppCBObj = new (std::nothrow) PktCBObj<StmTrcPacket>(pPktInFn,p_context);
- break;
-
- default:
- if ((protocol >= OCSD_PROTOCOL_CUSTOM_0) && (protocol < OCSD_PROTOCOL_END))
- {
- *ppCBObj = new (std::nothrow) PktCBObj<void>(pPktInFn, p_context);
- }
- else
- err = OCSD_ERR_NO_PROTOCOL;
- break;
- }
-
- if((*ppCBObj == 0) && (err == OCSD_OK))
- err = OCSD_ERR_MEM;
-
- return err;
-}
-
-static ocsd_err_t ocsd_create_pkt_mon_cb(ocsd_trace_protocol_t protocol, FnDefPktDataMon pPktInFn, const void *p_context, ITrcTypedBase **ppCBObj )
-{
- ocsd_err_t err = OCSD_OK;
- *ppCBObj = 0;
-
- switch(protocol)
- {
- case OCSD_PROTOCOL_ETMV4I:
- *ppCBObj = new (std::nothrow) PktMonCBObj<EtmV4ITrcPacket>(pPktInFn,p_context);
- break;
-
- case OCSD_PROTOCOL_ETMV3:
- *ppCBObj = new (std::nothrow) PktMonCBObj<EtmV3TrcPacket>(pPktInFn,p_context);
- break;
-
- case OCSD_PROTOCOL_PTM:
- *ppCBObj = new (std::nothrow) PktMonCBObj<PtmTrcPacket>(pPktInFn,p_context);
- break;
-
- case OCSD_PROTOCOL_STM:
- *ppCBObj = new (std::nothrow) PktMonCBObj<StmTrcPacket>(pPktInFn,p_context);
- break;
-
- default:
- if ((protocol >= OCSD_PROTOCOL_CUSTOM_0) && (protocol < OCSD_PROTOCOL_END))
- {
- *ppCBObj = new (std::nothrow) PktMonCBObj<void>(pPktInFn, p_context);
- }
- else
- err = OCSD_ERR_NO_PROTOCOL;
- break;
- }
-
- if((*ppCBObj == 0) && (err == OCSD_OK))
- err = OCSD_ERR_MEM;
-
- return err;
-}
-
-static ocsd_err_t ocsd_check_and_add_mem_acc_mapper(const dcd_tree_handle_t handle, DecodeTree **ppDT)
-{
- *ppDT = 0;
- if(handle == C_API_INVALID_TREE_HANDLE)
- return OCSD_ERR_INVALID_PARAM_VAL;
- *ppDT = static_cast<DecodeTree *>(handle);
- if(!(*ppDT)->hasMemAccMapper())
- return (*ppDT)->createMemAccMapper();
- return OCSD_OK;
-}
-
-/*******************************************************************************/
-/* C API Helper objects */
-/*******************************************************************************/
-
-/****************** Generic trace element output callback function ************/
-GenTraceElemCBObj::GenTraceElemCBObj(FnTraceElemIn pCBFn, const void *p_context) :
- m_c_api_cb_fn(pCBFn),
- m_p_cb_context(p_context)
-{
-}
-
-ocsd_datapath_resp_t GenTraceElemCBObj::TraceElemIn(const ocsd_trc_index_t index_sop,
- const uint8_t trc_chan_id,
- const OcsdTraceElement &elem)
-{
- return m_c_api_cb_fn(m_p_cb_context, index_sop, trc_chan_id, &elem);
-}
-
-/* End of File ocsd_c_api.cpp */
diff --git a/contrib/opencsd/decoder/source/c_api/ocsd_c_api_custom_obj.cpp b/contrib/opencsd/decoder/source/c_api/ocsd_c_api_custom_obj.cpp
deleted file mode 100644
index dbd0bd107698..000000000000
--- a/contrib/opencsd/decoder/source/c_api/ocsd_c_api_custom_obj.cpp
+++ /dev/null
@@ -1,431 +0,0 @@
-/*
- * \file ocsd_c_api_custom_obj.cpp
- * \brief OpenCSD :
- *
- * \copyright Copyright (c) 2016, 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.
- */
-
-/* pull in the C++ decode library */
-#include "opencsd.h"
-
-#include "opencsd/c_api/opencsd_c_api.h"
-#include "ocsd_c_api_custom_obj.h"
-#include "common/ocsd_lib_dcd_register.h"
-
-/***************** C-API functions ********************************/
-
-/** register a custom decoder with the library */
-OCSD_C_API ocsd_err_t ocsd_register_custom_decoder(const char *name, ocsd_extern_dcd_fact_t *p_dcd_fact)
-{
- ocsd_err_t err = OCSD_OK;
- OcsdLibDcdRegister *pRegister = OcsdLibDcdRegister::getDecoderRegister();
-
- // check not already registered
- if(pRegister->isRegisteredDecoder(name))
- return OCSD_ERR_DCDREG_NAME_REPEAT;
-
- // validate the factory interface structure
- if((p_dcd_fact->createDecoder == 0) ||
- (p_dcd_fact->destroyDecoder == 0) ||
- (p_dcd_fact->csidFromConfig == 0)
- )
- return OCSD_ERR_INVALID_PARAM_VAL;
-
- // create a wrapper.
- CustomDcdMngrWrapper *pWrapper = new (std::nothrow) CustomDcdMngrWrapper();
- if(pRegister == 0)
- return OCSD_ERR_MEM;
-
- p_dcd_fact->protocol_id = OcsdLibDcdRegister::getNextCustomProtocolID();
- if(p_dcd_fact->protocol_id < OCSD_PROTOCOL_END)
- {
- // fill out the wrapper and register it
- pWrapper->setAPIDcdFact(p_dcd_fact);
- err = pRegister->registerDecoderTypeByName(name,pWrapper);
- if(err != OCSD_OK)
- OcsdLibDcdRegister::releaseLastCustomProtocolID();
- }
- else
- err = OCSD_ERR_DCDREG_TOOMANY; // too many decoders
-
- if(err != OCSD_OK)
- delete pWrapper;
-
- return err;
-}
-
-OCSD_C_API ocsd_err_t ocsd_deregister_decoders()
-{
- // destroys all builtin and custom decoders & library registration object.
- OcsdLibDcdRegister::deregisterAllDecoders();
- return OCSD_OK;
-}
-
-OCSD_C_API ocsd_err_t ocsd_cust_protocol_to_str(const ocsd_trace_protocol_t pkt_protocol, const void *trc_pkt, char *buffer, const int buflen)
-{
- OcsdLibDcdRegister *pRegister = OcsdLibDcdRegister::getDecoderRegister();
- IDecoderMngr *p_mngr = 0;
- if (OCSD_PROTOCOL_IS_CUSTOM(pkt_protocol) && (pRegister->getDecoderMngrByType(pkt_protocol, &p_mngr) == OCSD_OK))
- {
- CustomDcdMngrWrapper *pWrapper = static_cast<CustomDcdMngrWrapper *>(p_mngr);
- pWrapper->pktToString(trc_pkt, buffer, buflen);
- return OCSD_OK;
- }
- return OCSD_ERR_NO_PROTOCOL;
-}
-
-/***************** Decode Manager Wrapper *****************************/
-
-CustomDcdMngrWrapper::CustomDcdMngrWrapper()
-{
- m_dcd_fact.protocol_id = OCSD_PROTOCOL_END;
-}
-
-
- // set the C-API decoder factory interface
-void CustomDcdMngrWrapper::setAPIDcdFact(ocsd_extern_dcd_fact_t *p_dcd_fact)
-{
- m_dcd_fact = *p_dcd_fact;
-}
-
-// create and destroy decoders
-ocsd_err_t CustomDcdMngrWrapper::createDecoder(const int create_flags, const int instID, const CSConfig *p_config, TraceComponent **ppComponent)
-{
- ocsd_err_t err = OCSD_OK;
- if(m_dcd_fact.protocol_id == OCSD_PROTOCOL_END)
- return OCSD_ERR_NOT_INIT;
-
- CustomDecoderWrapper *pComp = new (std::nothrow) CustomDecoderWrapper();
- *ppComponent = pComp;
- if (pComp == 0)
- return OCSD_ERR_MEM;
-
- ocsd_extern_dcd_cb_fns lib_callbacks;
- CustomDecoderWrapper::SetCallbacks(lib_callbacks);
- lib_callbacks.lib_context = pComp;
- lib_callbacks.packetCBFlags = 0;
-
- ocsd_extern_dcd_inst_t *pDecodeInst = pComp->getDecoderInstInfo();
-
- err = m_dcd_fact.createDecoder( create_flags,
- ((CustomConfigWrapper *)p_config)->getConfig(),
- &lib_callbacks,
- pDecodeInst);
-
- if (err == OCSD_OK)
- {
- // validate the decoder
- if ((pDecodeInst->fn_data_in == 0) ||
- (pDecodeInst->fn_update_pkt_mon == 0) ||
- (pDecodeInst->cs_id == 0) ||
- (pDecodeInst->decoder_handle == 0) ||
- (pDecodeInst->p_decoder_name == 0)
- )
- {
- err = OCSD_ERR_INVALID_PARAM_VAL;
- }
- }
-
- if (err != OCSD_OK)
- delete pComp;
- else
- pComp->updateNameFromDcdInst();
- return err;
-}
-
-ocsd_err_t CustomDcdMngrWrapper::destroyDecoder(TraceComponent *pComponent)
-{
- CustomDecoderWrapper *pCustWrap = dynamic_cast<CustomDecoderWrapper *>(pComponent);
- if(m_dcd_fact.protocol_id != OCSD_PROTOCOL_END)
- m_dcd_fact.destroyDecoder(pCustWrap->getDecoderInstInfo()->decoder_handle);
- delete pCustWrap;
- return OCSD_OK;
-}
-
-const ocsd_trace_protocol_t CustomDcdMngrWrapper::getProtocolType() const
-{
- return m_dcd_fact.protocol_id;
-}
-
-ocsd_err_t CustomDcdMngrWrapper::createConfigFromDataStruct(CSConfig **pConfigBase, const void *pDataStruct)
-{
- ocsd_err_t err = OCSD_OK;
- CustomConfigWrapper *pConfig = new (std::nothrow) CustomConfigWrapper(pDataStruct);
- if(!pConfig)
- return OCSD_ERR_MEM;
-
- if(m_dcd_fact.csidFromConfig == 0)
- return OCSD_ERR_NOT_INIT;
-
- unsigned char csid;
- err = m_dcd_fact.csidFromConfig(pDataStruct,&csid);
- if(err == OCSD_OK)
- {
- pConfig->setCSID(csid);
- *pConfigBase = pConfig;
- }
- return err;
-}
-
-ocsd_err_t CustomDcdMngrWrapper::getDataInputI(TraceComponent *pComponent, ITrcDataIn **ppDataIn)
-{
- CustomDecoderWrapper *pDecoder = dynamic_cast<CustomDecoderWrapper *>(pComponent);
- if(pDecoder == 0)
- return OCSD_ERR_INVALID_PARAM_TYPE;
-
- *ppDataIn = pDecoder;
- return OCSD_OK;
-}
-
-// component connections
-// all
-ocsd_err_t CustomDcdMngrWrapper::attachErrorLogger(TraceComponent *pComponent, ITraceErrorLog *pIErrorLog)
-{
- CustomDecoderWrapper *pDecoder = dynamic_cast<CustomDecoderWrapper *>(pComponent);
- if (pDecoder == 0)
- return OCSD_ERR_INVALID_PARAM_TYPE;
- pDecoder->getErrorLogAttachPt()->replace_first(pIErrorLog);
- return OCSD_OK;
-}
-
-// full decoder
-ocsd_err_t CustomDcdMngrWrapper::attachInstrDecoder(TraceComponent *pComponent, IInstrDecode *pIInstrDec)
-{
- CustomDecoderWrapper *pDecoder = dynamic_cast<CustomDecoderWrapper *>(pComponent);
- if(pDecoder == 0)
- return OCSD_ERR_INVALID_PARAM_TYPE;
- pDecoder->attachInstrDecI(pIInstrDec);
- return OCSD_OK;
-}
-
-ocsd_err_t CustomDcdMngrWrapper::attachMemAccessor(TraceComponent *pComponent, ITargetMemAccess *pMemAccessor)
-{
- CustomDecoderWrapper *pDecoder = dynamic_cast<CustomDecoderWrapper *>(pComponent);
- if(pDecoder == 0)
- return OCSD_ERR_INVALID_PARAM_TYPE;
- pDecoder->attachMemAccI(pMemAccessor);
- return OCSD_OK;
-}
-
-ocsd_err_t CustomDcdMngrWrapper::attachOutputSink(TraceComponent *pComponent, ITrcGenElemIn *pOutSink)
-{
- CustomDecoderWrapper *pDecoder = dynamic_cast<CustomDecoderWrapper *>(pComponent);
- if(pDecoder == 0)
- return OCSD_ERR_INVALID_PARAM_TYPE;
- pDecoder->attachGenElemI(pOutSink);
- return OCSD_OK;
-}
-
-// pkt processor only
-ocsd_err_t CustomDcdMngrWrapper::attachPktMonitor(TraceComponent *pComponent, ITrcTypedBase *pPktRawDataMon)
-{
- CustomDecoderWrapper *pDecoder = dynamic_cast<CustomDecoderWrapper *>(pComponent);
- if(pDecoder == 0)
- return OCSD_ERR_INVALID_PARAM_TYPE;
- IPktRawDataMon<void> *pIF = 0;
- if (pPktRawDataMon)
- {
- pIF = dynamic_cast<IPktRawDataMon<void> *>(pPktRawDataMon);
- if (!pIF)
- return OCSD_ERR_INVALID_PARAM_TYPE;
- }
- pDecoder->attachPtkMonI(pIF);
- return OCSD_OK;
-}
-
-ocsd_err_t CustomDcdMngrWrapper::attachPktIndexer(TraceComponent *pComponent, ITrcTypedBase *pPktIndexer)
-{
- // indexers for external custom will also be external and custom.
- return OCSD_ERR_DCD_INTERFACE_UNUSED;
-}
-
-ocsd_err_t CustomDcdMngrWrapper::attachPktSink(TraceComponent *pComponent, ITrcTypedBase *pPktDataInSink)
-{
- CustomDecoderWrapper *pDecoder = dynamic_cast<CustomDecoderWrapper *>(pComponent);
- if(pDecoder == 0)
- return OCSD_ERR_INVALID_PARAM_TYPE;
- IPktDataIn<void> *pIF = 0;
- if (pPktDataInSink)
- {
- pIF = dynamic_cast<IPktDataIn<void> *>(pPktDataInSink);
- if(!pIF)
- return OCSD_ERR_INVALID_PARAM_TYPE;
- }
- pDecoder->attachPtkSinkI(pIF);
- return OCSD_OK;
-}
-
-void CustomDcdMngrWrapper::pktToString(const void *pkt, char *pStrBuffer, int bufSize)
-{
- if (m_dcd_fact.pktToString)
- m_dcd_fact.pktToString(pkt, pStrBuffer, bufSize);
- else
- snprintf(pStrBuffer, bufSize, "CUSTOM_PKT[]: print unsupported; protocol(%d).",m_dcd_fact.protocol_id);
-}
-
-/************************** Decoder instance wrapper **************************************/
-
-/* callback functions */
-ocsd_datapath_resp_t GenElemOpCB( const void *lib_context,
- const ocsd_trc_index_t index_sop,
- const uint8_t trc_chan_id,
- const ocsd_generic_trace_elem *elem)
-{
- if (lib_context && ((CustomDecoderWrapper *)lib_context)->m_pGenElemIn)
- return ((CustomDecoderWrapper *)lib_context)->m_pGenElemIn->TraceElemIn(index_sop,trc_chan_id,*(OcsdTraceElement *)elem);
- return OCSD_RESP_FATAL_NOT_INIT;
-}
-
-void LogErrorCB(const void *lib_context, const ocsd_err_severity_t filter_level, const ocsd_err_t code, const ocsd_trc_index_t idx, const uint8_t chan_id, const char *pMsg)
-{
- if (lib_context)
- {
- if(pMsg)
- ((CustomDecoderWrapper *)lib_context)->LogError(ocsdError(filter_level, code, idx, chan_id, std::string(pMsg)));
- else
- ((CustomDecoderWrapper *)lib_context)->LogError(ocsdError(filter_level, code, idx, chan_id));
- }
-}
-
-void LogMsgCB(const void *lib_context, const ocsd_err_severity_t filter_level, const char *msg)
-{
- if (lib_context && msg)
- ((CustomDecoderWrapper *)lib_context)->LogMessage(filter_level, std::string(msg));
-}
-
-ocsd_err_t DecodeArmInstCB(const void *lib_context, ocsd_instr_info *instr_info)
-{
- if (lib_context && ((CustomDecoderWrapper *)lib_context)->m_pIInstrDec)
- return ((CustomDecoderWrapper *)lib_context)->m_pIInstrDec->DecodeInstruction(instr_info);
- return OCSD_ERR_ATTACH_INVALID_PARAM;
-}
-
-ocsd_err_t MemAccessCB(const void *lib_context,
- const ocsd_vaddr_t address,
- const uint8_t cs_trace_id,
- const ocsd_mem_space_acc_t mem_space,
- uint32_t *num_bytes,
- uint8_t *p_buffer)
-{
- if (lib_context && ((CustomDecoderWrapper *)lib_context)->m_pMemAccessor)
- return ((CustomDecoderWrapper *)lib_context)->m_pMemAccessor->ReadTargetMemory(address, cs_trace_id, mem_space, num_bytes, p_buffer);
- return OCSD_ERR_INVALID_PARAM_VAL;
-}
-
-void PktMonCB(const void *lib_context,
- const ocsd_datapath_op_t op,
- const ocsd_trc_index_t index_sop,
- const void *pkt,
- const uint32_t size,
- const uint8_t *p_data)
-{
- if (lib_context && ((CustomDecoderWrapper *)lib_context)->m_pPktMon)
- ((CustomDecoderWrapper *)lib_context)->m_pPktMon->RawPacketDataMon(op, index_sop, pkt, size, p_data);
-}
-
-ocsd_datapath_resp_t PktDataSinkCB(const void *lib_context,
- const ocsd_datapath_op_t op,
- const ocsd_trc_index_t index_sop,
- const void *pkt)
-{
- ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
- if (lib_context && ((CustomDecoderWrapper *)lib_context)->m_pPktIn)
- resp = ((CustomDecoderWrapper *)lib_context)->m_pPktIn->PacketDataIn(op, index_sop, pkt);
- return resp;
-}
-
-
-
-/** decoder instance object */
-CustomDecoderWrapper::CustomDecoderWrapper() : TraceComponent("extern_wrapper"),
- m_pGenElemIn(0),
- m_pIInstrDec(0),
- m_pMemAccessor(0),
- m_pPktMon(0),
- m_pPktIn(0)
-{
-}
-
-CustomDecoderWrapper::~CustomDecoderWrapper()
-{
-}
-
-ocsd_datapath_resp_t CustomDecoderWrapper::TraceDataIn( const ocsd_datapath_op_t op,
- const ocsd_trc_index_t index,
- const uint32_t dataBlockSize,
- const uint8_t *pDataBlock,
- uint32_t *numBytesProcessed)
-{
- if(m_decoder_inst.fn_data_in)
- return m_decoder_inst.fn_data_in( m_decoder_inst.decoder_handle,
- op,
- index,
- dataBlockSize,
- pDataBlock,
- numBytesProcessed);
- return OCSD_RESP_FATAL_NOT_INIT;
-}
-
-void CustomDecoderWrapper::attachPtkMonI(IPktRawDataMon<void>* pIF)
-{
- m_pPktMon = pIF;
- int flags = (m_pPktMon ? OCSD_CUST_DCD_PKT_CB_USE_MON : 0) | (m_pPktIn ? OCSD_CUST_DCD_PKT_CB_USE_SINK : 0);
- m_decoder_inst.fn_update_pkt_mon(m_decoder_inst.decoder_handle, flags);
-}
-
-void CustomDecoderWrapper::attachPtkSinkI(IPktDataIn<void>* pIF)
-{
- m_pPktIn = pIF;
- int flags = (m_pPktMon ? OCSD_CUST_DCD_PKT_CB_USE_MON : 0) | (m_pPktIn ? OCSD_CUST_DCD_PKT_CB_USE_SINK : 0);
- m_decoder_inst.fn_update_pkt_mon(m_decoder_inst.decoder_handle, flags);
-}
-
-void CustomDecoderWrapper::updateNameFromDcdInst()
-{
- // create a unique component name from the decoder name + cs-id.
- std::string name_combined = m_decoder_inst.p_decoder_name;
- char num_buffer[32];
- sprintf(num_buffer, "_%04d", m_decoder_inst.cs_id);
- name_combined += (std::string)num_buffer;
- setComponentName(name_combined);
-}
-
-void CustomDecoderWrapper::SetCallbacks(ocsd_extern_dcd_cb_fns & callbacks)
-{
- callbacks.fn_arm_instruction_decode = DecodeArmInstCB;
- callbacks.fn_gen_elem_out = GenElemOpCB;
- callbacks.fn_log_error = LogErrorCB;
- callbacks.fn_log_msg = LogMsgCB;
- callbacks.fn_memory_access = MemAccessCB;
- callbacks.fn_packet_data_sink = PktDataSinkCB;
- callbacks.fn_packet_mon = PktMonCB;
-}
-
-/* End of File ocsd_c_api_custom_obj.cpp */
diff --git a/contrib/opencsd/decoder/source/c_api/ocsd_c_api_custom_obj.h b/contrib/opencsd/decoder/source/c_api/ocsd_c_api_custom_obj.h
deleted file mode 100644
index d4845bdf709d..000000000000
--- a/contrib/opencsd/decoder/source/c_api/ocsd_c_api_custom_obj.h
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- * \file ocsd_c_api_custom_obj.h
- * \brief OpenCSD :
- *
- * \copyright Copyright (c) 2016, 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.
- */
-
-
-#ifndef ARM_OCSD_C_API_CUSTOM_OBJ_H_INCLUDED
-#define ARM_OCSD_C_API_CUSTOM_OBJ_H_INCLUDED
-
-#include "opencsd/c_api/ocsd_c_api_custom.h"
-#include "common/ocsd_dcd_mngr_i.h"
-
-/***** Decoder manager interface ******************************/
-class CustomDcdMngrWrapper : public IDecoderMngr
-{
-public:
- CustomDcdMngrWrapper();
- virtual ~CustomDcdMngrWrapper() {};
-
- // set the C-API decoder factory interface.
- void setAPIDcdFact(ocsd_extern_dcd_fact_t *p_dcd_fact);
-
-// create and destroy decoders
- virtual ocsd_err_t createDecoder(const int create_flags, const int instID, const CSConfig *p_config, TraceComponent **ppComponent);
- virtual ocsd_err_t destroyDecoder(TraceComponent *pComponent);
-
- //! Get the built in protocol type ID managed by this instance - extern for custom decoders
- virtual const ocsd_trace_protocol_t getProtocolType() const;
-
-// connect decoders to other components - (replace current / 0 pointer value to detach );
-// compatible with all decoders
- //!attach error logger to ptk-processor, or both of pkt processor and pkt decoder pair
- virtual ocsd_err_t attachErrorLogger(TraceComponent *pComponent, ITraceErrorLog *pIErrorLog);
-
-// pkt decoder only
- //! attach instruction decoder to pkt decoder
- virtual ocsd_err_t attachInstrDecoder(TraceComponent *pComponent, IInstrDecode *pIInstrDec);
-
- //! attach memory accessor to pkt decoder
- virtual ocsd_err_t attachMemAccessor(TraceComponent *pComponent, ITargetMemAccess *pMemAccessor);
-
- //! attach generic output interface to pkt decoder
- virtual ocsd_err_t attachOutputSink(TraceComponent *pComponent, ITrcGenElemIn *pOutSink);
-
-// pkt processor only
- //! attach a raw packet monitor to pkt processor (solo pkt processor, or pkt processor part of pair)
- virtual ocsd_err_t attachPktMonitor(TraceComponent *pComponent, ITrcTypedBase *pPktRawDataMon);
-
- //! attach a packet indexer to pkt processor (solo pkt processor, or pkt processor part of pair)
- virtual ocsd_err_t attachPktIndexer(TraceComponent *pComponent, ITrcTypedBase *pPktIndexer);
-
- //! attach a packet data sink to pkt processor output (solo pkt processor only - instead of decoder when pkt processor only created.)
- virtual ocsd_err_t attachPktSink(TraceComponent *pComponent, ITrcTypedBase *pPktDataInSink);
-
-// data input connection interface
- //! get raw data input interface from packet processor
- virtual ocsd_err_t getDataInputI(TraceComponent *pComponent, ITrcDataIn **ppDataIn);
-
-// create configuration from data structure
- virtual ocsd_err_t createConfigFromDataStruct(CSConfig **pConfigBase, const void *pDataStruct);
-
-// custom packet to string interface.
- void pktToString(const void *pkt, char *pStrBuffer, int bufSize);
-
-private:
-
- ocsd_extern_dcd_fact_t m_dcd_fact;
-};
-
-/**** Decoder instance wrapper */
-class CustomDecoderWrapper : public TraceComponent, public ITrcDataIn
-{
-public:
- CustomDecoderWrapper();
- virtual ~CustomDecoderWrapper();
- ocsd_extern_dcd_inst_t *getDecoderInstInfo() { return &m_decoder_inst; }
-
- virtual ocsd_datapath_resp_t TraceDataIn( const ocsd_datapath_op_t op,
- const ocsd_trc_index_t index,
- const uint32_t dataBlockSize,
- const uint8_t *pDataBlock,
- uint32_t *numBytesProcessed);
-
- void attachGenElemI(ITrcGenElemIn *pIF) { m_pGenElemIn = pIF; };
- void attachInstrDecI(IInstrDecode *pIF) { m_pIInstrDec = pIF; };
- void attachMemAccI(ITargetMemAccess *pIF) { m_pMemAccessor = pIF; };
-
- void attachPtkMonI(IPktRawDataMon<void> *pIF);
- void attachPtkSinkI(IPktDataIn<void> *pIF);
-
- void updateNameFromDcdInst();
-
- static void SetCallbacks(ocsd_extern_dcd_cb_fns &callbacks);
-
-private:
- // declare the callback functions as friend functions.
- friend ocsd_datapath_resp_t GenElemOpCB( const void *lib_context,
- const ocsd_trc_index_t index_sop,
- const uint8_t trc_chan_id,
- const ocsd_generic_trace_elem *elem);
-
- friend void LogErrorCB( const void *lib_context,
- const ocsd_err_severity_t filter_level,
- const ocsd_err_t code,
- const ocsd_trc_index_t idx,
- const uint8_t chan_id,
- const char *pMsg);
-
- friend void LogMsgCB(const void *lib_context,
- const ocsd_err_severity_t filter_level,
- const char *msg);
-
- friend ocsd_err_t DecodeArmInstCB(const void *lib_context, ocsd_instr_info *instr_info);
-
- friend ocsd_err_t MemAccessCB(const void *lib_context,
- const ocsd_vaddr_t address,
- const uint8_t cs_trace_id,
- const ocsd_mem_space_acc_t mem_space,
- uint32_t *num_bytes,
- uint8_t *p_buffer);
-
- friend void PktMonCB(const void *lib_context,
- const ocsd_datapath_op_t op,
- const ocsd_trc_index_t index_sop,
- const void *pkt,
- const uint32_t size,
- const uint8_t *p_data);
-
- friend ocsd_datapath_resp_t PktDataSinkCB(const void *lib_context,
- const ocsd_datapath_op_t op,
- const ocsd_trc_index_t index_sop,
- const void *pkt);
-
-private:
- ITrcGenElemIn *m_pGenElemIn; //!< generic element sink interface - output from decoder fed to common sink.
- IInstrDecode *m_pIInstrDec; //!< arm instruction decode interface - decoder may want to use this.
- ITargetMemAccess *m_pMemAccessor; //!< system memory accessor insterface - decoder may want to use this.
- IPktRawDataMon<void> *m_pPktMon; //!< interface to packet monitor (full or packet only decode).
- IPktDataIn<void> *m_pPktIn; //!< interface to packet sink (decode packets only).
-
- ocsd_extern_dcd_inst_t m_decoder_inst;
-};
-
-/**** Decoder configuration wrapper - implements CSConfig base class interface ***/
-class CustomConfigWrapper : public CSConfig
-{
-public:
- CustomConfigWrapper(const void *p_config) : m_p_config(p_config), m_CSID(0) {};
- virtual ~CustomConfigWrapper() {};
- virtual const uint8_t getTraceID() const { return m_CSID; };
- void setCSID(const uint8_t CSID) { m_CSID = CSID; };
- const void *getConfig() { return m_p_config; };
-private:
- const void *m_p_config;
- uint8_t m_CSID;
-};
-
-#endif // ARM_OCSD_C_API_CUSTOM_OBJ_H_INCLUDED
-
-/* End of File ocsd_c_api_custom_obj.h */
diff --git a/contrib/opencsd/decoder/source/c_api/ocsd_c_api_obj.h b/contrib/opencsd/decoder/source/c_api/ocsd_c_api_obj.h
deleted file mode 100644
index 0476ac67177c..000000000000
--- a/contrib/opencsd/decoder/source/c_api/ocsd_c_api_obj.h
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * \file ocsd_c_api_obj.h
- * \brief OpenCSD : C API callback objects.
- *
- * \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
- */
-
-#ifndef ARM_OCSD_C_API_OBJ_H_INCLUDED
-#define ARM_OCSD_C_API_OBJ_H_INCLUDED
-
-#include "opencsd/c_api/ocsd_c_api_types.h"
-#include "interfaces/trc_gen_elem_in_i.h"
-#include "common/ocsd_msg_logger.h"
-
-class TraceElemCBBase
-{
-public:
- TraceElemCBBase() {};
- virtual ~TraceElemCBBase() {};
-};
-
-class GenTraceElemCBObj : public ITrcGenElemIn, public TraceElemCBBase
-{
-public:
- GenTraceElemCBObj(FnTraceElemIn pCBFn, const void *p_context);
- virtual ~GenTraceElemCBObj() {};
-
- virtual ocsd_datapath_resp_t TraceElemIn(const ocsd_trc_index_t index_sop,
- const uint8_t trc_chan_id,
- const OcsdTraceElement &elem);
-
-private:
- FnTraceElemIn m_c_api_cb_fn;
- const void *m_p_cb_context;
-};
-
-
-
-template<class TrcPkt>
-class PktCBObj : public IPktDataIn<TrcPkt>
-{
-public:
- PktCBObj( FnDefPktDataIn pCBFunc, const void *p_context)
- {
- m_c_api_cb_fn = pCBFunc;
- m_p_context = p_context;
- };
-
- virtual ~PktCBObj() {};
-
- virtual ocsd_datapath_resp_t PacketDataIn( const ocsd_datapath_op_t op,
- const ocsd_trc_index_t index_sop,
- const TrcPkt *p_packet_in)
- {
- const void *c_pkt_struct = 0;
- if(op == OCSD_OP_DATA)
- c_pkt_struct = p_packet_in->c_pkt(); // always output the c struct packet
- return m_c_api_cb_fn(m_p_context,op,index_sop,c_pkt_struct);
- };
-
-private:
- FnDefPktDataIn m_c_api_cb_fn;
- const void *m_p_context;
-};
-
-// void specialisation for custom decoders that pass packets as const void * pointers
-template<>
-class PktCBObj<void> : public IPktDataIn<void>
-{
-public:
- PktCBObj(FnDefPktDataIn pCBFunc, const void *p_context)
- {
- m_c_api_cb_fn = pCBFunc;
- m_p_context = p_context;
- };
-
- virtual ~PktCBObj() {};
-
- virtual ocsd_datapath_resp_t PacketDataIn(const ocsd_datapath_op_t op,
- const ocsd_trc_index_t index_sop,
- const void *p_packet_in)
- {
- return m_c_api_cb_fn(m_p_context, op, index_sop, p_packet_in);
- };
-
-private:
- FnDefPktDataIn m_c_api_cb_fn;
- const void *m_p_context;
-};
-
-
-template<class TrcPkt>
-class PktMonCBObj : public IPktRawDataMon<TrcPkt>
-{
-public:
- PktMonCBObj( FnDefPktDataMon pCBFunc, const void *p_context)
- {
- m_c_api_cb_fn = pCBFunc;
- m_p_context = p_context;
- };
-
- virtual ~PktMonCBObj() {};
-
- virtual void RawPacketDataMon( const ocsd_datapath_op_t op,
- const ocsd_trc_index_t index_sop,
- const TrcPkt *p_packet_in,
- const uint32_t size,
- const uint8_t *p_data)
- {
- const void *c_pkt_struct = 0;
- if(op == OCSD_OP_DATA)
- c_pkt_struct = p_packet_in->c_pkt(); // always output the c struct packet
- m_c_api_cb_fn(m_p_context,op,index_sop,c_pkt_struct,size,p_data);
- };
-
-private:
- FnDefPktDataMon m_c_api_cb_fn;
- const void *m_p_context;
-};
-
-// void specialisation for custom decoders that pass packets as const void * pointers
-template<>
-class PktMonCBObj<void> : public IPktRawDataMon<void>
-{
-public:
- PktMonCBObj(FnDefPktDataMon pCBFunc, const void *p_context)
- {
- m_c_api_cb_fn = pCBFunc;
- m_p_context = p_context;
- };
-
- virtual ~PktMonCBObj() {};
- virtual void RawPacketDataMon(const ocsd_datapath_op_t op,
- const ocsd_trc_index_t index_sop,
- const void *p_packet_in,
- const uint32_t size,
- const uint8_t *p_data)
- {
- m_c_api_cb_fn(m_p_context, op, index_sop, p_packet_in, size, p_data);
- };
-
-private:
- FnDefPktDataMon m_c_api_cb_fn;
- const void *m_p_context;
-};
-
-/* handler for default string print CB object */
-class DefLogStrCBObj : public ocsdMsgLogStrOutI
-{
-public:
- DefLogStrCBObj()
- {
- m_c_api_cb_fn = 0;
- m_p_context = 0;
- };
-
- virtual ~DefLogStrCBObj()
- {
- m_c_api_cb_fn = 0;
- m_p_context = 0;
- };
-
- void setCBFn(const void *p_context, FnDefLoggerPrintStrCB pCBFn)
- {
- m_c_api_cb_fn = pCBFn;
- m_p_context = p_context;
- };
-
- virtual void printOutStr(const std::string &outStr)
- {
- if(m_c_api_cb_fn)
- m_c_api_cb_fn(m_p_context, outStr.c_str(), outStr.length());
- }
-
-private:
- FnDefLoggerPrintStrCB m_c_api_cb_fn;
- const void *m_p_context;
-};
-
-#endif // ARM_OCSD_C_API_OBJ_H_INCLUDED
-
-/* End of File ocsd_c_api_obj.h */
diff --git a/contrib/opencsd/decoder/source/etmv3/trc_cmp_cfg_etmv3.cpp b/contrib/opencsd/decoder/source/etmv3/trc_cmp_cfg_etmv3.cpp
deleted file mode 100644
index f2556e4dfef4..000000000000
--- a/contrib/opencsd/decoder/source/etmv3/trc_cmp_cfg_etmv3.cpp
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * \file trc_cmp_cfg_etmv3.cpp
- * \brief OpenCSD :
- *
- * \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 "opencsd/etmv3/trc_cmp_cfg_etmv3.h"
-
-EtmV3Config::EtmV3Config()
-{
- // defaults set ETMv3.4, V7A, instruction only.
- m_cfg.arch_ver = ARCH_V7;
- m_cfg.core_prof = profile_CortexA;
- m_cfg.reg_ccer = 0;
- m_cfg.reg_idr = 0x4100F240; // default trace IDR value
- m_cfg.reg_ctrl = 0;
-}
-
-EtmV3Config::EtmV3Config(const ocsd_etmv3_cfg *cfg_regs)
-{
- m_cfg = *cfg_regs;
-}
-
-EtmV3Config::EtmTraceMode const EtmV3Config::GetTraceMode() const
-{
- int mode = 0 + ( isDataValTrace() ? 1 : 0 ) + (isDataAddrTrace() ? 2 : 0) + (isInstrTrace() ? 0 : 3);
- return (EtmTraceMode)mode;
-}
-
-const int EtmV3Config::CtxtIDBytes() const
-{
- int ctxtIdsizes[] = { 0, 1, 2, 4 };
- return ctxtIdsizes[(m_cfg.reg_ctrl >> 14) & 0x3];
-}
-
-/* End of File trc_cmp_cfg_etmv3.cpp */
diff --git a/contrib/opencsd/decoder/source/etmv3/trc_pkt_decode_etmv3.cpp b/contrib/opencsd/decoder/source/etmv3/trc_pkt_decode_etmv3.cpp
deleted file mode 100644
index 0a15a33c42fb..000000000000
--- a/contrib/opencsd/decoder/source/etmv3/trc_pkt_decode_etmv3.cpp
+++ /dev/null
@@ -1,671 +0,0 @@
-/*!
- * \file trc_pkt_decode_etmv3.cpp
- * \brief OpenCSD : ETMv3 trace packet decode.
- *
- * \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 "opencsd/etmv3/trc_pkt_decode_etmv3.h"
-
-#define DCD_NAME "DCD_ETMV3"
-
-TrcPktDecodeEtmV3::TrcPktDecodeEtmV3() :
- TrcPktDecodeBase(DCD_NAME)
-{
- initDecoder();
-}
-
-TrcPktDecodeEtmV3::TrcPktDecodeEtmV3(int instIDNum) :
- TrcPktDecodeBase(DCD_NAME, instIDNum)
-{
- initDecoder();
-}
-
-TrcPktDecodeEtmV3::~TrcPktDecodeEtmV3()
-{
-}
-
-
-/* implementation packet decoding interface */
-ocsd_datapath_resp_t TrcPktDecodeEtmV3::processPacket()
-{
- ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
- bool bPktDone = false;
-
- if(!m_config)
- return OCSD_RESP_FATAL_NOT_INIT;
-
- // iterate round the state machine, waiting for sync, then decoding packets.
- while(!bPktDone)
- {
- switch(m_curr_state)
- {
- case NO_SYNC:
- // output the initial not synced packet to the sink
- resp = sendUnsyncPacket();
- m_curr_state = WAIT_ASYNC; // immediate wait for ASync and actually check out the packet
- break;
-
- case WAIT_ASYNC:
- // if async, wait for ISync, but this packet done.
- if(m_curr_packet_in->getType() == ETM3_PKT_A_SYNC)
- m_curr_state = WAIT_ISYNC;
- bPktDone = true;
- break;
-
- case WAIT_ISYNC:
- m_bWaitISync = true; // we are waiting for ISync
- if((m_curr_packet_in->getType() == ETM3_PKT_I_SYNC) ||
- (m_curr_packet_in->getType() == ETM3_PKT_I_SYNC_CYCLE))
- {
- // process the ISync immediately as the first ISync seen.
- resp = processISync((m_curr_packet_in->getType() == ETM3_PKT_I_SYNC_CYCLE),true);
- m_curr_state = SEND_PKTS;
- m_bWaitISync = false;
- }
- // something like TS, CC, PHDR+CC, which after ASYNC may be valid prior to ISync
- else if(preISyncValid(m_curr_packet_in->getType()))
- {
- // decode anything that might be valid - send will be set automatically
- resp = decodePacket(bPktDone);
- }
- else
- bPktDone = true;
- break;
-
- case DECODE_PKTS:
- resp = decodePacket(bPktDone);
- break;
-
- case SEND_PKTS:
- resp = m_outputElemList.sendElements();
- if(OCSD_DATA_RESP_IS_CONT(resp))
- m_curr_state = m_bWaitISync ? WAIT_ISYNC : DECODE_PKTS;
- bPktDone = true;
- break;
-
- default:
- bPktDone = true;
- LogError(ocsdError(OCSD_ERR_SEV_ERROR,OCSD_ERR_FAIL,m_index_curr_pkt,"Unknown Decoder State"));
- resetDecoder(); // mark decoder as unsynced - dump any current state.
- resp = OCSD_RESP_FATAL_SYS_ERR;
- break;
- }
- }
-
- return resp;
-}
-
-ocsd_datapath_resp_t TrcPktDecodeEtmV3::onEOT()
-{
- ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
- OcsdTraceElement *pElem = 0;
- try {
- pElem = GetNextOpElem(resp);
- pElem->setType(OCSD_GEN_TRC_ELEM_EO_TRACE);
- m_outputElemList.commitAllPendElem();
- m_curr_state = SEND_PKTS;
- resp = m_outputElemList.sendElements();
- if(OCSD_DATA_RESP_IS_CONT(resp))
- m_curr_state = DECODE_PKTS;
- }
- catch(ocsdError &err)
- {
- LogError(err);
- resetDecoder(); // mark decoder as unsynced - dump any current state.
- }
- return resp;
-}
-
-ocsd_datapath_resp_t TrcPktDecodeEtmV3::onReset()
-{
- ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
- resetDecoder();
- return resp;
-}
-
-ocsd_datapath_resp_t TrcPktDecodeEtmV3::onFlush()
-{
- ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
- if(m_curr_state == SEND_PKTS)
- {
- resp = m_outputElemList.sendElements();
- if(OCSD_DATA_RESP_IS_CONT(resp))
- m_curr_state = m_bWaitISync ? WAIT_ISYNC : DECODE_PKTS;
- }
- return resp;
-}
-
-ocsd_err_t TrcPktDecodeEtmV3::onProtocolConfig()
-{
- ocsd_err_t err = OCSD_OK;
- if(m_config)
- {
- // set some static config elements
- m_CSID = m_config->getTraceID();
-
- // check config compatible with current decoder support level.
- // at present no data trace;
- if(m_config->GetTraceMode() != EtmV3Config::TM_INSTR_ONLY)
- {
- err = OCSD_ERR_HW_CFG_UNSUPP;
- LogError(ocsdError(OCSD_ERR_SEV_ERROR,OCSD_ERR_HW_CFG_UNSUPP,"ETMv3 trace decoder : data trace decode not yet supported"));
- }
-
- // need to set up core profile info in follower
- ocsd_arch_profile_t arch_profile;
- arch_profile.arch = m_config->getArchVersion();
- arch_profile.profile = m_config->getCoreProfile();
- m_code_follower.setArchProfile(arch_profile);
- m_code_follower.setMemSpaceCSID(m_CSID);
- m_outputElemList.initCSID(m_CSID);
- }
- else
- err = OCSD_ERR_NOT_INIT;
- return err;
-}
-
-/* local decode methods */
-
-// initialise on creation
-void TrcPktDecodeEtmV3::initDecoder()
-{
- m_CSID = 0;
- resetDecoder();
- m_code_follower.initInterfaces(getMemoryAccessAttachPt(),getInstrDecodeAttachPt());
- m_outputElemList.initSendIf(getTraceElemOutAttachPt());
-}
-
-// reset for first use / re-use.
-void TrcPktDecodeEtmV3::resetDecoder()
-{
- m_curr_state = NO_SYNC; // mark as not synced
- m_bNeedAddr = true;
- m_bSentUnknown = false;
- m_bWaitISync = false;
- m_outputElemList.reset();
-}
-
-OcsdTraceElement *TrcPktDecodeEtmV3::GetNextOpElem(ocsd_datapath_resp_t &resp)
-{
- OcsdTraceElement *pElem = m_outputElemList.getNextElem(m_index_curr_pkt);
- if(pElem == 0)
- {
- resp = OCSD_RESP_FATAL_NOT_INIT;
- throw ocsdError(OCSD_ERR_SEV_ERROR, OCSD_ERR_MEM,m_index_curr_pkt,m_CSID,"Memory Allocation Error - fatal");
- }
- return pElem;
-}
-
-bool TrcPktDecodeEtmV3::preISyncValid(ocsd_etmv3_pkt_type pkt_type)
-{
- bool bValid = false;
- // its a timestamp
- if((pkt_type == ETM3_PKT_TIMESTAMP) ||
- // or we are cycleacc and its a packet that can have CC in it
- (m_config->isCycleAcc() && ((pkt_type == ETM3_PKT_CYCLE_COUNT) || (pkt_type == ETM3_PKT_P_HDR)))
- )
- bValid = true;
- return bValid;
-}
-
-// simple packet transforms handled here, more complex processing passed on to specific routines.
-ocsd_datapath_resp_t TrcPktDecodeEtmV3::decodePacket(bool &pktDone)
-{
- ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
- bool bISyncHasCC = false;
- OcsdTraceElement *pElem = 0;
- pktDone = false;
-
- // there may be pended packets that can now be committed.
- // only the branch address with exception and cancel element can cancel
- // if not one of those, commit immediately, otherwise defer to branch address handler.
- if(m_curr_packet_in->getType() != ETM3_PKT_BRANCH_ADDRESS)
- m_outputElemList.commitAllPendElem();
-
- try {
-
- switch(m_curr_packet_in->getType())
- {
-
- case ETM3_PKT_NOTSYNC:
- // mark as not synced - must have lost sync in the packet processor somehow
- throw ocsdError(OCSD_ERR_SEV_ERROR,OCSD_ERR_BAD_PACKET_SEQ,m_index_curr_pkt,m_CSID,"Trace Packet Synchronisation Lost");
- break;
-
- // no action for these packets - ignore and continue
- case ETM3_PKT_INCOMPLETE_EOT:
- case ETM3_PKT_A_SYNC:
- case ETM3_PKT_IGNORE:
- break;
-
- // markers for valid packets
- case ETM3_PKT_CYCLE_COUNT:
- pElem = GetNextOpElem(resp);
- pElem->setType(OCSD_GEN_TRC_ELEM_CYCLE_COUNT);
- pElem->setCycleCount(m_curr_packet_in->getCycleCount());
- break;
-
- case ETM3_PKT_TRIGGER:
- pElem = GetNextOpElem(resp);
- pElem->setType(OCSD_GEN_TRC_ELEM_EVENT);
- pElem->setEvent(EVENT_TRIGGER,0);
- break;
-
- case ETM3_PKT_BRANCH_ADDRESS:
- resp = processBranchAddr();
- break;
-
- case ETM3_PKT_I_SYNC_CYCLE:
- bISyncHasCC = true;
- case ETM3_PKT_I_SYNC:
- resp = processISync(bISyncHasCC);
- break;
-
- case ETM3_PKT_P_HDR:
- resp = processPHdr();
- break;
-
- case ETM3_PKT_CONTEXT_ID:
- pElem = GetNextOpElem(resp);
- pElem->setType(OCSD_GEN_TRC_ELEM_PE_CONTEXT);
- m_PeContext.setCtxtID(m_curr_packet_in->getCtxtID());
- pElem->setContext(m_PeContext);
- break;
-
- case ETM3_PKT_VMID:
- pElem = GetNextOpElem(resp);
- pElem->setType(OCSD_GEN_TRC_ELEM_PE_CONTEXT);
- m_PeContext.setVMID(m_curr_packet_in->getVMID());
- pElem->setContext(m_PeContext);
- break;
-
- case ETM3_PKT_EXCEPTION_ENTRY:
- pElem = GetNextOpElem(resp);
- pElem->setType(OCSD_GEN_TRC_ELEM_EXCEPTION);
- pElem->setExcepMarker(); // exception entries are always v7M data markers in ETMv3 trace.
- break;
-
- case ETM3_PKT_EXCEPTION_EXIT:
- pElem = GetNextOpElem(resp);
- pElem->setType(OCSD_GEN_TRC_ELEM_EXCEPTION_RET);
- pendExceptionReturn();
- break;
-
- case ETM3_PKT_TIMESTAMP:
- pElem = GetNextOpElem(resp);
- pElem->setType(OCSD_GEN_TRC_ELEM_TIMESTAMP);
- pElem->setTS(m_curr_packet_in->getTS());
- break;
-
- // data packets - data trace not supported at present
- case ETM3_PKT_STORE_FAIL:
- case ETM3_PKT_OOO_DATA:
- case ETM3_PKT_OOO_ADDR_PLC:
- case ETM3_PKT_NORM_DATA:
- case ETM3_PKT_DATA_SUPPRESSED:
- case ETM3_PKT_VAL_NOT_TRACED:
- case ETM3_PKT_BAD_TRACEMODE:
- resp = OCSD_RESP_FATAL_INVALID_DATA;
- throw ocsdError(OCSD_ERR_SEV_ERROR,OCSD_ERR_HW_CFG_UNSUPP,m_index_curr_pkt,m_CSID,"Invalid packet type : Data Tracing decode not supported.");
- break;
-
- // packet errors
- case ETM3_PKT_BAD_SEQUENCE:
- resp = OCSD_RESP_FATAL_INVALID_DATA;
- throw ocsdError(OCSD_ERR_SEV_ERROR,OCSD_ERR_BAD_PACKET_SEQ,m_index_curr_pkt,m_CSID,"Bad Packet sequence.");
- break;
-
- default:
- case ETM3_PKT_RESERVED:
- resp = OCSD_RESP_FATAL_INVALID_DATA;
- throw ocsdError(OCSD_ERR_SEV_ERROR,OCSD_ERR_BAD_PACKET_SEQ,m_index_curr_pkt,m_CSID,"Reserved or unknown packet ID.");
- break;
- }
- m_curr_state = m_outputElemList.elemToSend() ? SEND_PKTS : DECODE_PKTS;
- pktDone = !m_outputElemList.elemToSend();
- }
- catch(ocsdError &err)
- {
- LogError(err);
- resetDecoder(); // mark decoder as unsynced - dump any current state.
- pktDone = true;
- }
- catch(...)
- {
- LogError(ocsdError(OCSD_ERR_SEV_ERROR,OCSD_ERR_FAIL,m_index_curr_pkt,m_CSID,"Bad Packet sequence."));
- resp = OCSD_RESP_FATAL_SYS_ERR;
- resetDecoder(); // mark decoder as unsynced - dump any current state.
- pktDone = true;
- }
- return resp;
-}
-
-ocsd_datapath_resp_t TrcPktDecodeEtmV3::sendUnsyncPacket()
-{
- ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
- OcsdTraceElement *pElem = 0;
- try {
- pElem = GetNextOpElem(resp);
- pElem->setType(OCSD_GEN_TRC_ELEM_NO_SYNC);
- resp = m_outputElemList.sendElements();
- }
- catch(ocsdError &err)
- {
- LogError(err);
- resetDecoder(); // mark decoder as unsynced - dump any current state.
- }
- return resp;
-}
-
-void TrcPktDecodeEtmV3::setNeedAddr(bool bNeedAddr)
-{
- m_bNeedAddr = bNeedAddr;
- m_bSentUnknown = false;
-}
-
-ocsd_datapath_resp_t TrcPktDecodeEtmV3::processISync(const bool withCC, const bool firstSync /* = false */)
-{
- // map ISync reason to generic reason codes.
- static trace_on_reason_t on_map[] = { TRACE_ON_NORMAL, TRACE_ON_NORMAL,
- TRACE_ON_OVERFLOW, TRACE_ON_EX_DEBUG };
-
- ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
- bool ctxtUpdate = m_curr_packet_in->isCtxtUpdated();
- OcsdTraceElement *pElem = 0;
-
- try {
-
- pElem = GetNextOpElem(resp);
-
- if(firstSync || (m_curr_packet_in->getISyncReason() != iSync_Periodic))
- {
- pElem->setType(OCSD_GEN_TRC_ELEM_TRACE_ON);
- pElem->setTraceOnReason(on_map[(int)m_curr_packet_in->getISyncReason()]);
- pElem = GetNextOpElem(resp);
- }
-
- // look for context changes....
- if(ctxtUpdate || firstSync)
- {
- // if not first time out, read existing context in output element,
- // otherwise we are setting it new.
- if(firstSync)
- m_PeContext.resetCtxt();
-
- if(m_curr_packet_in->isCtxtIDUpdated())
- m_PeContext.setCtxtID(m_curr_packet_in->getCtxtID());
- if(m_curr_packet_in->isVMIDUpdated())
- m_PeContext.setVMID(m_curr_packet_in->getVMID());
- if(m_curr_packet_in->isCtxtFlagsUpdated())
- {
- m_PeContext.setEL(m_curr_packet_in->isHyp() ? ocsd_EL2 : ocsd_EL_unknown);
- m_PeContext.setSecLevel(m_curr_packet_in->isNS() ? ocsd_sec_nonsecure : ocsd_sec_secure);
- }
-
- // prepare the context packet
- pElem->setType(OCSD_GEN_TRC_ELEM_PE_CONTEXT);
- pElem->setContext(m_PeContext);
- pElem->setISA(m_curr_packet_in->ISA());
-
- // with cycle count...
- if(m_curr_packet_in->getISyncHasCC())
- pElem->setCycleCount(m_curr_packet_in->getCycleCount());
-
- }
-
- // set ISync address - if it is a valid I address
- if(!m_curr_packet_in->getISyncNoAddr())
- {
- if(m_curr_packet_in->getISyncIsLSiPAddr())
- {
- // TBD: handle extra data processing instruction for data trace
- // need to output E atom relating to the data instruction
- // rare - on start-up case.
-
- // main instruction address saved in data address for this packet type.
- m_IAddr = m_curr_packet_in->getDataAddr();
- }
- else
- {
- m_IAddr = m_curr_packet_in->getAddr();
- }
- setNeedAddr(false); // ready to process atoms.
- }
- m_curr_state = m_outputElemList.elemToSend() ? SEND_PKTS : DECODE_PKTS;
- }
- catch(ocsdError &err)
- {
- LogError(err);
- resetDecoder(); // mark decoder as unsynced - dump any current state.
- }
- return resp;
-}
-
-ocsd_datapath_resp_t TrcPktDecodeEtmV3::processBranchAddr()
-{
- ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
- OcsdTraceElement *pElem = 0;
- bool bUpdatePEContext = false;
-
- // might need to cancel something ... if the last output was an instruction range or excep return
- if(m_curr_packet_in->isExcepCancel())
- m_outputElemList.cancelPendElem();
- else
- m_outputElemList.commitAllPendElem(); // otherwise commit any pending elements.
-
- // record the address
- m_IAddr = m_curr_packet_in->getAddr();
- setNeedAddr(false); // no longer need an address.
-
- // exception packet - may need additional output
- if(m_curr_packet_in->isExcepPkt())
- {
- // exeception packet may have exception, context change, or both.
- // check for context change
- if(m_curr_packet_in->isCtxtUpdated())
- {
-
- ocsd_sec_level sec = m_curr_packet_in->isNS() ? ocsd_sec_nonsecure : ocsd_sec_secure;
- if(sec != m_PeContext.getSecLevel())
- {
- m_PeContext.setSecLevel(sec);
- bUpdatePEContext = true;
- }
- ocsd_ex_level pkt_el = m_curr_packet_in->isHyp() ? ocsd_EL2 : ocsd_EL_unknown;
- if(pkt_el != m_PeContext.getEL())
- {
- m_PeContext.setEL(pkt_el);
- bUpdatePEContext = true;
- }
- }
-
- // now decide if we need to send any packets out.
- try {
-
- if(bUpdatePEContext)
- {
- pElem = GetNextOpElem(resp);
- pElem->setType(OCSD_GEN_TRC_ELEM_PE_CONTEXT);
- pElem->setContext(m_PeContext);
- }
-
- // check for exception
- if(m_curr_packet_in->excepNum() != 0)
- {
- pElem = GetNextOpElem(resp);
- pElem->setType(OCSD_GEN_TRC_ELEM_EXCEPTION);
- pElem->setExceptionNum(m_curr_packet_in->excepNum());
- }
-
- // finally - do we have anything to send yet?
- m_curr_state = m_outputElemList.elemToSend() ? SEND_PKTS : DECODE_PKTS;
- }
- catch(ocsdError &err)
- {
- LogError(err);
- resetDecoder(); // mark decoder as unsynced - dump any current state.
- }
- }
- return resp;
-}
-
-
-ocsd_datapath_resp_t TrcPktDecodeEtmV3::processPHdr()
-{
- ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
- OcsdTraceElement *pElem = 0;
- ocsd_isa isa;
- Etmv3Atoms atoms(m_config->isCycleAcc());
-
- atoms.initAtomPkt(m_curr_packet_in,m_index_curr_pkt);
- isa = m_curr_packet_in->ISA();
- m_code_follower.setMemSpaceAccess((m_PeContext.getSecLevel() == ocsd_sec_secure) ? OCSD_MEM_SPACE_S : OCSD_MEM_SPACE_N);
-
- try
- {
- do
- {
- // if we do not have a valid address then send any cycle count elements
- // and stop processing
- if(m_bNeedAddr)
- {
- // output unknown address packet or a cycle count packet
- if(!m_bSentUnknown || m_config->isCycleAcc())
- {
- pElem = GetNextOpElem(resp);
- if(m_bSentUnknown || !atoms.numAtoms())
- pElem->setType(OCSD_GEN_TRC_ELEM_CYCLE_COUNT);
- else
- pElem->setType(OCSD_GEN_TRC_ELEM_ADDR_UNKNOWN);
- if(m_config->isCycleAcc())
- pElem->setCycleCount(atoms.getRemainCC());
- m_bSentUnknown = true;
- }
- atoms.clearAll(); // skip remaining atoms
- }
- else // have an address, can process atoms
- {
- pElem = GetNextOpElem(resp);
- pElem->setType(OCSD_GEN_TRC_ELEM_INSTR_RANGE);
-
- // cycle accurate may have a cycle count to use
- if(m_config->isCycleAcc())
- {
- // note: it is possible to have a CC only atom packet.
- if(!atoms.numAtoms()) // override type if CC only
- pElem->setType(OCSD_GEN_TRC_ELEM_CYCLE_COUNT);
- // set cycle count
- pElem->setCycleCount(atoms.getAtomCC());
- }
-
- // now process the atom
- if(atoms.numAtoms())
- {
- m_code_follower.setISA(isa);
- m_code_follower.followSingleAtom(m_IAddr,atoms.getCurrAtomVal());
-
- // valid code range
- if(m_code_follower.hasRange())
- {
- pElem->setAddrRange(m_IAddr,m_code_follower.getRangeEn());
- pElem->setLastInstrInfo(atoms.getCurrAtomVal() == ATOM_E,
- m_code_follower.getInstrType(),
- m_code_follower.getInstrSubType(),m_code_follower.getInstrSize());
- pElem->setLastInstrCond(m_code_follower.isCondInstr());
- pElem->setISA(isa);
- if(m_code_follower.hasNextAddr())
- m_IAddr = m_code_follower.getNextAddr();
- else
- setNeedAddr(true);
- }
-
- // next address has new ISA?
- if(m_code_follower.ISAChanged())
- isa = m_code_follower.nextISA();
-
- // there is a nacc
- if(m_code_follower.isNacc())
- {
- if(m_code_follower.hasRange())
- {
- pElem = GetNextOpElem(resp);
- pElem->setType(OCSD_GEN_TRC_ELEM_ADDR_NACC);
- }
- else
- pElem->updateType(OCSD_GEN_TRC_ELEM_ADDR_NACC);
- pElem->setAddrStart(m_code_follower.getNaccAddr());
- setNeedAddr(true);
- m_code_follower.clearNacc(); // we have generated some code for the nacc.
- }
- }
-
- atoms.clearAtom(); // next atom
- }
- }
- while(atoms.numAtoms());
-
- // is tha last element an atom?
- int numElem = m_outputElemList.getNumElem();
- if(numElem >= 1)
- {
- // if the last thing is an instruction range, pend it - could be cancelled later.
- if(m_outputElemList.getElemType(numElem-1) == OCSD_GEN_TRC_ELEM_INSTR_RANGE)
- m_outputElemList.pendLastNElem(1);
- }
-
- // finally - do we have anything to send yet?
- m_curr_state = m_outputElemList.elemToSend() ? SEND_PKTS : DECODE_PKTS;
- }
- catch(ocsdError &err)
- {
- LogError(err);
- resetDecoder(); // mark decoder as unsynced - dump any current state.
- }
- return resp;
-}
-
-// if v7M -> pend only ERET, if V7A/R pend ERET and prev instr.
-void TrcPktDecodeEtmV3::pendExceptionReturn()
-{
- int pendElem = 1;
- if(m_config->getCoreProfile() != profile_CortexM)
- {
- int nElem = m_outputElemList.getNumElem();
- if(nElem > 1)
- {
- if(m_outputElemList.getElemType(nElem - 2) == OCSD_GEN_TRC_ELEM_INSTR_RANGE)
- pendElem = 2; // need to pend instr+eret for A/R
- }
- }
- m_outputElemList.pendLastNElem(pendElem);
-}
-
-/* End of File trc_pkt_decode_etmv3.cpp */
diff --git a/contrib/opencsd/decoder/source/etmv3/trc_pkt_elem_etmv3.cpp b/contrib/opencsd/decoder/source/etmv3/trc_pkt_elem_etmv3.cpp
deleted file mode 100644
index f1e411f72423..000000000000
--- a/contrib/opencsd/decoder/source/etmv3/trc_pkt_elem_etmv3.cpp
+++ /dev/null
@@ -1,688 +0,0 @@
-/*
- * \file trc_pkt_elem_etmv3.cpp
- * \brief OpenCSD :
- *
- * \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 <cstring>
-#include <sstream>
-#include <iomanip>
-
-#include "opencsd/etmv3/trc_pkt_elem_etmv3.h"
-
-EtmV3TrcPacket::EtmV3TrcPacket()
-{
- m_pkt_data.addr.size = VA_32BIT; // etm v3 only handles 32 bit addresses.
-}
-
-EtmV3TrcPacket::~EtmV3TrcPacket()
-{
-}
-
-// update interface - set packet values
-
-// clear this packet info
-void EtmV3TrcPacket::Clear()
-{
- // clear structure flags and counter elements etc, that work per packet.
- // leave intra packet data unchanged
- m_pkt_data.addr.pkt_bits = 0;
- m_pkt_data.prev_isa = m_pkt_data.curr_isa; // mark ISA as not changed
- m_pkt_data.exception.bits.present = 0;
- m_pkt_data.atom.num = 0;
- m_pkt_data.cycle_count = 0;
- m_pkt_data.context.updated = 0;
- m_pkt_data.context.updated_c = 0;
- m_pkt_data.context.updated_v = 0;
- m_pkt_data.data.ooo_tag = 0;
- m_pkt_data.data.value = 0;
- m_pkt_data.data.update_addr = 0;
- m_pkt_data.data.update_be = 0;
- m_pkt_data.data.update_dval = 0;
- m_pkt_data.ts_update_bits = 0;
- m_pkt_data.isync_info.has_cycle_count = 0;
- m_pkt_data.isync_info.has_LSipAddress = 0;
- m_pkt_data.isync_info.no_address = 0;
-}
-
-// reset all state including intra packet
-void EtmV3TrcPacket::ResetState()
-{
- memset(&m_pkt_data,0,sizeof(ocsd_etmv3_pkt));
- m_pkt_data.curr_isa = m_pkt_data.prev_isa = ocsd_isa_unknown;
-}
-
-void EtmV3TrcPacket::UpdateAddress(const ocsd_vaddr_t partAddrVal, const int updateBits)
-{
- ocsd_vaddr_t validMask = OCSD_VA_MASK;
- validMask >>= OCSD_MAX_VA_BITSIZE-updateBits;
- m_pkt_data.addr.pkt_bits = updateBits;
- m_pkt_data.addr.val &= ~validMask;
- m_pkt_data.addr.val |= (partAddrVal & validMask);
- if(updateBits > m_pkt_data.addr.valid_bits)
- m_pkt_data.addr.valid_bits = updateBits;
-}
-
-void EtmV3TrcPacket::UpdateDataAddress(const uint32_t value, const uint8_t valid_bits)
-{
- // ETMv3 data addresses 32 bits.
- uint32_t validMask = 0xFFFFFFFF;
- validMask >>= 32-valid_bits;
- m_pkt_data.addr.pkt_bits = valid_bits;
- m_pkt_data.addr.val &= ~validMask;
- m_pkt_data.addr.val |= (value & validMask);
- if(valid_bits > m_pkt_data.addr.valid_bits)
- m_pkt_data.addr.valid_bits = valid_bits;
- m_pkt_data.data.update_addr = 1;
-}
-
-void EtmV3TrcPacket::UpdateTimestamp(const uint64_t tsVal, const uint8_t updateBits)
-{
- uint64_t validMask = ~0ULL;
- validMask >>= 64-updateBits;
- m_pkt_data.timestamp &= ~validMask;
- m_pkt_data.timestamp |= (tsVal & validMask);
- m_pkt_data.ts_update_bits = updateBits;
-}
-
-
-
-void EtmV3TrcPacket::SetException( const ocsd_armv7_exception type,
- const uint16_t number,
- const bool cancel,
- const bool cm_type,
- const int irq_n /*= 0*/,
- const int resume /* = 0*/)
-{
- // initial data
- m_pkt_data.exception.bits.cancel = cancel ? 1 : 0;
- m_pkt_data.exception.bits.cm_irq_n = irq_n;
- m_pkt_data.exception.bits.cm_resume = resume;
- m_pkt_data.exception.bits.cm_type = cm_type ? 1 : 0;
- m_pkt_data.exception.number = number;
- m_pkt_data.exception.type = type;
-
- // mark as valid in this packet
- m_pkt_data.exception.bits.present = 1;
-}
-
-bool EtmV3TrcPacket::UpdateAtomFromPHdr(const uint8_t pHdr, const bool cycleAccurate)
-{
- bool bValid = true;
- uint8_t E = 0, N = 0;
- if(!cycleAccurate)
- {
- if((pHdr & 0x3) == 0x0)
- {
- E = ((pHdr >> 2) & 0xF);
- N = (pHdr & 0x40) ? 1 : 0;
- m_pkt_data.atom.num = E+N;
- m_pkt_data.atom.En_bits = (((uint32_t)0x1) << E) - 1;
- m_pkt_data.p_hdr_fmt = 1;
- }
- else if((pHdr & 0x3) == 0x2)
- {
- m_pkt_data.atom.num = 2;
- m_pkt_data.p_hdr_fmt = 2;
- m_pkt_data.atom.En_bits = (pHdr & 0x8 ? 0 : 1) | (pHdr & 0x4 ? 0 : 0x2);
- }
- else
- bValid = false;
- }
- else
- {
- uint8_t pHdr_code = pHdr & 0xA3;
- switch(pHdr_code)
- {
- case 0x80:
- m_pkt_data.p_hdr_fmt = 1;
- E = ((pHdr >> 2) & 0x7);
- N = (pHdr & 0x40) ? 1 : 0;
- m_pkt_data.atom.num = E+N;
- if(m_pkt_data.atom.num)
- {
- m_pkt_data.atom.En_bits = (((uint32_t)0x1) << E) - 1;
- m_pkt_data.cycle_count = E+N;
- }
- else
- bValid = false; // deprecated 8b'10000000 code
-
- break;
-
- case 0x82:
- m_pkt_data.p_hdr_fmt = 2;
- if(pHdr & 0x10)
- {
- m_pkt_data.p_hdr_fmt = 4;
- m_pkt_data.atom.num = 1;
- m_pkt_data.cycle_count = 0;
- m_pkt_data.atom.En_bits = pHdr & 0x04 ? 0 : 1;
- }
- else
- {
- m_pkt_data.atom.num = 2;
- m_pkt_data.cycle_count = 1;
- m_pkt_data.atom.En_bits = (pHdr & 0x8 ? 0 : 1) | (pHdr & 0x4 ? 0 : 0x2);
- }
- break;
-
- case 0xA0:
- m_pkt_data.p_hdr_fmt = 3;
- m_pkt_data.cycle_count = ((pHdr >> 2) & 7) + 1;
- E = pHdr & 0x40 ? 1 : 0;
- m_pkt_data.atom.num = E;
- m_pkt_data.atom.En_bits = E;
- break;
-
- default:
- bValid = false;
- break;
-
- }
- }
- return bValid;
-}
-
-EtmV3TrcPacket &EtmV3TrcPacket::operator =(const ocsd_etmv3_pkt* p_pkt)
-{
- m_pkt_data = *p_pkt;
- return *this;
-}
-
- // printing
-void EtmV3TrcPacket::toString(std::string &str) const
-{
- const char *name;
- const char *desc;
- std::string valStr, ctxtStr = "";
-
- name = packetTypeName(m_pkt_data.type, &desc);
- str = name + (std::string)" : " + desc;
-
- switch(m_pkt_data.type)
- {
- // print the original header type for the bad sequences.
- case ETM3_PKT_BAD_SEQUENCE:
- case ETM3_PKT_BAD_TRACEMODE:
- name = packetTypeName(m_pkt_data.err_type,0);
- str += "[" + (std::string)name + "]";
- break;
-
- case ETM3_PKT_BRANCH_ADDRESS:
- getBranchAddressStr(valStr);
- str += "; " + valStr;
- break;
-
- case ETM3_PKT_I_SYNC_CYCLE:
- case ETM3_PKT_I_SYNC:
- getISyncStr(valStr);
- str += "; " + valStr;
- break;
-
- case ETM3_PKT_P_HDR:
- getAtomStr(valStr);
- str += "; " + valStr;
- break;
-
- case ETM3_PKT_CYCLE_COUNT:
- {
- std::ostringstream oss;
- oss << "; Cycles=" << m_pkt_data.cycle_count;
- str += oss.str();
- }
- break;
-
- case ETM3_PKT_CONTEXT_ID:
- {
- std::ostringstream oss;
- oss << "; CtxtID=" << std::hex << "0x" << m_pkt_data.context.ctxtID;
- str += oss.str();
- }
- break;
-
- case ETM3_PKT_VMID:
- {
- std::ostringstream oss;
- oss << "; VMID=" << std::hex << "0x" << m_pkt_data.context.VMID;
- str += oss.str();
- }
- break;
-
- case ETM3_PKT_TIMESTAMP:
- {
- std::ostringstream oss;
- oss << "; TS=" << std::hex << "0x" << m_pkt_data.timestamp << " (" << std::dec << m_pkt_data.timestamp << ") ";
- str += oss.str();
- }
- break;
-
- case ETM3_PKT_OOO_DATA:
- {
- std::ostringstream oss;
- oss << "; Val=" << std::hex << "0x" << m_pkt_data.data.value;
- oss << "; OO_Tag=" << std::hex << "0x" << m_pkt_data.data.ooo_tag;
- str += oss.str();
- }
- break;
-
- case ETM3_PKT_VAL_NOT_TRACED:
- if(m_pkt_data.data.update_addr)
- {
- trcPrintableElem::getValStr(valStr,32, m_pkt_data.data.addr.valid_bits,
- m_pkt_data.data.addr.val,true,m_pkt_data.data.addr.pkt_bits);
- str += "; Addr=" + valStr;
- }
- break;
-
- case ETM3_PKT_OOO_ADDR_PLC:
- if(m_pkt_data.data.update_addr)
- {
- trcPrintableElem::getValStr(valStr,32, m_pkt_data.data.addr.valid_bits,
- m_pkt_data.data.addr.val,true,m_pkt_data.data.addr.pkt_bits);
- str += "; Addr=" + valStr;
- }
- {
- std::ostringstream oss;
- oss << "; OO_Tag=" << std::hex << "0x" << m_pkt_data.data.ooo_tag;
- str += oss.str();
- }
- break;
-
- case ETM3_PKT_NORM_DATA:
- if(m_pkt_data.data.update_addr)
- {
- trcPrintableElem::getValStr(valStr,32, m_pkt_data.data.addr.valid_bits,
- m_pkt_data.data.addr.val,true,m_pkt_data.data.addr.pkt_bits);
- str += "; Addr=" + valStr;
- }
- if(m_pkt_data.data.update_dval)
- {
- std::ostringstream oss;
- oss << "; Val=" << std::hex << "0x" << m_pkt_data.data.value;
- str += oss.str();
- }
- break;
- }
-}
-
-void EtmV3TrcPacket::toStringFmt(const uint32_t fmtFlags, std::string &str) const
-{
- // no formatting implemented at present.
- toString(str);
-}
-
-const char *EtmV3TrcPacket::packetTypeName(const ocsd_etmv3_pkt_type type, const char **ppDesc) const
-{
- const char *pName = "I_RESERVED";
- const char *pDesc = "Reserved Packet Header";
-
- switch(type)
- {
-// markers for unknown packets
- // case ETM3_PKT_NOERROR:, //!< no error in packet - supplimentary data.
- case ETM3_PKT_NOTSYNC: //!< no sync found yet
- pName = "NOTSYNC";
- pDesc = "Trace Stream not synchronised";
- break;
-
- case ETM3_PKT_INCOMPLETE_EOT: //!< flushing incomplete/empty packet at end of trace.
- pName = "INCOMPLETE_EOT.";
- pDesc = "Incomplete packet at end of trace data.";
- break;
-
-// markers for valid packets
- case ETM3_PKT_BRANCH_ADDRESS:
- pName = "BRANCH_ADDRESS";
- pDesc = "Branch address.";
- break;
-
- case ETM3_PKT_A_SYNC:
- pName = "A_SYNC";
- pDesc = "Alignment Synchronisation.";
- break;
-
- case ETM3_PKT_CYCLE_COUNT:
- pName = "CYCLE_COUNT";
- pDesc = "Cycle Count.";
- break;
-
- case ETM3_PKT_I_SYNC:
- pName = "I_SYNC";
- pDesc = "Instruction Packet synchronisation.";
- break;
-
- case ETM3_PKT_I_SYNC_CYCLE:
- pName = "I_SYNC_CYCLE";
- pDesc = "Instruction Packet synchronisation with cycle count.";
- break;
-
- case ETM3_PKT_TRIGGER:
- pName = "TRIGGER";
- pDesc = "Trace Trigger Event.";
- break;
-
- case ETM3_PKT_P_HDR:
- pName = "P_HDR";
- pDesc = "Atom P-header.";
- break;
-
- case ETM3_PKT_STORE_FAIL:
- pName = "STORE_FAIL";
- pDesc = "Data Store Failed.";
- break;
-
- case ETM3_PKT_OOO_DATA:
- pName = "OOO_DATA";
- pDesc = "Out of Order data value packet.";
- break;
-
- case ETM3_PKT_OOO_ADDR_PLC:
- pName = "OOO_ADDR_PLC";
- pDesc = "Out of Order data address placeholder.";
- break;
-
- case ETM3_PKT_NORM_DATA:
- pName = "NORM_DATA";
- pDesc = "Data trace packet.";
- break;
-
- case ETM3_PKT_DATA_SUPPRESSED:
- pName = "DATA_SUPPRESSED";
- pDesc = "Data trace suppressed.";
- break;
-
- case ETM3_PKT_VAL_NOT_TRACED:
- pName = "VAL_NOT_TRACED";
- pDesc = "Data trace value not traced.";
- break;
-
- case ETM3_PKT_IGNORE:
- pName = "IGNORE";
- pDesc = "Packet ignored.";
- break;
-
- case ETM3_PKT_CONTEXT_ID:
- pName = "CONTEXT_ID";
- pDesc = "Context ID change.";
- break;
-
- case ETM3_PKT_VMID:
- pName = "VMID";
- pDesc = "VMID change.";
- break;
-
- case ETM3_PKT_EXCEPTION_ENTRY:
- pName = "EXCEPTION_ENTRY";
- pDesc = "Exception entry data marker.";
- break;
-
- case ETM3_PKT_EXCEPTION_EXIT:
- pName = "EXCEPTION_EXIT";
- pDesc = "Exception return.";
- break;
-
- case ETM3_PKT_TIMESTAMP:
- pName = "TIMESTAMP";
- pDesc = "Timestamp Value.";
- break;
-
-// internal processing types
- // case ETM3_PKT_BRANCH_OR_BYPASS_EOT: not externalised
-
-// packet errors
- case ETM3_PKT_BAD_SEQUENCE:
- pName = "BAD_SEQUENCE";
- pDesc = "Invalid sequence for packet type.";
- break;
-
- case ETM3_PKT_BAD_TRACEMODE:
- pName = "BAD_TRACEMODE";
- pDesc = "Invalid packet type for this trace mode.";
- break;
-
- // leave thest unchanged.
- case ETM3_PKT_RESERVED:
- default:
- break;
-
- }
-
- if(ppDesc) *ppDesc = pDesc;
- return pName;
-}
-
-void EtmV3TrcPacket::getBranchAddressStr(std::string &valStr) const
-{
- std::ostringstream oss;
- std::string subStr;
-
- // print address.
- trcPrintableElem::getValStr(subStr,32,m_pkt_data.addr.valid_bits,
- m_pkt_data.addr.val,true,m_pkt_data.addr.pkt_bits);
- oss << "Addr=" << subStr << "; ";
-
- // current ISA if changed.
- if(m_pkt_data.curr_isa != m_pkt_data.prev_isa)
- {
- getISAStr(subStr);
- oss << subStr;
- }
-
- // S / NS etc if changed.
- if(m_pkt_data.context.updated)
- {
- oss << (m_pkt_data.context.curr_NS ? "NS; " : "S; ");
- oss << (m_pkt_data.context.curr_Hyp ? "Hyp; " : "");
- }
-
- // exception?
- if(m_pkt_data.exception.bits.present)
- {
- getExcepStr(subStr);
- oss << subStr;
- }
- valStr = oss.str();
-}
-
-void EtmV3TrcPacket::getAtomStr(std::string &valStr) const
-{
- std::ostringstream oss;
- uint32_t bitpattern = m_pkt_data.atom.En_bits; // arranged LSBit oldest, MSbit newest
-
- if(!m_pkt_data.cycle_count)
- {
- for(int i = 0; i < m_pkt_data.atom.num; i++)
- {
- oss << ((bitpattern & 0x1) ? "E" : "N"); // in spec read L->R, oldest->newest
- bitpattern >>= 1;
- }
- }
- else
- {
- switch(m_pkt_data.p_hdr_fmt)
- {
- case 1:
- for(int i = 0; i < m_pkt_data.atom.num; i++)
- {
- oss << ((bitpattern & 0x1) ? "WE" : "WN"); // in spec read L->R, oldest->newest
- bitpattern >>= 1;
- }
- break;
-
- case 2:
- oss << "W";
- for(int i = 0; i < m_pkt_data.atom.num; i++)
- {
- oss << ((bitpattern & 0x1) ? "E" : "N"); // in spec read L->R, oldest->newest
- bitpattern >>= 1;
- }
- break;
-
- case 3:
- for(uint32_t i = 0; i < m_pkt_data.cycle_count; i++)
- oss << "W";
- if(m_pkt_data.atom.num)
- oss << ((bitpattern & 0x1) ? "E" : "N"); // in spec read L->R, oldest->newest
- break;
- }
- oss << "; Cycles=" << m_pkt_data.cycle_count;
- }
- valStr = oss.str();
-}
-
-void EtmV3TrcPacket::getISyncStr(std::string &valStr) const
-{
- std::ostringstream oss;
- static const char *reason[] = { "Periodic", "Trace Enable", "Restart Overflow", "Debug Exit" };
-
- // reason.
- oss << "(" << reason[(int)m_pkt_data.isync_info.reason] << "); ";
-
- // full address.
- if(!m_pkt_data.isync_info.no_address)
- {
- if(m_pkt_data.isync_info.has_LSipAddress)
- oss << "Data Instr Addr=0x";
- else
- oss << "Addr=0x";
- oss << std::hex << std::setfill('0') << std::setw(8) << m_pkt_data.addr.val << "; ";
- }
-
- oss << (m_pkt_data.context.curr_NS ? "NS; " : "S; ");
- oss << (m_pkt_data.context.curr_Hyp ? "Hyp; " : " ");
-
- if(m_pkt_data.context.updated_c)
- {
- oss << "CtxtID=" << std::hex << m_pkt_data.context.ctxtID << "; ";
- }
-
- if(m_pkt_data.isync_info.no_address)
- {
- valStr = oss.str();
- return; // bail out at this point if a data only ISYNC
- }
-
- std::string isaStr;
- getISAStr(isaStr);
- oss << isaStr;
-
- if(m_pkt_data.isync_info.has_cycle_count)
- {
- oss << "Cycles=" << std::dec << m_pkt_data.cycle_count << "; ";
- }
-
- if(m_pkt_data.isync_info.has_LSipAddress)
- {
- std::string addrStr;
-
- // extract address updata.
- trcPrintableElem::getValStr(addrStr,32,m_pkt_data.data.addr.valid_bits,
- m_pkt_data.data.addr.val,true,m_pkt_data.data.addr.pkt_bits);
- oss << "Curr Instr Addr=" << addrStr << ";";
- }
- valStr = oss.str();
-}
-
-void EtmV3TrcPacket::getISAStr(std::string &isaStr) const
-{
- std::ostringstream oss;
- oss << "ISA=";
- switch(m_pkt_data.curr_isa)
- {
- case ocsd_isa_arm:
- oss << "ARM(32); ";
- break;
-
- case ocsd_isa_thumb2:
- oss << "Thumb2; ";
- break;
-
- case ocsd_isa_aarch64:
- oss << "AArch64; ";
- break;
-
- case ocsd_isa_tee:
- oss << "ThumbEE; ";
- break;
-
- case ocsd_isa_jazelle:
- oss << "Jazelle; ";
- break;
-
- default:
- case ocsd_isa_unknown:
- oss << "Unknown; ";
- break;
- }
- isaStr = oss.str();
-}
-
-void EtmV3TrcPacket::getExcepStr(std::string &excepStr) const
-{
- static const char *ARv7Excep[] = {
- "No Exception", "Debug Halt", "SMC", "Hyp",
- "Async Data Abort", "Jazelle", "Reserved", "Reserved",
- "PE Reset", "Undefined Instr", "SVC", "Prefetch Abort",
- "Data Fault", "Generic", "IRQ", "FIQ"
- };
-
- static const char *MExcep[] = {
- "No Exception", "IRQ1", "IRQ2", "IRQ3",
- "IRQ4", "IRQ5", "IRQ6", "IRQ7",
- "IRQ0","usage Fault","NMI","SVC",
- "DebugMonitor", "Mem Manage","PendSV","SysTick",
- "Reserved","PE Reset","Reserved","HardFault"
- "Reserved","BusFault","Reserved","Reserved"
- };
-
- std::ostringstream oss;
- oss << "Exception=";
-
- if(m_pkt_data.exception.bits.cm_type)
- {
- if(m_pkt_data.exception.number < 0x18)
- oss << MExcep[m_pkt_data.exception.number];
- else
- oss << "IRQ" << std::dec << (m_pkt_data.exception.number - 0x10);
- if(m_pkt_data.exception.bits.cm_resume)
- oss << "; Resume=" << m_pkt_data.exception.bits.cm_resume;
- if(m_pkt_data.exception.bits.cancel)
- oss << "; Cancel prev instr";
- }
- else
- {
- oss << ARv7Excep[m_pkt_data.exception.number] << "; ";
- if(m_pkt_data.exception.bits.cancel)
- oss << "; Cancel prev instr";
- }
- excepStr = oss.str();
-}
-/* End of File trc_pkt_elem_etmv3.cpp */
diff --git a/contrib/opencsd/decoder/source/etmv3/trc_pkt_proc_etmv3.cpp b/contrib/opencsd/decoder/source/etmv3/trc_pkt_proc_etmv3.cpp
deleted file mode 100644
index 7871619fe55f..000000000000
--- a/contrib/opencsd/decoder/source/etmv3/trc_pkt_proc_etmv3.cpp
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * \file trc_pkt_proc_etmv3.cpp
- * \brief OpenCSD :
- *
- * \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 "opencsd/etmv3/trc_pkt_proc_etmv3.h"
-#include "trc_pkt_proc_etmv3_impl.h"
-#include "common/ocsd_error.h"
-
-#ifdef __GNUC__
-// G++ doesn't like the ## pasting
-#define ETMV3_PKTS_NAME "PKTP_ETMV3"
-#else
-#define ETMV3_PKTS_NAME OCSD_CMPNAME_PREFIX_PKTPROC##"_"##OCSD_BUILTIN_DCD_ETMV3
-#endif
-
-static const uint32_t ETMV3_SUPPORTED_OP_FLAGS = OCSD_OPFLG_PKTPROC_COMMON |
- ETMV3_OPFLG_UNFORMATTED_SOURCE;
-
-TrcPktProcEtmV3::TrcPktProcEtmV3() : TrcPktProcBase(ETMV3_PKTS_NAME),
- m_pProcessor(0)
-{
- m_supported_op_flags = ETMV3_SUPPORTED_OP_FLAGS;
-}
-
-TrcPktProcEtmV3::TrcPktProcEtmV3(int instIDNum) : TrcPktProcBase(ETMV3_PKTS_NAME, instIDNum),
- m_pProcessor(0)
-{
- m_supported_op_flags = ETMV3_SUPPORTED_OP_FLAGS;
-}
-
-TrcPktProcEtmV3::~TrcPktProcEtmV3()
-{
- if(m_pProcessor)
- delete m_pProcessor;
- m_pProcessor = 0;
-}
-
-ocsd_err_t TrcPktProcEtmV3::onProtocolConfig()
-{
- if(m_pProcessor == 0)
- {
- m_pProcessor = new (std::nothrow) EtmV3PktProcImpl();
- if(m_pProcessor == 0)
- {
- LogError(ocsdError(OCSD_ERR_SEV_ERROR,OCSD_ERR_MEM));
- return OCSD_ERR_MEM;
- }
- m_pProcessor->Initialise(this);
- }
- return m_pProcessor->Configure(m_config);
-}
-
-ocsd_datapath_resp_t TrcPktProcEtmV3::processData( const ocsd_trc_index_t index,
- const uint32_t dataBlockSize,
- const uint8_t *pDataBlock,
- uint32_t *numBytesProcessed)
-{
- if(m_pProcessor)
- return m_pProcessor->processData(index,dataBlockSize,pDataBlock,numBytesProcessed);
- return OCSD_RESP_FATAL_NOT_INIT;
-}
-
-ocsd_datapath_resp_t TrcPktProcEtmV3::onEOT()
-{
- if(m_pProcessor)
- return m_pProcessor->onEOT();
- return OCSD_RESP_FATAL_NOT_INIT;
-}
-
-ocsd_datapath_resp_t TrcPktProcEtmV3::onReset()
-{
- if(m_pProcessor)
- return m_pProcessor->onReset();
- return OCSD_RESP_FATAL_NOT_INIT;
-}
-
-ocsd_datapath_resp_t TrcPktProcEtmV3::onFlush()
-{
- if(m_pProcessor)
- return m_pProcessor->onFlush();
- return OCSD_RESP_FATAL_NOT_INIT;
-}
-
-const bool TrcPktProcEtmV3::isBadPacket() const
-{
- if(m_pProcessor)
- return m_pProcessor->isBadPacket();
- return false;
-}
-
-/* End of File trc_pkt_proc_etmv3.cpp */
diff --git a/contrib/opencsd/decoder/source/etmv3/trc_pkt_proc_etmv3_impl.cpp b/contrib/opencsd/decoder/source/etmv3/trc_pkt_proc_etmv3_impl.cpp
deleted file mode 100644
index fc39a5eda7d3..000000000000
--- a/contrib/opencsd/decoder/source/etmv3/trc_pkt_proc_etmv3_impl.cpp
+++ /dev/null
@@ -1,1224 +0,0 @@
-/*
- * \file trc_pkt_proc_etmv3_impl.cpp
- * \brief OpenCSD :
- *
- * \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 "trc_pkt_proc_etmv3_impl.h"
-
-EtmV3PktProcImpl::EtmV3PktProcImpl() :
- m_isInit(false),
- m_interface(0)
-{
-}
-
-EtmV3PktProcImpl::~EtmV3PktProcImpl()
-{
-}
-
-ocsd_err_t EtmV3PktProcImpl::Configure(const EtmV3Config *p_config)
-{
- ocsd_err_t err = OCSD_OK;
- if(p_config != 0)
- {
- m_config = *p_config;
- m_chanIDCopy = m_config.getTraceID();
- }
- else
- {
- err = OCSD_ERR_INVALID_PARAM_VAL;
- if(m_isInit)
- m_interface->LogError(ocsdError(OCSD_ERR_SEV_ERROR,err));
- }
- return err;
-}
-
-ocsd_datapath_resp_t EtmV3PktProcImpl::processData(const ocsd_trc_index_t index,
- const uint32_t dataBlockSize,
- const uint8_t *pDataBlock,
- uint32_t *numBytesProcessed)
-{
- ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
- m_bytesProcessed = 0;
-
- while( ( (m_bytesProcessed < dataBlockSize) ||
- ((m_bytesProcessed == dataBlockSize) && (m_process_state == SEND_PKT)) )
- && OCSD_DATA_RESP_IS_CONT(resp))
- {
- try
- {
- switch(m_process_state)
- {
- case WAIT_SYNC:
- if(!m_bStartOfSync)
- m_packet_index = index + m_bytesProcessed;
- m_bytesProcessed += waitForSync(dataBlockSize-m_bytesProcessed,pDataBlock+m_bytesProcessed);
- break;
-
- case PROC_HDR:
- m_packet_index = index + m_bytesProcessed;
- processHeaderByte(pDataBlock[m_bytesProcessed++]);
- break;
-
- case PROC_DATA:
- processPayloadByte(pDataBlock [m_bytesProcessed++]);
- break;
-
- case SEND_PKT:
- resp = outputPacket();
- break;
- }
- }
- catch(ocsdError &err)
- {
- m_interface->LogError(err);
- if( (err.getErrorCode() == OCSD_ERR_BAD_PACKET_SEQ) ||
- (err.getErrorCode() == OCSD_ERR_INVALID_PCKT_HDR))
- {
- // send invalid packets up the pipe to let the next stage decide what to do.
- m_process_state = SEND_PKT;
- }
- else
- {
- // bail out on any other error.
- resp = OCSD_RESP_FATAL_INVALID_DATA;
- }
- }
- catch(...)
- {
- /// vv bad at this point.
- resp = OCSD_RESP_FATAL_SYS_ERR;
- ocsdError fatal = ocsdError(OCSD_ERR_SEV_ERROR,OCSD_ERR_FAIL,m_packet_index,m_chanIDCopy);
- fatal.setMessage("Unknown System Error decoding trace.");
- m_interface->LogError(fatal);
- }
- }
-
- *numBytesProcessed = m_bytesProcessed;
- return resp;
-}
-
-ocsd_datapath_resp_t EtmV3PktProcImpl::onEOT()
-{
- ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
- // if we have a partial packet then send to attached sinks
- if(m_currPacketData.size() != 0)
- {
- // TBD: m_curr_packet.updateErrType(ETM4_ETM3_PKT_I_INCOMPLETE_EOT);
- resp = outputPacket();
- InitPacketState();
- }
- return resp;
-}
-
-ocsd_datapath_resp_t EtmV3PktProcImpl::onReset()
-{
- InitProcessorState();
- return OCSD_RESP_CONT;
-}
-
-ocsd_datapath_resp_t EtmV3PktProcImpl::onFlush()
-{
- // packet processor never holds on to flushable data (may have partial packet,
- // but any full packets are immediately sent)
- return OCSD_RESP_CONT;
-}
-
-void EtmV3PktProcImpl::Initialise(TrcPktProcEtmV3 *p_interface)
-{
- if(p_interface)
- {
- m_interface = p_interface;
- m_isInit = true;
-
- }
- InitProcessorState();
- /* not using pattern matcher for sync at present
- static const uint8_t a_sync[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x80 };
- m_syncMatch.setPattern(a_sync, sizeof(a_sync));*/
-}
-
-void EtmV3PktProcImpl::InitProcessorState()
-{
- m_bStreamSync = false; // not synced
- m_process_state = WAIT_SYNC; // waiting for sync
- m_bStartOfSync = false; // not seen start of sync packet
- m_curr_packet.ResetState(); // reset intra packet state
- InitPacketState(); // set curr packet state
- m_bSendPartPkt = false;
-}
-
-void EtmV3PktProcImpl::InitPacketState()
-{
- m_bytesExpectedThisPkt = 0;
- m_BranchPktNeedsException = false;
- m_bIsync_got_cycle_cnt = false;
- m_bIsync_get_LSiP_addr = false;
- m_IsyncInfoIdx = false;
- m_bExpectingDataAddress = false;
- m_bFoundDataAddress = false;
- m_currPacketData.clear();
- m_currPktIdx = 0; // index into processed bytes in current packet
- m_curr_packet.Clear();
-
-}
-
-ocsd_datapath_resp_t EtmV3PktProcImpl::outputPacket()
-{
- ocsd_datapath_resp_t dp_resp = OCSD_RESP_FATAL_NOT_INIT;
- if(m_isInit)
- {
- ocsd_etmv3_pkt_type type = m_curr_packet.getType();
- if(!m_bSendPartPkt)
- {
- dp_resp = m_interface->outputOnAllInterfaces(m_packet_index,&m_curr_packet,&type,m_currPacketData);
- m_process_state = m_bStreamSync ? PROC_HDR : WAIT_SYNC; // need a header next time, or still waiting to sync.
- m_currPacketData.clear();
- }
- else
- {
- // sending part packet, still some data in the main packet
- dp_resp = m_interface->outputOnAllInterfaces(m_packet_index,&m_curr_packet,&type,m_partPktData);
- m_process_state = m_post_part_pkt_state;
- m_packet_index += m_partPktData.size();
- m_bSendPartPkt = false;
- m_curr_packet.SetType(m_post_part_pkt_type);
- }
- }
- return dp_resp;
-}
-
-void EtmV3PktProcImpl::setBytesPartPkt(int numBytes, process_state nextState, const ocsd_etmv3_pkt_type nextType)
-{
- m_partPktData.clear();
- for(int i=0; i < numBytes; i++)
- {
- m_partPktData.push_back(m_currPacketData[i]);
- }
- m_currPacketData.erase(m_currPacketData.begin(), m_currPacketData.begin()+numBytes);
- m_bSendPartPkt = true;
- m_post_part_pkt_state = nextState;
- m_post_part_pkt_type = nextType;
-}
-
-uint32_t EtmV3PktProcImpl::waitForSync(const uint32_t dataBlockSize, const uint8_t *pDataBlock)
-{
- uint8_t currByte;
- uint32_t bytesProcessed = 0;
- bool bSendBlock = false;
-
- // need to wait for the first sync packet
- while(!bSendBlock && (bytesProcessed < dataBlockSize))
- {
- currByte = pDataBlock[bytesProcessed++];
- // TBD: forced sync point
-
- if(m_bStartOfSync)
- {
- // need to handle consecutive 0 bytes followed by genuine A-SYNC.
-
- m_currPacketData.push_back(currByte);
- if((currByte == 0x80) && (m_currPacketData.size() >= 6))
- {
- // it is a sync packet possibly with leading zeros
- bSendBlock = true;
- if(m_currPacketData.size() > 6)
- {
- m_currPacketData.pop_back();
- bytesProcessed--; // return 0x80 to the input buffer to re-process next pass after stripping 0's
- setBytesPartPkt(m_currPacketData.size()-5,WAIT_SYNC,ETM3_PKT_NOTSYNC);
- }
- else
- {
- m_bStreamSync = true;
- m_curr_packet.SetType(ETM3_PKT_A_SYNC);
- }
- }
- else if(currByte != 0x00)
- {
- m_bStartOfSync = false; // not a sync packet
- }
- else if(m_currPacketData.size() >= 13) // 13 0's, strip 8 of them...
- {
- setBytesPartPkt(8,WAIT_SYNC,ETM3_PKT_NOTSYNC);
- bSendBlock = true;
- }
- }
- else // not seen a start of sync candidate yet
- {
- if(currByte == 0x00) // could be the start of a-sync
- {
- if(m_currPacketData.size() == 0)
- {
- m_currPacketData.push_back(currByte);
- m_bStartOfSync = true;
- }
- else
- {
- bytesProcessed--;
- bSendBlock = true; // send none sync packet data, re-process this byte next time.
- m_curr_packet.SetType(ETM3_PKT_NOTSYNC); // send unsynced data packet.
- }
- }
- else
- {
- //save a byte - not start of a-sync
- m_currPacketData.push_back(currByte);
-
- // done all data in this block, or got 16 unsynced bytes
- if((bytesProcessed == dataBlockSize) || (m_currPacketData.size() == 16))
- {
- bSendBlock = true; // send none sync packet block
- m_curr_packet.SetType(ETM3_PKT_NOTSYNC); // send unsynced data packet.
- }
- }
- }
- }
- if(bSendBlock)
- SendPacket();
- return bytesProcessed;
-}
-
-ocsd_err_t EtmV3PktProcImpl::processHeaderByte(uint8_t by)
-{
- InitPacketState(); // new packet, clear old single packet state (retains intra packet state).
-
- // save byte
- m_currPacketData.push_back(by);
-
- m_process_state = PROC_DATA; // assume next is data packet
-
- // check for branch address 0bCxxxxxxx1
- if((by & 0x01) == 0x01 ) {
- m_curr_packet.SetType(ETM3_PKT_BRANCH_ADDRESS);
- m_BranchPktNeedsException = false;
- if((by & 0x80) != 0x80) {
- // no continuation - 1 byte branch same in alt and std...
- if((by == 0x01) && (m_interface->getComponentOpMode() & ETMV3_OPFLG_UNFORMATTED_SOURCE))
- {
- // TBD: need to fix up for handling bypassed ETM stream at some point.
- throwUnsupportedErr("Bypassed ETM stream not supported in this version of the decoder.");
- // could be EOTrace marker from bypassed formatter
- m_curr_packet.SetType(ETM3_PKT_BRANCH_OR_BYPASS_EOT);
- }
- else
- {
- OnBranchAddress();
- SendPacket(); // mark ready to send.
- }
- }
- }
- // check for p-header - 0b1xxxxxx0
- else if((by & 0x81) == 0x80) {
- m_curr_packet.SetType(ETM3_PKT_P_HDR);
- if(m_curr_packet.UpdateAtomFromPHdr(by,m_config.isCycleAcc()))
- SendPacket();
- else
- throwPacketHeaderErr("Invalid P-Header.");
- }
- // check 0b0000xx00 group
- else if((by & 0xF3) == 0x00) {
-
- // A-Sync
- if(by == 0x00) {
- m_curr_packet.SetType(ETM3_PKT_A_SYNC);
- }
- // cycle count
- else if(by == 0x04) {
- m_curr_packet.SetType(ETM3_PKT_CYCLE_COUNT);
- }
- // I-Sync
- else if(by == 0x08) {
- m_curr_packet.SetType(ETM3_PKT_I_SYNC);
- m_bIsync_got_cycle_cnt = false;
- m_bIsync_get_LSiP_addr = false;
- }
- // trigger
- else if(by == 0x0C) {
- m_curr_packet.SetType(ETM3_PKT_TRIGGER);
- // no payload - just send it.
- SendPacket();
- }
- }
- // check remaining 0bxxxxxx00 codes
- else if((by & 0x03 )== 0x00) {
- // OoO data 0b0xx0xx00
- if((by & 0x93 )== 0x00) {
- if(!m_config.isDataValTrace()) {
- m_curr_packet.SetErrType(ETM3_PKT_BAD_TRACEMODE);
- throwPacketHeaderErr("Invalid data trace header (out of order data) - not tracing data values.");
- }
- m_curr_packet.SetType(ETM3_PKT_OOO_DATA);
- uint8_t size = ((by & 0x0C) >> 2);
- // header contains a count of the data to follow
- // size 3 == 4 bytes, other sizes == size bytes
- if(size == 0)
- {
- m_curr_packet.SetDataOOOTag((by >> 5) & 0x3);
- m_curr_packet.SetDataValue(0);
- SendPacket();
- }
- else
- m_bytesExpectedThisPkt = (short)(1 + ((size == 3) ? 4 : size));
- }
- // I-Sync + cycle count
- else if(by == 0x70) {
- m_curr_packet.SetType(ETM3_PKT_I_SYNC_CYCLE);
- m_bIsync_got_cycle_cnt = false;
- m_bIsync_get_LSiP_addr = false;
- }
- // store failed
- else if(by == 0x50) {
- if(!m_config.isDataValTrace())
- {
- m_curr_packet.SetErrType(ETM3_PKT_BAD_TRACEMODE);
- throwPacketHeaderErr("Invalid data trace header (store failed) - not tracing data values.");
- }
- m_curr_packet.SetType(ETM3_PKT_STORE_FAIL);
- SendPacket();
- }
- // OoO placeholder 0b01x1xx00
- else if((by & 0xD3 )== 0x50) {
- m_curr_packet.SetType(ETM3_PKT_OOO_ADDR_PLC);
- if(!m_config.isDataTrace())
- {
- m_curr_packet.SetErrType(ETM3_PKT_BAD_TRACEMODE);
- throwPacketHeaderErr("Invalid data trace header (out of order placeholder) - not tracing data.");
- }
- // expecting data address if flagged and address tracing enabled (flag can be set even if address tracing disabled)
- m_bExpectingDataAddress = ((by & DATA_ADDR_EXPECTED_FLAG) == DATA_ADDR_EXPECTED_FLAG) && m_config.isDataAddrTrace();
- m_bFoundDataAddress = false;
- m_curr_packet.SetDataOOOTag((by >> 2) & 0x3);
- if(!m_bExpectingDataAddress) {
- SendPacket();
- }
- }
- // vmid 0b00111100
- else if(by == 0x3c) {
- m_curr_packet.SetType(ETM3_PKT_VMID);
- }
- else
- {
- m_curr_packet.SetErrType(ETM3_PKT_RESERVED);
- throwPacketHeaderErr("Packet header reserved encoding");
- }
- }
- // normal data 0b00x0xx10
- else if((by & 0xD3 )== 0x02) {
- uint8_t size = ((by & 0x0C) >> 2);
- if(!m_config.isDataTrace()) {
- m_curr_packet.SetErrType(ETM3_PKT_BAD_TRACEMODE);
- throwPacketHeaderErr("Invalid data trace header (normal data) - not tracing data.");
- }
- m_curr_packet.SetType(ETM3_PKT_NORM_DATA);
- m_bExpectingDataAddress = ((by & DATA_ADDR_EXPECTED_FLAG) == DATA_ADDR_EXPECTED_FLAG) && m_config.isDataAddrTrace();
- m_bFoundDataAddress = false;
-
- // set this with the data bytes expected this packet, plus the header byte.
- m_bytesExpectedThisPkt = (short)( 1 + ((size == 3) ? 4 : size));
- if(!m_bExpectingDataAddress && (m_bytesExpectedThisPkt == 1)) {
- // single byte data packet, value = 0;
- m_curr_packet.SetDataValue(0);
- SendPacket();
- }
-
- }
- // data suppressed 0b01100010
- else if(by == 0x62) {
- if(!m_config.isDataTrace())
- {
- m_curr_packet.SetErrType(ETM3_PKT_BAD_TRACEMODE);
- throwPacketHeaderErr("Invalid data trace header (data suppressed) - not tracing data.");
- }
- m_curr_packet.SetType(ETM3_PKT_DATA_SUPPRESSED);
- SendPacket();
- }
- // value not traced 0b011x1010
- else if((by & 0xEF )== 0x6A) {
- if(!m_config.isDataTrace()) {
- m_curr_packet.SetErrType(ETM3_PKT_BAD_TRACEMODE);
- throwPacketHeaderErr("Invalid data trace header (value not traced) - not tracing data.");
- }
- m_curr_packet.SetType(ETM3_PKT_VAL_NOT_TRACED);
- m_bExpectingDataAddress = ((by & DATA_ADDR_EXPECTED_FLAG) == DATA_ADDR_EXPECTED_FLAG) && m_config.isDataAddrTrace();
- m_bFoundDataAddress = false;
- if(!m_bExpectingDataAddress) {
- SendPacket();
- }
- }
- // ignore 0b01100110
- else if(by == 0x66) {
- m_curr_packet.SetType(ETM3_PKT_IGNORE);
- SendPacket();
- }
- // context ID 0b01101110
- else if(by == 0x6E) {
- m_curr_packet.SetType(ETM3_PKT_CONTEXT_ID);
- m_bytesExpectedThisPkt = (short)(1 + m_config.CtxtIDBytes());
- }
- // exception return 0b01110110
- else if(by == 0x76) {
- m_curr_packet.SetType(ETM3_PKT_EXCEPTION_EXIT);
- SendPacket();
- }
- // exception entry 0b01111110
- else if(by == 0x7E) {
- m_curr_packet.SetType(ETM3_PKT_EXCEPTION_ENTRY);
- SendPacket();
- }
- // timestamp packet 0b01000x10
- else if((by & 0xFB )== 0x42)
- {
- m_curr_packet.SetType(ETM3_PKT_TIMESTAMP);
- }
- else
- {
- m_curr_packet.SetErrType(ETM3_PKT_RESERVED);
- throwPacketHeaderErr("Packet header reserved encoding.");
- }
- return OCSD_OK;
-}
-
-ocsd_err_t EtmV3PktProcImpl::processPayloadByte(uint8_t by)
-{
- bool bTopBitSet = false;
- bool packetDone = false;
-
- // pop byte into buffer
- m_currPacketData.push_back(by);
-
- switch(m_curr_packet.getType()) {
- default:
- throw ocsdError(OCSD_ERR_SEV_ERROR,OCSD_ERR_PKT_INTERP_FAIL,m_packet_index,m_chanIDCopy,"Interpreter failed - cannot process payload for unexpected or unsupported packet.");
- break;
-
- case ETM3_PKT_BRANCH_ADDRESS:
- bTopBitSet = (bool)((by & 0x80) == 0x80);
- if(m_config.isAltBranch()) // etm implements the alternative branch encoding
- {
- if(!bTopBitSet) // no continuation
- {
- if(!m_BranchPktNeedsException)
- {
- if((by & 0xC0) == 0x40)
- m_BranchPktNeedsException = true;
- else
- packetDone = true;
- }
- else
- packetDone = true;
- }
- }
- else
- {
- // standard encoding < 5 bytes cannot be exception branch
- // 5 byte packet
- if(m_currPacketData.size() == 5) {
- if((by & 0xC0) == 0x40)
- // expecting follow up byte(s)
- m_BranchPktNeedsException = true;
- else
- packetDone = true;
- }
- // waiting for exception packet
- else if(m_BranchPktNeedsException){
- if(!bTopBitSet)
- packetDone = true;
- }
- else {
- // not exception - end of packets
- if(!bTopBitSet)
- packetDone = true;
- }
- }
-
- if(packetDone)
- {
- OnBranchAddress();
- SendPacket();
- }
- break;
-
- case ETM3_PKT_BRANCH_OR_BYPASS_EOT:
- /*
- if((by != 0x00) || ( m_currPacketData.size() == ETM3_PKT_BUFF_SIZE)) {
- if(by == 0x80 && ( m_currPacketData.size() == 7)) {
- // branch 0 followed by A-sync!
- m_currPacketData.size() = 1;
- m_curr_packet.SetType(ETM3_PKT_BRANCH_ADDRESS;
- SendPacket();
- memcpy(m_currPacketData, &m_currPacketData[1],6);
- m_currPacketData.size() = 6;
- m_curr_packet.SetType(ETM3_PKT_A_SYNC;
- SendPacket();
- }
- else if( m_currPacketData.size() == 2) {
- // branch followed by another byte
- m_currPacketData.size() = 1;
- m_curr_packet.SetType(ETM3_PKT_BRANCH_ADDRESS;
- SendPacket();
- ProcessHeaderByte(by);
- }
- else if(by == 0x00) {
- // end of buffer...output something - incomplete / unknown.
- SendPacket();
- }
- else if(by == 0x01) {
- // 0x01 - 0x00 x N - 0x1
- // end of buffer...output something
- m_currPacketData.size()--;
- SendPacket();
- ProcessHeaderByte(by);
- }
- else {
- // branch followed by unknown sequence
- int oldidx = m_currPacketData.size();
- m_currPacketData.size() = 1;
- m_curr_packet.SetType(ETM3_PKT_BRANCH_ADDRESS;
- SendPacket();
- oldidx--;
- memcpy(m_currPacketData, &m_currPacketData[1],oldidx);
- m_currPacketData.size() = oldidx;
- SendBadPacket("ERROR : unknown sequence");
- }
- }*/
- // just ignore zeros
- break;
-
-
-
- case ETM3_PKT_A_SYNC:
- if(by == 0x00) {
- if( m_currPacketData.size() > 5) {
- // extra 0, need to lose one
-
- // set error type
- m_curr_packet.SetErrType(ETM3_PKT_BAD_SEQUENCE);
- // mark extra 0 for sending, retain remaining, restart in A-SYNC processing mode.
- setBytesPartPkt(1,PROC_DATA,ETM3_PKT_A_SYNC);
- throwMalformedPacketErr("A-Sync ?: Extra 0x00 in sequence");
- }
- }
- else if((by == 0x80) && ( m_currPacketData.size() == 6)) {
- SendPacket();
- m_bStreamSync = true;
- }
- else
- {
- m_curr_packet.SetErrType(ETM3_PKT_BAD_SEQUENCE);
- m_bytesProcessed--; // remove the last byte from the number processed to re-try
- m_currPacketData.pop_back(); // remove the last byte processed from the packet
- throwMalformedPacketErr("A-Sync ? : Unexpected byte in sequence");
- }
- break;
-
- case ETM3_PKT_CYCLE_COUNT:
- bTopBitSet = ((by & 0x80) == 0x80);
- if(!bTopBitSet || ( m_currPacketData.size() >= 6)) {
- m_currPktIdx = 1;
- m_curr_packet.SetCycleCount(extractCycleCount());
- SendPacket();
- }
- break;
-
- case ETM3_PKT_I_SYNC_CYCLE:
- if(!m_bIsync_got_cycle_cnt) {
- if(((by & 0x80) != 0x80) || ( m_currPacketData.size() >= 6)) {
- m_bIsync_got_cycle_cnt = true;
- }
- break;
- }
- // fall through when we have the first non-cycle count byte
- case ETM3_PKT_I_SYNC:
- if(m_bytesExpectedThisPkt == 0) {
- int cycCountBytes = m_currPacketData.size() - 2;
- int ctxtIDBytes = m_config.CtxtIDBytes();
- // bytes expected = header + n x ctxt id + info byte + 4 x addr;
- if(m_config.isInstrTrace())
- m_bytesExpectedThisPkt = cycCountBytes + 6 + ctxtIDBytes;
- else
- m_bytesExpectedThisPkt = 2 + ctxtIDBytes;
- m_IsyncInfoIdx = 1 + cycCountBytes + ctxtIDBytes;
- }
- if(( m_currPacketData.size() - 1) == (unsigned)m_IsyncInfoIdx) {
- m_bIsync_get_LSiP_addr = ((m_currPacketData[m_IsyncInfoIdx] & 0x80) == 0x80);
- }
-
- // if bytes collected >= bytes expected
- if( m_currPacketData.size() >= m_bytesExpectedThisPkt) {
- // if we still need the LSip Addr, then this is not part of the expected
- // count as we have no idea how long it is
- if(m_bIsync_get_LSiP_addr) {
- if((by & 0x80) != 0x80) {
- OnISyncPacket();
- }
- }
- else {
- // otherwise, output now
- OnISyncPacket();
- }
- }
- break;
-
- case ETM3_PKT_NORM_DATA:
- if(m_bExpectingDataAddress && !m_bFoundDataAddress) {
- // look for end of continuation bits
- if((by & 0x80) != 0x80) {
- m_bFoundDataAddress = true;
- // add on the bytes we have found for the address to the expected data bytes
- m_bytesExpectedThisPkt += ( m_currPacketData.size() - 1);
- }
- else
- break;
- }
- // found any data address we were expecting
- else if(m_bytesExpectedThisPkt == m_currPacketData.size()) {
- m_currPktIdx = 1;
- if(m_bExpectingDataAddress)
- {
- uint8_t bits = 0, beVal = 0;
- bool updateBE = false;
- uint32_t dataAddress = extractDataAddress(bits,updateBE,beVal);
- m_curr_packet.UpdateDataAddress(dataAddress, bits);
- if(updateBE)
- m_curr_packet.UpdateDataEndian(beVal);
- }
- m_curr_packet.SetDataValue(extractDataValue((m_currPacketData[0] >> 2) & 0x3));
- SendPacket();
- }
- break;
-
- case ETM3_PKT_OOO_DATA:
- if(m_bytesExpectedThisPkt == m_currPacketData.size())
- {
- m_currPktIdx = 1;
- m_curr_packet.SetDataValue(extractDataValue((m_currPacketData[0] >> 2) & 0x3));
- m_curr_packet.SetDataOOOTag((m_currPacketData[0] >> 5) & 0x3);
- SendPacket();
- }
- if(m_bytesExpectedThisPkt < m_currPacketData.size())
- throwMalformedPacketErr("Malformed out of order data packet.");
- break;
-
- // both these expect an address only.
- case ETM3_PKT_VAL_NOT_TRACED:
- case ETM3_PKT_OOO_ADDR_PLC: // we set the tag earlier.
- if(m_bExpectingDataAddress) {
- // look for end of continuation bits
- if((by & 0x80) != 0x80) {
- uint8_t bits = 0, beVal = 0;
- bool updateBE = false;
- m_currPktIdx = 1;
- uint32_t dataAddress = extractDataAddress(bits,updateBE,beVal);
- m_curr_packet.UpdateDataAddress(dataAddress, bits);
- if(updateBE)
- m_curr_packet.UpdateDataEndian(beVal);
- SendPacket();
- }
- }
- break;
-
- case ETM3_PKT_CONTEXT_ID:
- if(m_bytesExpectedThisPkt == m_currPacketData.size()) {
- m_currPktIdx = 1;
- m_curr_packet.UpdateContextID(extractCtxtID());
- SendPacket();
- }
- if(m_bytesExpectedThisPkt < m_currPacketData.size())
- throwMalformedPacketErr("Malformed context id packet.");
- break;
-
- case ETM3_PKT_TIMESTAMP:
- if((by & 0x80) != 0x80) {
- uint8_t tsBits = 0;
- m_currPktIdx = 1;
- uint64_t tsVal = extractTimestamp(tsBits);
- m_curr_packet.UpdateTimestamp(tsVal,tsBits);
- SendPacket();
- }
- break;
-
- case ETM3_PKT_VMID:
- // single byte payload
- m_curr_packet.UpdateVMID(by);
- SendPacket();
- break;
- }
-
- return OCSD_OK;
-}
-
-// extract branch address packet at current location in packet data.
-void EtmV3PktProcImpl::OnBranchAddress()
-{
- int validBits = 0;
- ocsd_vaddr_t partAddr = 0;
-
- partAddr = extractBrAddrPkt(validBits);
- m_curr_packet.UpdateAddress(partAddr,validBits);
-}
-
-uint32_t EtmV3PktProcImpl::extractBrAddrPkt(int &nBitsOut)
-{
- static int addrshift[] = {
- 2, // ARM_ISA
- 1, // thumb
- 1, // thumb EE
- 0 // jazelle
- };
-
- static uint8_t addrMask[] = { // byte 5 masks
- 0x7, // ARM_ISA
- 0xF, // thumb
- 0xF, // thumb EE
- 0x1F // jazelle
- };
-
- static int addrBits[] = { // address bits in byte 5
- 3, // ARM_ISA
- 4, // thumb
- 4, // thumb EE
- 5 // jazelle
- };
-
- static ocsd_armv7_exception exceptionTypeARMdeprecated[] = {
- Excp_Reset,
- Excp_IRQ,
- Excp_Reserved,
- Excp_Reserved,
- Excp_Jazelle,
- Excp_FIQ,
- Excp_AsyncDAbort,
- Excp_DebugHalt
- };
-
- bool CBit = true;
- int bytecount = 0;
- int bitcount = 0;
- int shift = 0;
- int isa_idx = 0;
- uint32_t value = 0;
- uint8_t addrbyte;
- bool byte5AddrUpdate = false;
-
- while(CBit && bytecount < 4)
- {
- checkPktLimits();
- addrbyte = m_currPacketData[m_currPktIdx++];
- CBit = (bool)((addrbyte & 0x80) != 0);
- shift = bitcount;
- if(bytecount == 0)
- {
- addrbyte &= ~0x81;
- bitcount+=6;
- addrbyte >>= 1;
- }
- else
- {
- // bytes 2-4, no continuation, alt format uses bit 6 to indicate following exception bytes
- if(m_config.isAltBranch() && !CBit)
- {
- // last compressed address byte with exception
- if((addrbyte & 0x40) == 0x40)
- extractExceptionData();
- addrbyte &= 0x3F;
- bitcount+=6;
- }
- else
- {
- addrbyte &= 0x7F;
- bitcount+=7;
- }
- }
- value |= ((uint32_t)addrbyte) << shift;
- bytecount++;
- }
-
- // byte 5 - indicates following exception bytes (or not!)
- if(CBit)
- {
- checkPktLimits();
- addrbyte = m_currPacketData[m_currPktIdx++];
-
- // deprecated original byte 5 encoding - ARM state exception only
- if(addrbyte & 0x80)
- {
- uint8_t excep_num = (addrbyte >> 3) & 0x7;
- m_curr_packet.UpdateISA(ocsd_isa_arm);
- m_curr_packet.SetException(exceptionTypeARMdeprecated[excep_num], excep_num, (addrbyte & 0x40) ? true : false,m_config.isV7MArch());
- }
- else
- // normal 5 byte branch, or uses exception bytes.
- {
- // go grab the exception bits to correctly interpret the ISA state
- if((addrbyte & 0x40) == 0x40)
- extractExceptionData();
-
- if((addrbyte & 0xB8) == 0x08)
- m_curr_packet.UpdateISA(ocsd_isa_arm);
- else if ((addrbyte & 0xB0) == 0x10)
- m_curr_packet.UpdateISA(m_curr_packet.AltISA() ? ocsd_isa_tee : ocsd_isa_thumb2);
- else if ((addrbyte & 0xA0) == 0x20)
- m_curr_packet.UpdateISA(ocsd_isa_jazelle);
- else
- throwMalformedPacketErr("Malformed Packet - Unknown ISA.");
- }
-
- byte5AddrUpdate = true; // need to update the address value from byte 5
- }
-
- // figure out the correct ISA shifts for the address bits
- switch(m_curr_packet.ISA())
- {
- case ocsd_isa_thumb2: isa_idx = 1; break;
- case ocsd_isa_tee: isa_idx = 2; break;
- case ocsd_isa_jazelle: isa_idx = 3; break;
- default: break;
- }
-
- if(byte5AddrUpdate)
- {
- value |= ((uint32_t)(addrbyte & addrMask[isa_idx])) << bitcount;
- bitcount += addrBits[isa_idx];
- }
-
- // finally align according to ISA
- shift = addrshift[isa_idx];
- value <<= shift;
- bitcount += shift;
-
- nBitsOut = bitcount;
- return value;
-}
-
-// extract exception data from bytes after address.
-void EtmV3PktProcImpl::extractExceptionData()
-{
- static const ocsd_armv7_exception exceptionTypesStd[] = {
- Excp_NoException, Excp_DebugHalt, Excp_SMC, Excp_Hyp,
- Excp_AsyncDAbort, Excp_Jazelle, Excp_Reserved, Excp_Reserved,
- Excp_Reset, Excp_Undef, Excp_SVC, Excp_PrefAbort,
- Excp_SyncDataAbort, Excp_Generic, Excp_IRQ, Excp_FIQ
- };
-
- static const ocsd_armv7_exception exceptionTypesCM[] = {
- Excp_NoException, Excp_CMIRQn, Excp_CMIRQn, Excp_CMIRQn,
- Excp_CMIRQn, Excp_CMIRQn, Excp_CMIRQn, Excp_CMIRQn,
- Excp_CMIRQn, Excp_CMUsageFault, Excp_CMNMI, Excp_SVC,
- Excp_CMDebugMonitor, Excp_CMMemManage, Excp_CMPendSV, Excp_CMSysTick,
- Excp_Reserved, Excp_Reset, Excp_Reserved, Excp_CMHardFault,
- Excp_Reserved, Excp_CMBusFault, Excp_Reserved, Excp_Reserved
- };
-
- uint16_t exceptionNum = 0;
- ocsd_armv7_exception excep_type = Excp_Reserved;
- int resume = 0;
- int irq_n = 0;
- bool cancel_prev_instr = 0;
- bool Byte2 = false;
-
- checkPktLimits();
-
- //**** exception info Byte 0
- uint8_t dataByte = m_currPacketData[m_currPktIdx++];
-
- m_curr_packet.UpdateNS(dataByte & 0x1);
- exceptionNum |= (dataByte >> 1) & 0xF;
- cancel_prev_instr = (dataByte & 0x20) ? true : false;
- m_curr_packet.UpdateAltISA(((dataByte & 0x40) != 0) ? 1 : 0);
-
- //** another byte?
- if(dataByte & 0x80)
- {
- checkPktLimits();
- dataByte = m_currPacketData[m_currPktIdx++];
-
- if(dataByte & 0x40)
- Byte2 = true; //** immediate info byte 2, skipping 1
- else
- {
- //**** exception info Byte 1
- if(m_config.isV7MArch())
- {
- exceptionNum |= ((uint16_t)(dataByte & 0x1F)) << 4;
- }
- m_curr_packet.UpdateHyp(dataByte & 0x20 ? 1 : 0);
-
- if(dataByte & 0x80)
- {
- checkPktLimits();
- dataByte = m_currPacketData[m_currPktIdx++];
- Byte2 = true;
- }
- }
- //**** exception info Byte 2
- if(Byte2)
- {
- resume = dataByte & 0xF;
- }
- }
-
- // set the exception type - according to the number and core profile
- if(m_config.isV7MArch())
- {
- exceptionNum &= 0x1FF;
- if(exceptionNum < 0x018)
- excep_type= exceptionTypesCM[exceptionNum];
- else
- excep_type = Excp_CMIRQn;
-
- if(excep_type == Excp_CMIRQn)
- {
- if(exceptionNum > 0x018)
- irq_n = exceptionNum - 0x10;
- else if(exceptionNum == 0x008)
- irq_n = 0;
- else
- irq_n = exceptionNum;
- }
- }
- else
- {
- exceptionNum &= 0xF;
- excep_type = exceptionTypesStd[exceptionNum];
- }
- m_curr_packet.SetException(excep_type, exceptionNum, cancel_prev_instr,m_config.isV7MArch(), irq_n,resume);
-}
-
-void EtmV3PktProcImpl::checkPktLimits()
-{
- // index running off the end of the packet means a malformed packet.
- if(m_currPktIdx >= m_currPacketData.size())
- throwMalformedPacketErr("Malformed Packet - oversized packet.");
-}
-
-uint32_t EtmV3PktProcImpl::extractCtxtID()
-{
- uint32_t ctxtID = 0;
- int size = m_config.CtxtIDBytes();
-
- // check we have enough data
- if((m_currPktIdx + size) > m_currPacketData.size())
- throwMalformedPacketErr("Too few bytes to extract context ID.");
-
- switch(size)
- {
- case 1:
- ctxtID = (uint32_t)m_currPacketData[m_currPktIdx];
- m_currPktIdx++;
- break;
-
- case 2:
- ctxtID = (uint32_t)m_currPacketData[m_currPktIdx]
- | ((uint32_t)m_currPacketData[m_currPktIdx+1]) << 8;
- m_currPktIdx+=2;
- break;
-
- case 4:
- ctxtID = (uint32_t)m_currPacketData[m_currPktIdx]
- | ((uint32_t)m_currPacketData[m_currPktIdx+1]) << 8
- | ((uint32_t)m_currPacketData[m_currPktIdx+2]) << 16
- | ((uint32_t)m_currPacketData[m_currPktIdx+3]) << 24;
- m_currPktIdx+=4;
- break;
- }
- return ctxtID;
-}
-
-uint64_t EtmV3PktProcImpl::extractTimestamp(uint8_t &tsBits)
-{
- uint64_t ts = 0;
- unsigned tsMaxBytes = m_config.TSPkt64() ? 9 : 7;
- unsigned tsCurrBytes = 0;
- bool bCont = true;
- uint8_t mask = 0x7F;
- uint8_t last_mask = m_config.TSPkt64() ? 0xFF : 0x3F;
- uint8_t ts_iter_bits = 7;
- uint8_t ts_last_iter_bits = m_config.TSPkt64() ? 8 : 6;
- uint8_t currByte;
- tsBits = 0;
-
- while((tsCurrBytes < tsMaxBytes) && bCont)
- {
- if(m_currPacketData.size() < (m_currPktIdx + tsCurrBytes + 1))
- throwMalformedPacketErr("Insufficient bytes to extract timestamp.");
-
- currByte = m_currPacketData[m_currPktIdx+tsCurrBytes];
- ts |= ((uint64_t)(currByte & mask)) << (7 * tsCurrBytes);
- tsCurrBytes++;
- tsBits += ts_iter_bits;
- bCont = ((0x80 & currByte) == 0x80);
- if(tsCurrBytes == (tsMaxBytes - 1))
- {
- mask = last_mask;
- ts_iter_bits = ts_last_iter_bits;
- }
- }
- m_currPktIdx += tsCurrBytes;
- return ts;
-}
-
-
-uint32_t EtmV3PktProcImpl::extractDataAddress(uint8_t &bits, bool &updateBE, uint8_t &beVal)
-{
- uint32_t dataAddr = 0;
- int bytesIdx = 0;
- bool bCont = true;
- uint8_t currByte = 0;
-
- updateBE = false;
- bits = 0;
-
- while(bCont)
- {
- checkPktLimits();
- currByte = m_currPacketData[m_currPktIdx++] & ((bytesIdx == 4) ? 0x0F : 0x7F);
- dataAddr |= (((uint32_t)currByte) << (bytesIdx * 7));
- bCont = ((currByte & 0x80) == 0x80);
- if(bytesIdx == 4)
- {
- bits += 4;
- updateBE = true;
- beVal = ((currByte >> 4) & 0x1);
- bCont = false;
- }
- else
- bits+=7;
- bytesIdx++;
- }
- return dataAddr;
-}
-
-uint32_t EtmV3PktProcImpl::extractDataValue(const int dataByteSize)
-{
- static int bytesReqTable[] = { 0,1,2,4 };
-
- uint32_t dataVal = 0;
- int bytesUsed = 0;
- int bytesReq = bytesReqTable[dataByteSize & 0x3];
- while(bytesUsed < bytesReq)
- {
- checkPktLimits();
- dataVal |= (((uint32_t)m_currPacketData[m_currPktIdx++]) << (bytesUsed * 8));
- bytesUsed++;
- }
- return dataVal;
-}
-
-
-uint32_t EtmV3PktProcImpl::extractCycleCount()
-{
- uint32_t cycleCount = 0;
- int byteIdx = 0;
- uint8_t mask = 0x7F;
- bool bCond = true;
- uint8_t currByte = 0;
-
- while(bCond)
- {
- checkPktLimits();
- currByte = m_currPacketData[m_currPktIdx++];
- cycleCount |= ((uint32_t)(currByte & mask)) << (7 * byteIdx);
- bCond = ((currByte & 0x80) == 0x80);
- byteIdx++;
-
- if(byteIdx == 4)
- mask = 0x0F;
-
- if(byteIdx == 5)
- bCond = false;
- }
- return cycleCount;
-}
-
-void EtmV3PktProcImpl::OnISyncPacket()
-{
- uint8_t iSyncInfoByte = 0;
- uint32_t instrAddr = 0, LSiPAddr = 0;
- int LSiPBits = 0;
- uint8_t T = 0, J = 0, AltISA = 0;
-
- m_currPktIdx = 1;
- if(m_bIsync_got_cycle_cnt)
- {
- m_curr_packet.SetCycleCount(extractCycleCount());
- m_curr_packet.SetISyncHasCC();
- }
-
- if(m_config.CtxtIDBytes() != 0)
- {
- m_curr_packet.UpdateContextID(extractCtxtID());
- }
-
- // extract context info
- iSyncInfoByte = m_currPacketData[m_currPktIdx++];
- m_curr_packet.SetISyncReason((ocsd_iSync_reason)((iSyncInfoByte >> 5) & 0x3));
- J = (iSyncInfoByte >> 4) & 0x1;
- AltISA = m_config.MinorRev() >= 3 ? (iSyncInfoByte >> 2) & 0x1 : 0;
- m_curr_packet.UpdateNS((iSyncInfoByte >> 3) & 0x1);
- if(m_config.hasVirtExt())
- m_curr_packet.UpdateHyp((iSyncInfoByte >> 1) & 0x1);
-
- // main address value - full 32 bit address value
- if(m_config.isInstrTrace())
- {
- for(int i = 0; i < 4; i++)
- instrAddr |= ((uint32_t)m_currPacketData[m_currPktIdx++]) << (8*i);
- T = instrAddr & 0x1; // get the T bit.
- instrAddr &= ~0x1; // remove from address.
- m_curr_packet.UpdateAddress(instrAddr,32);
-
- // enough data now to set the instruction set.
- ocsd_isa currISA = ocsd_isa_arm;
- if(J)
- currISA = ocsd_isa_jazelle;
- else if(T)
- currISA = AltISA ? ocsd_isa_tee : ocsd_isa_thumb2;
- m_curr_packet.UpdateISA(currISA);
-
- // possible follow up address value - rarely uses unless trace enabled during
- // load and store instruction executing on top of other instruction.
- if(m_bIsync_get_LSiP_addr)
- {
- LSiPAddr = extractBrAddrPkt(LSiPBits);
- // follow up address value is compressed relative to the main value
- // we store this in the data address value temporarily.
- m_curr_packet.UpdateDataAddress(instrAddr,32);
- m_curr_packet.UpdateDataAddress(LSiPAddr,LSiPBits);
- }
- }
- else
- m_curr_packet.SetISyncNoAddr();
-
- SendPacket(); // mark ready to send
-}
-
-/* End of File trc_pkt_proc_etmv3_impl.cpp */
diff --git a/contrib/opencsd/decoder/source/etmv3/trc_pkt_proc_etmv3_impl.h b/contrib/opencsd/decoder/source/etmv3/trc_pkt_proc_etmv3_impl.h
deleted file mode 100644
index a8e4fd1b5373..000000000000
--- a/contrib/opencsd/decoder/source/etmv3/trc_pkt_proc_etmv3_impl.h
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * \file trc_pkt_proc_etmv3_impl.h
- * \brief OpenCSD :
- *
- * \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.
- */
-
-#ifndef ARM_TRC_PKT_PROC_ETMV3_IMPL_H_INCLUDED
-#define ARM_TRC_PKT_PROC_ETMV3_IMPL_H_INCLUDED
-
-#include "opencsd/etmv3/trc_pkt_proc_etmv3.h"
-#include "opencsd/etmv3/trc_cmp_cfg_etmv3.h"
-#include "opencsd/etmv3/trc_pkt_elem_etmv3.h"
-
-#define MAX_PACKET_SIZE 32
-#define ASYNC_SIZE 6
-
-class EtmV3PktProcImpl
-{
-public:
- EtmV3PktProcImpl();
- ~EtmV3PktProcImpl();
-
- void Initialise(TrcPktProcEtmV3 *p_interface);
-
- ocsd_err_t Configure(const EtmV3Config *p_config);
-
-
- ocsd_datapath_resp_t processData( const ocsd_trc_index_t index,
- const uint32_t dataBlockSize,
- const uint8_t *pDataBlock,
- uint32_t *numBytesProcessed);
- ocsd_datapath_resp_t onEOT();
- ocsd_datapath_resp_t onReset();
- ocsd_datapath_resp_t onFlush();
- const bool isBadPacket() const;
-
-protected:
- typedef enum _process_state {
- WAIT_SYNC,
- PROC_HDR,
- PROC_DATA,
- SEND_PKT,
- PROC_ERR,
- } process_state;
-
- process_state m_process_state;
-
-
- void InitPacketState(); // clear current packet state.
- void InitProcessorState(); // clear all previous process state
-
- // byte processing
-
- uint32_t waitForSync(const uint32_t dataBlockSize, const uint8_t *pDataBlock); //!< look for sync, return none-sync bytes processed.
- ocsd_err_t processHeaderByte(uint8_t by);
- ocsd_err_t processPayloadByte(uint8_t by);
-
- // packet handling - main routines
- void OnBranchAddress();
- void OnISyncPacket();
- uint32_t extractCtxtID();
- uint64_t extractTimestamp(uint8_t &tsBits);
- uint32_t extractDataAddress(uint8_t &bits, bool &updateBE, uint8_t &beVal);
- uint32_t extractDataValue(const int dataByteSize);
- uint32_t extractCycleCount();
-
- // packet handling - helper routines
- uint32_t extractBrAddrPkt(int &nBitsOut);
- void extractExceptionData();
- void checkPktLimits();
- void setBytesPartPkt(const int numBytes, const process_state nextState, const ocsd_etmv3_pkt_type nextType); // set first n bytes from current packet to be sent via alt packet.
-
- // packet output
- void SendPacket(); // mark state for packet output
- ocsd_datapath_resp_t outputPacket(); // output a packet
-
- // bad packets
- void throwMalformedPacketErr(const char *pszErrMsg);
- void throwPacketHeaderErr(const char *pszErrMsg);
- void throwUnsupportedErr(const char *pszErrMsg);
-
- uint32_t m_bytesProcessed; // bytes processed by the process data routine (index into input buffer)
- std::vector<uint8_t> m_currPacketData; // raw data
- uint32_t m_currPktIdx; // index into packet when expanding
- EtmV3TrcPacket m_curr_packet; // expanded packet
-
- std::vector<uint8_t> m_partPktData; // raw data when we need to split a packet.
- bool m_bSendPartPkt; // mark the part packet as the one we send.
- process_state m_post_part_pkt_state; // state to set after part packet set
- ocsd_etmv3_pkt_type m_post_part_pkt_type; // reset the packet type.
-
- // process state
- bool m_bStreamSync; //!< true if we have synced this stream
- bool m_bStartOfSync; //!< true if we have a start of sync.
-
- // packet state
- uint32_t m_bytesExpectedThisPkt; // used by some of the variable packet length types.
- bool m_BranchPktNeedsException;
- bool m_bIsync_got_cycle_cnt;
- bool m_bIsync_get_LSiP_addr;
- int m_IsyncInfoIdx;
- bool m_bExpectingDataAddress;
- bool m_bFoundDataAddress;
-
- ocsd_trc_index_t m_packet_index; // index of the start of the current packet
- ocsd_trc_index_t m_packet_curr_byte_index; // index of the current byte.
-
- bool m_isInit;
- TrcPktProcEtmV3 *m_interface; /**< The interface to the other decode components */
-
- EtmV3Config m_config;
-
- uint8_t m_chanIDCopy;
-};
-
-
-inline void EtmV3PktProcImpl::SendPacket()
-{
- m_process_state = SEND_PKT;
-}
-
-inline void EtmV3PktProcImpl::throwMalformedPacketErr(const char *pszErrMsg)
-{
- throw ocsdError(OCSD_ERR_SEV_ERROR,OCSD_ERR_BAD_PACKET_SEQ,m_packet_index,m_chanIDCopy,pszErrMsg);
-}
-
-inline void EtmV3PktProcImpl::throwPacketHeaderErr(const char *pszErrMsg)
-{
- throw ocsdError(OCSD_ERR_SEV_ERROR,OCSD_ERR_INVALID_PCKT_HDR,m_packet_index,m_chanIDCopy,pszErrMsg);
-}
-
-inline void EtmV3PktProcImpl::throwUnsupportedErr(const char *pszErrMsg)
-{
- throw ocsdError(OCSD_ERR_SEV_ERROR,OCSD_ERR_HW_CFG_UNSUPP,m_packet_index,m_chanIDCopy,pszErrMsg);
-}
-
-
-inline const bool EtmV3PktProcImpl::isBadPacket() const
-{
- return m_curr_packet.isBadPacket();
-}
-
-
-#endif // ARM_TRC_PKT_PROC_ETMV3_IMPL_H_INCLUDED
-
-/* End of File trc_pkt_proc_etmv3_impl.h */
diff --git a/contrib/opencsd/decoder/source/etmv4/trc_cmp_cfg_etmv4.cpp b/contrib/opencsd/decoder/source/etmv4/trc_cmp_cfg_etmv4.cpp
deleted file mode 100644
index 9f5b37396b46..000000000000
--- a/contrib/opencsd/decoder/source/etmv4/trc_cmp_cfg_etmv4.cpp
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * \file trc_cmp_cfg_etmv4.cpp
- * \brief OpenCSD :
- *
- * \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 "opencsd/etmv4/trc_cmp_cfg_etmv4.h"
-
-EtmV4Config::EtmV4Config()
-{
- m_cfg.reg_idr0 = 0x28000EA1;
- m_cfg.reg_idr1 = 0x4100F403;
- m_cfg.reg_idr2 = 0x00000488;
- m_cfg.reg_idr8 = 0;
- m_cfg.reg_idr9 = 0;
- m_cfg.reg_idr10 = 0;
- m_cfg.reg_idr11 = 0;
- m_cfg.reg_idr12 = 0;
- m_cfg.reg_idr13 = 0;
- m_cfg.reg_configr = 0xC1;
- m_cfg.reg_traceidr = 0;
- m_cfg.arch_ver = ARCH_V7;
- m_cfg.core_prof = profile_CortexA;
-
- PrivateInit();
-}
-
-EtmV4Config::EtmV4Config(const ocsd_etmv4_cfg *cfg_regs)
-{
- m_cfg = *cfg_regs;
- PrivateInit();
-}
-
-EtmV4Config & EtmV4Config::operator=(const ocsd_etmv4_cfg *p_cfg)
-{
- m_cfg = *p_cfg;
- PrivateInit();
- return *this;
-}
-
-void EtmV4Config::PrivateInit()
-{
- m_QSuppCalc = false;
- m_QSuppFilter = false;
- m_QSuppType = Q_NONE;
- m_VMIDSzCalc = false;
- m_VMIDSize = 0;
- m_condTraceCalc = false;
- m_CondTrace = COND_TR_DIS;
- m_MajVer = (uint8_t)((m_cfg.reg_idr1 >> 8) & 0xF);
- m_MinVer = (uint8_t)((m_cfg.reg_idr1 >> 4) & 0xF);
-}
-
-void EtmV4Config::CalcQSupp()
-{
- QSuppType qtypes[] = {
- Q_NONE,
- Q_ICOUNT_ONLY,
- Q_NO_ICOUNT_ONLY,
- Q_FULL
- };
- uint8_t Qsupp = (m_cfg.reg_idr0 >> 15) & 0x3;
- m_QSuppType = qtypes[Qsupp];
- m_QSuppFilter = (bool)((m_cfg.reg_idr0 & 0x4000) == 0x4000) && (m_QSuppType != Q_NONE);
- m_QSuppCalc = true;
-}
-
-void EtmV4Config::CalcVMIDSize()
-{
- uint32_t vmidszF = (m_cfg.reg_idr2 >> 10) & 0x1F;
- if(vmidszF == 1)
- m_VMIDSize = 8;
- else if(MinVersion() > 0)
- {
- if(vmidszF == 2)
- m_VMIDSize = 16;
- else if(vmidszF == 4)
- m_VMIDSize = 32;
- }
- m_VMIDSzCalc = true;
-}
-
-/* End of File trc_cmp_cfg_etmv4.cpp */
diff --git a/contrib/opencsd/decoder/source/etmv4/trc_etmv4_stack_elem.cpp b/contrib/opencsd/decoder/source/etmv4/trc_etmv4_stack_elem.cpp
deleted file mode 100644
index 8916c7dc350d..000000000000
--- a/contrib/opencsd/decoder/source/etmv4/trc_etmv4_stack_elem.cpp
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
-* \file trc_etmv4_stack_elem.cpp
-* \brief OpenCSD : ETMv4 decoder
-*
-* \copyright Copyright (c) 2017, 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 "opencsd/etmv4/trc_etmv4_stack_elem.h"
-
-/* implementation of P0 element stack in ETM v4 trace*/
-TrcStackElem *EtmV4P0Stack::createParamElemNoParam(const p0_elem_t p0_type, const bool isP0, const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, bool back /*= false*/)
-{
- TrcStackElem *pElem = new (std::nothrow) TrcStackElem(p0_type, isP0, root_pkt, root_index);
- if (pElem)
- {
- if (back)
- push_back(pElem);
- else
- push_front(pElem);
- }
- return pElem;
-}
-
-TrcStackElemParam *EtmV4P0Stack::createParamElem(const p0_elem_t p0_type, const bool isP0, const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const std::vector<uint32_t> &params)
-{
- TrcStackElemParam *pElem = new (std::nothrow) TrcStackElemParam(p0_type, isP0, root_pkt, root_index);
- if (pElem)
- {
- int param_idx = 0;
- int params_to_fill = params.size();
- while ((param_idx < 4) && params_to_fill)
- {
- pElem->setParam(params[param_idx], param_idx);
- param_idx++;
- params_to_fill--;
- }
- push_front(pElem);
- }
- return pElem;
-}
-
-TrcStackElemAtom *EtmV4P0Stack::createAtomElem(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const ocsd_pkt_atom &atom)
-{
- TrcStackElemAtom *pElem = new (std::nothrow) TrcStackElemAtom(root_pkt, root_index);
- if (pElem)
- {
- pElem->setAtom(atom);
- push_front(pElem);
- }
- return pElem;
-}
-
-TrcStackElemExcept *EtmV4P0Stack::createExceptElem(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const bool bSame, const uint16_t excepNum)
-{
- TrcStackElemExcept *pElem = new (std::nothrow) TrcStackElemExcept(root_pkt, root_index);
- if (pElem)
- {
- pElem->setExcepNum(excepNum);
- pElem->setPrevSame(bSame);
- push_front(pElem);
- }
- return pElem;
-}
-
-TrcStackElemCtxt *EtmV4P0Stack::createContextElem(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const etmv4_context_t &context)
-{
- TrcStackElemCtxt *pElem = new (std::nothrow) TrcStackElemCtxt(root_pkt, root_index);
- if (pElem)
- {
- pElem->setContext(context);
- push_front(pElem);
- }
- return pElem;
-
-}
-
-TrcStackElemAddr *EtmV4P0Stack::createAddrElem(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const etmv4_addr_val_t &addr_val)
-{
- TrcStackElemAddr *pElem = new (std::nothrow) TrcStackElemAddr(root_pkt, root_index);
- if (pElem)
- {
- pElem->setAddr(addr_val);
- push_front(pElem);
- }
- return pElem;
-}
-
-/* End of file trc_etmv4_stack_elem.cpp */
diff --git a/contrib/opencsd/decoder/source/etmv4/trc_pkt_decode_etmv4i.cpp b/contrib/opencsd/decoder/source/etmv4/trc_pkt_decode_etmv4i.cpp
deleted file mode 100644
index 2eb6cbc3f5bf..000000000000
--- a/contrib/opencsd/decoder/source/etmv4/trc_pkt_decode_etmv4i.cpp
+++ /dev/null
@@ -1,1155 +0,0 @@
-/*
- * \file trc_pkt_decode_etmv4i.cpp
- * \brief OpenCSD : ETMv4 decoder
- *
- * \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 "opencsd/etmv4/trc_pkt_decode_etmv4i.h"
-
-#include "common/trc_gen_elem.h"
-
-
-#define DCD_NAME "DCD_ETMV4"
-
-static const uint32_t ETMV4_SUPPORTED_DECODE_OP_FLAGS = OCSD_OPFLG_PKTDEC_COMMON;
-
-TrcPktDecodeEtmV4I::TrcPktDecodeEtmV4I()
- : TrcPktDecodeBase(DCD_NAME)
-{
- initDecoder();
-}
-
-TrcPktDecodeEtmV4I::TrcPktDecodeEtmV4I(int instIDNum)
- : TrcPktDecodeBase(DCD_NAME,instIDNum)
-{
- initDecoder();
-}
-
-TrcPktDecodeEtmV4I::~TrcPktDecodeEtmV4I()
-{
-}
-
-/*********************** implementation packet decoding interface */
-
-ocsd_datapath_resp_t TrcPktDecodeEtmV4I::processPacket()
-{
- ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
- bool bPktDone = false;
-
- while(!bPktDone)
- {
- switch (m_curr_state)
- {
- case NO_SYNC:
- // output the initial not synced packet to the sink
- m_output_elem.setType(OCSD_GEN_TRC_ELEM_NO_SYNC);
- resp = outputTraceElement(m_output_elem);
- m_curr_state = WAIT_SYNC;
- // fall through to check if the current packet is the async we are waiting for.
- break;
-
- case WAIT_SYNC:
- if(m_curr_packet_in->getType() == ETM4_PKT_I_ASYNC)
- m_curr_state = WAIT_TINFO;
- bPktDone = true;
- break;
-
- case WAIT_TINFO:
- m_need_ctxt = true;
- m_need_addr = true;
- if(m_curr_packet_in->getType() == ETM4_PKT_I_TRACE_INFO)
- {
- doTraceInfoPacket();
- m_curr_state = DECODE_PKTS;
- m_return_stack.flush();
- }
- bPktDone = true;
- break;
-
- case DECODE_PKTS:
- resp = decodePacket(bPktDone); // this may change the state to commit elem;
- break;
-
- case COMMIT_ELEM:
- resp = commitElements(bPktDone); // this will change the state to DECODE_PKTS once all elem committed.
- break;
-
- }
- }
- return resp;
-}
-
-ocsd_datapath_resp_t TrcPktDecodeEtmV4I::onEOT()
-{
- ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
- m_flush_EOT = true;
- resp = flushEOT();
- return resp;
-}
-
-ocsd_datapath_resp_t TrcPktDecodeEtmV4I::onReset()
-{
- ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
- resetDecoder();
- return resp;
-}
-
-ocsd_datapath_resp_t TrcPktDecodeEtmV4I::onFlush()
-{
- ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
-
- // continue exception processing (can't go through processPacket as elements no longer on stack)
- if(m_excep_info.proc != EXCEP_POP)
- resp = processException();
- // continue ongoing output operations on comitted elements.
- else if(m_curr_state == COMMIT_ELEM)
- resp = processPacket();
- // continue flushing at end of trace
- else if(m_flush_EOT)
- resp = flushEOT();
- return resp;
-}
-
-ocsd_err_t TrcPktDecodeEtmV4I::onProtocolConfig()
-{
- ocsd_err_t err = OCSD_OK;
-
- // set some static config elements
- m_CSID = m_config->getTraceID();
- m_max_spec_depth = m_config->MaxSpecDepth();
- m_p0_key_max = m_config->P0_Key_Max();
- m_cond_key_max_incr = m_config->CondKeyMaxIncr();
-
- // set up static trace instruction decode elements
- m_instr_info.dsb_dmb_waypoints = 0;
- m_instr_info.wfi_wfe_branch = m_config->wfiwfeBranch() ? 1 : 0;
- m_instr_info.pe_type.arch = m_config->archVersion();
- m_instr_info.pe_type.profile = m_config->coreProfile();
-
- m_IASize64 = (m_config->iaSizeMax() == 64);
-
- if (m_config->enabledRetStack())
- {
- m_return_stack.set_active(true);
-#ifdef TRC_RET_STACK_DEBUG
- m_return_stack.set_dbg_logger(this);
-#endif
- }
-
- // check config compatible with current decoder support level.
- // at present no data trace, no spec depth, no return stack, no QE
- // Remove these checks as support is added.
- if(m_max_spec_depth != 0)
- {
- err = OCSD_ERR_HW_CFG_UNSUPP;
- LogError(ocsdError(OCSD_ERR_SEV_ERROR,OCSD_ERR_HW_CFG_UNSUPP,"ETMv4 instruction decode : None-zero speculation depth not supported"));
- }
- else if(m_config->enabledDataTrace())
- {
- err = OCSD_ERR_HW_CFG_UNSUPP;
- LogError(ocsdError(OCSD_ERR_SEV_ERROR,OCSD_ERR_HW_CFG_UNSUPP,"ETMv4 instruction decode : Data trace elements not supported"));
- }
- else if(m_config->enabledLSP0Trace())
- {
- err = OCSD_ERR_HW_CFG_UNSUPP;
- LogError(ocsdError(OCSD_ERR_SEV_ERROR,OCSD_ERR_HW_CFG_UNSUPP,"ETMv4 instruction decode : LSP0 elements not supported."));
- }
- else if(m_config->enabledCondITrace() != EtmV4Config::COND_TR_DIS)
- {
- err = OCSD_ERR_HW_CFG_UNSUPP;
- LogError(ocsdError(OCSD_ERR_SEV_ERROR,OCSD_ERR_HW_CFG_UNSUPP,"ETMv4 instruction decode : Trace on conditional non-branch elements not supported."));
- }
- else if(m_config->enabledQE())
- {
- err = OCSD_ERR_HW_CFG_UNSUPP;
- LogError(ocsdError(OCSD_ERR_SEV_ERROR,OCSD_ERR_HW_CFG_UNSUPP,"ETMv4 instruction decode : Trace using Q elements not supported."));
- }
- return err;
-}
-
-
-/************* local decode methods */
-void TrcPktDecodeEtmV4I::initDecoder()
-{
- // set the operational modes supported.
- m_supported_op_flags = ETMV4_SUPPORTED_DECODE_OP_FLAGS;
-
- /* init elements that get set by config */
- m_max_spec_depth = 0;
- m_p0_key_max = 0;
- m_CSID = 0;
- m_cond_key_max_incr = 0;
- m_IASize64 = false;
-
- // reset decoder state to unsynced
- resetDecoder();
-}
-
-void TrcPktDecodeEtmV4I::resetDecoder()
-{
- m_curr_state = NO_SYNC;
- m_timestamp = 0;
- m_context_id = 0;
- m_vmid_id = 0;
- m_is_secure = true;
- m_is_64bit = false;
- m_cc_threshold = 0;
- m_curr_spec_depth = 0;
- m_p0_key = 0;
- m_cond_c_key = 0;
- m_cond_r_key = 0;
- m_need_ctxt = true;
- m_need_addr = true;
- m_except_pending_addr = false;
- m_mem_nacc_pending = false;
- m_prev_overflow = false;
- m_P0_stack.delete_all();
- m_output_elem.init();
- m_excep_info.proc = EXCEP_POP;
- m_flush_EOT = false;
-}
-
-// this function can output an immediate generic element if this covers the complete packet decode,
-// or stack P0 and other elements for later processing on commit or cancel.
-ocsd_datapath_resp_t TrcPktDecodeEtmV4I::decodePacket(bool &Complete)
-{
- bool bAllocErr = false;
- ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
- Complete = true;
- bool is_addr = false;
- bool is_except = false;
-
- switch(m_curr_packet_in->getType())
- {
- case ETM4_PKT_I_ASYNC: // nothing to do with this packet.
- case ETM4_PKT_I_IGNORE: // or this one.
- break;
-
- case ETM4_PKT_I_TRACE_INFO:
- // skip subsequent TInfo packets.
- m_return_stack.flush();
- break;
-
- case ETM4_PKT_I_TRACE_ON:
- {
- if (m_P0_stack.createParamElemNoParam(P0_TRC_ON, false, m_curr_packet_in->getType(), m_index_curr_pkt) == 0)
- bAllocErr = true;
- }
- break;
-
- case ETM4_PKT_I_OVERFLOW:
- {
- if (m_P0_stack.createParamElemNoParam(P0_OVERFLOW, false, m_curr_packet_in->getType(), m_index_curr_pkt) == 0)
- bAllocErr = true;
- }
- break;
-
- case ETM4_PKT_I_ATOM_F1:
- case ETM4_PKT_I_ATOM_F2:
- case ETM4_PKT_I_ATOM_F3:
- case ETM4_PKT_I_ATOM_F4:
- case ETM4_PKT_I_ATOM_F5:
- case ETM4_PKT_I_ATOM_F6:
- {
- if (m_P0_stack.createAtomElem(m_curr_packet_in->getType(), m_index_curr_pkt, m_curr_packet_in->getAtom()) == 0)
- bAllocErr = true;
- else
- m_curr_spec_depth += m_curr_packet_in->getAtom().num;
- }
- break;
-
- case ETM4_PKT_I_CTXT:
- {
- if (m_P0_stack.createContextElem(m_curr_packet_in->getType(), m_index_curr_pkt, m_curr_packet_in->getContext()) == 0)
- bAllocErr = true;
- }
- break;
-
- case ETM4_PKT_I_ADDR_MATCH:
- {
- etmv4_addr_val_t addr;
-
- addr.val = m_curr_packet_in->getAddrVal();
- addr.isa = m_curr_packet_in->getAddrIS();
- if (m_P0_stack.createAddrElem(m_curr_packet_in->getType(), m_index_curr_pkt, addr) == 0)
- bAllocErr = true;
- is_addr = true;
- }
- break;
-
- case ETM4_PKT_I_ADDR_CTXT_L_64IS0:
- case ETM4_PKT_I_ADDR_CTXT_L_64IS1:
- case ETM4_PKT_I_ADDR_CTXT_L_32IS0:
- case ETM4_PKT_I_ADDR_CTXT_L_32IS1:
- {
- if (m_P0_stack.createContextElem(m_curr_packet_in->getType(), m_index_curr_pkt, m_curr_packet_in->getContext()) == 0)
- bAllocErr = true;
- }
- case ETM4_PKT_I_ADDR_L_32IS0:
- case ETM4_PKT_I_ADDR_L_32IS1:
- case ETM4_PKT_I_ADDR_L_64IS0:
- case ETM4_PKT_I_ADDR_L_64IS1:
- case ETM4_PKT_I_ADDR_S_IS0:
- case ETM4_PKT_I_ADDR_S_IS1:
- {
- etmv4_addr_val_t addr;
-
- addr.val = m_curr_packet_in->getAddrVal();
- addr.isa = m_curr_packet_in->getAddrIS();
- if (m_P0_stack.createAddrElem(m_curr_packet_in->getType(), m_index_curr_pkt, addr) == 0)
- bAllocErr = true;
- is_addr = true;
- }
- break;
-
- // Exceptions
- case ETM4_PKT_I_EXCEPT:
- {
- if (m_P0_stack.createExceptElem(m_curr_packet_in->getType(), m_index_curr_pkt,
- (m_curr_packet_in->exception_info.addr_interp == 0x2),
- m_curr_packet_in->exception_info.exceptionType) == 0)
- bAllocErr = true;
- else
- {
- m_except_pending_addr = true; // wait for following packets before marking for commit.
- is_except = true;
- }
- }
- break;
-
- case ETM4_PKT_I_EXCEPT_RTN:
- {
- // P0 element if V7M profile.
- bool bV7MProfile = (m_config->archVersion() == ARCH_V7) && (m_config->coreProfile() == profile_CortexM);
- if (m_P0_stack.createParamElemNoParam(P0_EXCEP_RET, bV7MProfile, m_curr_packet_in->getType(), m_index_curr_pkt) == 0)
- bAllocErr = true;
- else if (bV7MProfile)
- m_curr_spec_depth++;
- }
- break;
-
- case ETM4_PKT_I_FUNC_RET:
- {
- // P0 element iff V8M profile, otherwise ignore
- if (OCSD_IS_V8_ARCH(m_config->archVersion()) && (m_config->coreProfile() == profile_CortexM))
- {
- if (m_P0_stack.createParamElemNoParam(P0_FUNC_RET, true, m_curr_packet_in->getType(), m_index_curr_pkt) == 0)
- bAllocErr = true;
- else
- m_curr_spec_depth++;
- }
- }
- break;
-
- // event trace
- case ETM4_PKT_I_EVENT:
- {
- std::vector<uint32_t> params = { 0 };
- params[0] = (uint32_t)m_curr_packet_in->event_val;
- if (m_P0_stack.createParamElem(P0_EVENT, false, m_curr_packet_in->getType(), m_index_curr_pkt, params) == 0)
- bAllocErr = true;
-
- }
- break;
-
- /* cycle count packets */
- case ETM4_PKT_I_CCNT_F1:
- case ETM4_PKT_I_CCNT_F2:
- case ETM4_PKT_I_CCNT_F3:
- {
- std::vector<uint32_t> params = { 0 };
- params[0] = m_curr_packet_in->getCC();
- if (m_P0_stack.createParamElem(P0_CC, false, m_curr_packet_in->getType(), m_index_curr_pkt, params) == 0)
- bAllocErr = true;
-
- }
- break;
-
- // timestamp
- case ETM4_PKT_I_TIMESTAMP:
- {
- bool bTSwithCC = m_config->enabledCCI();
- uint64_t ts = m_curr_packet_in->getTS();
- std::vector<uint32_t> params = { 0, 0, 0 };
- params[0] = (uint32_t)(ts & 0xFFFFFFFF);
- params[1] = (uint32_t)((ts >> 32) & 0xFFFFFFFF);
- if (bTSwithCC)
- params[2] = m_curr_packet_in->getCC();
- if (m_P0_stack.createParamElem(bTSwithCC ? P0_TS_CC : P0_TS, false, m_curr_packet_in->getType(), m_index_curr_pkt, params) == 0)
- bAllocErr = true;
-
- }
- break;
-
- case ETM4_PKT_I_BAD_SEQUENCE:
- resp = handleBadPacket("Bad byte sequence in packet.");
- break;
-
- case ETM4_PKT_I_BAD_TRACEMODE:
- resp = handleBadPacket("Invalid packet type for trace mode.");
- break;
-
- case ETM4_PKT_I_RESERVED:
- resp = handleBadPacket("Reserved packet header");
- break;
-
- /*** presently unsupported packets ***/
- /* conditional instruction tracing */
- case ETM4_PKT_I_COND_FLUSH:
- case ETM4_PKT_I_COND_I_F1:
- case ETM4_PKT_I_COND_I_F2:
- case ETM4_PKT_I_COND_I_F3:
- case ETM4_PKT_I_COND_RES_F1:
- case ETM4_PKT_I_COND_RES_F2:
- case ETM4_PKT_I_COND_RES_F3:
- case ETM4_PKT_I_COND_RES_F4:
- // speculation
- case ETM4_PKT_I_CANCEL_F1:
- case ETM4_PKT_I_CANCEL_F2:
- case ETM4_PKT_I_CANCEL_F3:
- case ETM4_PKT_I_COMMIT:
- case ETM4_PKT_I_MISPREDICT:
- case ETM4_PKT_I_DISCARD:
- // data synchronisation markers
- case ETM4_PKT_I_NUM_DS_MKR:
- case ETM4_PKT_I_UNNUM_DS_MKR:
- /* Q packets */
- case ETM4_PKT_I_Q:
- resp = OCSD_RESP_FATAL_INVALID_DATA;
- LogError(ocsdError(OCSD_ERR_SEV_ERROR,OCSD_ERR_BAD_DECODE_PKT,"Unsupported packet type."));
- break;
-
- default:
- // any other packet - bad packet error
- resp = OCSD_RESP_FATAL_INVALID_DATA;
- LogError(ocsdError(OCSD_ERR_SEV_ERROR,OCSD_ERR_BAD_DECODE_PKT,"Unknown packet type."));
- break;
-
- }
-
- // we need to wait for following address after exception
- // - work out if we have seen enough here...
- if(m_except_pending_addr && !is_except)
- {
- m_except_pending_addr = false; //next packet has to be an address
- // exception packet sequence complete
- if(is_addr)
- {
- m_curr_spec_depth++; // exceptions are P0 elements so up the spec depth to commit if needed.
- }
- else
- {
- resp = OCSD_RESP_FATAL_INVALID_DATA;
- LogError(ocsdError(OCSD_ERR_SEV_ERROR,OCSD_ERR_BAD_DECODE_PKT,"Expected Address packet to follow exception packet."));
- }
- }
-
- if(bAllocErr)
- {
- resp = OCSD_RESP_FATAL_SYS_ERR;
- LogError(ocsdError(OCSD_ERR_SEV_ERROR,OCSD_ERR_MEM,"Memory allocation error."));
- }
- else if(m_curr_spec_depth > m_max_spec_depth)
- {
- // auto commit anything above max spec depth
- // (this will auto commit anything if spec depth not supported!)
- m_P0_commit = m_curr_spec_depth - m_max_spec_depth;
- m_curr_state = COMMIT_ELEM;
- Complete = false; // force the processing of the commit elements.
- }
- return resp;
-}
-
-void TrcPktDecodeEtmV4I::doTraceInfoPacket()
-{
- m_trace_info = m_curr_packet_in->getTraceInfo();
- m_cc_threshold = m_curr_packet_in->getCCThreshold();
- m_p0_key = m_curr_packet_in->getP0Key();
- m_curr_spec_depth = m_curr_packet_in->getCurrSpecDepth();
-}
-
-/*
- * Walks through the element stack, processing from oldest element to the newest,
- according to the number of P0 elements that need committing.
- */
-ocsd_datapath_resp_t TrcPktDecodeEtmV4I::commitElements(bool &Complete)
-{
- ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
- bool bPause = false; // pause commit operation
- bool bPopElem = true; // do we remove the element from the stack (multi atom elements may need to stay!)
- int num_commit_req = m_P0_commit;
- ocsd_trc_index_t err_idx = 0;
-
- Complete = true; // assume we exit due to completion of commit operation
-
- TrcStackElem *pElem = 0; // stacked element pointer
-
- while(m_P0_commit && !bPause)
- {
- if(m_P0_stack.size() > 0)
- {
- pElem = m_P0_stack.back(); // get oldest element
- err_idx = pElem->getRootIndex(); // save index in case of error.
-
- switch (pElem->getP0Type())
- {
- // indicates a trace restart - beginning of trace or discontinuiuty
- case P0_TRC_ON:
- m_output_elem.setType(OCSD_GEN_TRC_ELEM_TRACE_ON);
- m_output_elem.trace_on_reason = m_prev_overflow ? TRACE_ON_OVERFLOW : TRACE_ON_NORMAL;
- m_prev_overflow = false;
- resp = outputTraceElementIdx(pElem->getRootIndex(),m_output_elem);
- m_return_stack.flush();
- break;
-
- case P0_ADDR:
- {
- TrcStackElemAddr *pAddrElem = dynamic_cast<TrcStackElemAddr *>(pElem);
- m_return_stack.clear_pop_pending(); // address removes the need to pop the indirect address target from the stack
- if(pAddrElem)
- {
- SetInstrInfoInAddrISA(pAddrElem->getAddr().val, pAddrElem->getAddr().isa);
- m_need_addr = false;
- }
- }
- break;
-
- case P0_CTXT:
- {
- TrcStackElemCtxt *pCtxtElem = dynamic_cast<TrcStackElemCtxt *>(pElem);
- if(pCtxtElem)
- {
- etmv4_context_t ctxt = pCtxtElem->getContext();
- // check this is an updated context
- if(ctxt.updated)
- {
- updateContext(pCtxtElem);
-
- m_output_elem.setType(OCSD_GEN_TRC_ELEM_PE_CONTEXT);
- resp = outputTraceElementIdx(pElem->getRootIndex(),m_output_elem);
- }
- }
- }
- break;
-
- case P0_EVENT:
- {
- TrcStackElemParam *pParamElem = dynamic_cast<TrcStackElemParam *>(pElem);
- if(pParamElem)
- resp = this->outputEvent(pParamElem);
- }
- break;
-
- case P0_TS:
- {
- TrcStackElemParam *pParamElem = dynamic_cast<TrcStackElemParam *>(pElem);
- if(pParamElem)
- resp = outputTS(pParamElem,false);
- }
- break;
-
- case P0_CC:
- {
- TrcStackElemParam *pParamElem = dynamic_cast<TrcStackElemParam *>(pElem);
- if(pParamElem)
- resp = outputCC(pParamElem);
- }
- break;
-
- case P0_TS_CC:
- {
- TrcStackElemParam *pParamElem = dynamic_cast<TrcStackElemParam *>(pElem);
- if(pParamElem)
- resp = outputTS(pParamElem,true);
- }
- break;
-
- case P0_OVERFLOW:
- m_prev_overflow = true;
- break;
-
- case P0_ATOM:
- {
- TrcStackElemAtom *pAtomElem = dynamic_cast<TrcStackElemAtom *>(pElem);
-
- if(pAtomElem)
- {
- bool bContProcess = true;
- while(!pAtomElem->isEmpty() && m_P0_commit && bContProcess)
- {
- ocsd_atm_val atom = pAtomElem->commitOldest();
-
- // check if prev atom left us an indirect address target on the return stack
- if ((resp = returnStackPop()) != OCSD_RESP_CONT)
- break;
-
- // if address and context do instruction trace follower.
- // otherwise skip atom and reduce committed elements
- if(!m_need_ctxt && !m_need_addr)
- {
- resp = processAtom(atom,bContProcess);
- }
- m_P0_commit--; // mark committed
- }
- if(!pAtomElem->isEmpty())
- bPopElem = false; // don't remove if still atoms to process.
- }
- }
- break;
-
- case P0_EXCEP:
- // check if prev atom left us an indirect address target on the return stack
- if ((resp = returnStackPop()) != OCSD_RESP_CONT)
- break;
-
- m_excep_info.proc = EXCEP_POP; // set state in case we need to stop part way through
- resp = processException(); // output trace + exception elements.
- m_P0_commit--;
- break;
-
- case P0_EXCEP_RET:
- m_output_elem.setType(OCSD_GEN_TRC_ELEM_EXCEPTION_RET);
- resp = outputTraceElementIdx(pElem->getRootIndex(),m_output_elem);
- if(pElem->isP0()) // are we on a core that counts ERET as P0?
- m_P0_commit--;
- break;
-
- case P0_FUNC_RET:
- // func ret is V8M - data trace only - hint that data has been popped off the stack.
- // at this point nothing to do till the decoder starts handling data trace.
- if (pElem->isP0())
- m_P0_commit--;
- break;
- }
-
- if(bPopElem)
- m_P0_stack.delete_back(); // remove element from stack;
-
- // if response not continue, then break out of the loop.
- if(!OCSD_DATA_RESP_IS_CONT(resp))
- {
- bPause = true;
- }
- }
- else
- {
- // too few elements for commit operation - decode error.
- resp = OCSD_RESP_FATAL_INVALID_DATA;
- LogError(ocsdError(OCSD_ERR_SEV_ERROR,OCSD_ERR_COMMIT_PKT_OVERRUN,err_idx,m_CSID,"Not enough elements to commit"));
- bPause = true;
- }
- }
-
- // done all elements - need more packets.
- if(m_P0_commit == 0)
- m_curr_state = DECODE_PKTS;
-
- // reduce the spec depth by number of comitted elements
- m_curr_spec_depth -= (num_commit_req-m_P0_commit);
- return resp;
-}
-
-ocsd_datapath_resp_t TrcPktDecodeEtmV4I::returnStackPop()
-{
- ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
- ocsd_isa nextISA;
-
- if (m_return_stack.pop_pending())
- {
- ocsd_vaddr_t popAddr = m_return_stack.pop(nextISA);
- if (m_return_stack.overflow())
- {
- resp = OCSD_RESP_FATAL_INVALID_DATA;
- LogError(ocsdError(OCSD_ERR_SEV_ERROR, OCSD_ERR_RET_STACK_OVERFLOW, "Trace Return Stack Overflow."));
- }
- else
- {
- m_instr_info.instr_addr = popAddr;
- m_instr_info.isa = nextISA;
- m_need_addr = false;
- }
- }
- return resp;
-}
-
-ocsd_datapath_resp_t TrcPktDecodeEtmV4I::flushEOT()
-{
- ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
- if(m_flush_EOT)
- {
- TrcStackElem *pElem = 0;
- while(OCSD_DATA_RESP_IS_CONT(resp) && (m_P0_stack.size() > 0))
- {
- // scan for outstanding events, TS and CC, before any outstanding
- // P0 commit elements.
- pElem = m_P0_stack.back();
-
- switch(pElem->getP0Type())
- {
- // clear stack and stop
- case P0_UNKNOWN:
- case P0_ATOM:
- case P0_TRC_ON:
- case P0_EXCEP:
- case P0_EXCEP_RET:
- case P0_OVERFLOW:
- m_P0_stack.delete_all();
- break;
-
- //skip
- case P0_ADDR:
- case P0_CTXT:
- break;
-
- // output
- case P0_EVENT:
- {
- TrcStackElemParam *pParamElem = dynamic_cast<TrcStackElemParam *>(pElem);
- if(pParamElem)
- resp = this->outputEvent(pParamElem);
- }
- break;
-
- case P0_TS:
- {
- TrcStackElemParam *pParamElem = dynamic_cast<TrcStackElemParam *>(pElem);
- if(pParamElem)
- resp = outputTS(pParamElem,false);
- }
- break;
-
- case P0_CC:
- {
- TrcStackElemParam *pParamElem = dynamic_cast<TrcStackElemParam *>(pElem);
- if(pParamElem)
- resp = outputCC(pParamElem);
- }
- break;
-
- case P0_TS_CC:
- {
- TrcStackElemParam *pParamElem = dynamic_cast<TrcStackElemParam *>(pElem);
- if(pParamElem)
- resp = outputTS(pParamElem,true);
- }
- break;
- }
- m_P0_stack.delete_back();
- }
-
- if(OCSD_DATA_RESP_IS_CONT(resp) && (m_P0_stack.size() == 0))
- {
- m_output_elem.setType(OCSD_GEN_TRC_ELEM_EO_TRACE);
- resp = outputTraceElement(m_output_elem);
- m_flush_EOT = false;
- }
- }
- return resp;
-}
-
-ocsd_datapath_resp_t TrcPktDecodeEtmV4I::outputCC(TrcStackElemParam *pParamElem)
-{
- m_output_elem.setType(OCSD_GEN_TRC_ELEM_CYCLE_COUNT);
- m_output_elem.setCycleCount(pParamElem->getParam(0));
- return outputTraceElementIdx(pParamElem->getRootIndex(),m_output_elem);
-}
-
-ocsd_datapath_resp_t TrcPktDecodeEtmV4I::outputTS(TrcStackElemParam *pParamElem, bool withCC)
-{
- m_output_elem.setType(OCSD_GEN_TRC_ELEM_TIMESTAMP);
- m_output_elem.timestamp = (uint64_t)(pParamElem->getParam(0)) | (((uint64_t)pParamElem->getParam(1)) << 32);
- if(withCC)
- m_output_elem.setCycleCount(pParamElem->getParam(2));
- return outputTraceElementIdx(pParamElem->getRootIndex(),m_output_elem);
-}
-
-ocsd_datapath_resp_t TrcPktDecodeEtmV4I::outputEvent(TrcStackElemParam *pParamElem)
-{
- m_output_elem.setType(OCSD_GEN_TRC_ELEM_EVENT);
- m_output_elem.trace_event.ev_type = EVENT_NUMBERED;
- m_output_elem.trace_event.ev_number = pParamElem->getParam(0);
- return outputTraceElementIdx(pParamElem->getRootIndex(),m_output_elem);
-}
-
-ocsd_datapath_resp_t TrcPktDecodeEtmV4I::outputTraceRange(const bool executed, ocsd_trc_index_t index)
-{
- m_output_elem.setType(OCSD_GEN_TRC_ELEM_INSTR_RANGE);
- m_output_elem.setLastInstrInfo(executed, m_instr_info.type, m_instr_info.sub_type, m_instr_info.instr_size);
- m_output_elem.setISA(m_instr_info.isa);
- m_output_elem.setLastInstrCond(m_instr_info.is_conditional);
- if (executed)
- m_instr_info.isa = m_instr_info.next_isa;
- return outputTraceElementIdx(index, m_output_elem);
-}
-
-ocsd_datapath_resp_t TrcPktDecodeEtmV4I::processAtom(const ocsd_atm_val atom, bool &bCont)
-{
- ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
- TrcStackElem *pElem = m_P0_stack.back(); // get the atom element
- bool bWPFound = false;
- ocsd_err_t err;
- bCont = true;
-
- err = traceInstrToWP(bWPFound);
- if(err != OCSD_OK)
- {
- if(err == OCSD_ERR_UNSUPPORTED_ISA)
- {
- m_need_addr = true;
- m_need_ctxt = true;
- LogError(ocsdError(OCSD_ERR_SEV_WARN,err,pElem->getRootIndex(),m_CSID,"Warning: unsupported instruction set processing atom packet."));
- // wait for next context
- return resp;
- }
- else
- {
- bCont = false;
- resp = OCSD_RESP_FATAL_INVALID_DATA;
- LogError(ocsdError(OCSD_ERR_SEV_ERROR,err,pElem->getRootIndex(),m_CSID,"Error processing atom packet."));
- return resp;
- }
- }
-
- if(bWPFound)
- {
- // save recorded next instuction address
- ocsd_vaddr_t nextAddr = m_instr_info.instr_addr;
-
- // action according to waypoint type and atom value
- switch(m_instr_info.type)
- {
- case OCSD_INSTR_BR:
- if (atom == ATOM_E)
- {
- m_instr_info.instr_addr = m_instr_info.branch_addr;
- if (m_instr_info.is_link)
- m_return_stack.push(nextAddr, m_instr_info.isa);
-
- }
- break;
-
- case OCSD_INSTR_BR_INDIRECT:
- if (atom == ATOM_E)
- {
- m_need_addr = true; // indirect branch taken - need new address.
- if (m_instr_info.is_link)
- m_return_stack.push(nextAddr,m_instr_info.isa);
- m_return_stack.set_pop_pending(); // need to know next packet before we know what is to happen
- }
- break;
- }
- resp = outputTraceRange((atom == ATOM_E), pElem->getRootIndex());
-
- }
- else
- {
- // no waypoint - likely inaccessible memory range.
- m_need_addr = true; // need an address update
-
- if(m_output_elem.st_addr != m_output_elem.en_addr)
- {
- // some trace before we were out of memory access range
- resp = outputTraceRange(true, pElem->getRootIndex());
- }
-
- if(m_mem_nacc_pending && OCSD_DATA_RESP_IS_CONT(resp))
- {
- m_output_elem.setType(OCSD_GEN_TRC_ELEM_ADDR_NACC);
- m_output_elem.st_addr = m_nacc_addr;
- resp = outputTraceElementIdx(pElem->getRootIndex(),m_output_elem);
- m_mem_nacc_pending = false;
- }
- }
-
- if(!OCSD_DATA_RESP_IS_CONT(resp))
- bCont = false;
-
- return resp;
-}
-
-// Exception processor
-ocsd_datapath_resp_t TrcPktDecodeEtmV4I::processException()
-{
- ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
- TrcStackElemExcept *pExceptElem;
-
- m_excep_info.addr_b_tgt = false;
-
- if(m_excep_info.proc == EXCEP_POP)
- {
- pExceptElem = dynamic_cast<TrcStackElemExcept *>(m_P0_stack.back()); // get the exception element
- TrcStackElemAddr *pAddressElem = 0;
- TrcStackElemCtxt *pCtxtElem = 0;
- TrcStackElem *pElem = 0;
-
- m_P0_stack.pop_back(); // remove the exception element
- pElem = m_P0_stack.back(); // look at next element.
- if(pElem->getP0Type() == P0_CTXT)
- {
- pCtxtElem = dynamic_cast<TrcStackElemCtxt *>(pElem);
- m_P0_stack.pop_back(); // remove the context element
- pElem = m_P0_stack.back(); // next one should be an address element
- }
-
- if(pElem->getP0Type() != P0_ADDR)
- {
- // no following address element - indicate processing error.
- resp = OCSD_RESP_FATAL_INVALID_DATA;
- LogError(ocsdError(OCSD_ERR_SEV_ERROR,OCSD_ERR_BAD_PACKET_SEQ,pExceptElem->getRootIndex(),m_CSID,"Address missing in exception packet."));
- }
- else
- {
- // extract address
- pAddressElem = static_cast<TrcStackElemAddr *>(pElem);
-
- // fill in exception info for use later
- m_excep_info.addr = pAddressElem->getAddr();
- m_excep_info.number = pExceptElem->getExcepNum();
- m_excep_info.index = pExceptElem->getRootIndex();
- m_excep_info.addr_b_tgt = pExceptElem->getPrevSame();
-
- // see if there is an address + optional context element implied
- // prior to the exception.
- if (m_excep_info.addr_b_tgt)
- {
- // this was a branch target address - update current setting
- bool b64bit = m_instr_info.isa == ocsd_isa_aarch64;
- if (pCtxtElem) {
- b64bit = pCtxtElem->getContext().SF;
- }
- m_instr_info.instr_addr = m_excep_info.addr.val;
- m_instr_info.isa = (m_excep_info.addr.isa == 0) ?
- (b64bit ? ocsd_isa_aarch64 : ocsd_isa_arm) : ocsd_isa_thumb2;
- m_need_addr = false;
- }
-
- // figure out next move
- if (pCtxtElem) {
- m_excep_info.proc = EXCEP_CTXT;
- updateContext(pCtxtElem);
- }
- else if(m_excep_info.addr.val == m_instr_info.instr_addr)
- m_excep_info.proc = EXCEP_EXCEP;
- else
- m_excep_info.proc = EXCEP_RANGE;
- }
- m_P0_stack.delete_popped();
- }
-
- // output a context element
- if (m_excep_info.proc == EXCEP_CTXT)
- {
- m_output_elem.setType(OCSD_GEN_TRC_ELEM_PE_CONTEXT);
- resp = outputTraceElementIdx(m_excep_info.index, m_output_elem);
- m_excep_info.proc = EXCEP_EXCEP;
- if (!OCSD_DATA_RESP_IS_CONT(resp))
- return resp;
- }
-
- // output a range element
- if(m_excep_info.proc == EXCEP_RANGE)
- {
- bool bWPFound = false;
- ocsd_err_t err;
-
- // last instr_info address is the start address
- m_output_elem.st_addr = m_instr_info.instr_addr;
-
- // look for match to return address.
- err = traceInstrToWP(bWPFound,true,m_excep_info.addr.val);
-
- if(err != OCSD_OK)
- {
- if(err == OCSD_ERR_UNSUPPORTED_ISA)
- {
- m_need_addr = true;
- m_need_ctxt = true;
- LogError(ocsdError(OCSD_ERR_SEV_WARN,err,m_excep_info.index,m_CSID,"Warning: unsupported instruction set processing exception packet."));
- }
- else
- {
- resp = OCSD_RESP_FATAL_INVALID_DATA;
- LogError(ocsdError(OCSD_ERR_SEV_ERROR,err,m_excep_info.index,m_CSID,"Error processing exception packet."));
- m_excep_info.proc = EXCEP_POP; // nothing more to do, reset to start of exception handling
- }
- }
-
- if(bWPFound)
- {
- // waypoint address found - output range
- resp = outputTraceRange(true, m_excep_info.index);
- m_excep_info.proc = EXCEP_EXCEP;
- }
- else
- {
- // no waypoint - likely inaccessible memory range.
- m_need_addr = true; // need an address update
-
- if(m_output_elem.st_addr != m_output_elem.en_addr)
- {
- // some trace before we were out of memory access range
- resp = outputTraceRange(true, m_excep_info.index);
- }
-
- m_excep_info.proc = m_mem_nacc_pending ? EXCEP_NACC : EXCEP_EXCEP;
- }
- }
-
- if((m_excep_info.proc == EXCEP_NACC) && OCSD_DATA_RESP_IS_CONT(resp))
- {
- m_output_elem.setType(OCSD_GEN_TRC_ELEM_ADDR_NACC);
- m_output_elem.st_addr = m_nacc_addr;
- resp = outputTraceElementIdx(m_excep_info.index,m_output_elem);
- m_excep_info.proc = EXCEP_EXCEP;
- m_mem_nacc_pending = false;
- }
-
- if((m_excep_info.proc == EXCEP_EXCEP) && OCSD_DATA_RESP_IS_CONT(resp))
- {
- // output element.
- m_output_elem.setType(OCSD_GEN_TRC_ELEM_EXCEPTION);
- // add end address as preferred return address to end addr in element
- m_output_elem.en_addr = m_excep_info.addr.val;
- m_output_elem.excep_ret_addr = 1;
- m_output_elem.excep_ret_addr_br_tgt = m_excep_info.addr_b_tgt;
- m_output_elem.exception_number = m_excep_info.number;
- resp = outputTraceElementIdx(m_excep_info.index,m_output_elem);
- m_excep_info.proc = EXCEP_POP;
- }
- return resp;
-}
-
-void TrcPktDecodeEtmV4I::SetInstrInfoInAddrISA(const ocsd_vaddr_t addr_val, const uint8_t isa)
-{
- m_instr_info.instr_addr = addr_val;
- if(m_is_64bit)
- m_instr_info.isa = ocsd_isa_aarch64;
- else
- m_instr_info.isa = (isa == 0) ? ocsd_isa_arm : ocsd_isa_thumb2;
-}
-
-// trace an instruction range to a waypoint - and set next address to restart from.
-ocsd_err_t TrcPktDecodeEtmV4I::traceInstrToWP(bool &bWPFound, const bool traceToAddrNext /*= false*/, const ocsd_vaddr_t nextAddrMatch /*= 0*/)
-{
- uint32_t opcode;
- uint32_t bytesReq;
- ocsd_err_t err = OCSD_OK;
-
- // TBD?: update mem space to allow for EL as well.
- ocsd_mem_space_acc_t mem_space = m_is_secure ? OCSD_MEM_SPACE_S : OCSD_MEM_SPACE_N;
-
- m_output_elem.st_addr = m_output_elem.en_addr = m_instr_info.instr_addr;
- m_output_elem.num_instr_range = 0;
-
- bWPFound = false;
-
- while(!bWPFound && !m_mem_nacc_pending)
- {
- // start off by reading next opcode;
- bytesReq = 4;
- err = accessMemory(m_instr_info.instr_addr,mem_space,&bytesReq,(uint8_t *)&opcode);
- if(err != OCSD_OK) break;
-
- if(bytesReq == 4) // got data back
- {
- m_instr_info.opcode = opcode;
- err = instrDecode(&m_instr_info);
- if(err != OCSD_OK) break;
-
- // increment address - may be adjusted by direct branch value later
- m_instr_info.instr_addr += m_instr_info.instr_size;
-
- // update the range decoded address in the output packet.
- m_output_elem.en_addr = m_instr_info.instr_addr;
- m_output_elem.num_instr_range++;
-
- // either walking to match the next instruction address or a real watchpoint
- if(traceToAddrNext)
- bWPFound = (m_output_elem.en_addr == nextAddrMatch);
- else
- bWPFound = (m_instr_info.type != OCSD_INSTR_OTHER);
- }
- else
- {
- // not enough memory accessible.
- m_mem_nacc_pending = true;
- m_nacc_addr = m_instr_info.instr_addr;
- }
- }
- return err;
-}
-
-void TrcPktDecodeEtmV4I::updateContext(TrcStackElemCtxt *pCtxtElem)
-{
- etmv4_context_t ctxt = pCtxtElem->getContext();
- // map to output element and local saved state.
- m_is_64bit = (ctxt.SF != 0);
- m_output_elem.context.bits64 = ctxt.SF;
- m_is_secure = (ctxt.NS == 0);
- m_output_elem.context.security_level = ctxt.NS ? ocsd_sec_nonsecure : ocsd_sec_secure;
- m_output_elem.context.exception_level = (ocsd_ex_level)ctxt.EL;
- m_output_elem.context.el_valid = 1;
- if(ctxt.updated_c)
- {
- m_output_elem.context.ctxt_id_valid = 1;
- m_context_id = m_output_elem.context.context_id = ctxt.ctxtID;
- }
- if(ctxt.updated_v)
- {
- m_output_elem.context.vmid_valid = 1;
- m_vmid_id = m_output_elem.context.vmid = ctxt.VMID;
- }
- m_need_ctxt = false;
-}
-
-ocsd_datapath_resp_t TrcPktDecodeEtmV4I::handleBadPacket(const char *reason)
-{
- ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
-
- if(getComponentOpMode() && OCSD_OPFLG_PKTDEC_ERROR_BAD_PKTS)
- {
- // error out - stop decoding
- resp = OCSD_RESP_FATAL_INVALID_DATA;
- LogError(ocsdError(OCSD_ERR_SEV_ERROR,OCSD_ERR_BAD_DECODE_PKT,reason));
- }
- else
- {
- // switch to unsync - clear decode state
- m_output_elem.setType(OCSD_GEN_TRC_ELEM_NO_SYNC);
- resp = outputTraceElement(m_output_elem);
- resetDecoder();
- m_curr_state = WAIT_SYNC;
- }
- return resp;
-}
-
-/* End of File trc_pkt_decode_etmv4i.cpp */
diff --git a/contrib/opencsd/decoder/source/etmv4/trc_pkt_elem_etmv4d.cpp b/contrib/opencsd/decoder/source/etmv4/trc_pkt_elem_etmv4d.cpp
deleted file mode 100644
index 58343b4117bf..000000000000
--- a/contrib/opencsd/decoder/source/etmv4/trc_pkt_elem_etmv4d.cpp
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * \file trc_pkt_elem_etmv4d.cpp
- * \brief OpenCSD :
- *
- * \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 "opencsd/etmv4/trc_pkt_elem_etmv4d.h"
-
-EtmV4DTrcPacket::EtmV4DTrcPacket()
-{
-}
-
-EtmV4DTrcPacket::~EtmV4DTrcPacket()
-{
-}
-
- // printing
-void EtmV4DTrcPacket::toString(std::string &str) const
-{
-}
-
-void EtmV4DTrcPacket::toStringFmt(const uint32_t fmtFlags, std::string &str) const
-{
-}
-
-
-
-/* End of File trc_pkt_elem_etmv4d.cpp */
diff --git a/contrib/opencsd/decoder/source/etmv4/trc_pkt_elem_etmv4i.cpp b/contrib/opencsd/decoder/source/etmv4/trc_pkt_elem_etmv4i.cpp
deleted file mode 100644
index 3f9d534db82c..000000000000
--- a/contrib/opencsd/decoder/source/etmv4/trc_pkt_elem_etmv4i.cpp
+++ /dev/null
@@ -1,583 +0,0 @@
-/*
- * \file trc_pkt_elem_etmv4i.cpp
- * \brief OpenCSD :
- *
- * \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/etmv4/trc_pkt_elem_etmv4i.h"
-
-EtmV4ITrcPacket::EtmV4ITrcPacket()
-{
-}
-
-EtmV4ITrcPacket::~EtmV4ITrcPacket()
-{
-}
-
-void EtmV4ITrcPacket::initStartState()
-{
- // clear packet state to start of trace (first sync or post discontinuity)
-
- // clear all valid bits
- pkt_valid.val = 0;
-
- // virtual address
- v_addr.pkt_bits = 0;
- v_addr.valid_bits = 0;
- v_addr_ISA = 0;
-
- // timestamp
- ts.bits_changed = 0;
- ts.timestamp = 0;
-
- // per packet init
- initNextPacket();
-}
-
-void EtmV4ITrcPacket::initNextPacket()
-{
- // clear valid bits for elements that are only valid over a single packet.
- pkt_valid.bits.cc_valid = 0;
- pkt_valid.bits.commit_elem_valid = 0;
- atom.num = 0;
- context.updated = 0;
- context.updated_v = 0;
- context.updated_c = 0;
- err_type = ETM4_PKT_I_NO_ERR_TYPE;
-}
-
-// printing
-void EtmV4ITrcPacket::toString(std::string &str) const
-{
- const char *name;
- const char *desc;
- std::string valStr, ctxtStr = "";
-
- name = packetTypeName(type, &desc);
- str = name + (std::string)" : " + desc;
-
- // extended descriptions
- switch (type)
- {
- case ETM4_PKT_I_BAD_SEQUENCE:
- case ETM4_PKT_I_INCOMPLETE_EOT:
- case ETM4_PKT_I_RESERVED_CFG:
- name = packetTypeName(err_type, 0);
- str += "[" + (std::string)name + "]";
- break;
-
- case ETM4_PKT_I_ADDR_CTXT_L_32IS0:
- case ETM4_PKT_I_ADDR_CTXT_L_32IS1:
- contextStr(ctxtStr);
- case ETM4_PKT_I_ADDR_L_32IS0:
- case ETM4_PKT_I_ADDR_L_32IS1:
- trcPrintableElem::getValStr(valStr, (v_addr.size == VA_64BIT) ? 64 : 32, v_addr.valid_bits, v_addr.val, true, (v_addr.pkt_bits < 32) ? v_addr.pkt_bits : 0);
- str += "; Addr=" + valStr + "; " + ctxtStr;
- break;
-
- case ETM4_PKT_I_ADDR_CTXT_L_64IS0:
- case ETM4_PKT_I_ADDR_CTXT_L_64IS1:
- contextStr(ctxtStr);
- case ETM4_PKT_I_ADDR_L_64IS0:
- case ETM4_PKT_I_ADDR_L_64IS1:
- trcPrintableElem::getValStr(valStr, (v_addr.size == VA_64BIT) ? 64 : 32, v_addr.valid_bits, v_addr.val, true, (v_addr.pkt_bits < 64) ? v_addr.pkt_bits : 0);
- str += "; Addr=" + valStr + "; " + ctxtStr;
- break;
-
- case ETM4_PKT_I_CTXT:
- contextStr(ctxtStr);
- str += "; " + ctxtStr;
- break;
-
- case ETM4_PKT_I_ADDR_S_IS0:
- case ETM4_PKT_I_ADDR_S_IS1:
- trcPrintableElem::getValStr(valStr, (v_addr.size == VA_64BIT) ? 64 : 32, v_addr.valid_bits, v_addr.val, true, v_addr.pkt_bits);
- str += "; Addr=" + valStr;
- break;
-
- case ETM4_PKT_I_ADDR_MATCH:
- addrMatchIdx(valStr);
- str += ", " + valStr;
- trcPrintableElem::getValStr(valStr, (v_addr.size == VA_64BIT) ? 64 : 32, v_addr.valid_bits, v_addr.val, true);
- str += "; Addr=" + valStr + "; " + ctxtStr;
- break;
-
- case ETM4_PKT_I_ATOM_F1:
- case ETM4_PKT_I_ATOM_F2:
- case ETM4_PKT_I_ATOM_F3:
- case ETM4_PKT_I_ATOM_F4:
- case ETM4_PKT_I_ATOM_F5:
- case ETM4_PKT_I_ATOM_F6:
- atomSeq(valStr);
- str += "; " + valStr;
- break;
-
- case ETM4_PKT_I_EXCEPT:
- exceptionInfo(valStr);
- str += "; " + valStr;
- break;
-
- case ETM4_PKT_I_TIMESTAMP:
- {
- std::ostringstream oss;
- oss << "; Updated val = " << std::hex << "0x" << ts.timestamp;
- if (pkt_valid.bits.cc_valid)
- oss << "; CC=" << std::hex << "0x" << cycle_count;
- str += oss.str();
- }
- break;
-
- case ETM4_PKT_I_TRACE_INFO:
- {
- std::ostringstream oss;
- oss << "; INFO=" << std::hex << "0x" << trace_info.val;
- if (trace_info.bits.cc_enabled)
- oss << "; CC_THRESHOLD=" << std::hex << "0x" << cc_threshold;
- str += oss.str();
- }
- break;
-
- case ETM4_PKT_I_CCNT_F1:
- case ETM4_PKT_I_CCNT_F2:
- case ETM4_PKT_I_CCNT_F3:
- {
- std::ostringstream oss;
- oss << "; Count=" << std::hex << "0x" << cycle_count;
- str += oss.str();
- }
- break;
- }
-}
-
-void EtmV4ITrcPacket::toStringFmt(const uint32_t fmtFlags, std::string &str) const
-{
- toString(str); // TBD add in formatted response.
-}
-
-const char *EtmV4ITrcPacket::packetTypeName(const ocsd_etmv4_i_pkt_type type, const char **ppDesc) const
-{
- const char *pName = "I_UNKNOWN";
- const char *pDesc = "Unknown Packet Header";
-
- switch(type)
- {
- case ETM4_PKT_I_NOTSYNC:
- pName = "I_NOT_SYNC";
- pDesc = "I Stream not synchronised";
- break;
-
- case ETM4_PKT_I_INCOMPLETE_EOT:
- pName = "I_INCOMPLETE_EOT";
- pDesc = "Incomplete packet at end of trace.";
- break;
-
- case ETM4_PKT_I_NO_ERR_TYPE:
- pName = "I_NO_ERR_TYPE";
- pDesc = "No Error Type.";
- break;
-
- case ETM4_PKT_I_BAD_SEQUENCE:
- pName = "I_BAD_SEQUENCE";
- pDesc = "Invalid Sequence in packet.";
- break;
-
- case ETM4_PKT_I_BAD_TRACEMODE:
- pName = "I_BAD_TRACEMODE";
- pDesc = "Invalid Packet for trace mode.";
- break;
-
- case ETM4_PKT_I_RESERVED:
- pName = "I_RESERVED";
- pDesc = "Reserved Packet Header";
- break;
-
- case ETM4_PKT_I_RESERVED_CFG:
- pName = "I_RESERVED_CFG";
- pDesc = "Reserved header for current configuration.";
- break;
-
- case ETM4_PKT_I_EXTENSION:
- pName = "I_EXTENSION";
- pDesc = "Extension packet header.";
- break;
-
- case ETM4_PKT_I_TRACE_INFO:
- pName = "I_TRACE_INFO";
- pDesc = "Trace Info.";
- break;
-
- case ETM4_PKT_I_TIMESTAMP:
- pName = "I_TIMESTAMP";
- pDesc = "Timestamp.";
- break;
-
- case ETM4_PKT_I_TRACE_ON:
- pName = "I_TRACE_ON";
- pDesc = "Trace On.";
- break;
-
- case ETM4_PKT_I_FUNC_RET:
- pName = "I_FUNC_RET";
- pDesc = "V8M - function return.";
- break;
-
- case ETM4_PKT_I_EXCEPT:
- pName = "I_EXCEPT";
- pDesc = "Exception.";
- break;
-
- case ETM4_PKT_I_EXCEPT_RTN:
- pName = "I_EXCEPT_RTN";
- pDesc = "Exception Return.";
- break;
-
- case ETM4_PKT_I_CCNT_F1:
- pName = "I_CCNT_F1";
- pDesc = "Cycle Count format 1.";
- break;
-
- case ETM4_PKT_I_CCNT_F2:
- pName = "I_CCNT_F2";
- pDesc = "Cycle Count format 2.";
- break;
-
- case ETM4_PKT_I_CCNT_F3:
- pName = "I_CCNT_F3";
- pDesc = "Cycle Count format 3.";
- break;
-
- case ETM4_PKT_I_NUM_DS_MKR:
- pName = "I_NUM_DS_MKR";
- pDesc = "Data Synchronisation Marker - Numbered.";
- break;
-
- case ETM4_PKT_I_UNNUM_DS_MKR:
- pName = "I_UNNUM_DS_MKR";
- pDesc = "Data Synchronisation Marker - Unnumbered.";
- break;
-
- case ETM4_PKT_I_COMMIT:
- pName = "I_COMMIT";
- pDesc = "Commit";
- break;
-
- case ETM4_PKT_I_CANCEL_F1:
- pName = "I_CANCEL_F1";
- pDesc = "Cancel Format 1.";
- break;
-
- case ETM4_PKT_I_MISPREDICT:
- pName = "I_MISPREDICT";
- pDesc = "Mispredict.";
- break;
-
- case ETM4_PKT_I_CANCEL_F2:
- pName = "I_CANCEL_F2";
- pDesc = "Cancel Format 2.";
- break;
-
- case ETM4_PKT_I_CANCEL_F3:
- pName = "I_CANCEL_F3";
- pDesc = "Cancel Format 3.";
- break;
-
- case ETM4_PKT_I_COND_I_F2:
- pName = "I_COND_I_F2";
- pDesc = "Conditional Instruction, format 2.";
- break;
-
- case ETM4_PKT_I_COND_FLUSH:
- pName = "I_COND_FLUSH";
- pDesc = "Conditional Flush.";
- break;
-
- case ETM4_PKT_I_COND_RES_F4:
- pName = "I_COND_RES_F4";
- pDesc = "Conditional Result, format 4.";
- break;
-
- case ETM4_PKT_I_COND_RES_F2:
- pName = "I_COND_RES_F2";
- pDesc = "Conditional Result, format 2.";
- break;
-
- case ETM4_PKT_I_COND_RES_F3:
- pName = "I_COND_RES_F3";
- pDesc = "Conditional Result, format 3.";
- break;
-
- case ETM4_PKT_I_COND_RES_F1:
- pName = "I_COND_RES_F1";
- pDesc = "Conditional Result, format 1.";
- break;
-
- case ETM4_PKT_I_COND_I_F1:
- pName = "I_COND_I_F1";
- pDesc = "Conditional Instruction, format 1.";
- break;
-
- case ETM4_PKT_I_COND_I_F3:
- pName = "I_COND_I_F3";
- pDesc = "Conditional Instruction, format 3.";
- break;
-
- case ETM4_PKT_I_IGNORE:
- pName = "I_IGNORE";
- pDesc = "Ignore.";
- break;
-
- case ETM4_PKT_I_EVENT:
- pName = "I_EVENT";
- pDesc = "Trace Event.";
- break;
-
- case ETM4_PKT_I_CTXT:
- pName = "I_CTXT";
- pDesc = "Context Packet.";
- break;
-
- case ETM4_PKT_I_ADDR_CTXT_L_32IS0:
- pName = "I_ADDR_CTXT_L_32IS0";
- pDesc = "Address & Context, Long, 32 bit, IS0.";
- break;
-
- case ETM4_PKT_I_ADDR_CTXT_L_32IS1:
- pName = "I_ADDR_CTXT_L_32IS1";
- pDesc = "Address & Context, Long, 32 bit, IS0.";
- break;
-
- case ETM4_PKT_I_ADDR_CTXT_L_64IS0:
- pName = "I_ADDR_CTXT_L_64IS0";
- pDesc = "Address & Context, Long, 64 bit, IS0.";
- break;
-
- case ETM4_PKT_I_ADDR_CTXT_L_64IS1:
- pName = "I_ADDR_CTXT_L_64IS1";
- pDesc = "Address & Context, Long, 64 bit, IS1.";
- break;
-
- case ETM4_PKT_I_ADDR_MATCH:
- pName = "I_ADDR_MATCH";
- pDesc = "Exact Address Match.";
- break;
-
- case ETM4_PKT_I_ADDR_S_IS0:
- pName = "I_ADDR_S_IS0";
- pDesc = "Address, Short, IS0.";
- break;
-
- case ETM4_PKT_I_ADDR_S_IS1:
- pName = "I_ADDR_S_IS1";
- pDesc = "Address, Short, IS1.";
- break;
-
- case ETM4_PKT_I_ADDR_L_32IS0:
- pName = "I_ADDR_L_32IS0";
- pDesc = "Address, Long, 32 bit, IS0.";
- break;
-
- case ETM4_PKT_I_ADDR_L_32IS1:
- pName = "I_ADDR_L_32IS1";
- pDesc = "Address, Long, 32 bit, IS1.";
- break;
-
- case ETM4_PKT_I_ADDR_L_64IS0:
- pName = "I_ADDR_L_64IS0";
- pDesc = "Address, Long, 64 bit, IS0.";
- break;
-
- case ETM4_PKT_I_ADDR_L_64IS1:
- pName = "I_ADDR_L_64IS1";
- pDesc = "Address, Long, 64 bit, IS1.";
- break;
-
- case ETM4_PKT_I_Q:
- pName = "I_Q";
- pDesc = "Q Packet.";
- break;
-
- case ETM4_PKT_I_ATOM_F6:
- pName = "I_ATOM_F6";
- pDesc = "Atom format 6.";
- break;
-
- case ETM4_PKT_I_ATOM_F5:
- pName = "I_ATOM_F5";
- pDesc = "Atom format 5.";
- break;
-
- case ETM4_PKT_I_ATOM_F2:
- pName = "I_ATOM_F2";
- pDesc = "Atom format 2.";
- break;
-
- case ETM4_PKT_I_ATOM_F4:
- pName = "I_ATOM_F4";
- pDesc = "Atom format 4.";
- break;
-
- case ETM4_PKT_I_ATOM_F1:
- pName = "I_ATOM_F1";
- pDesc = "Atom format 1.";
- break;
-
- case ETM4_PKT_I_ATOM_F3:
- pName = "I_ATOM_F3";
- pDesc = "Atom format 3.";
- break;
-
- case ETM4_PKT_I_ASYNC:
- pName = "I_ASYNC";
- pDesc = "Alignment Synchronisation.";
- break;
-
- case ETM4_PKT_I_DISCARD:
- pName = "I_DISCARD";
- pDesc = "Discard.";
- break;
-
- case ETM4_PKT_I_OVERFLOW:
- pName = "I_OVERFLOW";
- pDesc = "Overflow.";
- break;
-
- default:
- break;
- }
-
- if(ppDesc) *ppDesc = pDesc;
- return pName;
-}
-
-void EtmV4ITrcPacket::contextStr(std::string &ctxtStr) const
-{
- ctxtStr = "";
- if(pkt_valid.bits.context_valid)
- {
- std::ostringstream oss;
- if(context.updated)
- {
- oss << "Ctxt: " << (context.SF ? "AArch64," : "AArch32, ") << "EL" << context.EL << ", " << (context.NS ? "NS; " : "S; ");
- if(context.updated_c)
- {
- oss << "CID=0x" << std::hex << std::setfill('0') << std::setw(8) << context.ctxtID << "; ";
- }
- if(context.updated_v)
- {
- oss << "VMID=0x" << std::hex << std::setfill('0') << std::setw(4) << context.VMID << "; ";
- }
- }
- else
- {
- oss << "Ctxt: Same";
- }
- ctxtStr = oss.str();
- }
-}
-
-void EtmV4ITrcPacket::atomSeq(std::string &valStr) const
-{
- std::ostringstream oss;
- uint32_t bitpattern = atom.En_bits;
- for(int i = 0; i < atom.num; i++)
- {
- oss << ((bitpattern & 0x1) ? "E" : "N");
- bitpattern >>= 1;
- }
- valStr = oss.str();
-}
-
-void EtmV4ITrcPacket::addrMatchIdx(std::string &valStr) const
-{
- std::ostringstream oss;
- oss << "[" << (uint16_t)addr_exact_match_idx << "]";
- valStr = oss.str();
-}
-
-void EtmV4ITrcPacket::exceptionInfo(std::string &valStr) const
-{
- std::ostringstream oss;
-
- static const char *ARv8Excep[] = {
- "PE Reset", "Debug Halt", "Call", "Trap",
- "System Error", "Reserved", "Inst Debug", "Data Debug",
- "Reserved", "Reserved", "Alignment", "Inst Fault",
- "Data Fault", "Reserved", "IRQ", "FIQ"
- };
-
- static const char *MExcep[] = {
- "Reserved", "PE Reset", "NMI", "HardFault",
- "MemManage", "BusFault", "UsageFault", "Reserved",
- "Reserved","Reserved","Reserved","SVC",
- "DebugMonitor", "Reserved","PendSV","SysTick",
- "IRQ0","IRQ1","IRQ2","IRQ3",
- "IRQ4","IRQ5","IRQ6","IRQ7",
- "DebugHalt", "LazyFP Push", "Lockup", "Reserved",
- "Reserved","Reserved","Reserved","Reserved"
- };
-
- if(exception_info.m_type == 0)
- {
- if(exception_info.exceptionType < 0x10)
- oss << " " << ARv8Excep[exception_info.exceptionType] << ";";
- else
- oss << " Reserved;";
-
- }
- else
- {
- if(exception_info.exceptionType < 0x20)
- oss << " " << MExcep[exception_info.exceptionType] << ";";
- else if((exception_info.exceptionType >= 0x208) && (exception_info.exceptionType <= 0x3EF))
- oss << " IRQ" << (int)(exception_info.exceptionType - 0x200) << ";";
- else
- oss << " Reserved;";
- if(exception_info.m_fault_pending)
- oss << " Fault Pending;";
- }
-
- if(exception_info.addr_interp == 0x1)
- oss << " Ret Addr Follows;";
- else if(exception_info.addr_interp == 0x2)
- oss << " Ret Addr Follows, Match Prev;";
-
- valStr = oss.str();
-}
-
-EtmV4ITrcPacket &EtmV4ITrcPacket::operator =(const ocsd_etmv4_i_pkt* p_pkt)
-{
- *dynamic_cast<ocsd_etmv4_i_pkt *>(this) = *p_pkt;
- return *this;
-}
-
-/* End of File trc_pkt_elem_etmv4i.cpp */
diff --git a/contrib/opencsd/decoder/source/etmv4/trc_pkt_proc_etmv4.cpp b/contrib/opencsd/decoder/source/etmv4/trc_pkt_proc_etmv4.cpp
deleted file mode 100644
index b8c4f819c2d3..000000000000
--- a/contrib/opencsd/decoder/source/etmv4/trc_pkt_proc_etmv4.cpp
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * \file trc_pkt_proc_etmv4.cpp
- * \brief OpenCSD :
- *
- * \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 "opencsd/etmv4/trc_pkt_proc_etmv4.h"
-#include "trc_pkt_proc_etmv4i_impl.h"
-#include "common/ocsd_error.h"
-
-#ifdef __GNUC__
-// G++ doesn't like the ## pasting
-#define ETMV4I_PKTS_NAME "PKTP_ETMV4I"
-#else
-// VC++ is fine
-#define ETMV4I_PKTS_NAME OCSD_CMPNAME_PREFIX_PKTPROC##"_ETMV4I"
-#endif
-
-static const uint32_t ETMV4_SUPPORTED_OP_FLAGS = OCSD_OPFLG_PKTPROC_COMMON;
-
-/***************************************************************************/
-/*******************ETM V4 INSTRUCTION *************************************/
-/***************************************************************************/
-
-TrcPktProcEtmV4I::TrcPktProcEtmV4I() : TrcPktProcBase(ETMV4I_PKTS_NAME),
- m_pProcessor(0)
-{
- m_supported_op_flags = ETMV4_SUPPORTED_OP_FLAGS;
-}
-
-TrcPktProcEtmV4I::TrcPktProcEtmV4I(int instIDNum) : TrcPktProcBase(ETMV4I_PKTS_NAME, instIDNum),
- m_pProcessor(0)
-{
- m_supported_op_flags = ETMV4_SUPPORTED_OP_FLAGS;
-}
-
-TrcPktProcEtmV4I::~TrcPktProcEtmV4I()
-{
- if(m_pProcessor)
- delete m_pProcessor;
- m_pProcessor = 0;
-}
-
-ocsd_err_t TrcPktProcEtmV4I::onProtocolConfig()
-{
- if(m_pProcessor == 0)
- {
- m_pProcessor = new (std::nothrow) EtmV4IPktProcImpl();
- if(m_pProcessor == 0)
- {
- LogError(ocsdError(OCSD_ERR_SEV_ERROR,OCSD_ERR_MEM));
- return OCSD_ERR_MEM;
- }
- m_pProcessor->Initialise(this);
- }
- return m_pProcessor->Configure(m_config);
-}
-
-ocsd_datapath_resp_t TrcPktProcEtmV4I::processData( const ocsd_trc_index_t index,
- const uint32_t dataBlockSize,
- const uint8_t *pDataBlock,
- uint32_t *numBytesProcessed)
-{
- if(m_pProcessor)
- return m_pProcessor->processData(index,dataBlockSize,pDataBlock,numBytesProcessed);
- return OCSD_RESP_FATAL_NOT_INIT;
-}
-
-ocsd_datapath_resp_t TrcPktProcEtmV4I::onEOT()
-{
- if(m_pProcessor)
- return m_pProcessor->onEOT();
- return OCSD_RESP_FATAL_NOT_INIT;
-}
-
-ocsd_datapath_resp_t TrcPktProcEtmV4I::onReset()
-{
- if(m_pProcessor)
- return m_pProcessor->onReset();
- return OCSD_RESP_FATAL_NOT_INIT;
-}
-
-ocsd_datapath_resp_t TrcPktProcEtmV4I::onFlush()
-{
- if(m_pProcessor)
- return m_pProcessor->onFlush();
- return OCSD_RESP_FATAL_NOT_INIT;
-}
-
-const bool TrcPktProcEtmV4I::isBadPacket() const
-{
- if(m_pProcessor)
- return m_pProcessor->isBadPacket();
- return false;
-}
-
-/* End of File trc_pkt_proc_etmv4.cpp */
diff --git a/contrib/opencsd/decoder/source/etmv4/trc_pkt_proc_etmv4d_impl.h b/contrib/opencsd/decoder/source/etmv4/trc_pkt_proc_etmv4d_impl.h
deleted file mode 100644
index 3be35bd12b55..000000000000
--- a/contrib/opencsd/decoder/source/etmv4/trc_pkt_proc_etmv4d_impl.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * \file trc_pkt_proc_etmv4d_impl.h
- * \brief OpenCSD :
- *
- * \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.
- */
-
-#ifndef ARM_TRC_PKT_PROC_ETMV4D_IMPL_H_INCLUDED
-#define ARM_TRC_PKT_PROC_ETMV4D_IMPL_H_INCLUDED
-
-#include "etmv4/trc_pkt_proc_etmv4.h"
-#include "etmv4/trc_cmp_cfg_etmv4.h"
-
-class EtmV4DPktProcImpl
-{
-public:
- EtmV4DPktProcImpl();
- ~EtmV4DPktProcImpl();
-
- void Initialise(TrcPktProcEtmV4D *p_interface);
-
- ocsd_err_t Configure(const EtmV4Config *p_config);
-
-
- ocsd_datapath_resp_t processData( const ocsd_trc_index_t index,
- const uint32_t dataBlockSize,
- const uint8_t *pDataBlock,
- uint32_t *numBytesProcessed);
- ocsd_datapath_resp_t onEOT();
- ocsd_datapath_resp_t onReset();
- ocsd_datapath_resp_t onFlush();
-
-protected:
-
- bool m_isInit;
- TrcPktProcEtmV4D *m_interface; /**< The interface to the other decode components */
-
- EtmV4Config m_config;
-};
-
-
-#endif // ARM_TRC_PKT_PROC_ETMV4D_IMPL_H_INCLUDED
-
-/* End of File trc_pkt_proc_etmv4d_impl.h */
diff --git a/contrib/opencsd/decoder/source/etmv4/trc_pkt_proc_etmv4i_impl.cpp b/contrib/opencsd/decoder/source/etmv4/trc_pkt_proc_etmv4i_impl.cpp
deleted file mode 100644
index 0607c192f879..000000000000
--- a/contrib/opencsd/decoder/source/etmv4/trc_pkt_proc_etmv4i_impl.cpp
+++ /dev/null
@@ -1,1694 +0,0 @@
-/*
- * \file trc_pkt_proc_etmv4i_impl.cpp
- * \brief OpenCSD :
- *
- * \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 "trc_pkt_proc_etmv4i_impl.h"
-
-/* Trace raw input buffer class */
-TraceRawBuffer::TraceRawBuffer()
-{
- m_bufSize = 0;
- m_bufProcessed = 0;
- m_pBuffer = 0;
- pkt = 0;
-}
-
-// init the buffer
-void TraceRawBuffer::init(const uint32_t size, const uint8_t *rawtrace, std::vector<uint8_t> *out_packet)
-{
- m_bufSize = size;
- m_bufProcessed = 0;
- m_pBuffer = rawtrace;
- pkt = out_packet;
-}
-
-void TraceRawBuffer::copyByteToPkt()
-{
- if (!empty()) {
- pkt->push_back(m_pBuffer[m_bufProcessed]);
- m_bufProcessed++;
- }
-}
-uint8_t TraceRawBuffer::peekNextByte()
-{
- uint8_t val = 0;
- if (!empty())
- val = m_pBuffer[m_bufProcessed];
- return val;
-}
-
-/* trace etmv4 packet processing class */
-EtmV4IPktProcImpl::EtmV4IPktProcImpl() :
- m_isInit(false),
- m_interface(0),
- m_first_trace_info(false)
-{
-
-}
-
-EtmV4IPktProcImpl::~EtmV4IPktProcImpl()
-{
-}
-
-void EtmV4IPktProcImpl::Initialise(TrcPktProcEtmV4I *p_interface)
-{
- if(p_interface)
- {
- m_interface = p_interface;
- m_isInit = true;
- }
- InitProcessorState();
-}
-
-ocsd_err_t EtmV4IPktProcImpl::Configure(const EtmV4Config *p_config)
-{
- ocsd_err_t err = OCSD_OK;
- if(p_config != 0)
- {
- m_config = *p_config;
- BuildIPacketTable(); // packet table based on config
- }
- else
- {
- err = OCSD_ERR_INVALID_PARAM_VAL;
- if(m_isInit)
- m_interface->LogError(ocsdError(OCSD_ERR_SEV_ERROR,err));
- }
- return err;
-}
-
-ocsd_datapath_resp_t EtmV4IPktProcImpl::processData( const ocsd_trc_index_t index,
- const uint32_t dataBlockSize,
- const uint8_t *pDataBlock,
- uint32_t *numBytesProcessed)
-{
- ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
- m_trcIn.init(dataBlockSize, pDataBlock, &m_currPacketData);
- m_blockIndex = index;
- bool done = false;
- uint8_t nextByte;
-
- do
- {
- try
- {
- /* while (((m_blockBytesProcessed < dataBlockSize) ||
- ((m_blockBytesProcessed == dataBlockSize) && (m_process_state == SEND_PKT))) &&
- OCSD_DATA_RESP_IS_CONT(resp))*/
- while ( (!m_trcIn.empty() || (m_process_state == SEND_PKT)) &&
- OCSD_DATA_RESP_IS_CONT(resp)
- )
- {
- switch (m_process_state)
- {
- case PROC_HDR:
- m_packet_index = m_blockIndex + m_trcIn.processed();
- if (m_is_sync)
- {
- nextByte = m_trcIn.peekNextByte();
- m_pIPktFn = m_i_table[nextByte].pptkFn;
- m_curr_packet.type = m_i_table[nextByte].pkt_type;
- }
- else
- {
- // unsynced - process data until we see a sync point
- m_pIPktFn = &EtmV4IPktProcImpl::iNotSync;
- m_curr_packet.type = ETM4_PKT_I_NOTSYNC;
- }
- m_process_state = PROC_DATA;
-
- case PROC_DATA:
- // loop till full packet or no more data...
- while (!m_trcIn.empty() && (m_process_state == PROC_DATA))
- {
- nextByte = m_trcIn.peekNextByte();
- m_trcIn.copyByteToPkt(); // move next byte into the packet
- // m_currPacketData.push_back(pDataBlock[m_blockBytesProcessed]);
- // m_blockBytesProcessed++;
- (this->*m_pIPktFn)(nextByte);
- }
- break;
-
- case SEND_PKT:
- resp = outputPacket();
- InitPacketState();
- m_process_state = PROC_HDR;
- break;
-
- case SEND_UNSYNCED:
- resp = outputUnsyncedRawPacket();
- if (m_update_on_unsync_packet_index != 0)
- {
- m_packet_index = m_update_on_unsync_packet_index;
- m_update_on_unsync_packet_index = 0;
- }
- m_process_state = PROC_DATA; // after dumping unsynced data, still in data mode.
- break;
- }
- }
- done = true;
- }
- catch(ocsdError &err)
- {
- done = true;
- m_interface->LogError(err);
- if( (err.getErrorCode() == OCSD_ERR_BAD_PACKET_SEQ) ||
- (err.getErrorCode() == OCSD_ERR_INVALID_PCKT_HDR))
- {
- // send invalid packets up the pipe to let the next stage decide what to do.
- m_process_state = SEND_PKT;
- done = false;
- }
- else
- {
- // bail out on any other error.
- resp = OCSD_RESP_FATAL_INVALID_DATA;
- }
- }
- catch(...)
- {
- done = true;
- /// vv bad at this point.
- resp = OCSD_RESP_FATAL_SYS_ERR;
- const ocsdError &fatal = ocsdError(OCSD_ERR_SEV_ERROR,OCSD_ERR_FAIL,m_packet_index,m_config.getTraceID(),"Unknown System Error decoding trace.");
- m_interface->LogError(fatal);
- }
- } while (!done);
-
- *numBytesProcessed = m_trcIn.processed();
- return resp;
-}
-
-ocsd_datapath_resp_t EtmV4IPktProcImpl::onEOT()
-{
- ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
- // if we have a partial packet then send to attached sinks
- if(m_currPacketData.size() != 0)
- {
- m_curr_packet.updateErrType(ETM4_PKT_I_INCOMPLETE_EOT);
- resp = outputPacket();
- InitPacketState();
- }
- return resp;
-}
-
-ocsd_datapath_resp_t EtmV4IPktProcImpl::onReset()
-{
- // prepare for new decoding session
- InitProcessorState();
- return OCSD_RESP_CONT;
-}
-
-ocsd_datapath_resp_t EtmV4IPktProcImpl::onFlush()
-{
- // packet processor never holds on to flushable data (may have partial packet,
- // but any full packets are immediately sent)
- return OCSD_RESP_CONT;
-}
-
-void EtmV4IPktProcImpl::InitPacketState()
-{
- m_currPacketData.clear();
- m_curr_packet.initNextPacket(); // clear for next packet.
- m_update_on_unsync_packet_index = 0;
-}
-
-void EtmV4IPktProcImpl::InitProcessorState()
-{
- InitPacketState();
- m_pIPktFn = &EtmV4IPktProcImpl::iNotSync;
- m_packet_index = 0;
- m_is_sync = false;
- m_first_trace_info = false;
- m_sent_notsync_packet = false;
- m_process_state = PROC_HDR;
- m_curr_packet.initStartState();
-}
-
-ocsd_datapath_resp_t EtmV4IPktProcImpl::outputPacket()
-{
- ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
- resp = m_interface->outputOnAllInterfaces(m_packet_index,&m_curr_packet,&m_curr_packet.type,m_currPacketData);
- return resp;
-}
-
-ocsd_datapath_resp_t EtmV4IPktProcImpl::outputUnsyncedRawPacket()
-{
- ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
-
-
- m_interface->outputRawPacketToMonitor(m_packet_index,&m_curr_packet,m_dump_unsynced_bytes,&m_currPacketData[0]);
-
- if(!m_sent_notsync_packet)
- {
- resp = m_interface->outputDecodedPacket(m_packet_index,&m_curr_packet);
- m_sent_notsync_packet = true;
- }
-
- if(m_currPacketData.size() <= m_dump_unsynced_bytes)
- m_currPacketData.clear();
- else
- m_currPacketData.erase(m_currPacketData.begin(),m_currPacketData.begin()+m_dump_unsynced_bytes);
-
- return resp;
-}
-
-void EtmV4IPktProcImpl::iNotSync(const uint8_t lastByte)
-{
- // is it an extension byte?
- if (lastByte == 0x00) // TBD : add check for forced sync in here?
- {
- if (m_currPacketData.size() > 1)
- {
- m_dump_unsynced_bytes = m_currPacketData.size() - 1;
- m_process_state = SEND_UNSYNCED;
- // outputting some data then update packet index after so output indexes accurate
- m_update_on_unsync_packet_index = m_blockIndex + m_trcIn.processed() - 1;
- }
- else
- m_packet_index = m_blockIndex + m_trcIn.processed() - 1; // set it up now otherwise.
-
- m_pIPktFn = m_i_table[lastByte].pptkFn;
- }
- else if (m_currPacketData.size() >= 8)
- {
- m_dump_unsynced_bytes = m_currPacketData.size();
- m_process_state = SEND_UNSYNCED;
- // outputting some data then update packet index after so output indexes accurate
- m_update_on_unsync_packet_index = m_blockIndex + m_trcIn.processed();
- }
-}
-
-void EtmV4IPktProcImpl::iPktNoPayload(const uint8_t lastByte)
-{
- // some expansion may be required...
- switch(m_curr_packet.type)
- {
- case ETM4_PKT_I_ADDR_MATCH:
- m_curr_packet.setAddressExactMatch(lastByte & 0x3);
- break;
-
- case ETM4_PKT_I_EVENT:
- m_curr_packet.setEvent(lastByte & 0xF);
- break;
-
- case ETM4_PKT_I_NUM_DS_MKR:
- case ETM4_PKT_I_UNNUM_DS_MKR:
- m_curr_packet.setDataSyncMarker(lastByte & 0x7);
- break;
-
- // these just need the packet type - no processing required.
- case ETM4_PKT_I_COND_FLUSH:
- case ETM4_PKT_I_EXCEPT_RTN:
- case ETM4_PKT_I_TRACE_ON:
- case ETM4_PKT_I_FUNC_RET:
- case ETM4_PKT_I_IGNORE:
- default: break;
- }
- m_process_state = SEND_PKT; // now just send it....
-}
-
-void EtmV4IPktProcImpl::iPktReserved(const uint8_t lastByte)
-{
- m_curr_packet.updateErrType(ETM4_PKT_I_RESERVED, lastByte); // swap type for err type
- throw ocsdError(OCSD_ERR_SEV_ERROR, OCSD_ERR_INVALID_PCKT_HDR,m_packet_index,m_config.getTraceID());
-}
-
-void EtmV4IPktProcImpl::iPktInvalidCfg(const uint8_t lastByte)
-{
- m_curr_packet.updateErrType(ETM4_PKT_I_RESERVED_CFG, lastByte); // swap type for err type
- throw ocsdError(OCSD_ERR_SEV_ERROR, OCSD_ERR_INVALID_PCKT_HDR, m_packet_index, m_config.getTraceID());
-}
-
-void EtmV4IPktProcImpl::iPktExtension(const uint8_t lastByte)
-{
- if(m_currPacketData.size() == 2)
- {
- // not sync and not next by 0x00 - not sync sequence
- if(!m_is_sync && (lastByte != 0x00))
- {
- m_pIPktFn = &EtmV4IPktProcImpl::iNotSync;
- m_curr_packet.type = ETM4_PKT_I_NOTSYNC;
- return;
- }
-
- switch(lastByte)
- {
- case 0x03: // discard packet.
- m_curr_packet.type = ETM4_PKT_I_DISCARD;
- m_process_state = SEND_PKT;
- break;
-
- case 0x05:
- m_curr_packet.type = ETM4_PKT_I_OVERFLOW;
- m_process_state = SEND_PKT;
- break;
-
- case 0x00:
- m_curr_packet.type = ETM4_PKT_I_ASYNC;
- m_pIPktFn = &EtmV4IPktProcImpl::iPktASync; // handle subsequent bytes as async
- break;
-
- default:
- m_curr_packet.err_type = m_curr_packet.type;
- m_curr_packet.type = ETM4_PKT_I_BAD_SEQUENCE;
- m_process_state = SEND_PKT;
- break;
- }
- }
-}
-
-void EtmV4IPktProcImpl::iPktASync(const uint8_t lastByte)
-{
- if(lastByte != 0x00)
- {
- // not sync and not next by 0x00 - not sync sequence if < 12
- if(!m_is_sync && m_currPacketData.size() != 12)
- {
- m_pIPktFn = &EtmV4IPktProcImpl::iNotSync;
- m_curr_packet.type = ETM4_PKT_I_NOTSYNC;
- return;
- }
-
- // 12 bytes and not valid sync sequence - not possible even if not synced
- m_process_state = SEND_PKT;
- if((m_currPacketData.size() != 12) || (lastByte != 0x80))
- {
- m_curr_packet.type = ETM4_PKT_I_BAD_SEQUENCE;
- m_curr_packet.err_type = ETM4_PKT_I_ASYNC;
- }
- else
- m_is_sync = true; // found a sync packet, mark decoder as synchronised.
- }
- else if(m_currPacketData.size() == 12)
- {
- if(!m_is_sync)
- {
- // if we are not yet synced then ignore extra leading 0x00.
- m_dump_unsynced_bytes = 1;
- m_process_state = SEND_UNSYNCED;
- }
- else
- {
- // bad periodic ASYNC sequence.
- m_curr_packet.type = ETM4_PKT_I_BAD_SEQUENCE;
- m_curr_packet.err_type = ETM4_PKT_I_ASYNC;
- m_process_state = SEND_PKT;
- }
- }
-}
-
-void EtmV4IPktProcImpl::iPktTraceInfo(const uint8_t lastByte)
-{
- if(m_currPacketData.size() == 1) // header
- {
- //clear flags
- m_tinfo_sections.sectFlags = 0; // mark all sections as incomplete.
- m_tinfo_sections.ctrlBytes = 1; // assume only a single control section byte for now
-
- }
- else if(m_currPacketData.size() == 2) // first payload control byte
- {
- // figure out which sections are absent and set to true - opposite of bitfeild in byte;
- m_tinfo_sections.sectFlags = (~lastByte) & TINFO_ALL_SECT;
-
- // see if there is an extended control section, otherwise this byte is it.
- if((lastByte & 0x80) == 0x0)
- m_tinfo_sections.sectFlags |= TINFO_CTRL;
-
- }
- else
- {
- if(!(m_tinfo_sections.sectFlags & TINFO_CTRL))
- {
- m_tinfo_sections.sectFlags |= (lastByte & 0x80) ? 0 : TINFO_CTRL;
- m_tinfo_sections.ctrlBytes++;
- }
- else if(!(m_tinfo_sections.sectFlags & TINFO_INFO_SECT))
- m_tinfo_sections.sectFlags |= (lastByte & 0x80) ? 0 : TINFO_INFO_SECT;
- else if(!(m_tinfo_sections.sectFlags & TINFO_KEY_SECT))
- m_tinfo_sections.sectFlags |= (lastByte & 0x80) ? 0 : TINFO_KEY_SECT;
- else if(!(m_tinfo_sections.sectFlags & TINFO_SPEC_SECT))
- m_tinfo_sections.sectFlags |= (lastByte & 0x80) ? 0 : TINFO_SPEC_SECT;
- else if(!(m_tinfo_sections.sectFlags & TINFO_CYCT_SECT))
- m_tinfo_sections.sectFlags |= (lastByte & 0x80) ? 0 : TINFO_CYCT_SECT;
- }
-
- // all sections accounted for?
- if(m_tinfo_sections.sectFlags == TINFO_ALL)
- {
- // index of first section is number of payload control bytes + 1 for header byte
- unsigned idx = m_tinfo_sections.ctrlBytes + 1;
- uint32_t fieldVal = 0;
- uint8_t presSect = m_currPacketData[1] & TINFO_ALL_SECT; // first payload control byte
-
- m_curr_packet.clearTraceInfo();
-
- if((presSect & TINFO_INFO_SECT) && (idx < m_currPacketData.size()))
- {
- idx += extractContField(m_currPacketData,idx,fieldVal);
- m_curr_packet.setTraceInfo(fieldVal);
- }
- if((presSect & TINFO_KEY_SECT) && (idx < m_currPacketData.size()))
- {
- idx += extractContField(m_currPacketData,idx,fieldVal);
- m_curr_packet.setTraceInfoKey(fieldVal);
- }
- if((presSect & TINFO_SPEC_SECT) && (idx < m_currPacketData.size()))
- {
- idx += extractContField(m_currPacketData,idx,fieldVal);
- m_curr_packet.setTraceInfoSpec(fieldVal);
- }
- if((presSect & TINFO_CYCT_SECT) && (idx < m_currPacketData.size()))
- {
- idx += extractContField(m_currPacketData,idx,fieldVal);
- m_curr_packet.setTraceInfoCyct(fieldVal);
- }
- m_process_state = SEND_PKT;
- m_first_trace_info = true;
- }
-
-}
-
-void EtmV4IPktProcImpl::iPktTimestamp(const uint8_t lastByte)
-{
- // process the header byte
- if(m_currPacketData.size() == 1)
- {
- m_ccount_done = (bool)((lastByte & 0x1) == 0); // 0 = not present
- m_ts_done = false;
- m_ts_bytes = 0;
- }
- else
- {
- if(!m_ts_done)
- {
- m_ts_bytes++;
- m_ts_done = (m_ts_bytes == 9) || ((lastByte & 0x80) == 0);
- }
- else if(!m_ccount_done)
- {
- m_ccount_done = (bool)((lastByte & 0x80) == 0);
- // TBD: check for oorange ccount - bad packet.
- }
- }
-
- if(m_ts_done && m_ccount_done)
- {
- int idx = 1;
- uint64_t tsVal;
- int ts_bytes = extractContField64(m_currPacketData, idx, tsVal);
- int ts_bits = ts_bytes < 7 ? ts_bytes * 7 : 64;
-
- if(!m_curr_packet.pkt_valid.bits.ts_valid && m_first_trace_info)
- ts_bits = 64; // after trace info, missing bits are all 0.
-
- m_curr_packet.setTS(tsVal,(uint8_t)ts_bits);
-
- if((m_currPacketData[0] & 0x1) == 0x1)
- {
- uint32_t countVal, countMask;
-
- idx += ts_bytes;
- extractContField(m_currPacketData, idx, countVal, 3); // only 3 possible count bytes.
- countMask = (((uint32_t)1UL << m_config.ccSize()) - 1); // mask of the CC size
- countVal &= countMask;
- m_curr_packet.setCycleCount(countVal);
- }
-
- m_process_state = SEND_PKT;
- }
-}
-
-void EtmV4IPktProcImpl::iPktException(const uint8_t lastByte)
-{
- uint16_t excep_type = 0;
-
- switch(m_currPacketData.size())
- {
- case 1: m_excep_size = 3; break;
- case 2: if((lastByte & 0x80) == 0x00)
- m_excep_size = 2;
- break;
- }
-
- if(m_currPacketData.size() == (unsigned)m_excep_size)
- {
- excep_type = (m_currPacketData[1] >> 1) & 0x1F;
- uint8_t addr_interp = (m_currPacketData[1] & 0x40) >> 5 | (m_currPacketData[1] & 0x1);
- uint8_t m_fault_pending = 0;
- uint8_t m_type = (m_config.coreProfile() == profile_CortexM) ? 1 : 0;
-
- // extended exception packet (probably M class);
- if(m_currPacketData[1] & 0x80)
- {
- excep_type |= ((uint16_t)m_currPacketData[2] & 0x1F) << 5;
- m_fault_pending = (m_currPacketData[2] >> 5) & 0x1;
- }
- m_curr_packet.setExceptionInfo(excep_type,addr_interp,m_fault_pending, m_type);
- m_process_state = SEND_PKT;
-
- // allow the standard address packet handlers to process the address packet field for the exception.
- }
-}
-
-void EtmV4IPktProcImpl::iPktCycleCntF123(const uint8_t lastByte)
-{
- ocsd_etmv4_i_pkt_type format = m_curr_packet.type;
-
- if( m_currPacketData.size() == 1)
- {
- m_count_done = m_commit_done = false;
- m_has_count = true;
-
- if(format == ETM4_PKT_I_CCNT_F3)
- {
- // no commit section for TRCIDR0.COMMOPT == 1
- if(!m_config.commitOpt1())
- {
- m_curr_packet.setCommitElements(((lastByte >> 2) & 0x3) + 1);
- }
- // TBD: warning of non-valid CC threshold here?
- m_curr_packet.setCycleCount(m_curr_packet.getCCThreshold() + (lastByte & 0x3));
- m_process_state = SEND_PKT;
- }
- else if(format == ETM4_PKT_I_CCNT_F1)
- {
- if((lastByte & 0x1) == 0x1)
- {
- m_has_count = false;
- m_count_done = true;
- }
-
- // no commit section for TRCIDR0.COMMOPT == 1
- if(m_config.commitOpt1())
- m_commit_done = true;
- }
- }
- else if((format == ETM4_PKT_I_CCNT_F2) && ( m_currPacketData.size() == 2))
- {
- int commit_offset = ((lastByte & 0x1) == 0x1) ? ((int)m_config.MaxSpecDepth() - 15) : 1;
- int commit_elements = ((lastByte >> 4) & 0xF);
- commit_elements += commit_offset;
-
- // TBD: warning if commit elements < 0?
-
- m_curr_packet.setCycleCount(m_curr_packet.getCCThreshold() + (lastByte & 0xF));
- m_curr_packet.setCommitElements(commit_elements);
- m_process_state = SEND_PKT;
- }
- else
- {
- // F1 and size 2 or more
- if(!m_commit_done)
- m_commit_done = ((lastByte & 0x80) == 0x00);
- else if(!m_count_done)
- m_count_done = ((lastByte & 0x80) == 0x00);
- }
-
- if((format == ETM4_PKT_I_CCNT_F1) && m_commit_done && m_count_done)
- {
- int idx = 1; // index into buffer for payload data.
- uint32_t field_value = 0;
- // no commit section for TRCIDR0.COMMOPT == 1
- if(!m_config.commitOpt1())
- {
- idx += extractContField(m_currPacketData,idx,field_value);
- m_curr_packet.setCommitElements(field_value);
- }
- if (m_has_count)
- {
- extractContField(m_currPacketData, idx, field_value, 3);
- m_curr_packet.setCycleCount(field_value + m_curr_packet.getCCThreshold());
- }
- else
- m_curr_packet.setCycleCount(0); /* unknown CC marked as 0 after overflow */
- m_process_state = SEND_PKT;
- }
-}
-
-void EtmV4IPktProcImpl::iPktSpeclRes(const uint8_t lastByte)
-{
- if(m_currPacketData.size() == 1)
- {
- switch(m_curr_packet.getType())
- {
- case ETM4_PKT_I_MISPREDICT:
- case ETM4_PKT_I_CANCEL_F2:
- switch(lastByte & 0x3)
- {
- case 0x1: m_curr_packet.setAtomPacket(ATOM_PATTERN, 0x1, 1); break; // E
- case 0x2: m_curr_packet.setAtomPacket(ATOM_PATTERN, 0x3, 2); break; // EE
- case 0x3: m_curr_packet.setAtomPacket(ATOM_PATTERN, 0x0, 1); break; // N
- }
- if(m_curr_packet.getType() == ETM4_PKT_I_CANCEL_F2)
- m_curr_packet.setCancelElements(1);
- m_process_state = SEND_PKT;
- break;
-
- case ETM4_PKT_I_CANCEL_F3:
- if(lastByte & 0x1)
- m_curr_packet.setAtomPacket(ATOM_PATTERN, 0x1, 1); // E
- m_curr_packet.setCancelElements(((lastByte >> 1) & 0x3) + 2);
- m_process_state = SEND_PKT;
- break;
- }
- }
- else
- {
- if((lastByte & 0x80) == 0x00)
- {
- uint32_t field_val = 0;
- extractContField(m_currPacketData,1,field_val);
- if(m_curr_packet.getType() == ETM4_PKT_I_COMMIT)
- m_curr_packet.setCommitElements(field_val);
- else
- m_curr_packet.setCancelElements(field_val);
- // TBD: sanity check with max spec depth here?
- m_process_state = SEND_PKT;
- }
- }
-}
-
-void EtmV4IPktProcImpl::iPktCondInstr(const uint8_t lastByte)
-{
- bool bF1Done = false;
-
- if(m_currPacketData.size() == 1)
- {
- if(m_curr_packet.getType() == ETM4_PKT_I_COND_I_F2)
- {
- m_curr_packet.setCondIF2(lastByte & 0x3);
- m_process_state = SEND_PKT;
- }
-
- }
- else if(m_currPacketData.size() == 2)
- {
- if(m_curr_packet.getType() == ETM4_PKT_I_COND_I_F3) // f3 two bytes long
- {
- uint8_t num_c_elem = ((lastByte >> 1) & 0x3F) + (lastByte & 0x1);
- m_curr_packet.setCondIF3(num_c_elem,(bool)((lastByte & 0x1) == 0x1));
- // TBD: check for 0 num_c_elem in here.
- m_process_state = SEND_PKT;
- }
- else
- {
- bF1Done = ((lastByte & 0x80) == 0x00);
- }
- }
- else
- {
- bF1Done = ((lastByte & 0x80) == 0x00);
- }
-
- if(bF1Done)
- {
- uint32_t cond_key = 0;
- extractContField(m_currPacketData, 1, cond_key);
- m_process_state = SEND_PKT;
- }
-}
-
-void EtmV4IPktProcImpl::iPktCondResult(const uint8_t lastByte)
-{
- if(m_currPacketData.size() == 1)
- {
- m_F1P1_done = false; // F1 payload 1 done
- m_F1P2_done = false; // F1 payload 2 done
- m_F1has_P2 = false; // F1 has a payload 2
-
- switch(m_curr_packet.getType())
- {
- case ETM4_PKT_I_COND_RES_F1:
-
- m_F1has_P2 = true;
- if((lastByte & 0xFC) == 0x6C)// only one payload set
- {
- m_F1P2_done = true;
- m_F1has_P2 = false;
- }
- break;
-
- case ETM4_PKT_I_COND_RES_F2:
- m_curr_packet.setCondRF2((lastByte & 0x4) ? 2 : 1, lastByte & 0x3);
- m_process_state = SEND_PKT;
- break;
-
- case ETM4_PKT_I_COND_RES_F3:
- break;
-
- case ETM4_PKT_I_COND_RES_F4:
- m_curr_packet.setCondRF4(lastByte & 0x3);
- m_process_state = SEND_PKT;
- break;
- }
- }
- else if((m_curr_packet.getType() == ETM4_PKT_I_COND_RES_F3) && (m_currPacketData.size() == 2))
- {
- // 2nd F3 packet
- uint16_t f3_tokens = 0;
- f3_tokens = (uint16_t)m_currPacketData[1];
- f3_tokens |= ((uint16_t)m_currPacketData[0] & 0xf) << 8;
- m_curr_packet.setCondRF3(f3_tokens);
- m_process_state = SEND_PKT;
- }
- else // !first packet - F1
- {
- if(!m_F1P1_done)
- m_F1P1_done = ((lastByte & 0x80) == 0x00);
- else if(!m_F1P2_done)
- m_F1P2_done = ((lastByte & 0x80) == 0x00);
-
- if(m_F1P1_done && m_F1P2_done)
- {
- int st_idx = 1;
- uint32_t key[2];
- uint8_t result[2];
- uint8_t CI[2];
-
- st_idx+= extractCondResult(m_currPacketData,st_idx,key[0],result[0]);
- CI[0] = m_currPacketData[0] & 0x1;
- if(m_F1has_P2) // 2nd payload?
- {
- extractCondResult(m_currPacketData,st_idx,key[1],result[1]);
- CI[1] = (m_currPacketData[0] >> 1) & 0x1;
- }
- m_curr_packet.setCondRF1(key,result,CI,m_F1has_P2);
- m_process_state = SEND_PKT;
- }
- }
-}
-
-void EtmV4IPktProcImpl::iPktContext(const uint8_t lastByte)
-{
- bool bSendPacket = false;
-
- if(m_currPacketData.size() == 1)
- {
- if((lastByte & 0x1) == 0)
- {
- m_curr_packet.setContextInfo(false); // no update context packet (ctxt same as last time).
- m_process_state = SEND_PKT;
- }
- }
- else if(m_currPacketData.size() == 2)
- {
- if((lastByte & 0xC0) == 0) // no VMID or CID
- {
- bSendPacket = true;
- }
- else
- {
- m_vmidBytes = ((lastByte & 0x40) == 0x40) ? (m_config.vmidSize()/8) : 0;
- m_ctxtidBytes = ((lastByte & 0x80) == 0x80) ? (m_config.cidSize()/8) : 0;
- }
- }
- else // 3rd byte onwards
- {
- if(m_vmidBytes > 0)
- m_vmidBytes--;
- else if(m_ctxtidBytes > 0)
- m_ctxtidBytes--;
-
- if((m_ctxtidBytes == 0) && (m_vmidBytes == 0))
- bSendPacket = true;
- }
-
- if(bSendPacket)
- {
- extractAndSetContextInfo(m_currPacketData,1);
- m_process_state = SEND_PKT;
- }
-}
-
-void EtmV4IPktProcImpl::extractAndSetContextInfo(const std::vector<uint8_t> &buffer, const int st_idx)
-{
- // on input, buffer index points at the info byte - always present
- uint8_t infoByte = m_currPacketData[st_idx];
-
- m_curr_packet.setContextInfo(true, (infoByte & 0x3), (infoByte >> 5) & 0x1, (infoByte >> 4) & 0x1);
-
- // see if there are VMID and CID bytes, and how many.
- int nVMID_bytes = ((infoByte & 0x40) == 0x40) ? (m_config.vmidSize()/8) : 0;
- int nCtxtID_bytes = ((infoByte & 0x80) == 0x80) ? (m_config.cidSize()/8) : 0;
-
- // extract any VMID and CID
- int payload_idx = st_idx+1;
- if(nVMID_bytes)
- {
- uint32_t VMID = 0;
- for(int i = 0; i < nVMID_bytes; i++)
- {
- VMID |= ((uint32_t)m_currPacketData[i+payload_idx] << i*8);
- }
- payload_idx += nVMID_bytes;
- m_curr_packet.setContextVMID(VMID);
- }
-
- if(nCtxtID_bytes)
- {
- uint32_t CID = 0;
- for(int i = 0; i < nCtxtID_bytes; i++)
- {
- CID |= ((uint32_t)m_currPacketData[i+payload_idx] << i*8);
- }
- m_curr_packet.setContextCID(CID);
- }
-}
-
-void EtmV4IPktProcImpl::iPktAddrCtxt(const uint8_t lastByte)
-{
- if( m_currPacketData.size() == 1)
- {
- m_addrIS = 0;
- m_addrBytes = 4;
- m_bAddr64bit = false;
- m_vmidBytes = 0;
- m_ctxtidBytes = 0;
- m_bCtxtInfoDone = false;
-
- switch(m_curr_packet.type)
- {
- case ETM4_PKT_I_ADDR_CTXT_L_32IS1:
- m_addrIS = 1;
- case ETM4_PKT_I_ADDR_CTXT_L_32IS0:
- break;
-
- case ETM4_PKT_I_ADDR_CTXT_L_64IS1:
- m_addrIS = 1;
- case ETM4_PKT_I_ADDR_CTXT_L_64IS0:
- m_addrBytes = 8;
- m_bAddr64bit = true;
- break;
- }
- }
- else
- {
- if(m_addrBytes == 0)
- {
- if(m_bCtxtInfoDone == false)
- {
- m_bCtxtInfoDone = true;
- m_vmidBytes = ((lastByte & 0x40) == 0x40) ? (m_config.vmidSize()/8) : 0;
- m_ctxtidBytes = ((lastByte & 0x80) == 0x80) ? (m_config.cidSize()/8) : 0;
- }
- else
- {
- if( m_vmidBytes > 0)
- m_vmidBytes--;
- else if(m_ctxtidBytes > 0)
- m_ctxtidBytes--;
- }
- }
- else
- m_addrBytes--;
-
- if((m_addrBytes == 0) && m_bCtxtInfoDone && (m_vmidBytes == 0) && (m_ctxtidBytes == 0))
- {
- int st_idx = 1;
- if(m_bAddr64bit)
- {
- uint64_t val64;
- st_idx+=extract64BitLongAddr(m_currPacketData,st_idx,m_addrIS,val64);
- m_curr_packet.set64BitAddress(val64,m_addrIS);
- }
- else
- {
- uint32_t val32;
- st_idx+=extract32BitLongAddr(m_currPacketData,st_idx,m_addrIS,val32);
- m_curr_packet.set32BitAddress(val32,m_addrIS);
- }
- extractAndSetContextInfo(m_currPacketData,st_idx);
- m_process_state = SEND_PKT;
- }
- }
-}
-
-void EtmV4IPktProcImpl::iPktShortAddr(const uint8_t lastByte)
-{
- if (m_currPacketData.size() == 1)
- {
- m_addr_done = false;
- m_addrIS = 0;
- if (lastByte == ETM4_PKT_I_ADDR_S_IS1)
- m_addrIS = 1;
- }
- else if(!m_addr_done)
- {
- m_addr_done = (m_currPacketData.size() == 3) || ((lastByte & 0x80) == 0x00);
- }
-
- if(m_addr_done)
- {
- uint32_t addr_val = 0;
- int bits = 0;
-
- extractShortAddr(m_currPacketData,1,m_addrIS,addr_val,bits);
- m_curr_packet.updateShortAddress(addr_val,m_addrIS,(uint8_t)bits);
- m_process_state = SEND_PKT;
- }
-}
-
-int EtmV4IPktProcImpl::extractShortAddr(const std::vector<uint8_t> &buffer, const int st_idx, const uint8_t IS, uint32_t &value, int &bits)
-{
- int IS_shift = (IS == 0) ? 2 : 1;
- int idx = 0;
-
- bits = 7; // at least 7 bits
- value = 0;
- value |= ((uint32_t)(buffer[st_idx+idx] & 0x7F)) << IS_shift;
-
- if(m_currPacketData[st_idx+idx] & 0x80)
- {
- idx++;
- value |= ((uint32_t)m_currPacketData[st_idx+idx]) << (7 + IS_shift);
- bits += 8;
- }
- idx++;
- bits += IS_shift;
- return idx;
-}
-
-void EtmV4IPktProcImpl::iPktLongAddr(const uint8_t lastByte)
-{
- if(m_currPacketData.size() == 1)
- {
- // init the intra-byte data
- m_addrIS = 0;
- m_bAddr64bit = false;
- m_addrBytes = 4;
-
- switch(m_curr_packet.type)
- {
- case ETM4_PKT_I_ADDR_L_32IS1:
- m_addrIS = 1;
- case ETM4_PKT_I_ADDR_L_32IS0:
- m_addrBytes = 4;
- break;
-
- case ETM4_PKT_I_ADDR_L_64IS1:
- m_addrIS = 1;
- case ETM4_PKT_I_ADDR_L_64IS0:
- m_addrBytes = 8;
- m_bAddr64bit = true;
- break;
- }
- }
- if(m_currPacketData.size() == (unsigned)(1+m_addrBytes))
- {
- int st_idx = 1;
- if(m_bAddr64bit)
- {
- uint64_t val64;
- st_idx+=extract64BitLongAddr(m_currPacketData,st_idx,m_addrIS,val64);
- m_curr_packet.set64BitAddress(val64,m_addrIS);
- }
- else
- {
- uint32_t val32;
- st_idx+=extract32BitLongAddr(m_currPacketData,st_idx,m_addrIS,val32);
- m_curr_packet.set32BitAddress(val32,m_addrIS);
- }
- m_process_state = SEND_PKT;
- }
-}
-
-void EtmV4IPktProcImpl::iPktQ(const uint8_t lastByte)
-{
- if(m_currPacketData.size() == 1)
- {
- m_Q_type = lastByte & 0xF;
-
- m_addrBytes = 0;
- m_count_done = false;
- m_has_addr = false;
- m_addr_short = true;
- m_addr_match = false;
- m_addrIS = 1;
- m_QE = 0;
-
- switch(m_Q_type)
- {
- // count only - implied address.
- case 0x0:
- case 0x1:
- case 0x2:
- m_addr_match = true;
- m_has_addr = true;
- m_QE = m_Q_type & 0x3;
- case 0xC:
- break;
-
- // count + short address
- case 0x5:
- m_addrIS = 0;
- case 0x6:
- m_has_addr = true;
- m_addrBytes = 2; // short IS0/1
- break;
-
- // count + long address
- case 0xA:
- m_addrIS = 0;
- case 0xB:
- m_has_addr = true;
- m_addr_short = false;
- m_addrBytes = 4; // long IS0/1
- break;
-
- // no count, no address
- case 0xF:
- m_count_done = true;
- break;
-
- // reserved values 0x3, 0x4, 0x7, 0x8, 0x9, 0xD, 0xE
- default:
- m_curr_packet.err_type = m_curr_packet.type;
- m_curr_packet.type = ETM4_PKT_I_BAD_SEQUENCE;
- //SendBadIPacket( PKT_BAD_SEQUENCE, "ERROR: Bad Q packet type", PKT_Q );
- break;
- }
- }
- else
- {
- if(m_addrBytes > 0)
- {
- if(m_addr_short && m_addrBytes == 2) // short
- {
- if((lastByte & 0x80) == 0x00)
- m_addrBytes--; // short version can have just single byte.
- }
- m_addrBytes--;
- }
- else if(!m_count_done)
- {
- m_count_done = ((lastByte & 0x80) == 0x00);
- }
- }
-
- if(((m_addrBytes == 0) && m_count_done))
- {
- int idx = 1; // move past the header
- int bits = 0;
- uint32_t q_addr;
- uint32_t q_count;
-
- if(m_has_addr)
- {
- if(m_addr_match)
- {
- m_curr_packet.setAddressExactMatch(m_QE);
- }
- else if(m_addr_short)
- {
- idx+=extractShortAddr(m_currPacketData,idx,m_addrIS,q_addr,bits);
- m_curr_packet.updateShortAddress(q_addr,m_addrIS,(uint8_t)bits);
- }
- else
- {
- idx+=extract32BitLongAddr(m_currPacketData,idx,m_addrIS,q_addr);
- m_curr_packet.set32BitAddress(q_addr,m_addrIS);
- }
- }
-
- if(m_Q_type != 0xF)
- {
- extractContField(m_currPacketData,idx,q_count);
- m_curr_packet.setQType(true,q_count,m_has_addr,m_addr_match,m_Q_type);
- }
- else
- {
- m_curr_packet.setQType(false,0,false,false,0xF);
- }
- m_process_state = SEND_PKT;
- }
-
-}
-
-void EtmV4IPktProcImpl::iAtom(const uint8_t lastByte)
-{
- // patterns lsbit = oldest atom, ms bit = newest.
- static const uint32_t f4_patterns[] = {
- 0xE, // EEEN
- 0x0, // NNNN
- 0xA, // ENEN
- 0x5 // NENE
- };
-
- uint8_t pattIdx = 0, pattCount = 0;
- uint32_t pattern;
-
- // atom packets are single byte, no payload.
- switch(m_curr_packet.type)
- {
- case ETM4_PKT_I_ATOM_F1:
- m_curr_packet.setAtomPacket(ATOM_PATTERN,(lastByte & 0x1), 1); // 1xE or N
- break;
-
- case ETM4_PKT_I_ATOM_F2:
- m_curr_packet.setAtomPacket(ATOM_PATTERN,(lastByte & 0x3), 2); // 2x (E or N)
- break;
-
- case ETM4_PKT_I_ATOM_F3:
- m_curr_packet.setAtomPacket(ATOM_PATTERN,(lastByte & 0x7), 3); // 3x (E or N)
- break;
-
- case ETM4_PKT_I_ATOM_F4:
- m_curr_packet.setAtomPacket(ATOM_PATTERN,f4_patterns[(lastByte & 0x3)], 4); // 4 atom pattern
- break;
-
- case ETM4_PKT_I_ATOM_F5:
- pattIdx = ((lastByte & 0x20) >> 3) | (lastByte & 0x3);
- switch(pattIdx)
- {
- case 5: // 0b101
- m_curr_packet.setAtomPacket(ATOM_PATTERN,0x1E, 5); // 5 atom pattern EEEEN
- break;
-
- case 1: // 0b001
- m_curr_packet.setAtomPacket(ATOM_PATTERN,0x00, 5); // 5 atom pattern NNNNN
- break;
-
- case 2: //0b010
- m_curr_packet.setAtomPacket(ATOM_PATTERN,0x0A, 5); // 5 atom pattern NENEN
- break;
-
- case 3: //0b011
- m_curr_packet.setAtomPacket(ATOM_PATTERN,0x15, 5); // 5 atom pattern ENENE
- break;
-
- default:
- // TBD: warn about invalid pattern in here.
- break;
- }
- break;
-
- case ETM4_PKT_I_ATOM_F6:
- pattCount = (lastByte & 0x1F) + 3; // count of E's
- // TBD: check 23 or less at this point?
- pattern = ((uint32_t)0x1 << pattCount) - 1; // set pattern to string of E's
- if((lastByte & 0x20) == 0x00) // last atom is E?
- pattern |= ((uint32_t)0x1 << pattCount);
- m_curr_packet.setAtomPacket(ATOM_PATTERN,pattern, pattCount+1);
- break;
- }
-
- m_process_state = SEND_PKT;
-}
-
-// header byte processing is table driven.
-void EtmV4IPktProcImpl::BuildIPacketTable()
-{
- // initialise everything as reserved.
- for(int i = 0; i < 256; i++)
- {
- m_i_table[i].pkt_type = ETM4_PKT_I_RESERVED;
- m_i_table[i].pptkFn = &EtmV4IPktProcImpl::iPktReserved;
- }
-
- // 0x00 - extension
- m_i_table[0x00].pkt_type = ETM4_PKT_I_EXTENSION;
- m_i_table[0x00].pptkFn = &EtmV4IPktProcImpl::iPktExtension;
-
- // 0x01 - Trace info
- m_i_table[0x01].pkt_type = ETM4_PKT_I_TRACE_INFO;
- m_i_table[0x01].pptkFn = &EtmV4IPktProcImpl::iPktTraceInfo;
-
- // b0000001x - timestamp
- m_i_table[0x02].pkt_type = ETM4_PKT_I_TIMESTAMP;
- m_i_table[0x02].pptkFn = &EtmV4IPktProcImpl::iPktTimestamp;
- m_i_table[0x03].pkt_type = ETM4_PKT_I_TIMESTAMP;
- m_i_table[0x03].pptkFn = &EtmV4IPktProcImpl::iPktTimestamp;
-
- // b0000 0100 - trace on
- m_i_table[0x04].pkt_type = ETM4_PKT_I_TRACE_ON;
- m_i_table[0x04].pptkFn = &EtmV4IPktProcImpl::iPktNoPayload;
-
-
- // b0000 0101 - Funct ret V8M
- m_i_table[0x05].pkt_type = ETM4_PKT_I_FUNC_RET;
- if ((m_config.coreProfile() == profile_CortexM) &&
- (OCSD_IS_V8_ARCH(m_config.archVersion())) &&
- (m_config.FullVersion() >= 0x42))
- {
- m_i_table[0x05].pptkFn = &EtmV4IPktProcImpl::iPktNoPayload;
- }
-
- // b0000 0110 - exception
- m_i_table[0x06].pkt_type = ETM4_PKT_I_EXCEPT;
- m_i_table[0x06].pptkFn = &EtmV4IPktProcImpl::iPktException;
-
- // b0000 0111 - exception return
- m_i_table[0x07].pkt_type = ETM4_PKT_I_EXCEPT_RTN;
- m_i_table[0x07].pptkFn = &EtmV4IPktProcImpl::iPktNoPayload;
-
- // b0000 110x - cycle count f2
- // b0000 111x - cycle count f1
- for(int i = 0; i < 4; i++)
- {
- m_i_table[0x0C+i].pkt_type = (i >= 2) ? ETM4_PKT_I_CCNT_F1 : ETM4_PKT_I_CCNT_F2;
- m_i_table[0x0C+i].pptkFn = &EtmV4IPktProcImpl::iPktCycleCntF123;
- }
-
- // b0001 xxxx - cycle count f3
- for(int i = 0; i < 16; i++)
- {
- m_i_table[0x10+i].pkt_type = ETM4_PKT_I_CCNT_F3;
- m_i_table[0x10+i].pptkFn = &EtmV4IPktProcImpl::iPktCycleCntF123;
- }
-
- // b0010 0xxx - NDSM
- for(int i = 0; i < 8; i++)
- {
- m_i_table[0x20 + i].pkt_type = ETM4_PKT_I_NUM_DS_MKR;
- if (m_config.enabledDataTrace())
- m_i_table[0x20+i].pptkFn = &EtmV4IPktProcImpl::iPktNoPayload;
- else
- m_i_table[0x20+i].pptkFn = &EtmV4IPktProcImpl::iPktInvalidCfg;
- }
-
- // b0010 10xx, b0010 1100 - UDSM
- for(int i = 0; i < 5; i++)
- {
- m_i_table[0x28+i].pkt_type = ETM4_PKT_I_UNNUM_DS_MKR;
- if (m_config.enabledDataTrace())
- m_i_table[0x28+i].pptkFn = &EtmV4IPktProcImpl::iPktNoPayload;
- else
- m_i_table[0x28+i].pptkFn = &EtmV4IPktProcImpl::iPktInvalidCfg;
- }
-
- // b0010 1101 - commit
- m_i_table[0x2D].pkt_type = ETM4_PKT_I_COMMIT;
- m_i_table[0x2D].pptkFn = &EtmV4IPktProcImpl::iPktSpeclRes;
-
- // b0010 111x - cancel f1
- for(int i = 0; i < 2; i++)
- {
- // G++ doesn't understand [0x2E+i] so...
- int idx = i + 0x2E;
- m_i_table[idx].pkt_type = ETM4_PKT_I_CANCEL_F1;
- m_i_table[idx].pptkFn = &EtmV4IPktProcImpl::iPktSpeclRes;
- }
-
- // b0011 00xx - mis predict
- for(int i = 0; i < 4; i++)
- {
- m_i_table[0x30+i].pkt_type = ETM4_PKT_I_MISPREDICT;
- m_i_table[0x30+i].pptkFn = &EtmV4IPktProcImpl::iPktSpeclRes;
- }
-
- // b0011 01xx - cancel f2
- for(int i = 0; i < 4; i++)
- {
- m_i_table[0x34+i].pkt_type = ETM4_PKT_I_CANCEL_F2;
- m_i_table[0x34+i].pptkFn = &EtmV4IPktProcImpl::iPktSpeclRes;
- }
-
- // b0011 1xxx - cancel f3
- for(int i = 0; i < 8; i++)
- {
- m_i_table[0x38+i].pkt_type = ETM4_PKT_I_CANCEL_F3;
- m_i_table[0x38+i].pptkFn = &EtmV4IPktProcImpl::iPktSpeclRes;
- }
-
- bool bCondValid = m_config.hasCondTrace() && m_config.enabledCondITrace();
-
- // b0100 000x, b0100 0010 - cond I f2
- for (int i = 0; i < 3; i++)
- {
- m_i_table[0x40 + i].pkt_type = ETM4_PKT_I_COND_I_F2;
- if (bCondValid)
- m_i_table[0x40 + i].pptkFn = &EtmV4IPktProcImpl::iPktCondInstr;
- else
- m_i_table[0x40 + i].pptkFn = &EtmV4IPktProcImpl::iPktInvalidCfg;
- }
-
- // b0100 0011 - cond flush
- m_i_table[0x43].pkt_type = ETM4_PKT_I_COND_FLUSH;
- if (bCondValid)
- m_i_table[0x43].pptkFn = &EtmV4IPktProcImpl::iPktNoPayload;
- else
- m_i_table[0x43].pptkFn = &EtmV4IPktProcImpl::iPktInvalidCfg;
-
- // b0100 010x, b0100 0110 - cond res f4
- for (int i = 0; i < 3; i++)
- {
- m_i_table[0x44 + i].pkt_type = ETM4_PKT_I_COND_RES_F4;
- if (bCondValid)
- m_i_table[0x44 + i].pptkFn = &EtmV4IPktProcImpl::iPktCondResult;
- else
- m_i_table[0x44 + i].pptkFn = &EtmV4IPktProcImpl::iPktInvalidCfg;
- }
-
- // b0100 100x, b0100 0110 - cond res f2
- // b0100 110x, b0100 1110 - cond res f2
- for (int i = 0; i < 3; i++)
- {
- m_i_table[0x48 + i].pkt_type = ETM4_PKT_I_COND_RES_F2;
- if (bCondValid)
- m_i_table[0x48 + i].pptkFn = &EtmV4IPktProcImpl::iPktCondResult;
- else
- m_i_table[0x48 + i].pptkFn = &EtmV4IPktProcImpl::iPktInvalidCfg;
- }
- for (int i = 0; i < 3; i++)
- {
- m_i_table[0x4C + i].pkt_type = ETM4_PKT_I_COND_RES_F2;
- if (bCondValid)
- m_i_table[0x4C + i].pptkFn = &EtmV4IPktProcImpl::iPktCondResult;
- else
- m_i_table[0x4C + i].pptkFn = &EtmV4IPktProcImpl::iPktInvalidCfg;
- }
-
- // b0101xxxx - cond res f3
- for (int i = 0; i < 16; i++)
- {
- m_i_table[0x50 + i].pkt_type = ETM4_PKT_I_COND_RES_F3;
- if (bCondValid)
- m_i_table[0x50 + i].pptkFn = &EtmV4IPktProcImpl::iPktCondResult;
- else
- m_i_table[0x50 + i].pptkFn = &EtmV4IPktProcImpl::iPktInvalidCfg;
- }
-
- // b011010xx - cond res f1
- for (int i = 0; i < 4; i++)
- {
- m_i_table[0x68 + i].pkt_type = ETM4_PKT_I_COND_RES_F1;
- if (bCondValid)
- m_i_table[0x68 + i].pptkFn = &EtmV4IPktProcImpl::iPktCondResult;
- else
- m_i_table[0x68 + i].pptkFn = &EtmV4IPktProcImpl::iPktInvalidCfg;
- }
-
- // b0110 1100 - cond instr f1
- m_i_table[0x6C].pkt_type = ETM4_PKT_I_COND_I_F1;
- if (bCondValid)
- m_i_table[0x6C].pptkFn = &EtmV4IPktProcImpl::iPktCondInstr;
- else
- m_i_table[0x6C].pptkFn = &EtmV4IPktProcImpl::iPktInvalidCfg;
-
- // b0110 1101 - cond instr f3
- m_i_table[0x6D].pkt_type = ETM4_PKT_I_COND_I_F3;
- if (bCondValid)
- m_i_table[0x6D].pptkFn = &EtmV4IPktProcImpl::iPktCondInstr;
- else
- m_i_table[0x6D].pptkFn = &EtmV4IPktProcImpl::iPktInvalidCfg;
-
- // b0110111x - cond res f1
- for (int i = 0; i < 2; i++)
- {
- // G++ cannot understand [0x6E+i] so change these round
- m_i_table[i + 0x6E].pkt_type = ETM4_PKT_I_COND_RES_F1;
- if (bCondValid)
- m_i_table[i + 0x6E].pptkFn = &EtmV4IPktProcImpl::iPktCondResult;
- else
- m_i_table[i + 0x6E].pptkFn = &EtmV4IPktProcImpl::iPktInvalidCfg;
- }
-
- // ETM 4.3 introduces ignore packets
- if (m_config.FullVersion() >= 0x43)
- {
- m_i_table[0x70].pkt_type = ETM4_PKT_I_IGNORE;
- m_i_table[0x70].pptkFn = &EtmV4IPktProcImpl::iPktNoPayload;
- }
-
- // b01110001 - b01111111 - event trace
- for(int i = 0; i < 15; i++)
- {
- m_i_table[0x71+i].pkt_type = ETM4_PKT_I_EVENT;
- m_i_table[0x71+i].pptkFn = &EtmV4IPktProcImpl::iPktNoPayload;
- }
-
- // 0b1000 000x - context
- for(int i = 0; i < 2; i++)
- {
- m_i_table[0x80+i].pkt_type = ETM4_PKT_I_CTXT;
- m_i_table[0x80+i].pptkFn = &EtmV4IPktProcImpl::iPktContext;
- }
-
- // 0b1000 0010 to b1000 0011 - addr with ctxt
- // 0b1000 0101 to b1000 0110 - addr with ctxt
- for(int i = 0; i < 2; i++)
- {
- m_i_table[0x82+i].pkt_type = (i == 0) ? ETM4_PKT_I_ADDR_CTXT_L_32IS0 : ETM4_PKT_I_ADDR_CTXT_L_32IS1;
- m_i_table[0x82+i].pptkFn = &EtmV4IPktProcImpl::iPktAddrCtxt;
- }
-
- for(int i = 0; i < 2; i++)
- {
- m_i_table[0x85+i].pkt_type = (i == 0) ? ETM4_PKT_I_ADDR_CTXT_L_64IS0 : ETM4_PKT_I_ADDR_CTXT_L_64IS1;
- m_i_table[0x85+i].pptkFn = &EtmV4IPktProcImpl::iPktAddrCtxt;
- }
-
- // 0b1001 0000 to b1001 0010 - exact match addr
- for(int i = 0; i < 3; i++)
- {
- m_i_table[0x90+i].pkt_type = ETM4_PKT_I_ADDR_MATCH;
- m_i_table[0x90+i].pptkFn = &EtmV4IPktProcImpl::iPktNoPayload;
- }
-
- // b1001 0101 - b1001 0110 - addr short address
- for(int i = 0; i < 2; i++)
- {
- m_i_table[0x95+i].pkt_type = (i == 0) ? ETM4_PKT_I_ADDR_S_IS0 : ETM4_PKT_I_ADDR_S_IS1;
- m_i_table[0x95+i].pptkFn = &EtmV4IPktProcImpl::iPktShortAddr;
- }
-
- // b10011010 - b10011011 - addr long address
- // b10011101 - b10011110 - addr long address
- for(int i = 0; i < 2; i++)
- {
- m_i_table[0x9A+i].pkt_type = (i == 0) ? ETM4_PKT_I_ADDR_L_32IS0 : ETM4_PKT_I_ADDR_L_32IS1;
- m_i_table[0x9A+i].pptkFn = &EtmV4IPktProcImpl::iPktLongAddr;
- }
- for(int i = 0; i < 2; i++)
- {
- m_i_table[0x9D+i].pkt_type = (i == 0) ? ETM4_PKT_I_ADDR_L_64IS0 : ETM4_PKT_I_ADDR_L_64IS1;
- m_i_table[0x9D+i].pptkFn = &EtmV4IPktProcImpl::iPktLongAddr;
- }
-
- // b1010xxxx - Q packet
- for (int i = 0; i < 16; i++)
- {
- m_i_table[0xA0 + i].pkt_type = ETM4_PKT_I_Q;
- // certain Q type codes are reserved.
- switch (i) {
- case 0x3:
- case 0x4:
- case 0x7:
- case 0x8:
- case 0x9:
- case 0xD:
- case 0xE:
- // don't update pkt fn - leave at default reserved.
- break;
- default:
- // if this config supports Q elem - otherwise reserved again.
- if (m_config.hasQElem())
- m_i_table[0xA0 + i].pptkFn = &EtmV4IPktProcImpl::iPktQ;
- }
- }
-
- // Atom Packets - all no payload but have specific pattern generation fn
- for(int i = 0xC0; i <= 0xD4; i++) // atom f6
- {
- m_i_table[i].pkt_type = ETM4_PKT_I_ATOM_F6;
- m_i_table[i].pptkFn = &EtmV4IPktProcImpl::iAtom;
- }
- for(int i = 0xD5; i <= 0xD7; i++) // atom f5
- {
- m_i_table[i].pkt_type = ETM4_PKT_I_ATOM_F5;
- m_i_table[i].pptkFn = &EtmV4IPktProcImpl::iAtom;
- }
- for(int i = 0xD8; i <= 0xDB; i++) // atom f2
- {
- m_i_table[i].pkt_type = ETM4_PKT_I_ATOM_F2;
- m_i_table[i].pptkFn = &EtmV4IPktProcImpl::iAtom;
- }
- for(int i = 0xDC; i <= 0xDF; i++) // atom f4
- {
- m_i_table[i].pkt_type = ETM4_PKT_I_ATOM_F4;
- m_i_table[i].pptkFn = &EtmV4IPktProcImpl::iAtom;
- }
- for(int i = 0xE0; i <= 0xF4; i++) // atom f6
- {
- m_i_table[i].pkt_type = ETM4_PKT_I_ATOM_F6;
- m_i_table[i].pptkFn = &EtmV4IPktProcImpl::iAtom;
- }
-
- // atom f5
- m_i_table[0xF5].pkt_type = ETM4_PKT_I_ATOM_F5;
- m_i_table[0xF5].pptkFn = &EtmV4IPktProcImpl::iAtom;
-
- for(int i = 0xF6; i <= 0xF7; i++) // atom f1
- {
- m_i_table[i].pkt_type = ETM4_PKT_I_ATOM_F1;
- m_i_table[i].pptkFn = &EtmV4IPktProcImpl::iAtom;
- }
- for(int i = 0xF8; i <= 0xFF; i++) // atom f3
- {
- m_i_table[i].pkt_type = ETM4_PKT_I_ATOM_F3;
- m_i_table[i].pptkFn = &EtmV4IPktProcImpl::iAtom;
- }
-}
-
- unsigned EtmV4IPktProcImpl::extractContField(const std::vector<uint8_t> &buffer, const unsigned st_idx, uint32_t &value, const unsigned byte_limit /*= 5*/)
-{
- unsigned idx = 0;
- bool lastByte = false;
- uint8_t byteVal;
- value = 0;
- while(!lastByte && (idx < byte_limit)) // max 5 bytes for 32 bit value;
- {
- if(buffer.size() > (st_idx + idx))
- {
- // each byte has seven bits + cont bit
- byteVal = buffer[(st_idx + idx)];
- lastByte = (byteVal & 0x80) != 0x80;
- value |= ((uint32_t)(byteVal & 0x7F)) << (idx * 7);
- idx++;
- }
- else
- {
- throwBadSequenceError("Invalid 32 bit continuation fields in packet");
- }
- }
- return idx;
-}
-
-unsigned EtmV4IPktProcImpl::extractContField64(const std::vector<uint8_t> &buffer, const unsigned st_idx, uint64_t &value, const unsigned byte_limit /*= 9*/)
-{
- unsigned idx = 0;
- bool lastByte = false;
- uint8_t byteVal;
- value = 0;
- while(!lastByte && (idx < byte_limit)) // max 9 bytes for 64 bit value;
- {
- if(buffer.size() > (st_idx + idx))
- {
- // each byte has seven bits + cont bit
- byteVal = buffer[(st_idx + idx)];
- lastByte = (byteVal & 0x80) != 0x80;
- value |= ((uint64_t)(byteVal & 0x7F)) << (idx * 7);
- idx++;
- }
- else
- {
- throwBadSequenceError("Invalid 64 bit continuation fields in packet");
- }
- }
- return idx;
-}
-
- unsigned EtmV4IPktProcImpl::extractCondResult(const std::vector<uint8_t> &buffer, const unsigned st_idx, uint32_t& key, uint8_t &result)
-{
- unsigned idx = 0;
- bool lastByte = false;
- int incr = 0;
-
- key = 0;
-
- while(!lastByte && (idx < 6)) // cannot be more than 6 bytes for res + 32 bit key
- {
- if(buffer.size() > (st_idx + idx))
- {
- if(idx == 0)
- {
- result = buffer[st_idx+idx];
- key = (buffer[st_idx+idx] >> 4) & 0x7;
- incr+=3;
- }
- else
- {
- key |= ((uint32_t)(buffer[st_idx+idx] & 0x7F)) << incr;
- incr+=7;
- }
- lastByte = (bool)((buffer[st_idx+idx] & 0x80) == 0);
- idx++;
- }
- else
- {
- throwBadSequenceError("Invalid continuation fields in packet");
- }
- }
- return idx;
-}
-
-int EtmV4IPktProcImpl::extract64BitLongAddr(const std::vector<uint8_t> &buffer, const int st_idx, const uint8_t IS, uint64_t &value)
-{
- value = 0;
- if(IS == 0)
- {
- value |= ((uint64_t)(buffer[st_idx+0] & 0x7F)) << 2;
- value |= ((uint64_t)(buffer[st_idx+1] & 0x7F)) << 9;
- }
- else
- {
- value |= ((uint64_t)(buffer[st_idx+0] & 0x7F)) << 1;
- value |= ((uint64_t)buffer[st_idx+1]) << 8;
- }
- value |= ((uint64_t)buffer[st_idx+2]) << 16;
- value |= ((uint64_t)buffer[st_idx+3]) << 24;
- value |= ((uint64_t)buffer[st_idx+4]) << 32;
- value |= ((uint64_t)buffer[st_idx+5]) << 40;
- value |= ((uint64_t)buffer[st_idx+6]) << 48;
- value |= ((uint64_t)buffer[st_idx+7]) << 56;
- return 8;
-}
-
-int EtmV4IPktProcImpl::extract32BitLongAddr(const std::vector<uint8_t> &buffer, const int st_idx, const uint8_t IS, uint32_t &value)
-{
- value = 0;
- if(IS == 0)
- {
- value |= ((uint32_t)(buffer[st_idx+0] & 0x7F)) << 2;
- value |= ((uint32_t)(buffer[st_idx+1] & 0x7F)) << 9;
- }
- else
- {
- value |= ((uint32_t)(buffer[st_idx+0] & 0x7F)) << 1;
- value |= ((uint32_t)buffer[st_idx+1]) << 8;
- }
- value |= ((uint32_t)buffer[st_idx+2]) << 16;
- value |= ((uint32_t)buffer[st_idx+3]) << 24;
- return 4;
-}
-
-void EtmV4IPktProcImpl::throwBadSequenceError(const char *pszExtMsg)
-{
- m_curr_packet.updateErrType(ETM4_PKT_I_BAD_SEQUENCE); // swap type for err type
- throw ocsdError(OCSD_ERR_SEV_ERROR, OCSD_ERR_BAD_PACKET_SEQ,m_packet_index,m_config.getTraceID(),pszExtMsg);
-}
-
-
-/* End of File trc_pkt_proc_etmv4i_impl.cpp */
diff --git a/contrib/opencsd/decoder/source/etmv4/trc_pkt_proc_etmv4i_impl.h b/contrib/opencsd/decoder/source/etmv4/trc_pkt_proc_etmv4i_impl.h
deleted file mode 100644
index 429f32711f3e..000000000000
--- a/contrib/opencsd/decoder/source/etmv4/trc_pkt_proc_etmv4i_impl.h
+++ /dev/null
@@ -1,231 +0,0 @@
-/*
- * \file trc_pkt_proc_etmv4i_impl.h
- * \brief OpenCSD : Implementation of ETMv4 packet processing
- *
- * \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.
- */
-
-#ifndef ARM_TRC_PKT_PROC_ETMV4I_IMPL_H_INCLUDED
-#define ARM_TRC_PKT_PROC_ETMV4I_IMPL_H_INCLUDED
-
-#include "opencsd/etmv4/trc_pkt_proc_etmv4.h"
-#include "opencsd/etmv4/trc_cmp_cfg_etmv4.h"
-#include "opencsd/etmv4/trc_pkt_elem_etmv4i.h"
-
-class TraceRawBuffer
-{
-public:
- TraceRawBuffer();
- ~TraceRawBuffer() {};
-
- // init the buffer
- void init(const uint32_t size, const uint8_t *rawtrace, std::vector<uint8_t> *out_packet);
- void copyByteToPkt(); // move a byte to the packet buffer
- uint8_t peekNextByte(); // value of next byte in buffer.
-
- bool empty() { return m_bufProcessed == m_bufSize; };
- // bytes processed.
- uint32_t processed() { return m_bufProcessed; };
- // buffer size;
- uint32_t size() { return m_bufSize; }
-
-private:
- uint32_t m_bufSize;
- uint32_t m_bufProcessed;
- const uint8_t *m_pBuffer;
- std::vector<uint8_t> *pkt;
-
-};
-
-class EtmV4IPktProcImpl
-{
-public:
- EtmV4IPktProcImpl();
- ~EtmV4IPktProcImpl();
-
- void Initialise(TrcPktProcEtmV4I *p_interface);
-
- ocsd_err_t Configure(const EtmV4Config *p_config);
-
-
- ocsd_datapath_resp_t processData( const ocsd_trc_index_t index,
- const uint32_t dataBlockSize,
- const uint8_t *pDataBlock,
- uint32_t *numBytesProcessed);
- ocsd_datapath_resp_t onEOT();
- ocsd_datapath_resp_t onReset();
- ocsd_datapath_resp_t onFlush();
- const bool isBadPacket() const;
-
-protected:
- typedef enum _process_state {
- PROC_HDR,
- PROC_DATA,
- SEND_PKT,
- SEND_UNSYNCED,
- PROC_ERR,
- } process_state;
-
- process_state m_process_state;
-
- void InitPacketState(); // clear current packet state.
- void InitProcessorState(); // clear all previous process state
-
- /** packet processor configuration **/
- bool m_isInit;
- TrcPktProcEtmV4I *m_interface; /**< The interface to the other decode components */
-
- // etmv4 hardware configuration
- EtmV4Config m_config;
-
- /** packet data **/
- TraceRawBuffer m_trcIn; // trace data in buffer
- std::vector<uint8_t> m_currPacketData; // raw data packet
- int m_currPktIdx; // index into raw packet when expanding
- EtmV4ITrcPacket m_curr_packet; // expanded packet
- ocsd_trc_index_t m_packet_index; // index of the start of the current packet
-// uint32_t m_blockBytesProcessed; // number of bytes processed in the current data block
- ocsd_trc_index_t m_blockIndex; // index at the start of the current data block being processed
-
- // searching for sync
- bool m_is_sync; //!< seen first sync packet
- bool m_first_trace_info; //!< seen first trace info packet after sync
- bool m_sent_notsync_packet; //!< send one not sync packet if we see any unsynced data on the channel
- unsigned m_dump_unsynced_bytes; //!< number of unsynced bytes to send
- ocsd_trc_index_t m_update_on_unsync_packet_index;
-
-
-private:
- // current processing state data - counts and flags to determine if a packet is complete.
-
- // TraceInfo Packet
- // flags to indicate processing progress for these sections is complete.
- struct _t_info_pkt_prog {
- uint8_t sectFlags;
- uint8_t ctrlBytes;
- } m_tinfo_sections;
-
- #define TINFO_INFO_SECT 0x01
- #define TINFO_KEY_SECT 0x02
- #define TINFO_SPEC_SECT 0x04
- #define TINFO_CYCT_SECT 0x08
- #define TINFO_CTRL 0x20
- #define TINFO_ALL_SECT 0x1F
- #define TINFO_ALL 0x3F
-
-
- // address and context packets
- int m_addrBytes;
- uint8_t m_addrIS;
- bool m_bAddr64bit;
- int m_vmidBytes; // bytes still to find
- int m_ctxtidBytes; // bytes still to find
- bool m_bCtxtInfoDone;
- bool m_addr_done;
-
- // timestamp
- bool m_ccount_done; // done or not needed
- bool m_ts_done;
- int m_ts_bytes;
-
- // exception
- int m_excep_size;
-
- // cycle count
- bool m_has_count;
- bool m_count_done;
- bool m_commit_done;
-
- // cond result
- bool m_F1P1_done; // F1 payload 1 done
- bool m_F1P2_done; // F1 payload 2 done
- bool m_F1has_P2; // F1 has a payload 2
-
- // Q packets (use some from above too)
- bool m_has_addr;
- bool m_addr_short;
- bool m_addr_match;
- uint8_t m_Q_type;
- uint8_t m_QE;
-
- ocsd_datapath_resp_t outputPacket();
- ocsd_datapath_resp_t outputUnsyncedRawPacket();
-
- void iNotSync(const uint8_t lastByte); // not synced yet
- void iPktNoPayload(const uint8_t lastByte); // process a single byte packet
- void iPktReserved(const uint8_t lastByte); // deal with reserved header value
- void iPktExtension(const uint8_t lastByte);
- void iPktASync(const uint8_t lastByte);
- void iPktTraceInfo(const uint8_t lastByte);
- void iPktTimestamp(const uint8_t lastByte);
- void iPktException(const uint8_t lastByte);
- void iPktCycleCntF123(const uint8_t lastByte);
- void iPktSpeclRes(const uint8_t lastByte);
- void iPktCondInstr(const uint8_t lastByte);
- void iPktCondResult(const uint8_t lastByte);
- void iPktContext(const uint8_t lastByte);
- void iPktAddrCtxt(const uint8_t lastByte);
- void iPktShortAddr(const uint8_t lastByte);
- void iPktLongAddr(const uint8_t lastByte);
- void iPktQ(const uint8_t lastByte);
- void iAtom(const uint8_t lastByte);
- void iPktInvalidCfg(const uint8_t lastByte); // packet invalid in current config.
-
- unsigned extractContField(const std::vector<uint8_t> &buffer, const unsigned st_idx, uint32_t &value, const unsigned byte_limit = 5);
- unsigned extractContField64(const std::vector<uint8_t> &buffer, const unsigned st_idx, uint64_t &value, const unsigned byte_limit = 9);
- unsigned extractCondResult(const std::vector<uint8_t> &buffer, const unsigned st_idx, uint32_t& key, uint8_t &result);
- void extractAndSetContextInfo(const std::vector<uint8_t> &buffer, const int st_idx);
- int extract64BitLongAddr(const std::vector<uint8_t> &buffer, const int st_idx, const uint8_t IS, uint64_t &value);
- int extract32BitLongAddr(const std::vector<uint8_t> &buffer, const int st_idx, const uint8_t IS, uint32_t &value);
- int extractShortAddr(const std::vector<uint8_t> &buffer, const int st_idx, const uint8_t IS, uint32_t &value, int &bits);
-
- // packet processing is table driven.
- typedef void (EtmV4IPktProcImpl::*PPKTFN)(uint8_t);
- PPKTFN m_pIPktFn;
-
- struct _pkt_i_table_t {
- ocsd_etmv4_i_pkt_type pkt_type;
- PPKTFN pptkFn;
- } m_i_table[256];
-
- void BuildIPacketTable();
-
- void throwBadSequenceError(const char *pszExtMsg);
-};
-
-
-inline const bool EtmV4IPktProcImpl::isBadPacket() const
-{
- return m_curr_packet.isBadPacket();
-}
-
-#endif // ARM_TRC_PKT_PROC_ETMV4I_IMPL_H_INCLUDED
-
-/* End of File trc_pkt_proc_etmv4i_impl.h */
diff --git a/contrib/opencsd/decoder/source/i_dec/trc_i_decode.cpp b/contrib/opencsd/decoder/source/i_dec/trc_i_decode.cpp
deleted file mode 100644
index ab93284848bb..000000000000
--- a/contrib/opencsd/decoder/source/i_dec/trc_i_decode.cpp
+++ /dev/null
@@ -1,250 +0,0 @@
-/*
- * \file trc_i_decode.cpp
- * \brief OpenCSD :
- *
- * \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 "opencsd/ocsd_if_types.h"
-#include "i_dec/trc_i_decode.h"
-#include "i_dec/trc_idec_arminst.h"
-
-ocsd_err_t TrcIDecode::DecodeInstruction(ocsd_instr_info *instr_info)
-{
- ocsd_err_t err = OCSD_OK;
- clear_instr_subtype();
- SetArchVersion(instr_info);
-
- switch(instr_info->isa)
- {
- case ocsd_isa_arm:
- err = DecodeA32(instr_info);
- break;
-
- case ocsd_isa_thumb2:
- err = DecodeT32(instr_info);
- break;
-
- case ocsd_isa_aarch64:
- err = DecodeA64(instr_info);
- break;
-
- case ocsd_isa_tee:
- case ocsd_isa_jazelle:
- default:
- // unsupported ISA
- err = OCSD_ERR_UNSUPPORTED_ISA;
- break;
- }
- instr_info->sub_type = get_instr_subtype();
- return err;
-}
-
-void TrcIDecode::SetArchVersion(ocsd_instr_info *instr_info)
-{
- uint16_t arch = 0x0700;
-
- switch (instr_info->pe_type.arch)
- {
- case ARCH_V8: arch = 0x0800; break;
- case ARCH_V8r3: arch = 0x0803; break;
- case ARCH_V7:
- default:
- break;
- }
- set_arch_version(arch);
-}
-
-
-ocsd_err_t TrcIDecode::DecodeA32(ocsd_instr_info *instr_info)
-{
- uint32_t branchAddr = 0;
- arm_barrier_t barrier;
-
- instr_info->instr_size = 4; // instruction size A32
- instr_info->type = OCSD_INSTR_OTHER; // default type
- instr_info->next_isa = instr_info->isa; // assume same ISA
- instr_info->is_link = 0;
-
- if(inst_ARM_is_indirect_branch(instr_info->opcode))
- {
- instr_info->type = OCSD_INSTR_BR_INDIRECT;
- instr_info->is_link = inst_ARM_is_branch_and_link(instr_info->opcode);
- }
- else if(inst_ARM_is_direct_branch(instr_info->opcode))
- {
- inst_ARM_branch_destination((uint32_t)instr_info->instr_addr,instr_info->opcode,&branchAddr);
- instr_info->type = OCSD_INSTR_BR;
- if (branchAddr & 0x1)
- {
- instr_info->next_isa = ocsd_isa_thumb2;
- branchAddr &= ~0x1;
- }
- instr_info->branch_addr = (ocsd_vaddr_t)branchAddr;
- instr_info->is_link = inst_ARM_is_branch_and_link(instr_info->opcode);
- }
- else if((barrier = inst_ARM_barrier(instr_info->opcode)) != ARM_BARRIER_NONE)
- {
- switch(barrier)
- {
- case ARM_BARRIER_ISB:
- instr_info->type = OCSD_INSTR_ISB;
- break;
-
- case ARM_BARRIER_DSB:
- case ARM_BARRIER_DMB:
- if(instr_info->dsb_dmb_waypoints)
- instr_info->type = OCSD_INSTR_DSB_DMB;
- break;
- }
- }
- else if (instr_info->wfi_wfe_branch)
- {
- if (inst_ARM_wfiwfe(instr_info->opcode))
- {
- instr_info->type = OCSD_INSTR_WFI_WFE;
- }
- }
- instr_info->is_conditional = inst_ARM_is_conditional(instr_info->opcode);
-
- return OCSD_OK;
-}
-
-ocsd_err_t TrcIDecode::DecodeA64(ocsd_instr_info *instr_info)
-{
- uint64_t branchAddr = 0;
- arm_barrier_t barrier;
-
- instr_info->instr_size = 4; // default address update
- instr_info->type = OCSD_INSTR_OTHER; // default type
- instr_info->next_isa = instr_info->isa; // assume same ISA
- instr_info->is_link = 0;
-
- if(inst_A64_is_indirect_branch_link(instr_info->opcode, &instr_info->is_link))
- {
- instr_info->type = OCSD_INSTR_BR_INDIRECT;
-// instr_info->is_link = inst_A64_is_branch_and_link(instr_info->opcode);
- }
- else if(inst_A64_is_direct_branch_link(instr_info->opcode, &instr_info->is_link))
- {
- inst_A64_branch_destination(instr_info->instr_addr,instr_info->opcode,&branchAddr);
- instr_info->type = OCSD_INSTR_BR;
- instr_info->branch_addr = (ocsd_vaddr_t)branchAddr;
-// instr_info->is_link = inst_A64_is_branch_and_link(instr_info->opcode);
- }
- else if((barrier = inst_A64_barrier(instr_info->opcode)) != ARM_BARRIER_NONE)
- {
- switch(barrier)
- {
- case ARM_BARRIER_ISB:
- instr_info->type = OCSD_INSTR_ISB;
- break;
-
- case ARM_BARRIER_DSB:
- case ARM_BARRIER_DMB:
- if(instr_info->dsb_dmb_waypoints)
- instr_info->type = OCSD_INSTR_DSB_DMB;
- break;
- }
- }
- else if (instr_info->wfi_wfe_branch)
- {
- if (inst_A64_wfiwfe(instr_info->opcode))
- {
- instr_info->type = OCSD_INSTR_WFI_WFE;
- }
- }
-
- instr_info->is_conditional = inst_A64_is_conditional(instr_info->opcode);
-
- return OCSD_OK;
-}
-
-ocsd_err_t TrcIDecode::DecodeT32(ocsd_instr_info *instr_info)
-{
- uint32_t branchAddr = 0;
- arm_barrier_t barrier;
-
- // need to align the 32 bit opcode as 2 16 bit, with LS 16 as in top 16 bit of
- // 32 bit word - T2 routines assume 16 bit in top 16 bit of 32 bit opcode.
- uint32_t op_temp = (instr_info->opcode >> 16) & 0xFFFF;
- op_temp |= ((instr_info->opcode & 0xFFFF) << 16);
- instr_info->opcode = op_temp;
-
-
- instr_info->instr_size = is_wide_thumb((uint16_t)(instr_info->opcode >> 16)) ? 4 : 2;
- instr_info->type = OCSD_INSTR_OTHER; // default type
- instr_info->next_isa = instr_info->isa; // assume same ISA
- instr_info->is_link = 0;
- instr_info->is_conditional = 0;
-
-
- if(inst_Thumb_is_direct_branch_link(instr_info->opcode,&instr_info->is_link, &instr_info->is_conditional))
- {
- inst_Thumb_branch_destination((uint32_t)instr_info->instr_addr,instr_info->opcode,&branchAddr);
- instr_info->type = OCSD_INSTR_BR;
- instr_info->branch_addr = (ocsd_vaddr_t)(branchAddr & ~0x1);
- if((branchAddr & 0x1) == 0)
- instr_info->next_isa = ocsd_isa_arm;
- }
- else if (inst_Thumb_is_indirect_branch_link(instr_info->opcode, &instr_info->is_link))
- {
- instr_info->type = OCSD_INSTR_BR_INDIRECT;
- }
- else if((barrier = inst_Thumb_barrier(instr_info->opcode)) != ARM_BARRIER_NONE)
- {
- switch(barrier)
- {
- case ARM_BARRIER_ISB:
- instr_info->type = OCSD_INSTR_ISB;
- break;
-
- case ARM_BARRIER_DSB:
- case ARM_BARRIER_DMB:
- if(instr_info->dsb_dmb_waypoints)
- instr_info->type = OCSD_INSTR_DSB_DMB;
- break;
- }
- }
- else if (instr_info->wfi_wfe_branch)
- {
- if (inst_Thumb_wfiwfe(instr_info->opcode))
- {
- instr_info->type = OCSD_INSTR_WFI_WFE;
- }
- }
- instr_info->is_conditional = inst_Thumb_is_conditional(instr_info->opcode);
- instr_info->thumb_it_conditions = inst_Thumb_is_IT(instr_info->opcode);
-
- return OCSD_OK;
-}
-
-
-/* End of File trc_i_decode.cpp */
diff --git a/contrib/opencsd/decoder/source/i_dec/trc_idec_arminst.cpp b/contrib/opencsd/decoder/source/i_dec/trc_idec_arminst.cpp
deleted file mode 100644
index 09964a15e7b3..000000000000
--- a/contrib/opencsd/decoder/source/i_dec/trc_idec_arminst.cpp
+++ /dev/null
@@ -1,682 +0,0 @@
-/*
- * \file trc_idec_arminst.cpp
- * \brief OpenCSD :
- *
- * \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.
- */
-
-/*
-Basic ARM/Thumb/A64 instruction decode, suitable for e.g. basic
-block identification and trace decode.
-*/
-
-#include "i_dec/trc_idec_arminst.h"
-
-#include <stddef.h> /* for NULL */
-#include <assert.h>
-
-
-static ocsd_instr_subtype instr_sub_type = OCSD_S_INSTR_NONE;
-
-/* need to spot the architecture version for certain instructions */
-static uint16_t arch_version = 0x70;
-
-ocsd_instr_subtype get_instr_subtype()
-{
- return instr_sub_type;
-}
-
-void clear_instr_subtype()
-{
- instr_sub_type = OCSD_S_INSTR_NONE;
-}
-
-void set_arch_version(uint16_t version)
-{
- arch_version = version;
-}
-
-int inst_ARM_is_direct_branch(uint32_t inst)
-{
- int is_direct_branch = 1;
- if ((inst & 0xf0000000) == 0xf0000000) {
- /* NV space */
- if ((inst & 0xfe000000) == 0xfa000000){
- /* BLX (imm) */
- } else {
- is_direct_branch = 0;
- }
- } else if ((inst & 0x0e000000) == 0x0a000000) {
- /* B, BL */
- } else {
- is_direct_branch = 0;
- }
- return is_direct_branch;
-}
-
-int inst_ARM_wfiwfe(uint32_t inst)
-{
- if ( ((inst & 0xf0000000) != 0xf0000000) &&
- ((inst & 0x0ffffffe) == 0x0320f002)
- )
- /* WFI & WFE may be traced as branches in etm4.3 ++ */
- return 1;
- return 0;
-}
-
-int inst_ARM_is_indirect_branch(uint32_t inst)
-{
- int is_indirect_branch = 1;
- if ((inst & 0xf0000000) == 0xf0000000) {
- /* NV space */
- if ((inst & 0xfe500000) == 0xf8100000) {
- /* RFE */
- } else {
- is_indirect_branch = 0;
- }
- } else if ((inst & 0x0ff000d0) == 0x01200010) {
- /* BLX (register), BX */
- if ((inst & 0xFF) == 0x1E)
- instr_sub_type = OCSD_S_INSTR_V7_IMPLIED_RET; /* BX LR */
- } else if ((inst & 0x0ff000f0) == 0x01200020) {
- /* BXJ: in v8 this behaves like BX */
- } else if ((inst & 0x0e108000) == 0x08108000) {
- /* POP {...,pc} or LDMxx {...,pc} */
- if ((inst & 0x0FFFA000) == 0x08BD8000) /* LDMIA SP!,{...,pc} */
- instr_sub_type = OCSD_S_INSTR_V7_IMPLIED_RET;
- } else if ((inst & 0x0e50f000) == 0x0410f000) {
- /* LDR PC,imm... inc. POP {PC} */
- if ( (inst & 0x01ff0000) == 0x009D0000)
- instr_sub_type = OCSD_S_INSTR_V7_IMPLIED_RET; /* LDR PC, [SP], #imm */
- } else if ((inst & 0x0e50f010) == 0x0610f000) {
- /* LDR PC,reg */
- } else if ((inst & 0x0fe0f000) == 0x01a0f000) {
- /* MOV PC,rx */
- if ((inst & 0x00100FFF) == 0x00E) /* ensure the S=0, LSL #0 variant - i.e plain MOV */
- instr_sub_type = OCSD_S_INSTR_V7_IMPLIED_RET; /* MOV PC, R14 */
- } else if ((inst & 0x0f900080) == 0x01000000) {
- /* "Miscellaneous instructions" - in DP space */
- is_indirect_branch = 0;
- } else if ((inst & 0x0f9000f0) == 0x01800090) {
- /* Some extended loads and stores */
- is_indirect_branch = 0;
- } else if ((inst & 0x0fb0f000) == 0x0320f000) {
- /* MSR #imm */
- is_indirect_branch = 0;
- } else if ((inst & 0x0e00f000) == 0x0200f000) {
- /* DP PC,imm shift */
- if ((inst & 0x0f90f000) == 0x0310f000) {
- /* TST/CMP */
- is_indirect_branch = 0;
- }
- } else if ((inst & 0x0e00f000) == 0x0000f000) {
- /* DP PC,reg */
- } else {
- is_indirect_branch = 0;
- }
- return is_indirect_branch;
-}
-
-int inst_Thumb_is_direct_branch(uint32_t inst)
-{
- uint8_t link, cond;
- return inst_Thumb_is_direct_branch_link(inst, &link, &cond);
-}
-
-int inst_Thumb_is_direct_branch_link(uint32_t inst, uint8_t *is_link, uint8_t *is_cond)
-{
- int is_direct_branch = 1;
-
- if ((inst & 0xf0000000) == 0xd0000000 && (inst & 0x0e000000) != 0x0e000000) {
- /* B<c> (encoding T1) */
- *is_cond = 1;
- } else if ((inst & 0xf8000000) == 0xe0000000) {
- /* B (encoding T2) */
- } else if ((inst & 0xf800d000) == 0xf0008000 && (inst & 0x03800000) != 0x03800000) {
- /* B (encoding T3) */
- *is_cond = 1;
- } else if ((inst & 0xf8009000) == 0xf0009000) {
- /* B (encoding T4); BL (encoding T1) */
- if (inst & 0x00004000) {
- *is_link = 1;
- instr_sub_type = OCSD_S_INSTR_BR_LINK;
- }
- } else if ((inst & 0xf800d001) == 0xf000c000) {
- /* BLX (imm) (encoding T2) */
- *is_link = 1;
- instr_sub_type = OCSD_S_INSTR_BR_LINK;
- } else if ((inst & 0xf5000000) == 0xb1000000) {
- /* CB(NZ) */
- *is_cond = 1;
- } else {
- is_direct_branch = 0;
- }
- return is_direct_branch;
-}
-
-int inst_Thumb_wfiwfe(uint32_t inst)
-{
- int is_wfiwfe = 1;
- /* WFI, WFE may be branches in etm4.3++ */
- if ((inst & 0xfffffffe) == 0xf3af8002) {
- /* WFI & WFE (encoding T2) */
- }
- else if ((inst & 0xffef0000) == 0xbf200000) {
- /* WFI & WFE (encoding T1) */
- }
- else {
- is_wfiwfe = 0;
- }
- return is_wfiwfe;
-}
-
-int inst_Thumb_is_indirect_branch(uint32_t inst)
-{
- uint8_t link;
- return inst_Thumb_is_indirect_branch_link(inst, &link);
-}
-
-int inst_Thumb_is_indirect_branch_link(uint32_t inst, uint8_t *is_link)
-{
- /* See e.g. PFT Table 2-3 and Table 2-5 */
- int is_branch = 1;
-
- if ((inst & 0xff000000) == 0x47000000) {
- /* BX, BLX (reg) [v8M includes BXNS, BLXNS] */
- if (inst & 0x00800000) {
- *is_link = 1;
- instr_sub_type = OCSD_S_INSTR_BR_LINK;
- }
- else if ((inst & 0x00780000) == 0x00700000) {
- instr_sub_type = OCSD_S_INSTR_V7_IMPLIED_RET; /* BX LR */
- }
- } else if ((inst & 0xfff0d000) == 0xf3c08000) {
- /* BXJ: in v8 this behaves like BX */
- } else if ((inst & 0xff000000) == 0xbd000000) {
- /* POP {pc} */
- instr_sub_type = OCSD_S_INSTR_V7_IMPLIED_RET;
- } else if ((inst & 0xfd870000) == 0x44870000) {
- /* MOV PC,reg or ADD PC,reg */
- if ((inst & 0xffff0000) == 0x46f700000)
- instr_sub_type = OCSD_S_INSTR_V7_IMPLIED_RET; /* MOV PC,LR */
- } else if ((inst & 0xfff0ffe0) == 0xe8d0f000) {
- /* TBB/TBH */
- } else if ((inst & 0xffd00000) == 0xe8100000) {
- /* RFE (T1) */
- } else if ((inst & 0xffd00000) == 0xe9900000) {
- /* RFE (T2) */
- } else if ((inst & 0xfff0d000) == 0xf3d08000) {
- /* SUBS PC,LR,#imm inc.ERET */
- } else if ((inst & 0xfff0f000) == 0xf8d0f000) {
- /* LDR PC,imm (T3) */
- } else if ((inst & 0xff7ff000) == 0xf85ff000) {
- /* LDR PC,literal (T2) */
- } else if ((inst & 0xfff0f800) == 0xf850f800) {
- /* LDR PC,imm (T4) */
- if((inst & 0x000f0f00) == 0x000d0b00)
- instr_sub_type = OCSD_S_INSTR_V7_IMPLIED_RET; /* LDR PC, [SP], #imm*/
- } else if ((inst & 0xfff0ffc0) == 0xf850f000) {
- /* LDR PC,reg (T2) */
- } else if ((inst & 0xfe508000) == 0xe8108000) {
- /* LDM PC */
- if ((inst & 0x0FFF0000) == 0x08BD0000) /* LDMIA [SP]!, */
- instr_sub_type = OCSD_S_INSTR_V7_IMPLIED_RET; /* POP {...,pc} */
- } else {
- is_branch = 0;
- }
- return is_branch;
-}
-
-int inst_A64_is_direct_branch(uint32_t inst)
-{
- uint8_t link = 0;
- return inst_A64_is_direct_branch_link(inst, &link);
-}
-
-int inst_A64_is_direct_branch_link(uint32_t inst, uint8_t *is_link)
-{
- int is_direct_branch = 1;
- if ((inst & 0x7c000000) == 0x34000000) {
- /* CB, TB */
- } else if ((inst & 0xff000010) == 0x54000000) {
- /* B<cond> */
- } else if ((inst & 0x7c000000) == 0x14000000) {
- /* B, BL imm */
- if (inst & 0x80000000) {
- *is_link = 1;
- instr_sub_type = OCSD_S_INSTR_BR_LINK;
- }
- } else {
- is_direct_branch = 0;
- }
- return is_direct_branch;
-}
-
-int inst_A64_wfiwfe(uint32_t inst)
-{
- /* WFI, WFE may be traced as branches in etm 4.3++ */
- if ((inst & 0xffffffdf) == 0xd503205f)
- return 1;
- return 0;
-}
-
-int inst_A64_is_indirect_branch(uint32_t inst)
-{
- uint8_t link = 0;
- return inst_A64_is_indirect_branch_link(inst, &link);
-}
-
-int inst_A64_is_indirect_branch_link(uint32_t inst, uint8_t *is_link)
-{
- int is_indirect_branch = 1;
-
- if ((inst & 0xffdffc1f) == 0xd61f0000) {
- /* BR, BLR */
- if (inst & 0x00200000) {
- *is_link = 1;
- instr_sub_type = OCSD_S_INSTR_BR_LINK;
- }
- } else if ((inst & 0xfffffc1f) == 0xd65f0000) {
- instr_sub_type = OCSD_S_INSTR_V8_RET;
- /* RET */
- } else if ((inst & 0xffffffff) == 0xd69f03e0) {
- /* ERET */
- instr_sub_type = OCSD_S_INSTR_V8_ERET;
- } else if (arch_version >= 0x0803) {
- /* new pointer auth instr for v8.3 arch */
- if ((inst & 0xffdff800) == 0xd61f0800) {
- /* BRAA, BRAB, BLRAA, BLRBB */
- if (inst & 0x00200000) {
- *is_link = 1;
- instr_sub_type = OCSD_S_INSTR_BR_LINK;
- }
- } else if ((inst & 0xffdff81F) == 0xd71f081F) {
- /* BRAAZ, BRABZ, BLRAAZ, BLRBBZ */
- if (inst & 0x00200000) {
- *is_link = 1;
- instr_sub_type = OCSD_S_INSTR_BR_LINK;
- }
- } else if ((inst & 0xfffffbff) == 0xd69f0bff) {
- /* ERETAA, ERETAB */
- instr_sub_type = OCSD_S_INSTR_V8_ERET;
- } else if ((inst & 0xfffffbff) == 0xd65f0bff) {
- /* RETAA, RETAB */
- instr_sub_type = OCSD_S_INSTR_V8_RET;
- } else {
- is_indirect_branch = 0;
- }
- } else {
- is_indirect_branch = 0;
- }
- return is_indirect_branch;
-}
-
-int inst_ARM_branch_destination(uint32_t addr, uint32_t inst, uint32_t *pnpc)
-{
- uint32_t npc;
- int is_direct_branch = 1;
- if ((inst & 0x0e000000) == 0x0a000000) {
- /*
- B: cccc:1010:imm24
- BL: cccc:1011:imm24
- BLX: 1111:101H:imm24
- */
- npc = addr + 8 + ((int32_t)((inst & 0xffffff) << 8) >> 6);
- if ((inst & 0xf0000000) == 0xf0000000) {
- npc |= 1; /* indicate ISA is now Thumb */
- npc |= ((inst >> 23) & 2); /* apply the H bit */
- }
- } else {
- is_direct_branch = 0;
- }
- if (is_direct_branch && pnpc != NULL) {
- *pnpc = npc;
- }
- return is_direct_branch;
-}
-
-int inst_Thumb_branch_destination(uint32_t addr, uint32_t inst, uint32_t *pnpc)
-{
- uint32_t npc;
- int is_direct_branch = 1;
- if ((inst & 0xf0000000) == 0xd0000000 && (inst & 0x0e000000) != 0x0e000000) {
- /* B<c> (encoding T1) */
- npc = addr + 4 + ((int32_t)((inst & 0x00ff0000) << 8) >> 23);
- npc |= 1;
- } else if ((inst & 0xf8000000) == 0xe0000000) {
- /* B (encoding T2) */
- npc = addr + 4 + ((int32_t)((inst & 0x07ff0000) << 5) >> 20);
- npc |= 1;
- } else if ((inst & 0xf800d000) == 0xf0008000 && (inst & 0x03800000) != 0x03800000) {
- /* B (encoding T3) */
- npc = addr + 4 + ((int32_t)(((inst & 0x04000000) << 5) |
- ((inst & 0x0800) << 19) |
- ((inst & 0x2000) << 16) |
- ((inst & 0x003f0000) << 7) |
- ((inst & 0x000007ff) << 12)) >> 11);
- npc |= 1;
- } else if ((inst & 0xf8009000) == 0xf0009000) {
- /* B (encoding T4); BL (encoding T1) */
- uint32_t S = ((inst & 0x04000000) >> 26)-1; /* ffffffff or 0 according to S bit */
- npc = addr + 4 + ((int32_t)(((inst & 0x04000000) << 5) |
- (((inst^S) & 0x2000) << 17) |
- (((inst^S) & 0x0800) << 18) |
- ((inst & 0x03ff0000) << 3) |
- ((inst & 0x000007ff) << 8)) >> 7);
- npc |= 1;
- } else if ((inst & 0xf800d001) == 0xf000c000) {
- /* BLX (encoding T2) */
- uint32_t S = ((inst & 0x04000000) >> 26)-1; /* ffffffff or 0 according to S bit */
- addr &= 0xfffffffc; /* Align(PC,4) */
- npc = addr + 4 + ((int32_t)(((inst & 0x04000000) << 5) |
- (((inst^S) & 0x2000) << 17) |
- (((inst^S) & 0x0800) << 18) |
- ((inst & 0x03ff0000) << 3) |
- ((inst & 0x000007fe) << 8)) >> 7);
- /* don't set the Thumb bit, as we're transferring to ARM */
- } else if ((inst & 0xf5000000) == 0xb1000000) {
- /* CB(NZ) */
- /* Note that it's zero-extended - always a forward branch */
- npc = addr + 4 + ((((inst & 0x02000000) << 6) |
- ((inst & 0x00f80000) << 7)) >> 25);
- npc |= 1;
- } else {
- is_direct_branch = 0;
- }
- if (is_direct_branch && pnpc != NULL) {
- *pnpc = npc;
- }
- return is_direct_branch;
-}
-
-int inst_A64_branch_destination(uint64_t addr, uint32_t inst, uint64_t *pnpc)
-{
- uint64_t npc;
- int is_direct_branch = 1;
- if ((inst & 0xff000010) == 0x54000000) {
- /* B<cond> */
- npc = addr + ((int32_t)((inst & 0x00ffffe0) << 8) >> 11);
- } else if ((inst & 0x7c000000) == 0x14000000) {
- /* B, BL imm */
- npc = addr + ((int32_t)((inst & 0x03ffffff) << 6) >> 4);
- } else if ((inst & 0x7e000000) == 0x34000000) {
- /* CB */
- npc = addr + ((int32_t)((inst & 0x00ffffe0) << 8) >> 11);
- } else if ((inst & 0x7e000000) == 0x36000000) {
- /* TB */
- npc = addr + ((int32_t)((inst & 0x0007ffe0) << 13) >> 16);
- } else {
- is_direct_branch = 0;
- }
- if (is_direct_branch && pnpc != NULL) {
- *pnpc = npc;
- }
- return is_direct_branch;
-}
-
-int inst_ARM_is_branch(uint32_t inst)
-{
- return inst_ARM_is_indirect_branch(inst) ||
- inst_ARM_is_direct_branch(inst);
-}
-
-int inst_Thumb_is_branch(uint32_t inst)
-{
- return inst_Thumb_is_indirect_branch(inst) ||
- inst_Thumb_is_direct_branch(inst);
-}
-
-int inst_A64_is_branch(uint32_t inst)
-{
- return inst_A64_is_indirect_branch(inst) ||
- inst_A64_is_direct_branch(inst);
-}
-
-int inst_ARM_is_branch_and_link(uint32_t inst)
-{
- int is_branch = 1;
- if ((inst & 0xf0000000) == 0xf0000000) {
- if ((inst & 0xfe000000) == 0xfa000000){
- instr_sub_type = OCSD_S_INSTR_BR_LINK;
- /* BLX (imm) */
- } else {
- is_branch = 0;
- }
- } else if ((inst & 0x0f000000) == 0x0b000000) {
- instr_sub_type = OCSD_S_INSTR_BR_LINK;
- /* BL */
- } else if ((inst & 0x0ff000f0) == 0x01200030) {
- instr_sub_type = OCSD_S_INSTR_BR_LINK;
- /* BLX (reg) */
- } else {
- is_branch = 0;
- }
- return is_branch;
-}
-
-int inst_Thumb_is_branch_and_link(uint32_t inst)
-{
- int is_branch = 1;
- if ((inst & 0xff800000) == 0x47800000) {
- instr_sub_type = OCSD_S_INSTR_BR_LINK;
- /* BLX (reg) */
- } else if ((inst & 0xf800c000) == 0xf000c000) {
- instr_sub_type = OCSD_S_INSTR_BR_LINK;
- /* BL, BLX (imm) */
- } else {
- is_branch = 0;
- }
- return is_branch;
-}
-
-int inst_A64_is_branch_and_link(uint32_t inst)
-{
- int is_branch = 1;
- if ((inst & 0xfffffc1f) == 0xd63f0000) {
- /* BLR */
- instr_sub_type = OCSD_S_INSTR_BR_LINK;
- } else if ((inst & 0xfc000000) == 0x94000000) {
- /* BL */
- instr_sub_type = OCSD_S_INSTR_BR_LINK;
- } else if (arch_version >= 0x0803) {
- /* new pointer auth instr for v8.3 arch */
- if ((inst & 0xfffff800) == 0xd73f0800) {
- /* BLRAA, BLRBB */
- instr_sub_type = OCSD_S_INSTR_BR_LINK;
- } else if ((inst & 0xfffff81F) == 0xd63f081F) {
- /* BLRAAZ, BLRBBZ */
- instr_sub_type = OCSD_S_INSTR_BR_LINK;
- } else {
- is_branch = 0;
- }
- } else {
- is_branch = 0;
- }
- return is_branch;
-}
-
-int inst_ARM_is_conditional(uint32_t inst)
-{
- return (inst & 0xe0000000) != 0xe0000000;
-}
-
-int inst_Thumb_is_conditional(uint32_t inst)
-{
- if ((inst & 0xf0000000) == 0xd0000000 && (inst & 0x0e000000) != 0x0e000000) {
- /* B<c> (encoding T1) */
- return 1;
- } else if ((inst & 0xf800d000) == 0xf0008000 && (inst & 0x03800000) != 0x03800000) {
- /* B<c> (encoding T3) */
- return 1;
- } else if ((inst & 0xf5000000) == 0xb1000000) {
- /* CB(N)Z */
- return 1;
- }
- return 0;
-}
-
-unsigned int inst_Thumb_is_IT(uint32_t inst)
-{
- if ((inst & 0xff000000) == 0xbf000000 &&
- (inst & 0x000f0000) != 0x00000000) {
- if (inst & 0x00010000) {
- return 4;
- } else if (inst & 0x00020000) {
- return 3;
- } else if (inst & 0x00040000) {
- return 2;
- } else {
- assert(inst & 0x00080000);
- return 1;
- }
- } else {
- return 0;
- }
-}
-
-/*
-Test whether an A64 instruction is conditional.
-
-Instructions like CSEL, CSINV, CCMP are not classed as conditional.
-They use the condition code but do one of two things with it,
-neither a NOP. The "intruction categories" section of ETMv4
-lists no (non branch) conditional instructions for A64.
-*/
-int inst_A64_is_conditional(uint32_t inst)
-{
- if ((inst & 0x7c000000) == 0x34000000) {
- /* CB, TB */
- return 1;
- } else if ((inst & 0xff000010) == 0x54000000) {
- /* B.cond */
- return 1;
- }
- return 0;
-}
-
-arm_barrier_t inst_ARM_barrier(uint32_t inst)
-{
- if ((inst & 0xfff00000) == 0xf5700000) {
- switch (inst & 0xf0) {
- case 0x40:
- return ARM_BARRIER_DSB;
- case 0x50:
- return ARM_BARRIER_DMB;
- case 0x60:
- return ARM_BARRIER_ISB;
- default:
- return ARM_BARRIER_NONE;
- }
- } else if ((inst & 0x0fff0f00) == 0x0e070f00) {
- switch (inst & 0xff) {
- case 0x9a:
- return ARM_BARRIER_DSB; /* mcr p15,0,Rt,c7,c10,4 */
- case 0xba:
- return ARM_BARRIER_DMB; /* mcr p15,0,Rt,c7,c10,5 */
- case 0x95:
- return ARM_BARRIER_ISB; /* mcr p15,0,Rt,c7,c5,4 */
- default:
- return ARM_BARRIER_NONE;
- }
- } else {
- return ARM_BARRIER_NONE;
- }
-}
-
-arm_barrier_t inst_Thumb_barrier(uint32_t inst)
-{
- if ((inst & 0xffffff00) == 0xf3bf8f00) {
- switch (inst & 0xf0) {
- case 0x40:
- return ARM_BARRIER_DSB;
- case 0x50:
- return ARM_BARRIER_DMB;
- case 0x60:
- return ARM_BARRIER_ISB;
- default:
- return ARM_BARRIER_NONE;
- }
- } else if ((inst & 0xffff0f00) == 0xee070f00) {
- /* Thumb2 CP15 barriers are unlikely... 1156T2 only? */
- switch (inst & 0xff) {
- case 0x9a:
- return ARM_BARRIER_DSB; /* mcr p15,0,Rt,c7,c10,4 */
- case 0xba:
- return ARM_BARRIER_DMB; /* mcr p15,0,Rt,c7,c10,5 */
- case 0x95:
- return ARM_BARRIER_ISB; /* mcr p15,0,Rt,c7,c5,4 */
- default:
- return ARM_BARRIER_NONE;
- }
- return ARM_BARRIER_NONE;
- } else {
- return ARM_BARRIER_NONE;
- }
-}
-
-arm_barrier_t inst_A64_barrier(uint32_t inst)
-{
- if ((inst & 0xfffff09f) == 0xd503309f) {
- switch (inst & 0x60) {
- case 0x0:
- return ARM_BARRIER_DSB;
- case 0x20:
- return ARM_BARRIER_DMB;
- case 0x40:
- return ARM_BARRIER_ISB;
- default:
- return ARM_BARRIER_NONE;
- }
- } else {
- return ARM_BARRIER_NONE;
- }
-}
-
-int inst_ARM_is_UDF(uint32_t inst)
-{
- return (inst & 0xfff000f0) == 0xe7f000f0;
-}
-
-int inst_Thumb_is_UDF(uint32_t inst)
-{
- return (inst & 0xff000000) == 0xde000000 || /* T1 */
- (inst & 0xfff0f000) == 0xf7f0a000; /* T2 */
-}
-
-int inst_A64_is_UDF(uint32_t inst)
-{
- /* No A64 encodings are formally allocated as permanently undefined,
- but it is intended not to allocate any instructions in the 21-bit
- regions at the bottom or top of the range. */
- return (inst & 0xffe00000) == 0x00000000 ||
- (inst & 0xffe00000) == 0xffe00000;
-}
-
-/* End of File trc_idec_arminst.cpp */
diff --git a/contrib/opencsd/decoder/source/mem_acc/trc_mem_acc_base.cpp b/contrib/opencsd/decoder/source/mem_acc/trc_mem_acc_base.cpp
deleted file mode 100644
index 1250bdc42d93..000000000000
--- a/contrib/opencsd/decoder/source/mem_acc/trc_mem_acc_base.cpp
+++ /dev/null
@@ -1,148 +0,0 @@
-/*!
- * \file trc_mem_acc_base.cpp
- * \brief OpenCSD : Trace memory accessor base 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 "mem_acc/trc_mem_acc_base.h"
-#include "mem_acc/trc_mem_acc_file.h"
-#include "mem_acc/trc_mem_acc_cb.h"
-#include "mem_acc/trc_mem_acc_bufptr.h"
-
-#include <sstream>
-#include <iomanip>
-
- /** Accessor Creation */
-ocsd_err_t TrcMemAccFactory::CreateBufferAccessor(TrcMemAccessorBase **pAccessor, const ocsd_vaddr_t s_address, const uint8_t *p_buffer, const uint32_t size)
-{
- ocsd_err_t err = OCSD_OK;
- TrcMemAccessorBase *pAcc = 0;
- pAcc = new (std::nothrow) TrcMemAccBufPtr(s_address,p_buffer,size);
- if(pAcc == 0)
- err = OCSD_ERR_MEM;
- *pAccessor = pAcc;
- return err;
-}
-
-ocsd_err_t TrcMemAccFactory::CreateFileAccessor(TrcMemAccessorBase **pAccessor, const std::string &pathToFile, ocsd_vaddr_t startAddr, size_t offset /*= 0*/, size_t size /*= 0*/)
-{
- ocsd_err_t err = OCSD_OK;
- TrcMemAccessorFile *pFileAccessor = 0;
- err = TrcMemAccessorFile::createFileAccessor(&pFileAccessor, pathToFile, startAddr, offset,size);
- *pAccessor = pFileAccessor;
- return err;
-}
-
-ocsd_err_t TrcMemAccFactory::CreateCBAccessor(TrcMemAccessorBase **pAccessor, const ocsd_vaddr_t s_address, const ocsd_vaddr_t e_address, const ocsd_mem_space_acc_t mem_space)
-{
- ocsd_err_t err = OCSD_OK;
- TrcMemAccessorBase *pAcc = 0;
- pAcc = new (std::nothrow) TrcMemAccCB(s_address,e_address,mem_space);
- if(pAcc == 0)
- err = OCSD_ERR_MEM;
- *pAccessor = pAcc;
- return err;
-}
-
-/** Accessor Destruction */
-void TrcMemAccFactory::DestroyAccessor(TrcMemAccessorBase *pAccessor)
-{
- switch(pAccessor->getType())
- {
- case TrcMemAccessorBase::MEMACC_FILE:
- TrcMemAccessorFile::destroyFileAccessor(dynamic_cast<TrcMemAccessorFile *>(pAccessor));
- break;
-
- case TrcMemAccessorBase::MEMACC_CB_IF:
- case TrcMemAccessorBase::MEMACC_BUFPTR:
- delete pAccessor;
- break;
-
- default:
- break;
- }
-}
-
-
-/* memory access info logging */
-void TrcMemAccessorBase::getMemAccString(std::string &accStr) const
-{
- std::ostringstream oss;
-
- switch(m_type)
- {
- case MEMACC_FILE:
- oss << "FileAcc; Range::0x";
- break;
-
- case MEMACC_BUFPTR:
- oss << "BuffAcc; Range::0x";
- break;
-
- case MEMACC_CB_IF:
- oss << "CB Acc; Range::0x";
- break;
-
- default:
- oss << "UnknAcc; Range::0x";
- break;
- }
- oss << std::hex << std::setw(2) << std::setfill('0') << m_startAddress << ":" << m_endAddress;
- oss << "; Mem Space::";
- switch(m_mem_space)
- {
- case OCSD_MEM_SPACE_EL1S: oss << "EL1S"; break;
- case OCSD_MEM_SPACE_EL1N: oss << "EL1N"; break;
- case OCSD_MEM_SPACE_EL2: oss << "EL2"; break;
- case OCSD_MEM_SPACE_EL3: oss << "EL3"; break;
- case OCSD_MEM_SPACE_S: oss << "Any S"; break;
- case OCSD_MEM_SPACE_N: oss << "Any NS"; break;
- case OCSD_MEM_SPACE_ANY: oss << "Any"; break;
-
- default:
- {
- uint8_t MSBits = (uint8_t)m_mem_space;
- if(MSBits & (uint8_t)OCSD_MEM_SPACE_EL1S)
- oss << "EL1S,";
- if(MSBits & (uint8_t)OCSD_MEM_SPACE_EL1N)
- oss << "EL1N,";
- if(MSBits & (uint8_t)OCSD_MEM_SPACE_EL2)
- oss << "EL2,";
- if(MSBits & (uint8_t)OCSD_MEM_SPACE_EL3)
- oss << "EL3,";
- }
- break;
- }
- accStr = oss.str();
-}
-
-/* End of File trc_mem_acc_base.cpp */
diff --git a/contrib/opencsd/decoder/source/mem_acc/trc_mem_acc_bufptr.cpp b/contrib/opencsd/decoder/source/mem_acc/trc_mem_acc_bufptr.cpp
deleted file mode 100644
index 25c736387c0b..000000000000
--- a/contrib/opencsd/decoder/source/mem_acc/trc_mem_acc_bufptr.cpp
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * \file trc_mem_acc_bufptr.cpp
- * \brief OpenCSD :
- *
- * \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 <cstring>
-
-#include "mem_acc/trc_mem_acc_bufptr.h"
-
-TrcMemAccBufPtr::TrcMemAccBufPtr(const ocsd_vaddr_t s_address, const uint8_t *p_buffer, const uint32_t size) :
- TrcMemAccessorBase(MEMACC_BUFPTR, s_address, s_address+size-1),
- m_p_buffer(p_buffer),
- m_size(size)
-{
-}
-
-const uint32_t TrcMemAccBufPtr::readBytes(const ocsd_vaddr_t address, const ocsd_mem_space_acc_t mem_space, const uint8_t trcID, const uint32_t reqBytes, uint8_t *byteBuffer)
-{
- // mapper wlll filter memory spaces.
- uint32_t bytesRead = bytesInRange(address,reqBytes); // check bytes available
- if(bytesRead)
- memcpy(byteBuffer,m_p_buffer+address-m_startAddress,bytesRead);
- return bytesRead;
-}
-
-/* End of File trc_mem_acc_bufptr.cpp */
diff --git a/contrib/opencsd/decoder/source/mem_acc/trc_mem_acc_cache.cpp b/contrib/opencsd/decoder/source/mem_acc/trc_mem_acc_cache.cpp
deleted file mode 100644
index 444314ee9da6..000000000000
--- a/contrib/opencsd/decoder/source/mem_acc/trc_mem_acc_cache.cpp
+++ /dev/null
@@ -1,176 +0,0 @@
-/*!
-* \file trc_mem_acc_cache.cpp
-* \brief OpenCSD : Memory accessor cache.
-*
-* \copyright Copyright (c) 2018, 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 <cstring>
-#include <sstream>
-#include <iomanip>
-#include "mem_acc/trc_mem_acc_cache.h"
-#include "mem_acc/trc_mem_acc_base.h"
-#include "interfaces/trc_error_log_i.h"
-
-#ifdef LOG_CACHE_STATS
-#define INC_HITS_RL(idx) m_hits++; m_hit_rl[m_mru_idx]++;
-#define INC_MISS() m_misses++;
-#define INC_PAGES() m_pages++;
-#define SET_MAX_RL(idx) \
- { \
- if (m_hit_rl_max[idx] < m_hit_rl[idx]) \
- m_hit_rl_max[idx] = m_hit_rl[idx]; \
- m_hit_rl[idx] = 0; \
- }
-#define INC_RL(idx) m_hit_rl[m_mru_idx]++;
-#else
-#define INC_HITS_RL(idx)
-#define INC_MISS()
-#define INC_PAGES()
-#define SET_MAX_RL(idx)
-#define INC_RL(idx)
-#endif
-
-// uncomment to log cache ops
-//#define LOG_CACHE_OPS
-
-ocsd_err_t TrcMemAccCache::readBytesFromCache(TrcMemAccessorBase *p_accessor, const ocsd_vaddr_t address, const ocsd_mem_space_acc_t mem_space, const uint8_t trcID, uint32_t *numBytes, uint8_t *byteBuffer)
-{
- uint32_t bytesRead = 0, reqBytes = *numBytes;
- ocsd_err_t err = OCSD_OK;
-
-#ifdef LOG_CACHE_OPS
- std::ostringstream oss;
-#endif
-
- if (m_bCacheEnabled)
- {
- if (blockInCache(address, reqBytes))
- {
- bytesRead = reqBytes;
- memcpy(byteBuffer, &m_mru[m_mru_idx].data[address - m_mru[m_mru_idx].st_addr], reqBytes);
-#ifdef LOG_CACHE_OPS
- oss << "TrcMemAccCache:: hit [page: " << std::dec << m_mru_idx << "[addr:0x" << std::hex << address << ", bytes: " << std::dec << reqBytes << "]\n";
- logMsg(oss.str());
-#endif
- INC_HITS_RL(m_mru_idx);
- }
- else
- {
- INC_MISS();
-#ifdef LOG_CACHE_OPS
- oss << "TrcMemAccCache:: miss [addr:0x" << std::hex << address << ", bytes: " << std::dec << reqBytes << "]\n";
- logMsg(oss.str());
-#endif
- /* need a new cache page - check the underlying accessor for the data */
- m_mru_idx = m_mru_next_new;
- m_mru[m_mru_idx].valid_len = p_accessor->readBytes(address, mem_space, trcID, MEM_ACC_CACHE_PAGE_SIZE, &m_mru[m_mru_idx].data[0]);
-
- /* check return length valid - v bad if return length more than request */
- if (m_mru[m_mru_idx].valid_len > MEM_ACC_CACHE_PAGE_SIZE)
- {
- m_mru[m_mru_idx].valid_len = 0; // set to nothing returned.
- err = OCSD_ERR_MEM_ACC_BAD_LEN;
- }
-
- if (m_mru[m_mru_idx].valid_len > 0)
- {
- // got some data - so save the
- m_mru[m_mru_idx].st_addr = address;
-
- // log the run length hit counts
- SET_MAX_RL(m_mru_idx);
-
-#ifdef LOG_CACHE_OPS
- oss.str("");
- oss << "TrcMemAccCache:: load [page: " << std::dec << m_mru_idx << "[addr:0x" << std::hex << address << ", bytes: " << std::dec << m_mru[m_mru_idx].valid_len << "]\n";
- logMsg(oss.str());
-#endif
- INC_PAGES();
-
- // increment the next new page counter.
- m_mru_next_new++;
- if (m_mru_next_new == MEM_ACC_CACHE_MRU_SIZE)
- m_mru_next_new = 0;
-
- if (blockInPage(address, reqBytes)) /* check we got the data we needed */
- {
- bytesRead = reqBytes;
- memcpy(byteBuffer, &m_mru[m_mru_idx].data[address - m_mru[m_mru_idx].st_addr], reqBytes);
- INC_RL(m_mru_idx);
- }
- else
- {
-#ifdef LOG_CACHE_OPS
- oss.str("");
- oss << "TrcMemAccCache:: miss-after-load [page: " << std::dec << m_mru_idx << "[addr:0x" << std::hex << address << ", bytes: " << std::dec << m_mru[m_mru_idx].valid_len << "]\n";
- logMsg(oss.str());
-#endif
- INC_MISS();
- }
- }
- }
- }
- *numBytes = bytesRead;
- return err;
-}
-
-void TrcMemAccCache::logMsg(const std::string &szMsg)
-{
- if (m_err_log)
- m_err_log->LogMessage(ITraceErrorLog::HANDLE_GEN_INFO, OCSD_ERR_SEV_INFO, szMsg);
-}
-
-void TrcMemAccCache::setErrorLog(ITraceErrorLog *log)
-{
- m_err_log = log;
-}
-
-void TrcMemAccCache::logAndClearCounts()
-{
-#ifdef LOG_CACHE_STATS
- std::ostringstream oss;
-
- oss << "TrcMemAccCache:: cache performance: hits(" << std::dec << m_hits << "), miss(" << m_misses << "), pages(" << m_pages << ")\n";
- logMsg(oss.str());
- for (int i = 0; i < MEM_ACC_CACHE_MRU_SIZE; i++)
- {
- if (m_hit_rl_max[i] < m_hit_rl[i])
- m_hit_rl_max[i] = m_hit_rl[i];
- oss.str("");
- oss << "Run length max page " << std::dec << i << ": " << m_hit_rl_max[i] << "\n";
- logMsg(oss.str());
- }
- m_hits = m_misses = m_pages = 0;
-#endif
-}
-
-
-/* End of File trc_mem_acc_cache.cpp */
diff --git a/contrib/opencsd/decoder/source/mem_acc/trc_mem_acc_cb.cpp b/contrib/opencsd/decoder/source/mem_acc/trc_mem_acc_cb.cpp
deleted file mode 100644
index 1a1565bff038..000000000000
--- a/contrib/opencsd/decoder/source/mem_acc/trc_mem_acc_cb.cpp
+++ /dev/null
@@ -1,34 +0,0 @@
-/*!
- * \file trc_mem_acc_cb.cpp
- * \brief OpenCSD : Trace Mem accessor - callback function
- *
- * \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
- */
-
-#include "mem_acc/trc_mem_acc_cb.h"
-
-TrcMemAccCB::TrcMemAccCB(const ocsd_vaddr_t s_address,
- const ocsd_vaddr_t e_address,
- const ocsd_mem_space_acc_t mem_space) :
- TrcMemAccessorBase(MEMACC_CB_IF, s_address, e_address),
- m_p_CBclass(0),
- m_p_CBfn(0),
- m_p_cbfn_context(0)
-{
- setMemSpace(mem_space);
-}
-
-/** Memory access override - allow decoder to read bytes from the buffer. */
-const uint32_t TrcMemAccCB::readBytes(const ocsd_vaddr_t address, const ocsd_mem_space_acc_t memSpace, const uint8_t trcID, const uint32_t reqBytes, uint8_t *byteBuffer)
-{
- // if we have a callback object, use it to call back.
- if(m_p_CBclass)
- return m_p_CBclass->readBytes(address,memSpace,reqBytes,byteBuffer);
- if(m_p_CBfn)
- return m_p_CBfn(m_p_cbfn_context, address,memSpace,reqBytes,byteBuffer);
- if (m_p_CBIDfn)
- return m_p_CBIDfn(m_p_cbfn_context, address, memSpace, trcID, reqBytes, byteBuffer);
- return 0;
-}
-
-/* End of File trc_mem_acc_cb.cpp */
diff --git a/contrib/opencsd/decoder/source/mem_acc/trc_mem_acc_file.cpp b/contrib/opencsd/decoder/source/mem_acc/trc_mem_acc_file.cpp
deleted file mode 100644
index 25b718ea589c..000000000000
--- a/contrib/opencsd/decoder/source/mem_acc/trc_mem_acc_file.cpp
+++ /dev/null
@@ -1,391 +0,0 @@
-/*
- * \file trc_mem_acc_file.cpp
- * \brief OpenCSD :
- *
- * \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 "mem_acc/trc_mem_acc_file.h"
-
-#include <sstream>
-#include <iomanip>
-
-/***************************************************/
-/* protected construction and reference counting */
-/***************************************************/
-
-TrcMemAccessorFile::TrcMemAccessorFile() : TrcMemAccessorBase(MEMACC_FILE)
-{
- m_ref_count = 0;
- m_base_range_set = false;
- m_has_access_regions = false;
- m_file_size = 0;
-}
-
-TrcMemAccessorFile::~TrcMemAccessorFile()
-{
- if(m_mem_file.is_open())
- m_mem_file.close();
- if(m_access_regions.size())
- {
- std::list<FileRegionMemAccessor *>::iterator it;
- it = m_access_regions.begin();
- while(it != m_access_regions.end())
- {
- delete (*it);
- it++;
- }
- m_access_regions.clear();
- }
-}
-
-ocsd_err_t TrcMemAccessorFile::initAccessor(const std::string &pathToFile, ocsd_vaddr_t startAddr, size_t offset, size_t size)
-{
- ocsd_err_t err = OCSD_OK;
- bool init = false;
-
- m_mem_file.open(pathToFile.c_str(), std::ifstream::binary | std::ifstream::ate);
- if(m_mem_file.is_open())
- {
- m_file_size = (ocsd_vaddr_t)m_mem_file.tellg() & ((ocsd_vaddr_t)~0x1);
- m_mem_file.seekg(0, m_mem_file.beg);
- // adding an offset of 0, sets the base range.
- if((offset == 0) && (size == 0))
- {
- init = AddOffsetRange(startAddr, ((size_t)m_file_size)-offset, offset);
- }
- else if((offset + size) <= m_file_size)
- {
- // if offset != 0, size must by != 0
- init = AddOffsetRange(startAddr, size, offset);
- }
- m_file_path = pathToFile;
- }
- else
- err = OCSD_ERR_MEM_ACC_FILE_NOT_FOUND;
- if(!init)
- err = OCSD_ERR_NOT_INIT;
- return err;
-}
-
-
-FileRegionMemAccessor *TrcMemAccessorFile::getRegionForAddress(const ocsd_vaddr_t startAddr) const
-{
- FileRegionMemAccessor *p_region = 0;
- if(m_has_access_regions)
- {
- std::list<FileRegionMemAccessor *>::const_iterator it;
- it = m_access_regions.begin();
- while((it != m_access_regions.end()) && (p_region == 0))
- {
- if((*it)->addrInRange(startAddr))
- p_region = *it;
- it++;
- }
- }
- return p_region;
-}
-
-
-/***************************************************/
-/* static object creation */
-/***************************************************/
-
-std::map<std::string, TrcMemAccessorFile *> TrcMemAccessorFile::s_FileAccessorMap;
-
-// return existing or create new accessor
-ocsd_err_t TrcMemAccessorFile::createFileAccessor(TrcMemAccessorFile **p_acc, const std::string &pathToFile, ocsd_vaddr_t startAddr, size_t offset /*= 0*/, size_t size /*= 0*/)
-{
- ocsd_err_t err = OCSD_OK;
- TrcMemAccessorFile * acc = 0;
- std::map<std::string, TrcMemAccessorFile *>::iterator it = s_FileAccessorMap.find(pathToFile);
- if(it != s_FileAccessorMap.end())
- {
- acc = it->second;
- if(acc->addrStartOfRange(startAddr))
- acc->IncRefCount();
- else
- {
- err = OCSD_ERR_MEM_ACC_FILE_DIFF_RANGE;
- acc = 0;
- }
- }
- else
- {
- acc = new (std::nothrow) TrcMemAccessorFile();
- if(acc != 0)
- {
- if((err = acc->initAccessor(pathToFile,startAddr, offset,size)) == OCSD_OK)
- {
- acc->IncRefCount();
- s_FileAccessorMap.insert(std::pair<std::string, TrcMemAccessorFile *>(pathToFile,acc));
- }
- else
- {
- delete acc;
- acc = 0;
- }
- }
- else
- err = OCSD_ERR_MEM;
- }
- *p_acc = acc;
- return err;
-}
-
-void TrcMemAccessorFile::destroyFileAccessor(TrcMemAccessorFile *p_accessor)
-{
- if(p_accessor != 0)
- {
- p_accessor->DecRefCount();
- if(p_accessor->getRefCount() == 0)
- {
- std::map<std::string, TrcMemAccessorFile *>::iterator it = s_FileAccessorMap.find(p_accessor->getFilePath());
- if(it != s_FileAccessorMap.end())
- {
- s_FileAccessorMap.erase(it);
- }
- delete p_accessor;
- }
- }
-}
-
-const bool TrcMemAccessorFile::isExistingFileAccessor(const std::string &pathToFile)
-{
- bool bExists = false;
- std::map<std::string, TrcMemAccessorFile *>::const_iterator it = s_FileAccessorMap.find(pathToFile);
- if(it != s_FileAccessorMap.end())
- bExists = true;
- return bExists;
-}
-
-TrcMemAccessorFile * TrcMemAccessorFile::getExistingFileAccessor(const std::string &pathToFile)
-{
- TrcMemAccessorFile * p_acc = 0;
- std::map<std::string, TrcMemAccessorFile *>::iterator it = s_FileAccessorMap.find(pathToFile);
- if(it != s_FileAccessorMap.end())
- p_acc = it->second;
- return p_acc;
-}
-
-
-
-/***************************************************/
-/* accessor instance functions */
-/***************************************************/
-const uint32_t TrcMemAccessorFile::readBytes(const ocsd_vaddr_t address, const ocsd_mem_space_acc_t mem_space, const uint8_t trcID, const uint32_t reqBytes, uint8_t *byteBuffer)
-{
- if(!m_mem_file.is_open())
- return 0;
- uint32_t bytesRead = 0;
-
- if(m_base_range_set)
- {
- bytesRead = TrcMemAccessorBase::bytesInRange(address,reqBytes); // get avialable bytes in range.
- if(bytesRead)
- {
- ocsd_vaddr_t addr_pos = (ocsd_vaddr_t)m_mem_file.tellg();
- if((address - m_startAddress) != addr_pos)
- m_mem_file.seekg(address - m_startAddress);
- m_mem_file.read((char *)byteBuffer,bytesRead);
- }
- }
-
- if((bytesRead == 0) && m_has_access_regions)
- {
- bytesRead = bytesInRange(address,reqBytes);
- if(bytesRead)
- {
- FileRegionMemAccessor *p_region = getRegionForAddress(address);
- ocsd_vaddr_t addr_pos = (ocsd_vaddr_t)m_mem_file.tellg();
- if((address - p_region->regionStartAddress() + p_region->getOffset()) != addr_pos)
- m_mem_file.seekg(address - p_region->regionStartAddress() + p_region->getOffset());
- m_mem_file.read((char *)byteBuffer,bytesRead);
- }
- }
- return bytesRead;
-}
-
-bool TrcMemAccessorFile::AddOffsetRange(const ocsd_vaddr_t startAddr, const size_t size, const size_t offset)
-{
- bool addOK = false;
- if(m_file_size == 0) // must have set the file size
- return false;
- if(addrInRange(startAddr) || addrInRange(startAddr+size-1)) // cannot be overlapping
- return false;
-
- // now either set the base range or an offset range
- if(offset == 0)
- {
- if(!m_base_range_set)
- {
- setRange(startAddr, startAddr+size-1);
- m_base_range_set = true;
- addOK = true;
- }
- }
- else
- {
- if((offset + size) <= m_file_size)
- {
- FileRegionMemAccessor *frmacc = new (std::nothrow) FileRegionMemAccessor();
- if(frmacc)
- {
- frmacc->setOffset(offset);
- frmacc->setRange(startAddr,startAddr+size-1);
- m_access_regions.push_back(frmacc);
- m_access_regions.sort();
- // may need to trim the 0 offset base range...
- if(m_base_range_set)
- {
- std::list<FileRegionMemAccessor *>::iterator it;
- it = m_access_regions.begin();
- size_t first_range_offset = (*it)->getOffset();
- if((m_startAddress + first_range_offset - 1) > m_endAddress)
- m_endAddress = m_startAddress + first_range_offset - 1;
- }
- addOK = true;
- m_has_access_regions = true;
- }
- }
- }
- return addOK;
-}
-
-const bool TrcMemAccessorFile::addrInRange(const ocsd_vaddr_t s_address) const
-{
- bool bInRange = false;
- if(m_base_range_set)
- bInRange = TrcMemAccessorBase::addrInRange(s_address);
-
- if(!bInRange && m_has_access_regions)
- {
- if(getRegionForAddress(s_address) != 0)
- bInRange = true;
- }
- return bInRange;
-}
-
-const bool TrcMemAccessorFile::addrStartOfRange(const ocsd_vaddr_t s_address) const
-{
- bool bInRange = false;
- if(m_base_range_set)
- bInRange = TrcMemAccessorBase::addrStartOfRange(s_address);
- if(!bInRange && m_has_access_regions)
- {
- FileRegionMemAccessor *pRegion = getRegionForAddress(s_address);
- if(pRegion)
- bInRange = (pRegion->regionStartAddress() == s_address);
- }
- return bInRange;
-}
-
-
- /* validate ranges */
-const bool TrcMemAccessorFile::validateRange()
-{
- bool bRangeValid = true;
- if(m_base_range_set)
- bRangeValid = TrcMemAccessorBase::validateRange();
-
- if(m_has_access_regions && bRangeValid)
- {
- std::list<FileRegionMemAccessor *>::const_iterator it;
- it = m_access_regions.begin();
- while((it != m_access_regions.end()) && bRangeValid)
- {
- bRangeValid = (*it)->validateRange();
- it++;
- }
- }
- return bRangeValid;
-}
-
-const uint32_t TrcMemAccessorFile::bytesInRange(const ocsd_vaddr_t s_address, const uint32_t reqBytes) const
-{
- uint32_t bytesInRange = 0;
- if(m_base_range_set)
- bytesInRange = TrcMemAccessorBase::bytesInRange(s_address,reqBytes);
-
- if((bytesInRange == 0) && (m_has_access_regions))
- {
- FileRegionMemAccessor *p_region = getRegionForAddress(s_address);
- bytesInRange = p_region->bytesInRange(s_address,reqBytes);
- }
-
- return bytesInRange;
-}
-
-const bool TrcMemAccessorFile::overLapRange(const TrcMemAccessorBase *p_test_acc) const
-{
- bool bOverLapRange = false;
- if(m_base_range_set)
- bOverLapRange = TrcMemAccessorBase::overLapRange(p_test_acc);
-
- if(!bOverLapRange && (m_has_access_regions))
- {
- std::list<FileRegionMemAccessor *>::const_iterator it;
- it = m_access_regions.begin();
- while((it != m_access_regions.end()) && !bOverLapRange)
- {
- bOverLapRange = (*it)->overLapRange(p_test_acc);
- it++;
- }
- }
- return bOverLapRange;
-}
-
- /*! Override to handle ranges and offset accessors plus add in file name. */
-void TrcMemAccessorFile::getMemAccString(std::string &accStr) const
-{
- std::ostringstream oss;
- accStr = "";
- if(m_base_range_set)
- {
- TrcMemAccessorBase::getMemAccString(accStr);
- }
-
- if(m_has_access_regions)
- {
- std::string addStr;
- std::list<FileRegionMemAccessor *>::const_iterator it;
- it = m_access_regions.begin();
- while(it != m_access_regions.end())
- {
- (*it)->getMemAccString(addStr);
- if(accStr.length())
- accStr += "\n";
- accStr += addStr;
- it++;
- }
- }
- accStr += (std::string)"\nFilename=" + m_file_path;
-}
-
-/* End of File trc_mem_acc_file.cpp */
diff --git a/contrib/opencsd/decoder/source/mem_acc/trc_mem_acc_mapper.cpp b/contrib/opencsd/decoder/source/mem_acc/trc_mem_acc_mapper.cpp
deleted file mode 100644
index 53edfe1a1616..000000000000
--- a/contrib/opencsd/decoder/source/mem_acc/trc_mem_acc_mapper.cpp
+++ /dev/null
@@ -1,299 +0,0 @@
-/*
- * \file trc_mem_acc_mapper.cpp
- * \brief OpenCSD :
- *
- * \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 "mem_acc/trc_mem_acc_mapper.h"
-#include "mem_acc/trc_mem_acc_file.h"
-#include "common/ocsd_error.h"
-
-/************************************************************************************/
-/* mappers base class */
-/************************************************************************************/
-
-#define USING_MEM_ACC_CACHE
-
-TrcMemAccMapper::TrcMemAccMapper() :
- m_acc_curr(0),
- m_trace_id_curr(0),
- m_using_trace_id(false),
- m_err_log(0)
-{
-#ifdef USING_MEM_ACC_CACHE
- m_cache.enableCaching(true);
-#endif
-}
-
-TrcMemAccMapper::TrcMemAccMapper(bool using_trace_id) :
- m_acc_curr(0),
- m_trace_id_curr(0),
- m_using_trace_id(using_trace_id),
- m_err_log(0)
-{
-#ifdef USING_MEM_ACC_CACHE
- m_cache.enableCaching(true);
-#endif
-}
-
-TrcMemAccMapper::~TrcMemAccMapper()
-{
-}
-
-void TrcMemAccMapper::setErrorLog(ITraceErrorLog *err_log_i)
-{
- m_err_log = err_log_i;
- m_cache.setErrorLog(err_log_i);
-}
-
-// memory access interface
-ocsd_err_t TrcMemAccMapper::ReadTargetMemory(const ocsd_vaddr_t address, const uint8_t cs_trace_id, const ocsd_mem_space_acc_t mem_space, uint32_t *num_bytes, uint8_t *p_buffer)
-{
- bool bReadFromCurr = true;
- uint32_t readBytes = 0;
- ocsd_err_t err = OCSD_OK;
-
- /* see if the address is in any range we know */
- if (!readFromCurrent(address, mem_space, cs_trace_id))
- {
- bReadFromCurr = findAccessor(address, mem_space, cs_trace_id);
-
- // found a new accessor - invalidate any cache entries used by the previous one.
- if (m_cache.enabled() && bReadFromCurr)
- m_cache.invalidateAll();
- }
-
- /* if bReadFromCurr then we know m_acc_curr is set */
- if (bReadFromCurr)
- {
- // use cache if enabled and the amount fits into a cache page
- if (m_cache.enabled_for_size(*num_bytes))
- {
- // read from cache - or load a new cache page and read....
- readBytes = *num_bytes;
- err = m_cache.readBytesFromCache(m_acc_curr, address, mem_space, cs_trace_id, &readBytes, p_buffer);
- if (err != OCSD_OK)
- LogWarn(err, "Mem Acc: Cache access error");
- }
- else
- {
- readBytes = m_acc_curr->readBytes(address, mem_space, cs_trace_id, *num_bytes, p_buffer);
- // guard against bad accessor returns (e.g. callback not obeying the rules for return values)
- if (readBytes > *num_bytes)
- {
- err = OCSD_ERR_MEM_ACC_BAD_LEN;
- LogWarn(err,"Mem acc: bad return length");
- }
- }
- }
-
- *num_bytes = readBytes;
- return err;
-}
-
-void TrcMemAccMapper::RemoveAllAccessors()
-{
- TrcMemAccessorBase *pAcc = 0;
- pAcc = getFirstAccessor();
- while(pAcc != 0)
- {
- TrcMemAccFactory::DestroyAccessor(pAcc);
- pAcc = getNextAccessor();
- if (m_cache.enabled())
- m_cache.invalidateAll();
- }
- clearAccessorList();
- if (m_cache.enabled())
- m_cache.logAndClearCounts();
-}
-
-ocsd_err_t TrcMemAccMapper::RemoveAccessorByAddress(const ocsd_vaddr_t st_address, const ocsd_mem_space_acc_t mem_space, const uint8_t cs_trace_id /* = 0 */)
-{
- ocsd_err_t err = OCSD_OK;
- if(findAccessor(st_address,mem_space,cs_trace_id))
- {
- err = RemoveAccessor(m_acc_curr);
- m_acc_curr = 0;
- if (m_cache.enabled())
- m_cache.invalidateAll();
- }
- else
- err = OCSD_ERR_INVALID_PARAM_VAL;
- if (m_cache.enabled())
- m_cache.logAndClearCounts();
- return err;
-}
-
-void TrcMemAccMapper::LogMessage(const std::string &msg)
-{
- if(m_err_log)
- m_err_log->LogMessage(ITraceErrorLog::HANDLE_GEN_INFO,OCSD_ERR_SEV_INFO,msg);
-}
-
-void TrcMemAccMapper::LogWarn(const ocsd_err_t err, const std::string &msg)
-{
- if (m_err_log)
- {
- ocsdError err_ocsd(OCSD_ERR_SEV_WARN,err,msg);
- m_err_log->LogError(ITraceErrorLog::HANDLE_GEN_INFO, &err_ocsd);
- }
-}
-
-
-/************************************************************************************/
-/* mappers global address space class - no differentiation in core trace IDs */
-/************************************************************************************/
-TrcMemAccMapGlobalSpace::TrcMemAccMapGlobalSpace() : TrcMemAccMapper()
-{
-}
-
-TrcMemAccMapGlobalSpace::~TrcMemAccMapGlobalSpace()
-{
-}
-
-ocsd_err_t TrcMemAccMapGlobalSpace::AddAccessor(TrcMemAccessorBase *p_accessor, const uint8_t /*cs_trace_id*/)
-{
- ocsd_err_t err = OCSD_OK;
- bool bOverLap = false;
-
- if(!p_accessor->validateRange())
- return OCSD_ERR_MEM_ACC_RANGE_INVALID;
-
- std::vector<TrcMemAccessorBase *>::const_iterator it = m_acc_global.begin();
- while((it != m_acc_global.end()) && !bOverLap)
- {
- // if overlap and memory space match
- if( ((*it)->overLapRange(p_accessor)) &&
- ((*it)->inMemSpace(p_accessor->getMemSpace()))
- )
- {
- bOverLap = true;
- err = OCSD_ERR_MEM_ACC_OVERLAP;
- }
- it++;
- }
-
- // no overlap - add to the list of ranges.
- if(!bOverLap)
- m_acc_global.push_back(p_accessor);
-
- return err;
-}
-
-bool TrcMemAccMapGlobalSpace::findAccessor(const ocsd_vaddr_t address, const ocsd_mem_space_acc_t mem_space, const uint8_t /*cs_trace_id*/)
-{
- bool bFound = false;
- std::vector<TrcMemAccessorBase *>::const_iterator it = m_acc_global.begin();
- while((it != m_acc_global.end()) && !bFound)
- {
- if( (*it)->addrInRange(address) &&
- (*it)->inMemSpace(mem_space))
- {
- bFound = true;
- m_acc_curr = *it;
- }
- it++;
- }
- return bFound;
-}
-
-bool TrcMemAccMapGlobalSpace::readFromCurrent(const ocsd_vaddr_t address, const ocsd_mem_space_acc_t mem_space, const uint8_t /*cs_trace_id*/)
-{
- bool readFromCurr = false;
- if(m_acc_curr)
- readFromCurr = (m_acc_curr->addrInRange(address) && m_acc_curr->inMemSpace(mem_space));
- return readFromCurr;
-}
-
-
-TrcMemAccessorBase * TrcMemAccMapGlobalSpace::getFirstAccessor()
-{
- TrcMemAccessorBase *p_acc = 0;
- m_acc_it = m_acc_global.begin();
- if(m_acc_it != m_acc_global.end())
- {
- p_acc = *m_acc_it;
- }
- return p_acc;
-}
-
-TrcMemAccessorBase *TrcMemAccMapGlobalSpace::getNextAccessor()
-{
- TrcMemAccessorBase *p_acc = 0;
- m_acc_it++;
- if(m_acc_it != m_acc_global.end())
- {
- p_acc = *m_acc_it;
- }
- return p_acc;
-}
-
-void TrcMemAccMapGlobalSpace::clearAccessorList()
-{
- m_acc_global.clear();
-}
-
-ocsd_err_t TrcMemAccMapGlobalSpace::RemoveAccessor(const TrcMemAccessorBase *p_accessor)
-{
- bool bFound = false;
- TrcMemAccessorBase *p_acc = getFirstAccessor();
- while(p_acc != 0)
- {
- if(p_acc == p_accessor)
- {
- m_acc_global.erase(m_acc_it);
- TrcMemAccFactory::DestroyAccessor(p_acc);
- p_acc = 0;
- bFound = true;
- }
- else
- p_acc = getNextAccessor();
- }
- return bFound ? OCSD_OK : OCSD_ERR_INVALID_PARAM_VAL;
-}
-
-
-void TrcMemAccMapGlobalSpace::logMappedRanges()
-{
- std::string accStr;
- TrcMemAccessorBase *pAccessor = getFirstAccessor();
- LogMessage("Mapped Memory Accessors\n");
- while(pAccessor != 0)
- {
- pAccessor->getMemAccString(accStr);
- accStr += "\n";
- LogMessage(accStr);
- pAccessor = getNextAccessor();
- }
- LogMessage("========================\n");
-}
-
-/* End of File trc_mem_acc_mapper.cpp */
diff --git a/contrib/opencsd/decoder/source/ocsd_code_follower.cpp b/contrib/opencsd/decoder/source/ocsd_code_follower.cpp
deleted file mode 100644
index 4386eb4c1d93..000000000000
--- a/contrib/opencsd/decoder/source/ocsd_code_follower.cpp
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * \file ocsd_code_follower.cpp
- * \brief OpenCSD : Instruction Code path follower.
- *
- * \copyright Copyright (c) 2016, 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 "common/ocsd_code_follower.h"
-
-OcsdCodeFollower::OcsdCodeFollower()
-{
- m_instr_info.pe_type.arch = ARCH_UNKNOWN;
- m_instr_info.pe_type.profile = profile_Unknown;
- m_instr_info.isa = ocsd_isa_unknown;
- m_instr_info.dsb_dmb_waypoints = 0;
- m_instr_info.wfi_wfe_branch = 0;
- m_instr_info.instr_addr = 0;
- m_instr_info.opcode = 0;
- m_pMemAccess = 0;
- m_pIDecode = 0;
- m_mem_space_csid = 0;
- m_st_range_addr = m_en_range_addr = m_next_addr = 0;
- m_b_next_valid = false;
- m_b_nacc_err = false;
-}
-
-OcsdCodeFollower::~OcsdCodeFollower()
-{
-}
-
-void OcsdCodeFollower::initInterfaces(componentAttachPt<ITargetMemAccess> *pMemAccess, componentAttachPt<IInstrDecode> *pIDecode)
-{
- m_pMemAccess = pMemAccess;
- m_pIDecode = pIDecode;
-}
-
-bool OcsdCodeFollower::initFollowerState()
-{
- bool initDone = false;
-
- // reset per follow flags
- m_b_next_valid = false;
- m_b_nacc_err = false;
-
- // set range addresses
- m_en_range_addr = m_next_addr = m_st_range_addr;
-
-// check initialisation is valid.
-
- // must have attached memory access and i-decode objects
- if(m_pMemAccess && m_pIDecode)
- {
- initDone = (m_pMemAccess->hasAttachedAndEnabled() && m_pIDecode->hasAttachedAndEnabled());
- }
- return initDone;
-}
-
-/*!
- * Decodes an instruction at a single location, calculates the next address
- * if possible according to the instruction type and atom.
- *
- * @param addrStart : Address of the instruction
- * @param A : Atom value - E or N
- *
- * @return ocsd_err_t : OCSD_OK - decode correct, check flags for next address
- * : OCSD_ERR_MEM_NACC - unable to access memory area @ address - need new address in trace packet stream.
- * : OCSD_ERR_NOT_INIT - not initialised - fatal.
- * : OCSD_<other> - other error occured - fatal.
- */
-ocsd_err_t OcsdCodeFollower::followSingleAtom(const ocsd_vaddr_t addrStart, const ocsd_atm_val A)
-{
- ocsd_err_t err = OCSD_ERR_NOT_INIT;
-
- if(!initFollowerState())
- return err;
-
- m_en_range_addr = m_st_range_addr = m_instr_info.instr_addr = addrStart;
- err = decodeSingleOpCode();
-
- if(err != OCSD_OK)
- return err;
-
- // set end range - always after the instruction executed.
- m_en_range_addr = m_instr_info.instr_addr + m_instr_info.instr_size;
-
- // assume next addr is the instruction after
- m_next_addr = m_en_range_addr;
- m_b_next_valid = true;
-
- // case when next address is different
- switch(m_instr_info.type)
- {
- case OCSD_INSTR_BR:
- if(A == ATOM_E) // executed the direct branch
- m_next_addr = m_instr_info.branch_addr;
- break;
-
- case OCSD_INSTR_BR_INDIRECT:
- if(A == ATOM_E) // executed indirect branch
- m_b_next_valid = false;
- break;
- }
- return err;
-}
-
-ocsd_err_t OcsdCodeFollower::decodeSingleOpCode()
-{
- ocsd_err_t err = OCSD_OK;
- // request 4 bytes for the opcode - even for Thumb which may be T32
- uint32_t bytesReq = 4;
- uint32_t opcode; // buffer for opcode
-
- // read memory location for opcode
- err = m_pMemAccess->first()->ReadTargetMemory(m_instr_info.instr_addr,m_mem_space_csid,m_mem_acc_rule,&bytesReq,(uint8_t *)&opcode);
-
- // operational error (not access problem - that is indicated by 0 bytes returned)
- if(err != OCSD_OK)
- return err;
-
- if(bytesReq == 4) // check that we got all memory requested.
- {
- m_instr_info.opcode = opcode;
- err = m_pIDecode->first()->DecodeInstruction(&m_instr_info);
- }
- else // otherwise memory unavailable.
- {
- m_b_nacc_err = true;
- m_nacc_address = m_instr_info.instr_addr;
- err = OCSD_ERR_MEM_NACC;
- }
- return err;
-}
-
-/* End of File ocsd_code_follower.cpp */
diff --git a/contrib/opencsd/decoder/source/ocsd_dcd_tree.cpp b/contrib/opencsd/decoder/source/ocsd_dcd_tree.cpp
deleted file mode 100644
index cf75e569d72a..000000000000
--- a/contrib/opencsd/decoder/source/ocsd_dcd_tree.cpp
+++ /dev/null
@@ -1,715 +0,0 @@
-/*
- * \file ocsd_dcd_tree.cpp
- * \brief OpenCSD :
- *
- * \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 "common/ocsd_dcd_tree.h"
-#include "common/ocsd_lib_dcd_register.h"
-#include "mem_acc/trc_mem_acc_mapper.h"
-
-/***************************************************************/
-ITraceErrorLog *DecodeTree::s_i_error_logger = &DecodeTree::s_error_logger;
-std::list<DecodeTree *> DecodeTree::s_trace_dcd_trees; /**< list of pointers to decode tree objects */
-ocsdDefaultErrorLogger DecodeTree::s_error_logger; /**< The library default error logger */
-TrcIDecode DecodeTree::s_instruction_decoder; /**< default instruction decode library */
-
-DecodeTree *DecodeTree::CreateDecodeTree(const ocsd_dcd_tree_src_t src_type, uint32_t formatterCfgFlags)
-{
- DecodeTree *dcd_tree = new (std::nothrow) DecodeTree();
- if(dcd_tree != 0)
- {
- if(dcd_tree->initialise(src_type, formatterCfgFlags))
- {
- s_trace_dcd_trees.push_back(dcd_tree);
- }
- else
- {
- delete dcd_tree;
- dcd_tree = 0;
- }
- }
- return dcd_tree;
-}
-
-void DecodeTree::DestroyDecodeTree(DecodeTree *p_dcd_tree)
-{
- std::list<DecodeTree *>::iterator it;
- bool bDestroyed = false;
- it = s_trace_dcd_trees.begin();
- while(!bDestroyed && (it != s_trace_dcd_trees.end()))
- {
- if(*it == p_dcd_tree)
- {
- s_trace_dcd_trees.erase(it);
- delete p_dcd_tree;
- bDestroyed = true;
- }
- else
- it++;
- }
-}
-
-void DecodeTree::setAlternateErrorLogger(ITraceErrorLog *p_error_logger)
-{
- if(p_error_logger)
- s_i_error_logger = p_error_logger;
- else
- s_i_error_logger = &s_error_logger;
-}
-
-/***************************************************************/
-
-DecodeTree::DecodeTree() :
- m_i_instr_decode(&s_instruction_decoder),
- m_i_mem_access(0),
- m_i_gen_elem_out(0),
- m_i_decoder_root(0),
- m_frame_deformatter_root(0),
- m_decode_elem_iter(0),
- m_default_mapper(0),
- m_created_mapper(false)
-{
- for(int i = 0; i < 0x80; i++)
- m_decode_elements[i] = 0;
-}
-
-DecodeTree::~DecodeTree()
-{
- destroyMemAccMapper();
- for(uint8_t i = 0; i < 0x80; i++)
- {
- destroyDecodeElement(i);
- }
- PktPrinterFact::destroyAllPrinters(m_printer_list);
-}
-
-
-
-ocsd_datapath_resp_t DecodeTree::TraceDataIn( const ocsd_datapath_op_t op,
- const ocsd_trc_index_t index,
- const uint32_t dataBlockSize,
- const uint8_t *pDataBlock,
- uint32_t *numBytesProcessed)
-{
- if(m_i_decoder_root)
- return m_i_decoder_root->TraceDataIn(op,index,dataBlockSize,pDataBlock,numBytesProcessed);
- *numBytesProcessed = 0;
- return OCSD_RESP_FATAL_NOT_INIT;
-}
-
-/* set key interfaces - attach / replace on any existing tree components */
-void DecodeTree::setInstrDecoder(IInstrDecode *i_instr_decode)
-{
- uint8_t elemID;
- DecodeTreeElement *pElem = 0;
-
- pElem = getFirstElement(elemID);
- while(pElem != 0)
- {
- pElem->getDecoderMngr()->attachInstrDecoder(pElem->getDecoderHandle(),i_instr_decode);
- pElem = getNextElement(elemID);
- }
-}
-
-void DecodeTree::setMemAccessI(ITargetMemAccess *i_mem_access)
-{
- uint8_t elemID;
- DecodeTreeElement *pElem = 0;
-
- pElem = getFirstElement(elemID);
- while(pElem != 0)
- {
- pElem->getDecoderMngr()->attachMemAccessor(pElem->getDecoderHandle(),i_mem_access);
- pElem = getNextElement(elemID);
- }
- m_i_mem_access = i_mem_access;
-}
-
-void DecodeTree::setGenTraceElemOutI(ITrcGenElemIn *i_gen_trace_elem)
-{
- uint8_t elemID;
- DecodeTreeElement *pElem = 0;
-
- pElem = getFirstElement(elemID);
- while(pElem != 0)
- {
- pElem->getDecoderMngr()->attachOutputSink(pElem->getDecoderHandle(),i_gen_trace_elem);
- pElem = getNextElement(elemID);
- }
-}
-
-ocsd_err_t DecodeTree::createMemAccMapper(memacc_mapper_t type /* = MEMACC_MAP_GLOBAL*/ )
-{
- // clean up any old one
- destroyMemAccMapper();
-
- // make a new one
- switch(type)
- {
- default:
- case MEMACC_MAP_GLOBAL:
- m_default_mapper = new (std::nothrow) TrcMemAccMapGlobalSpace();
- break;
- }
-
- // set the access interface
- if(m_default_mapper)
- {
- m_created_mapper = true;
- setMemAccessI(m_default_mapper);
- m_default_mapper->setErrorLog(s_i_error_logger);
- }
-
- return (m_default_mapper != 0) ? OCSD_OK : OCSD_ERR_MEM;
-}
-
-void DecodeTree::setExternMemAccMapper(TrcMemAccMapper* pMapper)
-{
- destroyMemAccMapper(); // destroy any existing mapper - if decode tree created it.
- m_default_mapper = pMapper;
-}
-
-void DecodeTree::destroyMemAccMapper()
-{
- if(m_default_mapper && m_created_mapper)
- {
- m_default_mapper->RemoveAllAccessors();
- delete m_default_mapper;
- m_default_mapper = 0;
- m_created_mapper = false;
- }
-}
-
-void DecodeTree::logMappedRanges()
-{
- if(m_default_mapper)
- m_default_mapper->logMappedRanges();
-}
-
-/* Memory accessor creation - all on default mem accessor using the 0 CSID for global core space. */
-ocsd_err_t DecodeTree::addBufferMemAcc(const ocsd_vaddr_t address, const ocsd_mem_space_acc_t mem_space, const uint8_t *p_mem_buffer, const uint32_t mem_length)
-{
- if(!hasMemAccMapper())
- return OCSD_ERR_NOT_INIT;
-
- // need a valid memory buffer, and a least enough bytes for one opcode.
- if((p_mem_buffer == 0) || (mem_length < 4))
- return OCSD_ERR_INVALID_PARAM_VAL;
-
- TrcMemAccessorBase *p_accessor;
- ocsd_err_t err = TrcMemAccFactory::CreateBufferAccessor(&p_accessor, address, p_mem_buffer, mem_length);
- if(err == OCSD_OK)
- {
- TrcMemAccBufPtr *pMBuffAcc = dynamic_cast<TrcMemAccBufPtr *>(p_accessor);
- if(pMBuffAcc)
- {
- pMBuffAcc->setMemSpace(mem_space);
- err = m_default_mapper->AddAccessor(p_accessor,0);
- }
- else
- err = OCSD_ERR_MEM; // wrong type of object - treat as mem error
-
- if(err != OCSD_OK)
- TrcMemAccFactory::DestroyAccessor(p_accessor);
- }
- return err;
-}
-
-ocsd_err_t DecodeTree::addBinFileMemAcc(const ocsd_vaddr_t address, const ocsd_mem_space_acc_t mem_space, const std::string &filepath)
-{
- if(!hasMemAccMapper())
- return OCSD_ERR_NOT_INIT;
-
- if(filepath.length() == 0)
- return OCSD_ERR_INVALID_PARAM_VAL;
-
- TrcMemAccessorBase *p_accessor;
- ocsd_err_t err = TrcMemAccFactory::CreateFileAccessor(&p_accessor,filepath,address);
-
- if(err == OCSD_OK)
- {
- TrcMemAccessorFile *pAcc = dynamic_cast<TrcMemAccessorFile *>(p_accessor);
- if(pAcc)
- {
- pAcc->setMemSpace(mem_space);
- err = m_default_mapper->AddAccessor(pAcc,0);
- }
- else
- err = OCSD_ERR_MEM; // wrong type of object - treat as mem error
-
- if(err != OCSD_OK)
- TrcMemAccFactory::DestroyAccessor(p_accessor);
- }
- return err;
-
-}
-
-ocsd_err_t DecodeTree::addBinFileRegionMemAcc(const ocsd_file_mem_region_t *region_array, const int num_regions, const ocsd_mem_space_acc_t mem_space, const std::string &filepath)
-{
- if(!hasMemAccMapper())
- return OCSD_ERR_NOT_INIT;
-
- if((region_array == 0) || (num_regions == 0) || (filepath.length() == 0))
- return OCSD_ERR_INVALID_PARAM_VAL;
-
- TrcMemAccessorBase *p_accessor;
- int curr_region_idx = 0;
-
- // add first region during the creation of the file accessor.
- ocsd_err_t err = TrcMemAccFactory::CreateFileAccessor(&p_accessor,filepath,region_array[curr_region_idx].start_address,region_array[curr_region_idx].file_offset, region_array[curr_region_idx].region_size);
- if(err == OCSD_OK)
- {
- TrcMemAccessorFile *pAcc = dynamic_cast<TrcMemAccessorFile *>(p_accessor);
- if(pAcc)
- {
- // add additional regions to the file accessor.
- curr_region_idx++;
- while(curr_region_idx < num_regions)
- {
- pAcc->AddOffsetRange(region_array[curr_region_idx].start_address,
- region_array[curr_region_idx].region_size,
- region_array[curr_region_idx].file_offset);
- curr_region_idx++;
- }
- pAcc->setMemSpace(mem_space);
-
- // add the accessor to the map.
- err = m_default_mapper->AddAccessor(pAcc,0);
- }
- else
- err = OCSD_ERR_MEM; // wrong type of object - treat as mem error
-
- if(err != OCSD_OK)
- TrcMemAccFactory::DestroyAccessor(p_accessor);
- }
- return err;
-}
-
-ocsd_err_t DecodeTree::updateBinFileRegionMemAcc(const ocsd_file_mem_region_t *region_array, const int num_regions, const ocsd_mem_space_acc_t mem_space, const std::string &filepath)
-{
- if (!hasMemAccMapper())
- return OCSD_ERR_NOT_INIT;
-
- if ((region_array == 0) || (num_regions == 0) || (filepath.length() == 0))
- return OCSD_ERR_INVALID_PARAM_VAL;
-
- TrcMemAccessorFile *pAcc = TrcMemAccessorFile::getExistingFileAccessor(filepath);
- if (!pAcc)
- return OCSD_ERR_INVALID_PARAM_VAL;
-
- int curr_region_idx = 0;
- while (curr_region_idx < num_regions)
- {
- // check "new" range
- if (!pAcc->addrStartOfRange(region_array[curr_region_idx].start_address))
- {
- // ensure adds cleanly
- if (!pAcc->AddOffsetRange(region_array[curr_region_idx].start_address,
- region_array[curr_region_idx].region_size,
- region_array[curr_region_idx].file_offset))
- return OCSD_ERR_INVALID_PARAM_VAL; // otherwise bail out
- }
- curr_region_idx++;
- }
- return OCSD_OK;
-}
-ocsd_err_t DecodeTree::initCallbackMemAcc(const ocsd_vaddr_t st_address, const ocsd_vaddr_t en_address,
- const ocsd_mem_space_acc_t mem_space, void *p_cb_func, bool IDfn, const void *p_context)
-{
- if(!hasMemAccMapper())
- return OCSD_ERR_NOT_INIT;
-
- if(p_cb_func == 0)
- return OCSD_ERR_INVALID_PARAM_VAL;
-
- TrcMemAccessorBase *p_accessor;
- ocsd_err_t err = TrcMemAccFactory::CreateCBAccessor(&p_accessor, st_address, en_address, mem_space);
- if(err == OCSD_OK)
- {
- TrcMemAccCB *pCBAcc = dynamic_cast<TrcMemAccCB *>(p_accessor);
- if(pCBAcc)
- {
- if (IDfn)
- pCBAcc->setCBIDIfFn((Fn_MemAccID_CB)p_cb_func, p_context);
- else
- pCBAcc->setCBIfFn((Fn_MemAcc_CB)p_cb_func, p_context);
-
- err = m_default_mapper->AddAccessor(p_accessor,0);
- }
- else
- err = OCSD_ERR_MEM; // wrong type of object - treat as mem error
-
- if(err != OCSD_OK)
- TrcMemAccFactory::DestroyAccessor(p_accessor);
- }
- return err;
-}
-
-ocsd_err_t DecodeTree::addCallbackMemAcc(const ocsd_vaddr_t st_address, const ocsd_vaddr_t en_address, const ocsd_mem_space_acc_t mem_space, Fn_MemAcc_CB p_cb_func, const void *p_context)
-{
- return initCallbackMemAcc(st_address, en_address, mem_space, (void *)p_cb_func, false, p_context);
-}
-
-ocsd_err_t DecodeTree::addCallbackIDMemAcc(const ocsd_vaddr_t st_address, const ocsd_vaddr_t en_address, const ocsd_mem_space_acc_t mem_space, Fn_MemAccID_CB p_cb_func, const void *p_context)
-{
- return initCallbackMemAcc(st_address, en_address, mem_space, (void *)p_cb_func, true, p_context);
-}
-
-ocsd_err_t DecodeTree::removeMemAccByAddress(const ocsd_vaddr_t address, const ocsd_mem_space_acc_t mem_space)
-{
- if(!hasMemAccMapper())
- return OCSD_ERR_NOT_INIT;
- return m_default_mapper->RemoveAccessorByAddress(address,mem_space,0);
-}
-
-ocsd_err_t DecodeTree::createDecoder(const std::string &decoderName, const int createFlags, const CSConfig *pConfig)
-{
- ocsd_err_t err = OCSD_OK;
- IDecoderMngr *pDecoderMngr = 0;
- TraceComponent *pTraceComp = 0;
- int crtFlags = createFlags;
-
- uint8_t CSID = 0; // default for single stream decoder (no deformatter) - we ignore the ID
- if(usingFormatter())
- {
- CSID = pConfig->getTraceID();
- crtFlags |= OCSD_CREATE_FLG_INST_ID;
- }
-
- // create the decode element to attach to the channel.
- if((err = createDecodeElement(CSID)) != OCSD_OK)
- return err;
-
- // get the libary decoder register.
- OcsdLibDcdRegister * lib_reg = OcsdLibDcdRegister::getDecoderRegister();
- if(lib_reg == 0)
- return OCSD_ERR_NOT_INIT;
-
- // find the named decoder
- if((err = lib_reg->getDecoderMngrByName(decoderName,&pDecoderMngr)) != OCSD_OK)
- return err;
-
- // got the decoder...
- if((err = pDecoderMngr->createDecoder(crtFlags,(int)CSID,pConfig,&pTraceComp)) != OCSD_OK)
- return err;
-
- m_decode_elements[CSID]->SetDecoderElement(decoderName, pDecoderMngr, pTraceComp, true);
-
- // always attach an error logger
- if(err == OCSD_OK)
- err = pDecoderMngr->attachErrorLogger(pTraceComp,DecodeTree::s_i_error_logger);
-
- // if we created a packet decoder it may need additional components.
- if(crtFlags & OCSD_CREATE_FLG_FULL_DECODER)
- {
- if(m_i_instr_decode && (err == OCSD_OK))
- err = pDecoderMngr->attachInstrDecoder(pTraceComp,m_i_instr_decode);
-
- if(err == OCSD_ERR_DCD_INTERFACE_UNUSED) // ignore if instruction decoder refused
- err = OCSD_OK;
-
- if(m_i_mem_access && (err == OCSD_OK))
- err = pDecoderMngr->attachMemAccessor(pTraceComp,m_i_mem_access);
-
- if(err == OCSD_ERR_DCD_INTERFACE_UNUSED) // ignore if mem accessor refused
- err = OCSD_OK;
-
- if( m_i_gen_elem_out && (err == OCSD_OK))
- err = pDecoderMngr->attachOutputSink(pTraceComp,m_i_gen_elem_out);
- }
-
- // finally attach the packet processor input to the demux output channel
- if(err == OCSD_OK)
- {
- ITrcDataIn *pDataIn = 0;
- if((err = pDecoderMngr->getDataInputI(pTraceComp,&pDataIn)) == OCSD_OK)
- {
- // got the interface -> attach to demux, or direct to input of decode tree
- if(usingFormatter())
- err = m_frame_deformatter_root->getIDStreamAttachPt(CSID)->attach(pDataIn);
- else
- m_i_decoder_root = pDataIn;
- }
- }
-
- if(err != OCSD_OK)
- {
- destroyDecodeElement(CSID); // will destroy decoder as well.
- }
- return err;
-}
-
-ocsd_err_t DecodeTree::removeDecoder(const uint8_t CSID)
-{
- ocsd_err_t err = OCSD_OK;
- uint8_t localID = CSID;
- if(!usingFormatter())
- localID = 0;
-
- if(usingFormatter() && !OCSD_IS_VALID_CS_SRC_ID(CSID))
- err = OCSD_ERR_INVALID_ID;
- else
- {
- destroyDecodeElement(localID);
- }
- return err;
-}
-
-DecodeTreeElement * DecodeTree::getDecoderElement(const uint8_t CSID) const
-{
- DecodeTreeElement *ret_elem = 0;
- if(usingFormatter() && OCSD_IS_VALID_CS_SRC_ID(CSID))
- {
- ret_elem = m_decode_elements[CSID];
- }
- else
- ret_elem = m_decode_elements[0]; // ID 0 is used if single leaf tree.
- return ret_elem;
-}
-
-DecodeTreeElement *DecodeTree::getFirstElement(uint8_t &elemID)
-{
- m_decode_elem_iter = 0;
- return getNextElement(elemID);
-}
-
-DecodeTreeElement *DecodeTree::getNextElement(uint8_t &elemID)
-{
- DecodeTreeElement *ret_elem = 0;
-
- if(m_decode_elem_iter < 0x80)
- {
- // find a none zero entry or end of range
- while((m_decode_elements[m_decode_elem_iter] == 0) && (m_decode_elem_iter < 0x80))
- m_decode_elem_iter++;
-
- // return entry unless end of range
- if(m_decode_elem_iter < 0x80)
- {
- ret_elem = m_decode_elements[m_decode_elem_iter];
- elemID = m_decode_elem_iter;
- m_decode_elem_iter++;
- }
- }
- return ret_elem;
-}
-
-bool DecodeTree::initialise(const ocsd_dcd_tree_src_t type, uint32_t formatterCfgFlags)
-{
- bool initOK = true;
- m_dcd_tree_type = type;
- if(type == OCSD_TRC_SRC_FRAME_FORMATTED)
- {
- // frame formatted - we want to create the deformatter and hook it up
- m_frame_deformatter_root = new (std::nothrow) TraceFormatterFrameDecoder();
- if(m_frame_deformatter_root)
- {
- m_frame_deformatter_root->Configure(formatterCfgFlags);
- m_frame_deformatter_root->getErrLogAttachPt()->attach(DecodeTree::s_i_error_logger);
- m_i_decoder_root = dynamic_cast<ITrcDataIn*>(m_frame_deformatter_root);
- }
- else
- initOK = false;
- }
- return initOK;
-}
-
-void DecodeTree::setSingleRoot(TrcPktProcI *pComp)
-{
- m_i_decoder_root = static_cast<ITrcDataIn*>(pComp);
-}
-
-ocsd_err_t DecodeTree::createDecodeElement(const uint8_t CSID)
-{
- ocsd_err_t err = OCSD_ERR_INVALID_ID;
- if(CSID < 0x80)
- {
- if(m_decode_elements[CSID] == 0)
- {
- m_decode_elements[CSID] = new (std::nothrow) DecodeTreeElement();
- if(m_decode_elements[CSID] == 0)
- err = OCSD_ERR_MEM;
- else
- err = OCSD_OK;
- }
- else
- err = OCSD_ERR_ATTACH_TOO_MANY;
- }
- return err;
-}
-
-void DecodeTree::destroyDecodeElement(const uint8_t CSID)
-{
- if(CSID < 0x80)
- {
- if(m_decode_elements[CSID] != 0)
- {
- m_decode_elements[CSID]->DestroyElem();
- delete m_decode_elements[CSID];
- m_decode_elements[CSID] = 0;
- }
- }
-}
-
-ocsd_err_t DecodeTree::setIDFilter(std::vector<uint8_t> &ids)
-{
- ocsd_err_t err = OCSD_ERR_DCDT_NO_FORMATTER;
- if(usingFormatter())
- {
- err = m_frame_deformatter_root->OutputFilterAllIDs(false);
- if(err == OCSD_OK)
- err = m_frame_deformatter_root->OutputFilterIDs(ids,true);
- }
- return err;
-}
-
-ocsd_err_t DecodeTree::clearIDFilter()
-{
- ocsd_err_t err = OCSD_ERR_DCDT_NO_FORMATTER;
- if(usingFormatter())
- {
- err = m_frame_deformatter_root->OutputFilterAllIDs(true);
- }
- return err;
-}
-
-/** add a protocol packet printer */
-ocsd_err_t DecodeTree::addPacketPrinter(uint8_t CSID, bool bMonitor, ItemPrinter **ppPrinter)
-{
- ocsd_err_t err = OCSD_ERR_INVALID_PARAM_VAL;
- DecodeTreeElement *pElement = getDecoderElement(CSID);
- if (pElement)
- {
- ocsd_trace_protocol_t protocol = pElement->getProtocol();
- ItemPrinter *pPrinter;
-
- pPrinter = PktPrinterFact::createProtocolPrinter(getPrinterList(), protocol, CSID);
- if (pPrinter)
- {
- pPrinter->setMessageLogger(getCurrentErrorLogI()->getOutputLogger());
- switch (protocol)
- {
- case OCSD_PROTOCOL_ETMV4I:
- {
- PacketPrinter<EtmV4ITrcPacket> *pTPrinter = dynamic_cast<PacketPrinter<EtmV4ITrcPacket> *>(pPrinter);
- if (bMonitor)
- err = pElement->getDecoderMngr()->attachPktMonitor(pElement->getDecoderHandle(), (IPktRawDataMon<EtmV4ITrcPacket> *)pTPrinter);
- else
- err = pElement->getDecoderMngr()->attachPktSink(pElement->getDecoderHandle(), (IPktDataIn<EtmV4ITrcPacket> *)pTPrinter);
- }
- break;
-
- case OCSD_PROTOCOL_ETMV3:
- {
- PacketPrinter<EtmV3TrcPacket> *pTPrinter = dynamic_cast<PacketPrinter<EtmV3TrcPacket> *>(pPrinter);
- if (bMonitor)
- err = pElement->getDecoderMngr()->attachPktMonitor(pElement->getDecoderHandle(), (IPktRawDataMon<EtmV3TrcPacket> *)pTPrinter);
- else
- err = pElement->getDecoderMngr()->attachPktSink(pElement->getDecoderHandle(), (IPktDataIn<EtmV3TrcPacket> *)pTPrinter);
- }
- break;
-
- case OCSD_PROTOCOL_PTM:
- {
- PacketPrinter<PtmTrcPacket> *pTPrinter = dynamic_cast<PacketPrinter<PtmTrcPacket> *>(pPrinter);
- if (bMonitor)
- err = pElement->getDecoderMngr()->attachPktMonitor(pElement->getDecoderHandle(), (IPktRawDataMon<PtmTrcPacket> *)pTPrinter);
- else
- err = pElement->getDecoderMngr()->attachPktSink(pElement->getDecoderHandle(), (IPktDataIn<PtmTrcPacket> *)pTPrinter);
- }
- break;
-
- case OCSD_PROTOCOL_STM:
- {
- PacketPrinter<StmTrcPacket> *pTPrinter = dynamic_cast<PacketPrinter<StmTrcPacket> *>(pPrinter);
- if (bMonitor)
- err = pElement->getDecoderMngr()->attachPktMonitor(pElement->getDecoderHandle(), (IPktRawDataMon<StmTrcPacket> *)pTPrinter);
- else
- err = pElement->getDecoderMngr()->attachPktSink(pElement->getDecoderHandle(), (IPktDataIn<StmTrcPacket> *)pTPrinter);
- }
- break;
-
- default:
- err = OCSD_ERR_NO_PROTOCOL;
- break;
- }
-
- if (err == OCSD_OK)
- {
- if (ppPrinter)
- *ppPrinter = pPrinter;
- }
- else
- PktPrinterFact::destroyPrinter(getPrinterList(), pPrinter);
- }
- }
- return err;
-}
-
-/** add a raw frame printer */
-ocsd_err_t DecodeTree::addRawFramePrinter(RawFramePrinter **ppPrinter, uint32_t flags)
-{
- ocsd_err_t err = OCSD_ERR_MEM;
- RawFramePrinter *pPrinter = PktPrinterFact::createRawFramePrinter(getPrinterList());
- if (pPrinter)
- {
- pPrinter->setMessageLogger((DecodeTree::getCurrentErrorLogI()->getOutputLogger()));
- TraceFormatterFrameDecoder *pFrameDecoder = getFrameDeformatter();
- uint32_t cfgFlags = pFrameDecoder->getConfigFlags();
- cfgFlags |= ((uint32_t)flags & (OCSD_DFRMTR_PACKED_RAW_OUT | OCSD_DFRMTR_UNPACKED_RAW_OUT));
- pFrameDecoder->Configure(cfgFlags);
- err = pFrameDecoder->getTrcRawFrameAttachPt()->attach(pPrinter);
- if (ppPrinter && (err==OCSD_OK))
- *ppPrinter = pPrinter;
- }
- return err;
-}
-
-/** add a generic element output printer */
-ocsd_err_t DecodeTree::addGenElemPrinter(TrcGenericElementPrinter **ppPrinter)
-{
- ocsd_err_t err = OCSD_ERR_MEM;
- TrcGenericElementPrinter *pPrinter = PktPrinterFact::createGenElemPrinter(getPrinterList());
- if (pPrinter)
- {
- pPrinter->setMessageLogger((DecodeTree::getCurrentErrorLogI()->getOutputLogger()));
- setGenTraceElemOutI(pPrinter);
- err = OCSD_OK;
- if (ppPrinter)
- *ppPrinter = pPrinter;
- }
- return err;
-
-}
-
-/* End of File ocsd_dcd_tree.cpp */
diff --git a/contrib/opencsd/decoder/source/ocsd_error.cpp b/contrib/opencsd/decoder/source/ocsd_error.cpp
deleted file mode 100644
index 251964b7a4b0..000000000000
--- a/contrib/opencsd/decoder/source/ocsd_error.cpp
+++ /dev/null
@@ -1,232 +0,0 @@
-/*
- * \file ocsd_error.cpp
- * \brief OpenCSD : Library error 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 "common/ocsd_error.h"
-#include <sstream>
-#include <iomanip>
-
-static const char *s_errorCodeDescs[][2] = {
- /* general return errors */
- {"OCSD_OK", "No Error."},
- {"OCSD_ERR_FAIL","General failure."},
- {"OCSD_ERR_MEM","Internal memory allocation error."},
- {"OCSD_ERR_NOT_INIT","Component not initialised."},
- {"OCSD_ERR_INVALID_ID","Invalid CoreSight Trace Source ID."},
- {"OCSD_ERR_BAD_HANDLE","Invalid handle passed to component."},
- {"OCSD_ERR_INVALID_PARAM_VAL","Invalid value parameter passed to component."},
- {"OCSD_ERR_INVALID_PARAM_TYPE","Type mismatch on abstract interface."},
- {"OCSD_ERR_FILE_ERROR","File access error"},
- {"OCSD_ERR_NO_PROTOCOL","Trace protocol unsupported"},
- /* attachment point errors */
- {"OCSD_ERR_ATTACH_TOO_MANY","Cannot attach - attach device limit reached."},
- {"OCSD_ERR_ATTACH_INVALID_PARAM"," Cannot attach - invalid parameter."},
- {"OCSD_ERR_ATTACH_COMP_NOT_FOUND","Cannot detach - component not found."},
- /* source reader errors */
- {"OCSD_ERR_RDR_FILE_NOT_FOUND","source reader - file not found."},
- {"OCSD_ERR_RDR_INVALID_INIT", "source reader - invalid initialisation parameter."},
- {"OCSD_ERR_RDR_NO_DECODER", "source reader - not trace decoder set."},
- /* data path errors */
- {"OCSD_ERR_DATA_DECODE_FATAL", "A decoder in the data path has returned a fatal error."},
- /* frame deformatter errors */
- {"OCSD_ERR_DFMTR_NOTCONTTRACE", "Trace input to deformatter none-continuous"},
- {"OCSD_ERR_DFMTR_BAD_FHSYNC", "Bad frame or half frame sync in trace deformatter"},
- /* packet processor errors - protocol issues etc */
- {"OCSD_ERR_BAD_PACKET_SEQ","Bad packet sequence"},
- {"OCSD_ERR_INVALID_PCKT_HDR","Invalid packet header"},
- {"OCSD_ERR_PKT_INTERP_FAIL","Interpreter failed - cannot recover - bad data or sequence"},
- /* packet decoder errors */
- {"OCSD_ERR_UNSUPPORTED_ISA","ISA not supported in decoder"},
- {"OCSD_ERR_HW_CFG_UNSUPP","Programmed trace configuration not supported by decodUer."},
- {"OCSD_ERR_UNSUPP_DECODE_PKT","Packet not supported in decoder"},
- {"OCSD_ERR_BAD_DECODE_PKT","Reserved or unknown packet in decoder."},
- {"OCSD_ERR_COMMIT_PKT_OVERRUN","Overrun in commit packet stack - tried to commit more than available"},
- {"OCSD_ERR_MEM_NACC","Unable to access required memory address."},
- {"OCSD_ERR_RET_STACK_OVERFLOW","Internal return stack overflow checks failed - popped more than we pushed."},
- /* decode tree errors */
- {"OCSD_ERR_DCDT_NO_FORMATTER","No formatter in use - operation not valid."},
- /* target memory access errors */
- {"OCSD_ERR_MEM_ACC_OVERLAP","Attempted to set an overlapping range in memory access map."},
- {"OCSD_ERR_MEM_ACC_FILE_NOT_FOUND","Memory access file could not be opened."},
- {"OCSD_ERR_MEM_ACC_FILE_DIFF_RANGE","Attempt to re-use the same memory access file for a different address range."},
- {"OCSD_ERR_MEM_ACC_BAD_LEN","Memory accessor returned a bad read length value (larger than requested."},
- {"OCSD_ERR_MEM_ACC_RANGE_INVALID","Address range in accessor set to invalid values."},
- /* test errors - errors generated only by the test code, not the library */
- {"OCSD_ERR_TEST_SNAPSHOT_PARSE", "Test snapshot file parse error"},
- {"OCSD_ERR_TEST_SNAPSHOT_PARSE_INFO", "Test snapshot file parse information"},
- {"OCSD_ERR_TEST_SNAPSHOT_READ","test snapshot reader error"},
- {"OCSD_ERR_TEST_SS_TO_DECODER","test snapshot to decode tree conversion error"},
- /* decoder registration */
- {"OCSD_ERR_DCDREG_NAME_REPEAT","Attempted to register a decoder with the same name as another one."},
- {"OCSD_ERR_DCDREG_NAME_UNKNOWN","Attempted to find a decoder with a name that is not known in the library."},
- {"OCSD_ERR_DCDREG_TYPE_UNKNOWN","Attempted to find a decoder with a type that is not known in the library."},
- /* decoder config */
- {"OCSD_ERR_DCD_INTERFACE_UNUSED","Attempt to connect or use and interface not supported by this decoder."},
- /* end marker*/
- {"OCSD_ERR_LAST", "No error - error code end marker"}
-};
-
-ocsdError::ocsdError(const ocsd_err_severity_t sev_type, const ocsd_err_t code) :
- m_error_code(code),
- m_sev(sev_type),
- m_idx(OCSD_BAD_TRC_INDEX),
- m_chan_ID(OCSD_BAD_CS_SRC_ID)
-{
-}
-
-ocsdError::ocsdError(const ocsd_err_severity_t sev_type, const ocsd_err_t code, const ocsd_trc_index_t idx) :
- m_error_code(code),
- m_sev(sev_type),
- m_idx(idx),
- m_chan_ID(OCSD_BAD_CS_SRC_ID)
-{
-}
-
-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) :
- m_error_code(code),
- m_sev(sev_type),
- m_idx(idx),
- m_chan_ID(chan_id)
-{
-}
-
-ocsdError::ocsdError(const ocsd_err_severity_t sev_type, const ocsd_err_t code, const std::string &msg) :
- m_error_code(code),
- m_sev(sev_type),
- m_idx(OCSD_BAD_TRC_INDEX),
- m_chan_ID(OCSD_BAD_CS_SRC_ID),
- m_err_message(msg)
-{
-}
-
-ocsdError::ocsdError(const ocsd_err_severity_t sev_type, const ocsd_err_t code, const ocsd_trc_index_t idx, const std::string &msg) :
- m_error_code(code),
- m_sev(sev_type),
- m_idx(idx),
- m_chan_ID(OCSD_BAD_CS_SRC_ID),
- m_err_message(msg)
-{
-}
-
-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) :
- m_error_code(code),
- m_sev(sev_type),
- m_idx(idx),
- m_chan_ID(chan_id),
- m_err_message(msg)
-{
-}
-
-
-ocsdError::ocsdError(const ocsdError *pError) :
- m_error_code(pError->getErrorCode()),
- m_sev(pError->getErrorSeverity()),
- m_idx(pError->getErrorIndex()),
- m_chan_ID(pError->getErrorChanID())
-{
- setMessage(pError->getMessage());
-}
-
-ocsdError::ocsdError(const ocsdError &Error) :
- m_error_code(Error.getErrorCode()),
- m_sev(Error.getErrorSeverity()),
- m_idx(Error.getErrorIndex()),
- m_chan_ID(Error.getErrorChanID())
-{
- setMessage(Error.getMessage());
-}
-
-ocsdError::ocsdError():
- m_error_code(OCSD_ERR_LAST),
- m_sev(OCSD_ERR_SEV_NONE),
- m_idx(OCSD_BAD_TRC_INDEX),
- m_chan_ID(OCSD_BAD_CS_SRC_ID)
-{
-}
-
-ocsdError::~ocsdError()
-{
-}
-
-const std::string ocsdError::getErrorString(const ocsdError &error)
-{
- std::string szErrStr = "LIBRARY INTERNAL ERROR: Invalid Error Object";
- const char *sev_type_sz[] = {
- "NONE ",
- "ERROR:",
- "WARN :",
- "INFO :"
- };
-
- switch(error.getErrorSeverity())
- {
- default:
- case OCSD_ERR_SEV_NONE:
- break;
-
- case OCSD_ERR_SEV_ERROR:
- case OCSD_ERR_SEV_WARN:
- case OCSD_ERR_SEV_INFO:
- szErrStr = sev_type_sz[(int)error.getErrorSeverity()];
- appendErrorDetails(szErrStr,error);
- break;
- }
- return szErrStr;
-}
-
-void ocsdError::appendErrorDetails(std::string &errStr, const ocsdError &error)
-{
- int numerrstr = ((sizeof(s_errorCodeDescs) / sizeof(const char *)) / 2);
- int code = (int)error.getErrorCode();
- ocsd_trc_index_t idx = error.getErrorIndex();
- uint8_t chan_ID = error.getErrorChanID();
- std::ostringstream oss;
-
- oss << "0x" << std::hex << std::setfill('0') << std::setw(4) << code;
- if(code < numerrstr)
- oss << " (" << s_errorCodeDescs[code][0] << ") [" << s_errorCodeDescs[code][1] << "]; ";
- else
- oss << " (unknown); ";
-
- if(idx != OCSD_BAD_TRC_INDEX)
- oss << "TrcIdx=" << std::dec << idx << "; ";
-
- if(chan_ID != OCSD_BAD_CS_SRC_ID)
- oss << "CS ID=" << std::hex << std::setfill('0') << std::setw(2) << (uint16_t)chan_ID << "; ";
-
- oss << error.getMessage();
- errStr = oss.str();
-}
-
-/* End of File ocsd_error.cpp */
diff --git a/contrib/opencsd/decoder/source/ocsd_error_logger.cpp b/contrib/opencsd/decoder/source/ocsd_error_logger.cpp
deleted file mode 100644
index 42794a784311..000000000000
--- a/contrib/opencsd/decoder/source/ocsd_error_logger.cpp
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * \file ocsd_error_logger.cpp
- * \brief OpenCSD :
- *
- * \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 "common/ocsd_error_logger.h"
-
-//#include <iostream>
-#include <sstream>
-
-ocsdDefaultErrorLogger::ocsdDefaultErrorLogger() :
- m_Verbosity(OCSD_ERR_SEV_ERROR),
- m_output_logger(0),
- m_created_output_logger(false)
-{
- m_lastErr = 0;
- for(int i = 0; i < 0x80; i++)
- m_lastErrID[i] = 0;
- m_error_sources.push_back("Gen_Err"); // handle 0
- m_error_sources.push_back("Gen_Warn"); // handle 1
- m_error_sources.push_back("Gen_Info"); // handle 2
-}
-
-ocsdDefaultErrorLogger::~ocsdDefaultErrorLogger()
-{
- if(m_created_output_logger)
- delete m_output_logger;
-
- if(m_lastErr)
- delete m_lastErr;
-
- for(int i = 0; i < 0x80; i++)
- if(m_lastErrID[i] != 0) delete m_lastErrID[i];
-}
-
-bool ocsdDefaultErrorLogger::initErrorLogger(const ocsd_err_severity_t verbosity, bool bCreateOutputLogger /*= false*/)
-{
- bool bInit = true;
- m_Verbosity = verbosity;
- if(bCreateOutputLogger)
- {
- m_output_logger = new (std::nothrow) ocsdMsgLogger();
- if(m_output_logger)
- {
- m_created_output_logger = true;
- m_output_logger->setLogOpts(ocsdMsgLogger::OUT_STDERR);
- }
- else
- bInit = false;
- }
- return bInit;
-}
-
-void ocsdDefaultErrorLogger::setOutputLogger(ocsdMsgLogger *pLogger)
-{
- // if we created the current logger, delete it.
- if(m_output_logger && m_created_output_logger)
- delete m_output_logger;
- m_created_output_logger = false;
- m_output_logger = pLogger;
-}
-
-const ocsd_hndl_err_log_t ocsdDefaultErrorLogger::RegisterErrorSource(const std::string &component_name)
-{
- ocsd_hndl_err_log_t handle = m_error_sources.size();
- m_error_sources.push_back(component_name);
- return handle;
-}
-
-void ocsdDefaultErrorLogger::LogError(const ocsd_hndl_err_log_t handle, const ocsdError *Error)
-{
- // only log errors that match or exceed the current verbosity
- if(m_Verbosity >= Error->getErrorSeverity())
- {
- // print out only if required
- if(m_output_logger)
- {
- if(m_output_logger->isLogging())
- {
- std::string errStr = "unknown";
- if(handle < m_error_sources.size())
- errStr = m_error_sources[handle];
- errStr += " : " + ocsdError::getErrorString(Error);
- m_output_logger->LogMsg(errStr);
- }
- }
-
- // log last error
- if(m_lastErr == 0)
- CreateErrorObj(&m_lastErr,Error);
- else
- *m_lastErr = Error;
-
- // log last error associated with an ID
- if(OCSD_IS_VALID_CS_SRC_ID(Error->getErrorChanID()))
- {
- if(m_lastErrID[Error->getErrorChanID()] == 0)
- CreateErrorObj(&m_lastErrID[Error->getErrorChanID()], Error);
- else
- *m_lastErrID[Error->getErrorChanID()] = Error;
- }
- }
-}
-
-void ocsdDefaultErrorLogger::LogMessage(const ocsd_hndl_err_log_t handle, const ocsd_err_severity_t filter_level, const std::string &msg )
-{
- // only log errors that match or exceed the current verbosity
- if((m_Verbosity >= filter_level))
- {
- if(m_output_logger)
- {
- if(m_output_logger->isLogging())
- {
- std::string errStr = "unknown";
- if(handle < m_error_sources.size())
- errStr = m_error_sources[handle];
- errStr += " : " + msg;
- m_output_logger->LogMsg(errStr);
- }
- }
- }
-}
-
-void ocsdDefaultErrorLogger::CreateErrorObj(ocsdError **ppErr, const ocsdError *p_from)
-{
- *ppErr = new (std::nothrow) ocsdError(p_from);
-}
-
-/* End of File ocsd_error_logger.cpp */
diff --git a/contrib/opencsd/decoder/source/ocsd_gen_elem_list.cpp b/contrib/opencsd/decoder/source/ocsd_gen_elem_list.cpp
deleted file mode 100644
index 1a568ec34775..000000000000
--- a/contrib/opencsd/decoder/source/ocsd_gen_elem_list.cpp
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- * \file ocsd_gen_elem_list.cpp
- * \brief OpenCSD : List of Generic trace elements for output.
- *
- * \copyright Copyright (c) 2016, 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 "common/ocsd_gen_elem_list.h"
-
-OcsdGenElemList::OcsdGenElemList()
-{
- m_firstElemIdx=0;
- m_numUsed=0;
- m_numPend=0;
-
- m_elemArraySize = 0;
- m_sendIf = 0;
- m_CSID = 0;
- m_pElemArray = 0;
-}
-
-OcsdGenElemList::~OcsdGenElemList()
-{
- for(int i = 0; i<m_elemArraySize; i++)
- {
- delete m_pElemArray[i].pElem;
- }
- delete [] m_pElemArray;
- m_pElemArray = 0;
-}
-
-void OcsdGenElemList::reset()
-{
- m_firstElemIdx=0;
- m_numUsed=0;
- m_numPend=0;
-}
-
-OcsdTraceElement *OcsdGenElemList::getNextElem(const ocsd_trc_index_t trc_pkt_idx)
-{
- OcsdTraceElement *pElem = 0;
- if(getNumElem() == m_elemArraySize) // all in use
- growArray();
-
- if(m_pElemArray != 0)
- {
- m_numUsed++;
- int idx = getAdjustedIdx(m_firstElemIdx + m_numUsed - 1);
- pElem = m_pElemArray[idx].pElem;
- m_pElemArray[idx].trc_pkt_idx = trc_pkt_idx;
- }
- return pElem;
-}
-
-const ocsd_gen_trc_elem_t OcsdGenElemList::getElemType(const int entryN) const
-{
- ocsd_gen_trc_elem_t elem_type = OCSD_GEN_TRC_ELEM_UNKNOWN;
- if(entryN < getNumElem())
- {
- int idx = getAdjustedIdx(m_firstElemIdx + entryN);
- elem_type = m_pElemArray[idx].pElem->getType();
- }
- return elem_type;
-}
-
-ocsd_datapath_resp_t OcsdGenElemList::sendElements()
-{
- ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
-
- if((m_elemArraySize == 0) || (m_sendIf == 0))
- return OCSD_RESP_FATAL_NOT_INIT;
-
- if(!m_sendIf->hasAttachedAndEnabled())
- return OCSD_RESP_FATAL_NOT_INIT;
-
- while(elemToSend() && OCSD_DATA_RESP_IS_CONT(resp))
- {
- resp = m_sendIf->first()->TraceElemIn(m_pElemArray[m_firstElemIdx].trc_pkt_idx, m_CSID, *(m_pElemArray[m_firstElemIdx].pElem));
- m_firstElemIdx++;
- if(m_firstElemIdx >= m_elemArraySize)
- m_firstElemIdx = 0;
- m_numUsed--;
- }
- return resp;
-}
-
-// this function will enlarge the array, and create extra element objects.
-// existing objects will be moved to the front of the array
-// called if all elements are in use. (sets indexes accordingly)
-void OcsdGenElemList::growArray()
-{
- elemPtr_t *p_new_array = 0;
-
- int increment;
- if(m_elemArraySize == 0)
- // starting from scratch...
- increment = 8;
- else
- increment = m_elemArraySize / 2; // grow by 50%
-
-
- p_new_array = new (std::nothrow) elemPtr_t[m_elemArraySize+increment];
-
- if(p_new_array != 0)
- {
- // fill the last increment elements with new objects
- for(int i=0; i < increment; i++)
- {
- p_new_array[m_elemArraySize+i].pElem = new (std::nothrow) OcsdTraceElement();
- }
-
- // copy the existing objects from the old array to the start of the new one
- // and adjust the indices.
- if(m_elemArraySize > 0)
- {
- int inIdx = m_firstElemIdx;
- for(int i = 0; i < m_elemArraySize; i++)
- {
- p_new_array[i].pElem = m_pElemArray[inIdx].pElem;
- p_new_array[i].trc_pkt_idx = m_pElemArray[inIdx].trc_pkt_idx;
- inIdx++;
- if(inIdx >= m_elemArraySize)
- inIdx = 0;
- }
- }
-
- // delete the old pointer array.
- delete [] m_pElemArray;
- m_elemArraySize += increment;
- }
- else
- m_elemArraySize = 0;
-
- // update the internal array pointers to the new array
- if(m_firstElemIdx >= 0)
- m_firstElemIdx = 0;
- m_pElemArray = p_new_array;
-}
-
-/* End of File ocsd_gen_elem_list.cpp */
diff --git a/contrib/opencsd/decoder/source/ocsd_lib_dcd_register.cpp b/contrib/opencsd/decoder/source/ocsd_lib_dcd_register.cpp
deleted file mode 100644
index adb042dcadff..000000000000
--- a/contrib/opencsd/decoder/source/ocsd_lib_dcd_register.cpp
+++ /dev/null
@@ -1,215 +0,0 @@
-/*
- * \file ocsd_lib_dcd_register.cpp
- * \brief OpenCSD : Library decoder register object
- *
- * \copyright Copyright (c) 2016, 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 "common/ocsd_lib_dcd_register.h"
-
-// include built-in decode manager headers
-#include "opencsd/etmv4/trc_dcd_mngr_etmv4i.h"
-#include "opencsd/etmv3/trc_dcd_mngr_etmv3.h"
-#include "opencsd/ptm/trc_dcd_mngr_ptm.h"
-#include "opencsd/stm/trc_dcd_mngr_stm.h"
-
-// create array of built-in decoders to register with library
-static built_in_decoder_info_t sBuiltInArray[] = {
- CREATE_BUILTIN_ENTRY(DecoderMngrEtmV4I,OCSD_BUILTIN_DCD_ETMV4I),
- CREATE_BUILTIN_ENTRY(DecoderMngrEtmV3, OCSD_BUILTIN_DCD_ETMV3),
- CREATE_BUILTIN_ENTRY(DecoderMngrPtm, OCSD_BUILTIN_DCD_PTM),
- CREATE_BUILTIN_ENTRY(DecoderMngrStm, OCSD_BUILTIN_DCD_STM)
- //{ 0, 0, 0}
-};
-
-#define NUM_BUILTINS sizeof(sBuiltInArray) / sizeof(built_in_decoder_info_t)
-
-
-OcsdLibDcdRegister *OcsdLibDcdRegister::m_p_libMngr = 0;
-bool OcsdLibDcdRegister::m_b_registeredBuiltins = false;
-ocsd_trace_protocol_t OcsdLibDcdRegister::m_nextCustomProtocolID = OCSD_PROTOCOL_CUSTOM_0;
-
-OcsdLibDcdRegister *OcsdLibDcdRegister::getDecoderRegister()
-{
- if(m_p_libMngr == 0)
- m_p_libMngr = new (std::nothrow) OcsdLibDcdRegister();
- return m_p_libMngr;
-}
-
-const ocsd_trace_protocol_t OcsdLibDcdRegister::getNextCustomProtocolID()
-{
- ocsd_trace_protocol_t ret = m_nextCustomProtocolID;
- if(m_nextCustomProtocolID < OCSD_PROTOCOL_END)
- m_nextCustomProtocolID = (ocsd_trace_protocol_t)(((int)m_nextCustomProtocolID)+1);
- return ret;
-}
-
-void OcsdLibDcdRegister::releaseLastCustomProtocolID()
-{
- if(m_nextCustomProtocolID > OCSD_PROTOCOL_CUSTOM_0)
- m_nextCustomProtocolID = (ocsd_trace_protocol_t)(((int)m_nextCustomProtocolID)-1);
-}
-
-OcsdLibDcdRegister::OcsdLibDcdRegister()
-{
- m_iter = m_decoder_mngrs.begin();
- m_pLastTypedDecoderMngr = 0;
-}
-
-OcsdLibDcdRegister::~OcsdLibDcdRegister()
-{
- m_decoder_mngrs.clear();
- m_typed_decoder_mngrs.clear();
- m_pLastTypedDecoderMngr = 0;
-}
-
-
-const ocsd_err_t OcsdLibDcdRegister::registerDecoderTypeByName(const std::string &name, IDecoderMngr *p_decoder_fact)
-{
- if(isRegisteredDecoder(name))
- return OCSD_ERR_DCDREG_NAME_REPEAT;
- m_decoder_mngrs.emplace(std::pair<const std::string, IDecoderMngr *>(name,p_decoder_fact));
- m_typed_decoder_mngrs.emplace(std::pair<const ocsd_trace_protocol_t, IDecoderMngr *>(p_decoder_fact->getProtocolType(),p_decoder_fact));
- return OCSD_OK;
-}
-
-void OcsdLibDcdRegister::registerBuiltInDecoders()
-{
- bool memFail = false;
- for(unsigned i = 0; i < NUM_BUILTINS; i++)
- {
- if(sBuiltInArray[i].PFn)
- {
- sBuiltInArray[i].pMngr = sBuiltInArray[i].PFn( sBuiltInArray[i].name);
- if(!sBuiltInArray[i].pMngr)
- memFail=true;
- }
- }
- m_b_registeredBuiltins = !memFail;
-}
-
-void OcsdLibDcdRegister::deregisterAllDecoders()
-{
- if(m_b_registeredBuiltins)
- {
- for(unsigned i = 0; i < NUM_BUILTINS; i++)
- delete sBuiltInArray[i].pMngr;
- m_b_registeredBuiltins = false;
- }
-
- if(m_p_libMngr)
- {
- m_p_libMngr->deRegisterCustomDecoders();
- delete m_p_libMngr;
- m_p_libMngr = 0;
- }
-}
-
-void OcsdLibDcdRegister::deRegisterCustomDecoders()
-{
- std::map<const ocsd_trace_protocol_t, IDecoderMngr *>::const_iterator iter = m_typed_decoder_mngrs.begin();
- while(iter != m_typed_decoder_mngrs.end())
- {
- IDecoderMngr *pMngr = iter->second;
- if(pMngr->getProtocolType() >= OCSD_PROTOCOL_CUSTOM_0)
- delete pMngr;
- iter++;
- }
-}
-
-const ocsd_err_t OcsdLibDcdRegister::getDecoderMngrByName(const std::string &name, IDecoderMngr **p_decoder_mngr)
-{
- if(!m_b_registeredBuiltins)
- {
- registerBuiltInDecoders();
- if(!m_b_registeredBuiltins)
- return OCSD_ERR_MEM;
- }
-
- std::map<const std::string, IDecoderMngr *>::const_iterator iter = m_decoder_mngrs.find(name);
- if(iter == m_decoder_mngrs.end())
- return OCSD_ERR_DCDREG_NAME_UNKNOWN;
- *p_decoder_mngr = iter->second;
- return OCSD_OK;
-}
-
-const ocsd_err_t OcsdLibDcdRegister::getDecoderMngrByType(const ocsd_trace_protocol_t decoderType, IDecoderMngr **p_decoder_mngr)
-{
- if(!m_b_registeredBuiltins)
- {
- registerBuiltInDecoders();
- if(!m_b_registeredBuiltins)
- return OCSD_ERR_MEM;
- }
-
- if (m_pLastTypedDecoderMngr && (m_pLastTypedDecoderMngr->getProtocolType() == decoderType))
- *p_decoder_mngr = m_pLastTypedDecoderMngr;
- else
- {
- std::map<const ocsd_trace_protocol_t, IDecoderMngr *>::const_iterator iter = m_typed_decoder_mngrs.find(decoderType);
- if (iter == m_typed_decoder_mngrs.end())
- return OCSD_ERR_DCDREG_TYPE_UNKNOWN;
- *p_decoder_mngr = m_pLastTypedDecoderMngr = iter->second;
- }
- return OCSD_OK;
-}
-
-const bool OcsdLibDcdRegister::isRegisteredDecoder(const std::string &name)
-{
- std::map<const std::string, IDecoderMngr *>::const_iterator iter = m_decoder_mngrs.find(name);
- if(iter != m_decoder_mngrs.end())
- return true;
- return false;
-}
-
-const bool OcsdLibDcdRegister::isRegisteredDecoderType(const ocsd_trace_protocol_t decoderType)
-{
- std::map<const ocsd_trace_protocol_t, IDecoderMngr *>::const_iterator iter = m_typed_decoder_mngrs.find(decoderType);
- if(iter != m_typed_decoder_mngrs.end())
- return true;
- return false;
-}
-
-const bool OcsdLibDcdRegister::getFirstNamedDecoder(std::string &name)
-{
- m_iter = m_decoder_mngrs.begin();
- return getNextNamedDecoder(name);
-}
-
-const bool OcsdLibDcdRegister::getNextNamedDecoder(std::string &name)
-{
- if(m_iter == m_decoder_mngrs.end())
- return false;
- name = m_iter->first;
- m_iter++;
- return true;
-}
-
-/* End of File ocsd_lib_dcd_register.cpp */
diff --git a/contrib/opencsd/decoder/source/ocsd_msg_logger.cpp b/contrib/opencsd/decoder/source/ocsd_msg_logger.cpp
deleted file mode 100644
index 287edfa9fe84..000000000000
--- a/contrib/opencsd/decoder/source/ocsd_msg_logger.cpp
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * \file ocsd_msg_logger.cpp
- * \brief OpenCSD :
- *
- * \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 "common/ocsd_msg_logger.h"
-
-#include <iostream>
-#include <sstream>
-
-#define MSGLOG_OUT_MASK (ocsdMsgLogger::OUT_FILE | ocsdMsgLogger::OUT_STDERR | ocsdMsgLogger::OUT_STDOUT | ocsdMsgLogger::OUT_STR_CB)
-
-ocsdMsgLogger::ocsdMsgLogger() :
- m_outFlags(ocsdMsgLogger::OUT_STDOUT),
- m_logFileName("ocsd_trace_decode.log"),
- m_pOutStrI(0)
-{
-}
-
-ocsdMsgLogger::~ocsdMsgLogger()
-{
- m_out_file.close();
-}
-
-void ocsdMsgLogger::setLogOpts(int logOpts)
-{
- m_outFlags = logOpts & (MSGLOG_OUT_MASK);
-}
-
-void ocsdMsgLogger::setLogFileName(const char *fileName)
-{
- if (fileName == 0)
- m_logFileName = "";
- else
- m_logFileName = fileName;
-
- if(m_out_file.is_open())
- m_out_file.close();
-
- if (m_logFileName.length())
- m_outFlags |= (int)ocsdMsgLogger::OUT_FILE;
- else
- m_outFlags &= ~((int)ocsdMsgLogger::OUT_FILE);
-}
-
-void ocsdMsgLogger::setStrOutFn(ocsdMsgLogStrOutI *p_IstrOut)
-{
- m_pOutStrI = p_IstrOut;
- if (p_IstrOut)
- m_outFlags |= (int)ocsdMsgLogger::OUT_STR_CB;
- else
- m_outFlags &= ~((int)ocsdMsgLogger::OUT_STR_CB);
-}
-
-void ocsdMsgLogger::LogMsg(const std::string &msg)
-{
- if(m_outFlags & OUT_STDOUT)
- {
- std::cout << msg;
- std::cout.flush();
- }
-
- if(m_outFlags & OUT_STDERR)
- {
- std::cerr << msg;
- std::cerr.flush();
- }
-
- if(m_outFlags & OUT_FILE)
- {
- if(!m_out_file.is_open())
- {
- m_out_file.open(m_logFileName.c_str(),std::fstream::out | std::fstream::app);
- }
- m_out_file << msg;
- m_out_file.flush();
- }
-
- if (m_outFlags & OUT_STR_CB)
- {
- if (m_pOutStrI)
- m_pOutStrI->printOutStr(msg);
- }
-}
-
-const bool ocsdMsgLogger::isLogging() const
-{
- return (bool)((m_outFlags & MSGLOG_OUT_MASK) != 0);
-}
-
-/* End of File ocsd_msg_logger.cpp */
diff --git a/contrib/opencsd/decoder/source/ocsd_version.cpp b/contrib/opencsd/decoder/source/ocsd_version.cpp
deleted file mode 100644
index 6dd3f2c7069e..000000000000
--- a/contrib/opencsd/decoder/source/ocsd_version.cpp
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * \file ocsd_version.cpp
- * \brief OpenCSD :
- *
- * \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 "opencsd/ocsd_if_version.h"
-#include "common/ocsd_version.h"
-
-const uint32_t ocsdVersion::vers_num()
-{
- return OCSD_VER_NUM;
-}
-
-const char *ocsdVersion::vers_str()
-{
- return OCSD_VER_STRING;
-}
-
-/* End of File ocsd_version.cpp */
diff --git a/contrib/opencsd/decoder/source/pkt_printers/raw_frame_printer.cpp b/contrib/opencsd/decoder/source/pkt_printers/raw_frame_printer.cpp
deleted file mode 100644
index 7ac2ddf66334..000000000000
--- a/contrib/opencsd/decoder/source/pkt_printers/raw_frame_printer.cpp
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * \file raw_frame_printer.cpp
- * \brief OpenCSD :
- *
- * \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 <string>
-#include <sstream>
-#include <iomanip>
-
-#include "opencsd.h"
-
-
-ocsd_err_t RawFramePrinter::TraceRawFrameIn( const ocsd_datapath_op_t op,
- const ocsd_trc_index_t index,
- const ocsd_rawframe_elem_t frame_element,
- const int dataBlockSize,
- const uint8_t *pDataBlock,
- const uint8_t traceID)
-{
-
- if(op == OCSD_OP_DATA) // only interested in actual frame data.
- {
- std::string strData;
- std::ostringstream oss;
- int printDataSize = dataBlockSize;
-
- oss << "Frame Data; Index" << std::setw(7) << index << "; ";
-
- switch(frame_element)
- {
- case OCSD_FRM_PACKED: oss << std::setw(15) << "RAW_PACKED; "; break;
- case OCSD_FRM_HSYNC: oss << std::setw(15) << "HSYNC; "; break;
- case OCSD_FRM_FSYNC: oss << std::setw(15) << "FSYNC; "; break;
- case OCSD_FRM_ID_DATA:
- oss << std::setw(10) << "ID_DATA[";
- if (traceID == OCSD_BAD_CS_SRC_ID)
- oss << "????";
- else
- oss << "0x" << std::hex << std::setw(2) << std::setfill('0') << (uint16_t)traceID;
- oss << "]; ";
- break;
- default: oss << std::setw(15) << "UNKNOWN; "; break;
- }
-
- if(printDataSize)
- {
- createDataString(printDataSize,pDataBlock,16,strData);
- oss << strData;
- }
- oss << std::endl;
- itemPrintLine(oss.str());
- }
- return OCSD_OK;
-}
-
-void RawFramePrinter::createDataString(const int dataSize, const uint8_t *pData, int bytesPerLine, std::string &dataStr)
-{
- int lineBytes = 0;
- std::ostringstream oss;
-
- for(int i = 0; i < dataSize; i++)
- {
- if(lineBytes == bytesPerLine)
- {
- oss << std::endl;
- lineBytes = 0;
- }
- oss << std::hex << std::setw(2) << std::setfill('0') << (uint32_t)pData[i] << " ";
- lineBytes ++;
- }
- dataStr = oss.str();
-}
-
-
-/* End of File raw_frame_printer.cpp */
diff --git a/contrib/opencsd/decoder/source/pkt_printers/trc_print_fact.cpp b/contrib/opencsd/decoder/source/pkt_printers/trc_print_fact.cpp
deleted file mode 100644
index 52dcb6b3e1ac..000000000000
--- a/contrib/opencsd/decoder/source/pkt_printers/trc_print_fact.cpp
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
-* \file trc_print_fact.cpp
-* \brief OpenCSD : Trace Packet printer factory.
-*
-* \copyright Copyright (c) 2017, 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 "pkt_printers/trc_print_fact.h"
-
-RawFramePrinter * PktPrinterFact::createRawFramePrinter(std::vector<ItemPrinter *> &printer_list, ocsdMsgLogger *pMsgLogger /*= 0*/)
-{
- RawFramePrinter *pPrinter = 0;
- pPrinter = new (std::nothrow)RawFramePrinter();
- SavePrinter(printer_list, pPrinter, pMsgLogger);
- return pPrinter;
-}
-
-TrcGenericElementPrinter *PktPrinterFact::createGenElemPrinter(std::vector<ItemPrinter *> &printer_list, ocsdMsgLogger *pMsgLogger /*= 0*/)
-{
- TrcGenericElementPrinter *pPrinter = 0;
- pPrinter = new (std::nothrow)TrcGenericElementPrinter();
- SavePrinter(printer_list, pPrinter, pMsgLogger);
- return pPrinter;
-}
-
-ItemPrinter *PktPrinterFact::createProtocolPrinter(std::vector<ItemPrinter *> &printer_list, ocsd_trace_protocol_t protocol, uint8_t CSID, ocsdMsgLogger *pMsgLogger /*= 0*/)
-{
- ItemPrinter *pPrinter = 0;
- switch (protocol)
- {
- case OCSD_PROTOCOL_ETMV4I:
- pPrinter = new (std::nothrow) PacketPrinter<EtmV4ITrcPacket>(CSID);
- break;
- case OCSD_PROTOCOL_ETMV3:
- pPrinter = new (std::nothrow) PacketPrinter<EtmV3TrcPacket>(CSID);
- break;
- case OCSD_PROTOCOL_PTM:
- pPrinter = new (std::nothrow) PacketPrinter<PtmTrcPacket>(CSID);
- break;
- case OCSD_PROTOCOL_STM:
- pPrinter = new (std::nothrow) PacketPrinter<StmTrcPacket>(CSID);
- break;
- default:
- break;
- }
- SavePrinter(printer_list, pPrinter, pMsgLogger);
- return pPrinter;
-}
-
-const int PktPrinterFact::numPrinters(std::vector<ItemPrinter *> &printer_list)
-{
- return printer_list.size();
-}
-
-void PktPrinterFact::SavePrinter(std::vector<ItemPrinter *> &printer_list, ItemPrinter *pPrinter, ocsdMsgLogger *pMsgLogger)
-{
- if (pPrinter)
- {
- pPrinter->setMessageLogger(pMsgLogger);
- printer_list.push_back((ItemPrinter *)pPrinter);
- }
-}
-
-void PktPrinterFact::destroyAllPrinters(std::vector<ItemPrinter *> &printer_list)
-{
- std::vector<ItemPrinter *>::iterator it;
- it = printer_list.begin();
- while (it != printer_list.end())
- {
- delete *it;
- it++;
- }
- printer_list.clear();
-}
-
-void PktPrinterFact::destroyPrinter(std::vector<ItemPrinter *> &printer_list, ItemPrinter *pPrinter)
-{
- std::vector<ItemPrinter *>::iterator it;
- it = printer_list.begin();
- while (it != printer_list.end())
- {
- if (*it == pPrinter)
- {
- printer_list.erase(it);
- delete pPrinter;
- return;
- }
- else
- it++;
- }
-}
-
-
-
-/* end of file trc_print_fact.cpp */
diff --git a/contrib/opencsd/decoder/source/ptm/trc_cmp_cfg_ptm.cpp b/contrib/opencsd/decoder/source/ptm/trc_cmp_cfg_ptm.cpp
deleted file mode 100644
index 74ded02c2130..000000000000
--- a/contrib/opencsd/decoder/source/ptm/trc_cmp_cfg_ptm.cpp
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * \file trc_cmp_cfg_ptm.cpp
- * \brief OpenCSD :
- *
- * \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 "opencsd/ptm/trc_cmp_cfg_ptm.h"
-
-PtmConfig::PtmConfig()
-{
- // defaults set ETMv1.1, V7A
- m_cfg.arch_ver = ARCH_V7;
- m_cfg.core_prof = profile_CortexA;
- m_cfg.reg_ccer = 0;
- m_cfg.reg_idr = 0x4100F310;
- m_cfg.reg_ctrl = 0;
-}
-
-PtmConfig::PtmConfig(const ocsd_ptm_cfg *cfg_regs)
-{
- m_cfg = *cfg_regs;
-}
-
-const int PtmConfig::CtxtIDBytes() const
-{
- int ctxtIdsizes[] = { 0, 1, 2, 4 };
- return ctxtIdsizes[(m_cfg.reg_ctrl >> 14) & 0x3];
-}
-
-
-/* End of File trc_cmp_cfg_ptm.cpp */
diff --git a/contrib/opencsd/decoder/source/ptm/trc_pkt_decode_ptm.cpp b/contrib/opencsd/decoder/source/ptm/trc_pkt_decode_ptm.cpp
deleted file mode 100644
index 94ed5acc243a..000000000000
--- a/contrib/opencsd/decoder/source/ptm/trc_pkt_decode_ptm.cpp
+++ /dev/null
@@ -1,665 +0,0 @@
-/*
- * \file trc_pkt_decode_ptm.cpp
- * \brief OpenCSD : PTM packet decoder.
- *
- * \copyright Copyright (c) 2016, 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 "opencsd/ptm/trc_pkt_decode_ptm.h"
-
-#define DCD_NAME "DCD_PTM"
-
-TrcPktDecodePtm::TrcPktDecodePtm()
- : TrcPktDecodeBase(DCD_NAME)
-{
- initDecoder();
-}
-
-TrcPktDecodePtm::TrcPktDecodePtm(int instIDNum)
- : TrcPktDecodeBase(DCD_NAME,instIDNum)
-{
- initDecoder();
-}
-
-TrcPktDecodePtm::~TrcPktDecodePtm()
-{
-}
-
-/*********************** implementation packet decoding interface */
-
-ocsd_datapath_resp_t TrcPktDecodePtm::processPacket()
-{
- ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
- bool bPktDone = false;
-
- while(!bPktDone)
- {
- switch(m_curr_state)
- {
- case NO_SYNC:
- // no sync - output a no sync packet then transition to wait sync.
- m_output_elem.elem_type = OCSD_GEN_TRC_ELEM_NO_SYNC;
- resp = outputTraceElement(m_output_elem);
- m_curr_state = (m_curr_packet_in->getType() == PTM_PKT_A_SYNC) ? WAIT_ISYNC : WAIT_SYNC;
- bPktDone = true;
- break;
-
- case WAIT_SYNC:
- if(m_curr_packet_in->getType() == PTM_PKT_A_SYNC)
- m_curr_state = WAIT_ISYNC;
- bPktDone = true;
- break;
-
- case WAIT_ISYNC:
- if(m_curr_packet_in->getType() == PTM_PKT_I_SYNC)
- m_curr_state = DECODE_PKTS;
- else
- bPktDone = true;
- break;
-
- case DECODE_PKTS:
- resp = decodePacket();
- bPktDone = true;
- break;
-
- default:
- // should only see these after a _WAIT resp - in flush handler
- case CONT_ISYNC:
- case CONT_ATOM:
- bPktDone = true;
- // throw a decoder error
- break;
- }
- }
- return resp;
-}
-
-ocsd_datapath_resp_t TrcPktDecodePtm::onEOT()
-{
- ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
- // shouldn't be any packets left to be processed - flush shoudl have done this.
- // just output the end of trace marker
- m_output_elem.setType(OCSD_GEN_TRC_ELEM_EO_TRACE);
- resp = outputTraceElement(m_output_elem);
- return resp;
-}
-
-ocsd_datapath_resp_t TrcPktDecodePtm::onReset()
-{
- ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
- resetDecoder();
- return resp;
-}
-
-ocsd_datapath_resp_t TrcPktDecodePtm::onFlush()
-{
- ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
- resp = contProcess();
- return resp;
-}
-
-// atom and isync packets can have multiple ouput packets that can be _WAITed mid stream.
-ocsd_datapath_resp_t TrcPktDecodePtm::contProcess()
-{
- ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
- switch(m_curr_state)
- {
- case CONT_ISYNC:
- resp = processIsync();
- break;
-
- case CONT_ATOM:
- resp = processAtom();
- break;
-
- case CONT_WPUP:
- resp = processWPUpdate();
- break;
-
- case CONT_BRANCH:
- resp = processBranch();
- break;
-
- default: break; // not a state that requires further processing
- }
-
- if(OCSD_DATA_RESP_IS_CONT(resp) && processStateIsCont())
- m_curr_state = DECODE_PKTS; // continue packet processing - assuming we have not degraded into an unsynced state.
-
- return resp;
-}
-
-ocsd_err_t TrcPktDecodePtm::onProtocolConfig()
-{
- ocsd_err_t err = OCSD_OK;
- if(m_config == 0)
- return OCSD_ERR_NOT_INIT;
-
- // static config - copy of CSID for easy reference
- m_CSID = m_config->getTraceID();
-
- // handle return stack implementation
- if (m_config->hasRetStack())
- {
- m_return_stack.set_active(m_config->enaRetStack());
-#ifdef TRC_RET_STACK_DEBUG
- m_return_stack.set_dbg_logger(this);
-#endif
- }
-
- // config options affecting decode
- m_instr_info.pe_type.profile = m_config->coreProfile();
- m_instr_info.pe_type.arch = m_config->archVersion();
- m_instr_info.dsb_dmb_waypoints = m_config->dmsbWayPt() ? 1 : 0;
- m_instr_info.wfi_wfe_branch = 0;
- return err;
-}
-
-/****************** local decoder routines */
-
-void TrcPktDecodePtm::initDecoder()
-{
- m_CSID = 0;
- m_instr_info.pe_type.profile = profile_Unknown;
- m_instr_info.pe_type.arch = ARCH_UNKNOWN;
- m_instr_info.dsb_dmb_waypoints = 0;
- resetDecoder();
-}
-
-void TrcPktDecodePtm::resetDecoder()
-{
- m_curr_state = NO_SYNC;
- m_need_isync = true; // need context to start.
-
- m_instr_info.isa = ocsd_isa_unknown;
- m_mem_nacc_pending = false;
-
- m_pe_context.ctxt_id_valid = 0;
- m_pe_context.bits64 = 0;
- m_pe_context.vmid_valid = 0;
- m_pe_context.exception_level = ocsd_EL_unknown;
- m_pe_context.security_level = ocsd_sec_secure;
- m_pe_context.el_valid = 0;
-
- m_curr_pe_state.instr_addr = 0x0;
- m_curr_pe_state.isa = ocsd_isa_unknown;
- m_curr_pe_state.valid = false;
-
- m_atoms.clearAll();
- m_output_elem.init();
-}
-
-ocsd_datapath_resp_t TrcPktDecodePtm::decodePacket()
-{
- ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
- switch(m_curr_packet_in->getType())
- {
- // ignore these from trace o/p point of veiw
- case PTM_PKT_NOTSYNC:
- case PTM_PKT_INCOMPLETE_EOT:
- case PTM_PKT_NOERROR:
- break;
-
- // bad / reserved packet - need to wait for next sync point
- case PTM_PKT_BAD_SEQUENCE:
- case PTM_PKT_RESERVED:
- m_curr_state = WAIT_SYNC;
- m_need_isync = true; // need context to re-start.
- m_output_elem.setType(OCSD_GEN_TRC_ELEM_NO_SYNC);
- resp = outputTraceElement(m_output_elem);
- break;
-
- // packets we can ignore if in sync
- case PTM_PKT_A_SYNC:
- case PTM_PKT_IGNORE:
- break;
-
- //
- case PTM_PKT_I_SYNC:
- resp = processIsync();
- break;
-
- case PTM_PKT_BRANCH_ADDRESS:
- resp = processBranch();
- break;
-
- case PTM_PKT_TRIGGER:
- m_output_elem.setType(OCSD_GEN_TRC_ELEM_EVENT);
- m_output_elem.setEvent(EVENT_TRIGGER, 0);
- resp = outputTraceElement(m_output_elem);
- break;
-
- case PTM_PKT_WPOINT_UPDATE:
- resp = processWPUpdate();
- break;
-
- case PTM_PKT_CONTEXT_ID:
- {
- bool bUpdate = true;
- // see if this is a change
- if((m_pe_context.ctxt_id_valid) && (m_pe_context.context_id == m_curr_packet_in->context.ctxtID))
- bUpdate = false;
- if(bUpdate)
- {
- m_pe_context.context_id = m_curr_packet_in->context.ctxtID;
- m_pe_context.ctxt_id_valid = 1;
- m_output_elem.setType(OCSD_GEN_TRC_ELEM_PE_CONTEXT);
- m_output_elem.setContext(m_pe_context);
- resp = outputTraceElement(m_output_elem);
- }
- }
- break;
-
- case PTM_PKT_VMID:
- {
- bool bUpdate = true;
- // see if this is a change
- if((m_pe_context.vmid_valid) && (m_pe_context.vmid == m_curr_packet_in->context.VMID))
- bUpdate = false;
- if(bUpdate)
- {
- m_pe_context.vmid = m_curr_packet_in->context.VMID;
- m_pe_context.vmid_valid = 1;
- m_output_elem.setType(OCSD_GEN_TRC_ELEM_PE_CONTEXT);
- m_output_elem.setContext(m_pe_context);
- resp = outputTraceElement(m_output_elem);
- }
- }
- break;
-
- case PTM_PKT_ATOM:
- if(m_curr_pe_state.valid)
- {
- m_atoms.initAtomPkt(m_curr_packet_in->getAtom(),m_index_curr_pkt);
- resp = processAtom();
- }
- break;
-
- case PTM_PKT_TIMESTAMP:
- m_output_elem.setType(OCSD_GEN_TRC_ELEM_TIMESTAMP);
- m_output_elem.timestamp = m_curr_packet_in->timestamp;
- if(m_curr_packet_in->cc_valid)
- m_output_elem.setCycleCount(m_curr_packet_in->cycle_count);
- resp = outputTraceElement(m_output_elem);
- break;
-
- case PTM_PKT_EXCEPTION_RET:
- m_output_elem.setType(OCSD_GEN_TRC_ELEM_EXCEPTION_RET);
- resp = outputTraceElement(m_output_elem);
- break;
-
- }
- return resp;
-}
-
-ocsd_datapath_resp_t TrcPktDecodePtm::processIsync()
-{
- ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
-
- // extract the I-Sync data if not re-entering after a _WAIT
- if(m_curr_state == DECODE_PKTS)
- {
- m_curr_pe_state.instr_addr = m_curr_packet_in->getAddrVal();
- m_curr_pe_state.isa = m_curr_packet_in->getISA();
- m_curr_pe_state.valid = true;
-
- m_i_sync_pe_ctxt = m_curr_packet_in->ISAChanged();
- if(m_curr_packet_in->CtxtIDUpdated())
- {
- m_pe_context.context_id = m_curr_packet_in->getCtxtID();
- m_pe_context.ctxt_id_valid = 1;
- m_i_sync_pe_ctxt = true;
- }
-
- if(m_curr_packet_in->VMIDUpdated())
- {
- m_pe_context.vmid = m_curr_packet_in->getVMID();
- m_pe_context.vmid_valid = 1;
- m_i_sync_pe_ctxt = true;
- }
- m_pe_context.security_level = m_curr_packet_in->getNS() ? ocsd_sec_nonsecure : ocsd_sec_secure;
-
- if(m_need_isync || (m_curr_packet_in->iSyncReason() != iSync_Periodic))
- {
- m_output_elem.setType(OCSD_GEN_TRC_ELEM_TRACE_ON);
- m_output_elem.trace_on_reason = TRACE_ON_NORMAL;
- if(m_curr_packet_in->iSyncReason() == iSync_TraceRestartAfterOverflow)
- m_output_elem.trace_on_reason = TRACE_ON_OVERFLOW;
- else if(m_curr_packet_in->iSyncReason() == iSync_DebugExit)
- m_output_elem.trace_on_reason = TRACE_ON_EX_DEBUG;
- if(m_curr_packet_in->hasCC())
- m_output_elem.setCycleCount(m_curr_packet_in->getCCVal());
- resp = outputTraceElement(m_output_elem);
- }
- else
- {
- // periodic - no output
- m_i_sync_pe_ctxt = false;
- }
- m_need_isync = false; // got 1st Isync - can continue to process data.
- m_return_stack.flush();
- }
-
- if(m_i_sync_pe_ctxt && OCSD_DATA_RESP_IS_CONT(resp))
- {
- m_output_elem.setType(OCSD_GEN_TRC_ELEM_PE_CONTEXT);
- m_output_elem.setContext(m_pe_context);
- m_output_elem.setISA(m_curr_pe_state.isa);
- resp = outputTraceElement(m_output_elem);
- m_i_sync_pe_ctxt = false;
- }
-
- // if wait and still stuff to process....
- if(OCSD_DATA_RESP_IS_WAIT(resp) && ( m_i_sync_pe_ctxt))
- m_curr_state = CONT_ISYNC;
-
- return resp;
-}
-
-// change of address and/or exception in program flow.
-// implies E atom before the branch if none exception.
-ocsd_datapath_resp_t TrcPktDecodePtm::processBranch()
-{
- ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
-
- // initial pass - decoding packet.
- if(m_curr_state == DECODE_PKTS)
- {
- // specific behviour if this is an exception packet.
- if(m_curr_packet_in->isBranchExcepPacket())
- {
- // exception - record address and output exception packet.
- m_output_elem.setType(OCSD_GEN_TRC_ELEM_EXCEPTION);
- m_output_elem.exception_number = m_curr_packet_in->excepNum();
- m_output_elem.excep_ret_addr = 0;
- if(m_curr_pe_state.valid)
- {
- m_output_elem.excep_ret_addr = 1;
- m_output_elem.en_addr = m_curr_pe_state.instr_addr;
- }
- // could be an associated cycle count
- if(m_curr_packet_in->hasCC())
- m_output_elem.setCycleCount(m_curr_packet_in->getCCVal());
-
- // output the element
- resp = outputTraceElement(m_output_elem);
- }
- else
- {
- // branch address only - implies E atom - need to output a range element based on the atom.
- if(m_curr_pe_state.valid)
- resp = processAtomRange(ATOM_E,"BranchAddr");
- }
-
- // now set the branch address for the next time.
- m_curr_pe_state.isa = m_curr_packet_in->getISA();
- m_curr_pe_state.instr_addr = m_curr_packet_in->getAddrVal();
- m_curr_pe_state.valid = true;
- }
-
- // atom range may return with NACC pending
- checkPendingNacc(resp);
-
- // if wait and still stuff to process....
- if(OCSD_DATA_RESP_IS_WAIT(resp) && ( m_mem_nacc_pending))
- m_curr_state = CONT_BRANCH;
-
- return resp;
-}
-
-// effectively completes a range prior to exception or after many bytes of trace (>4096)
-//
-ocsd_datapath_resp_t TrcPktDecodePtm::processWPUpdate()
-{
- ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
-
- // if we need an address to run from then the WPUpdate will not form a range as
- // we do not have a start point - still waiting for branch or other address packet
- if(m_curr_pe_state.valid)
- {
- // WP update implies atom - use E, we cannot be sure if the instruction passed its condition codes
- // - though it doesn't really matter as it is not a branch so cannot change flow.
- resp = processAtomRange(ATOM_E,"WP update",TRACE_TO_ADDR_INCL,m_curr_packet_in->getAddrVal());
- }
-
- // atom range may return with NACC pending
- checkPendingNacc(resp);
-
- // if wait and still stuff to process....
- if(OCSD_DATA_RESP_IS_WAIT(resp) && ( m_mem_nacc_pending))
- m_curr_state = CONT_WPUP;
-
- return resp;
-}
-
-// a single atom packet can result in multiple range outputs...need to be re-entrant in case we get a wait response.
-// also need to handle nacc response from instruction walking routine
-//
-ocsd_datapath_resp_t TrcPktDecodePtm::processAtom()
-{
- ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
-
- // loop to process all the atoms in the packet
- while(m_atoms.numAtoms() && m_curr_pe_state.valid && OCSD_DATA_RESP_IS_CONT(resp))
- {
- resp = processAtomRange(m_atoms.getCurrAtomVal(),"atom");
- if(!m_curr_pe_state.valid)
- m_atoms.clearAll();
- else
- m_atoms.clearAtom();
- }
-
- // bad address may mean a nacc needs sending
- checkPendingNacc(resp);
-
- // if wait and still stuff to process....
- if(OCSD_DATA_RESP_IS_WAIT(resp) && ( m_mem_nacc_pending || m_atoms.numAtoms()))
- m_curr_state = CONT_ATOM;
-
- return resp;
-}
-
- void TrcPktDecodePtm::checkPendingNacc(ocsd_datapath_resp_t &resp)
- {
- if(m_mem_nacc_pending && OCSD_DATA_RESP_IS_CONT(resp))
- {
- m_output_elem.setType(OCSD_GEN_TRC_ELEM_ADDR_NACC);
- m_output_elem.st_addr = m_nacc_addr;
- resp = outputTraceElementIdx(m_index_curr_pkt,m_output_elem);
- m_mem_nacc_pending = false;
- }
- }
-
-// given an atom element - walk the code and output a range or mark nacc.
-ocsd_datapath_resp_t TrcPktDecodePtm::processAtomRange(const ocsd_atm_val A, const char *pkt_msg, const waypoint_trace_t traceWPOp /*= TRACE_WAYPOINT*/, const ocsd_vaddr_t nextAddrMatch /*= 0*/)
-{
- ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
- bool bWPFound = false;
- std::ostringstream oss;
-
- m_instr_info.instr_addr = m_curr_pe_state.instr_addr;
- m_instr_info.isa = m_curr_pe_state.isa;
-
- ocsd_err_t err = traceInstrToWP(bWPFound,traceWPOp,nextAddrMatch);
- if(err != OCSD_OK)
- {
- if(err == OCSD_ERR_UNSUPPORTED_ISA)
- {
- m_curr_pe_state.valid = false; // need a new address packet
- oss << "Warning: unsupported instruction set processing " << pkt_msg << " packet.";
- LogError(ocsdError(OCSD_ERR_SEV_WARN,err,m_index_curr_pkt,m_CSID,oss.str()));
- // wait for next address
- return OCSD_RESP_WARN_CONT;
- }
- else
- {
- resp = OCSD_RESP_FATAL_INVALID_DATA;
- oss << "Error processing " << pkt_msg << " packet.";
- LogError(ocsdError(OCSD_ERR_SEV_ERROR,err,m_index_curr_pkt,m_CSID,oss.str()));
- return resp;
- }
- }
-
- if(bWPFound)
- {
- // save recorded next instuction address
- ocsd_vaddr_t nextAddr = m_instr_info.instr_addr;
-
- // action according to waypoint type and atom value
- switch(m_instr_info.type)
- {
- case OCSD_INSTR_BR:
- if (A == ATOM_E)
- {
- m_instr_info.instr_addr = m_instr_info.branch_addr;
- if (m_instr_info.is_link)
- m_return_stack.push(nextAddr,m_instr_info.isa);
- }
- break;
-
- // For PTM -> branch addresses imply E atom, N atom does not need address (return stack will require this)
- case OCSD_INSTR_BR_INDIRECT:
- if (A == ATOM_E)
- {
- // atom on indirect branch - either implied E from a branch address packet, or return stack if active.
-
- // indirect branch taken - need new address -if the current packet is a branch address packet this will be sorted.
- m_curr_pe_state.valid = false;
-
- // if return stack and the incoming packet is an atom.
- if (m_return_stack.is_active() && (m_curr_packet_in->getType() == PTM_PKT_ATOM))
- {
- // we have an E atom packet and return stack value - set address from return stack
- m_instr_info.instr_addr = m_return_stack.pop(m_instr_info.next_isa);
-
- if (m_return_stack.overflow())
- {
- resp = OCSD_RESP_FATAL_INVALID_DATA;
- oss << "Return stack error processing " << pkt_msg << " packet.";
- LogError(ocsdError(OCSD_ERR_SEV_ERROR, OCSD_ERR_RET_STACK_OVERFLOW, m_index_curr_pkt, m_CSID, oss.str()));
- return resp;
- }
- else
- m_curr_pe_state.valid = true;
- }
- if(m_instr_info.is_link)
- m_return_stack.push(nextAddr, m_instr_info.isa);
- }
- break;
- }
-
- m_output_elem.setType(OCSD_GEN_TRC_ELEM_INSTR_RANGE);
- m_output_elem.setLastInstrInfo((A == ATOM_E),m_instr_info.type, m_instr_info.sub_type,m_instr_info.instr_size);
- m_output_elem.setISA(m_curr_pe_state.isa);
- if(m_curr_packet_in->hasCC())
- m_output_elem.setCycleCount(m_curr_packet_in->getCCVal());
- m_output_elem.setLastInstrCond(m_instr_info.is_conditional);
- resp = outputTraceElementIdx(m_index_curr_pkt,m_output_elem);
-
- m_curr_pe_state.instr_addr = m_instr_info.instr_addr;
- m_curr_pe_state.isa = m_instr_info.next_isa;
- }
- else
- {
- // no waypoint - likely inaccessible memory range.
- m_curr_pe_state.valid = false; // need an address update
-
- if(m_output_elem.st_addr != m_output_elem.en_addr)
- {
- // some trace before we were out of memory access range
- m_output_elem.setType(OCSD_GEN_TRC_ELEM_INSTR_RANGE);
- m_output_elem.setLastInstrInfo(true,m_instr_info.type, m_instr_info.sub_type,m_instr_info.instr_size);
- m_output_elem.setISA(m_curr_pe_state.isa);
- m_output_elem.setLastInstrCond(m_instr_info.is_conditional);
- resp = outputTraceElementIdx(m_index_curr_pkt,m_output_elem);
- }
- }
- return resp;
-}
-
-ocsd_err_t TrcPktDecodePtm::traceInstrToWP(bool &bWPFound, const waypoint_trace_t traceWPOp /*= TRACE_WAYPOINT*/, const ocsd_vaddr_t nextAddrMatch /*= 0*/)
-{
- uint32_t opcode;
- uint32_t bytesReq;
- ocsd_err_t err = OCSD_OK;
- ocsd_vaddr_t curr_op_address;
-
- ocsd_mem_space_acc_t mem_space = (m_pe_context.security_level == ocsd_sec_secure) ? OCSD_MEM_SPACE_S : OCSD_MEM_SPACE_N;
-
- m_output_elem.st_addr = m_output_elem.en_addr = m_instr_info.instr_addr;
- m_output_elem.num_instr_range = 0;
-
- bWPFound = false;
-
- while(!bWPFound && !m_mem_nacc_pending)
- {
- // start off by reading next opcode;
- bytesReq = 4;
- curr_op_address = m_instr_info.instr_addr; // save the start address for the current opcode
- err = accessMemory(m_instr_info.instr_addr,mem_space,&bytesReq,(uint8_t *)&opcode);
- if(err != OCSD_OK) break;
-
- if(bytesReq == 4) // got data back
- {
- m_instr_info.opcode = opcode;
- err = instrDecode(&m_instr_info);
- if(err != OCSD_OK) break;
-
- // increment address - may be adjusted by direct branch value later
- m_instr_info.instr_addr += m_instr_info.instr_size;
-
- // update the range decoded address in the output packet.
- m_output_elem.en_addr = m_instr_info.instr_addr;
- m_output_elem.num_instr_range++;
-
- m_output_elem.last_i_type = m_instr_info.type;
- // either walking to match the next instruction address or a real waypoint
- if(traceWPOp != TRACE_WAYPOINT)
- {
- if(traceWPOp == TRACE_TO_ADDR_EXCL)
- bWPFound = (m_output_elem.en_addr == nextAddrMatch);
- else
- bWPFound = (curr_op_address == nextAddrMatch);
- }
- else
- bWPFound = (m_instr_info.type != OCSD_INSTR_OTHER);
- }
- else
- {
- // not enough memory accessible.
- m_mem_nacc_pending = true;
- m_nacc_addr = m_instr_info.instr_addr;
- }
- }
- return err;
-}
-
-/* End of File trc_pkt_decode_ptm.cpp */
diff --git a/contrib/opencsd/decoder/source/ptm/trc_pkt_elem_ptm.cpp b/contrib/opencsd/decoder/source/ptm/trc_pkt_elem_ptm.cpp
deleted file mode 100644
index 7c8bcd7ef7f6..000000000000
--- a/contrib/opencsd/decoder/source/ptm/trc_pkt_elem_ptm.cpp
+++ /dev/null
@@ -1,473 +0,0 @@
-/*
- * \file trc_pkt_elem_ptm.cpp
- * \brief OpenCSD :
- *
- * \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/ptm/trc_pkt_elem_ptm.h"
-
-PtmTrcPacket::PtmTrcPacket()
-{
-}
-
-PtmTrcPacket::~PtmTrcPacket()
-{
-}
-
-PtmTrcPacket &PtmTrcPacket::operator =(const ocsd_ptm_pkt* p_pkt)
-{
- *dynamic_cast<ocsd_ptm_pkt *>(this) = *p_pkt;
- return *this;
-}
-
-void PtmTrcPacket::Clear()
-{
- err_type = PTM_PKT_NOERROR;
- cycle_count = 0;
- cc_valid = 0;
- context.updated = 0;
- context.updated_c = 0;
- context.updated_v = 0;
- ts_update_bits = 0;
- atom.En_bits = 0;
- exception.bits.present = 0;
- prev_isa = curr_isa; // mark ISA as not changed
-}
-
-void PtmTrcPacket::ResetState()
-{
- type = PTM_PKT_NOTSYNC;
-
- context.ctxtID = 0;
- context.VMID = 0;
- context.curr_alt_isa = 0;
- context.curr_Hyp = 0;
- context.curr_NS = 0;
-
- addr.valid_bits = 0;
- addr.size = VA_32BIT;
- addr.val = 0;
-
- prev_isa = curr_isa = ocsd_isa_unknown;
-
- timestamp = 0;
-
- Clear();
-}
-
-void PtmTrcPacket::UpdateAddress(const ocsd_vaddr_t partAddrVal, const int updateBits)
-{
- ocsd_vaddr_t validMask = OCSD_VA_MASK;
- validMask >>= OCSD_MAX_VA_BITSIZE-updateBits;
- addr.pkt_bits = updateBits;
- addr.val &= ~validMask;
- addr.val |= (partAddrVal & validMask);
- if(updateBits > addr.valid_bits)
- addr.valid_bits = updateBits;
-}
-
-void PtmTrcPacket::UpdateTimestamp(const uint64_t tsVal, const uint8_t updateBits)
-{
- uint64_t validMask = ~0ULL;
- validMask >>= 64-updateBits;
- timestamp &= ~validMask;
- timestamp |= (tsVal & validMask);
- ts_update_bits = updateBits;
-}
-
-void PtmTrcPacket::SetCycleAccAtomFromPHdr(const uint8_t pHdr)
-{
- atom.num = 1;
- atom.En_bits = (pHdr & 0x2) ? 0x0 : 0x1;
-}
-
-void PtmTrcPacket::SetAtomFromPHdr(const uint8_t pHdr)
-{
- // how many atoms
- uint8_t atom_fmt_id = pHdr & 0xF0;
- if(atom_fmt_id == 0x80)
- {
- // format 1 or 2
- if((pHdr & 0x08) == 0x08)
- atom.num = 2;
- else
- atom.num = 1;
- }
- else if(atom_fmt_id == 0x90)
- {
- atom.num = 3;
- }
- else
- {
- if((pHdr & 0xE0) == 0xA0)
- atom.num = 4;
- else
- atom.num = 5;
- }
-
- // extract the E/N bits
- uint8_t atom_mask = 0x2; // start @ bit 1 - newest instruction
- atom.En_bits = 0;
- for(int i = 0; i < atom.num; i++)
- {
- atom.En_bits <<= 1;
- if(!(atom_mask & pHdr)) // 0 bit is an E in PTM -> a one in the standard atom bit type
- atom.En_bits |= 0x1;
- atom_mask <<= 1;
- }
-}
-
- // printing
-void PtmTrcPacket::toString(std::string &str) const
-{
- std::string temp1, temp2;
- std::ostringstream oss;
-
- packetTypeName(type, temp1,temp2);
- oss << temp1 << " : " << temp2 << "; ";
-
- // some packets require additional data.
- switch(type)
- {
- case PTM_PKT_BAD_SEQUENCE:
- packetTypeName(err_type, temp1,temp2);
- oss << "[" << temp1 << "]; ";
- break;
-
- case PTM_PKT_ATOM:
- getAtomStr(temp1);
- oss << temp1;
- break;
-
- case PTM_PKT_CONTEXT_ID:
- oss << "CtxtID=0x" << std::hex << std::setw(8) << std::setfill('0') << context.ctxtID << "; ";
- break;
-
- case PTM_PKT_VMID:
- oss << "VMID=0x" << std::hex << std::setw(2) << std::setfill('0') << context.VMID << "; ";
- break;
-
- case PTM_PKT_WPOINT_UPDATE:
- case PTM_PKT_BRANCH_ADDRESS:
- getBranchAddressStr(temp1);
- oss << temp1;
- break;
-
- case PTM_PKT_I_SYNC:
- getISyncStr(temp1);
- oss << temp1;
- break;
-
- case PTM_PKT_TIMESTAMP:
- getTSStr(temp1);
- oss << temp1;
- break;
- }
-
- str = oss.str();
-}
-
-void PtmTrcPacket::toStringFmt(const uint32_t fmtFlags, std::string &str) const
-{
- toString(str);
-}
-
-void PtmTrcPacket::getAtomStr(std::string &valStr) const
-{
- std::ostringstream oss;
- uint32_t bitpattern = atom.En_bits; // arranged LSBit oldest, MSbit newest
-
- if(cc_valid) // cycle accurate trace - single atom
- {
- std::string subStr;
- oss << ((bitpattern & 0x1) ? "E" : "N"); // in spec read L->R, oldest->newest
- oss << "; ";
- getCycleCountStr(subStr);
- oss << subStr;
- }
- else
- {
- // none cycle count
- for(int i = 0; i < atom.num; i++)
- {
- oss << ((bitpattern & 0x1) ? "E" : "N"); // in spec read L->R, oldest->newest
- bitpattern >>= 1;
- }
- oss << "; ";
- }
- valStr = oss.str();
-}
-
-void PtmTrcPacket::getBranchAddressStr(std::string &valStr) const
-{
- std::ostringstream oss;
- std::string subStr;
-
- // print address.
- trcPrintableElem::getValStr(subStr,32,addr.valid_bits,addr.val,true,addr.pkt_bits);
- oss << "Addr=" << subStr << "; ";
-
- // current ISA if changed.
- if(curr_isa != prev_isa)
- {
- getISAStr(subStr);
- oss << subStr;
- }
-
- // S / NS etc if changed.
- if(context.updated)
- {
- oss << (context.curr_NS ? "NS; " : "S; ");
- oss << (context.curr_Hyp ? "Hyp; " : "");
- }
-
- // exception?
- if(exception.bits.present)
- {
- getExcepStr(subStr);
- oss << subStr;
- }
-
- if(cc_valid)
- {
- getCycleCountStr(subStr);
- oss << subStr;
- }
- valStr = oss.str();
-}
-
-void PtmTrcPacket::getISAStr(std::string &isaStr) const
-{
- std::ostringstream oss;
- oss << "ISA=";
- switch(curr_isa)
- {
- case ocsd_isa_arm:
- oss << "ARM(32); ";
- break;
-
- case ocsd_isa_thumb2:
- oss << "Thumb2; ";
- break;
-
- case ocsd_isa_aarch64:
- oss << "AArch64; ";
- break;
-
- case ocsd_isa_tee:
- oss << "ThumbEE; ";
- break;
-
- case ocsd_isa_jazelle:
- oss << "Jazelle; ";
- break;
-
- default:
- case ocsd_isa_unknown:
- oss << "Unknown; ";
- break;
- }
- isaStr = oss.str();
-}
-
-void PtmTrcPacket::getExcepStr(std::string &excepStr) const
-{
- static const char *ARv7Excep[] = {
- "No Exception", "Debug Halt", "SMC", "Hyp",
- "Async Data Abort", "Jazelle", "Reserved", "Reserved",
- "PE Reset", "Undefined Instr", "SVC", "Prefetch Abort",
- "Data Fault", "Generic", "IRQ", "FIQ"
- };
-
- std::ostringstream oss;
- oss << "Excep=";
- if(exception.number < 16)
- oss << ARv7Excep[exception.number];
- else
- oss << "Unknown";
- oss << " [" << std::hex << std::setw(2) << std::setfill('0') << exception.number << "]; ";
- excepStr = oss.str();
-}
-
-void PtmTrcPacket::getISyncStr(std::string &valStr) const
-{
- std::ostringstream oss;
- std::string tmpStr;
- static const char *reason[] = { "Periodic", "Trace Enable", "Restart Overflow", "Debug Exit" };
-
- // reason.
- oss << "(" << reason[(int)i_sync_reason] << "); ";
-
- // full address.
- oss << "Addr=0x" << std::hex << std::setfill('0') << std::setw(8) << (uint32_t)addr.val << "; ";
-
- oss << (context.curr_NS ? "NS; " : "S; ");
- oss << (context.curr_Hyp ? "Hyp; " : " ");
-
- if(context.updated_c)
- {
- oss << "CtxtID=" << std::hex << std::setw(8) << std::setfill('0') << context.ctxtID << "; ";
- }
-
- getISAStr(tmpStr);
- oss << tmpStr;
-
- if(cc_valid)
- {
- getCycleCountStr(tmpStr);
- oss << tmpStr;
- }
- valStr = oss.str();
-}
-
-void PtmTrcPacket::getTSStr(std::string &valStr) const
-{
- std::string tmpStr;
- std::ostringstream oss;
-
- trcPrintableElem::getValStr(tmpStr,64,64,timestamp,true,ts_update_bits);
- oss << "TS=" << tmpStr + "(" << std::dec << timestamp << "); ";
- if(cc_valid)
- {
- getCycleCountStr(tmpStr);
- oss << tmpStr;
- }
- valStr = oss.str();
-}
-
-
-void PtmTrcPacket::getCycleCountStr(std::string &subStr) const
-{
- std::ostringstream oss;
- oss << "Cycles=" << std::dec << cycle_count << "; ";
- subStr = oss.str();
-}
-
-
-void PtmTrcPacket::packetTypeName(const ocsd_ptm_pkt_type pkt_type, std::string &name, std::string &desc) const
-{
- switch(pkt_type)
- {
- case PTM_PKT_NOTSYNC: //!< no sync found yet
- name = "NOTSYNC";
- desc = "PTM Not Synchronised";
- break;
-
- case PTM_PKT_INCOMPLETE_EOT:
- name = "INCOMPLETE_EOT";
- desc = "Incomplete packet flushed at end of trace";
- break;
-
- case PTM_PKT_NOERROR:
- name = "NO_ERROR";
- desc = "Error type not set";
- break;
-
- case PTM_PKT_BAD_SEQUENCE:
- name = "BAD_SEQUENCE";
- desc = "Invalid sequence in packet";
- break;
-
- case PTM_PKT_RESERVED:
- name = "RESERVED";
- desc = "Reserved Packet Header";
- break;
-
- case PTM_PKT_BRANCH_ADDRESS:
- name = "BRANCH_ADDRESS";
- desc = "Branch address packet";
- break;
-
- case PTM_PKT_A_SYNC:
- name = "ASYNC";
- desc = "Alignment Synchronisation Packet";
- break;
-
- case PTM_PKT_I_SYNC:
- name = "ISYNC";
- desc = "Instruction Synchronisation packet";
- break;
-
- case PTM_PKT_TRIGGER:
- name = "TRIGGER";
- desc = "Trigger Event packet";
- break;
-
- case PTM_PKT_WPOINT_UPDATE:
- name = "WP_UPDATE";
- desc = "Waypoint update packet";
- break;
-
- case PTM_PKT_IGNORE:
- name = "IGNORE";
- desc = "Ignore packet";
- break;
-
- case PTM_PKT_CONTEXT_ID:
- name = "CTXTID";
- desc = "Context ID packet";
- break;
-
- case PTM_PKT_VMID:
- name = "VMID";
- desc = "VM ID packet";
- break;
-
- case PTM_PKT_ATOM:
- name = "ATOM";
- desc = "Atom packet";
- break;
-
- case PTM_PKT_TIMESTAMP:
- name = "TIMESTAMP";
- desc = "Timestamp packet";
- break;
-
- case PTM_PKT_EXCEPTION_RET:
- name = "ERET";
- desc = "Exception return packet";
- break;
-
- default:
- name = "UNKNOWN";
- desc = "Unknown packet type";
- break;
-
- //PTM_PKT_BRANCH_OR_BYPASS_EOT,
- //PTM_PKT_TPIU_PAD_EOB,
- }
-}
-
-/* End of File trc_pkt_elem_ptm.cpp */
diff --git a/contrib/opencsd/decoder/source/ptm/trc_pkt_proc_ptm.cpp b/contrib/opencsd/decoder/source/ptm/trc_pkt_proc_ptm.cpp
deleted file mode 100644
index 7c90b62e6413..000000000000
--- a/contrib/opencsd/decoder/source/ptm/trc_pkt_proc_ptm.cpp
+++ /dev/null
@@ -1,1215 +0,0 @@
-/*
- * \file trc_pkt_proc_ptm.cpp
- * \brief OpenCSD :
- *
- * \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 "opencsd/ptm/trc_pkt_proc_ptm.h"
-#include "opencsd/ptm/trc_cmp_cfg_ptm.h"
-#include "common/ocsd_error.h"
-
-
-#ifdef __GNUC__
-// G++ doesn't like the ## pasting
-#define PTM_PKTS_NAME "PKTP_PTM"
-#else
-// VC++ is OK
-#define PTM_PKTS_NAME OCSD_CMPNAME_PREFIX_PKTPROC##"_PTM"
-#endif
-
-TrcPktProcPtm::TrcPktProcPtm() : TrcPktProcBase(PTM_PKTS_NAME)
-{
- InitProcessorState();
- BuildIPacketTable();
-}
-
-TrcPktProcPtm::TrcPktProcPtm(int instIDNum) : TrcPktProcBase(PTM_PKTS_NAME, instIDNum)
-{
- InitProcessorState();
- BuildIPacketTable();
-}
-
-TrcPktProcPtm::~TrcPktProcPtm()
-{
-
-}
-
-ocsd_err_t TrcPktProcPtm::onProtocolConfig()
-{
- ocsd_err_t err = OCSD_ERR_NOT_INIT;
-
- if(m_config != 0)
- {
- m_chanIDCopy = m_config->getTraceID();
- err = OCSD_OK;
- }
- return err;
-}
-
-ocsd_datapath_resp_t TrcPktProcPtm::processData( const ocsd_trc_index_t index,
- const uint32_t dataBlockSize,
- const uint8_t *pDataBlock,
- uint32_t *numBytesProcessed)
-{
- ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
- uint8_t currByte = 0;
-
- m_dataInProcessed = 0;
-
- if(!checkInit())
- {
- resp = OCSD_RESP_FATAL_NOT_INIT;
- }
- else
- {
- m_pDataIn = pDataBlock;
- m_dataInLen = dataBlockSize;
- m_block_idx = index; // index start for current block
- }
-
- while( ( ( m_dataInProcessed < dataBlockSize) ||
- (( m_dataInProcessed == dataBlockSize) && (m_process_state == SEND_PKT)) ) &&
- OCSD_DATA_RESP_IS_CONT(resp))
- {
- try
- {
- switch(m_process_state)
- {
- case WAIT_SYNC:
- if(!m_waitASyncSOPkt)
- {
- m_curr_pkt_index = m_block_idx + m_dataInProcessed;
- m_curr_packet.type = PTM_PKT_NOTSYNC;
- m_bAsyncRawOp = hasRawMon();
- }
- resp = waitASync();
- break;
-
- case PROC_HDR:
- m_curr_pkt_index = m_block_idx + m_dataInProcessed;
- if(readByte(currByte))
- {
- m_pIPktFn = m_i_table[currByte].pptkFn;
- m_curr_packet.type = m_i_table[currByte].pkt_type;
- }
- else
- {
- // sequencing error - should not get to the point where readByte
- // fails and m_DataInProcessed < dataBlockSize
- // throw data overflow error
- throw ocsdError(OCSD_ERR_SEV_ERROR,OCSD_ERR_PKT_INTERP_FAIL,m_curr_pkt_index,this->m_chanIDCopy,"Data Buffer Overrun");
- }
- m_process_state = PROC_DATA;
-
- case PROC_DATA:
- (this->*m_pIPktFn)();
- break;
-
- case SEND_PKT:
- resp = outputPacket();
- InitPacketState();
- m_process_state = PROC_HDR;
- break;
- }
- }
- catch(ocsdError &err)
- {
- LogError(err);
- if( (err.getErrorCode() == OCSD_ERR_BAD_PACKET_SEQ) ||
- (err.getErrorCode() == OCSD_ERR_INVALID_PCKT_HDR))
- {
- // send invalid packets up the pipe to let the next stage decide what to do.
- m_process_state = SEND_PKT;
- }
- else
- {
- // bail out on any other error.
- resp = OCSD_RESP_FATAL_INVALID_DATA;
- }
- }
- catch(...)
- {
- /// vv bad at this point.
- resp = OCSD_RESP_FATAL_SYS_ERR;
- const ocsdError &fatal = ocsdError(OCSD_ERR_SEV_ERROR,OCSD_ERR_FAIL,m_curr_pkt_index,m_chanIDCopy,"Unknown System Error decoding trace.");
- LogError(fatal);
- }
-
- }
- *numBytesProcessed = m_dataInProcessed;
- return resp;
-}
-
-ocsd_datapath_resp_t TrcPktProcPtm::onEOT()
-{
- ocsd_datapath_resp_t err = OCSD_RESP_FATAL_NOT_INIT;
- if(checkInit())
- {
- err = OCSD_RESP_CONT;
- if(m_currPacketData.size() > 0)
- {
- m_curr_packet.SetErrType(PTM_PKT_INCOMPLETE_EOT);
- err = outputPacket();
- }
- }
- return err;
-}
-
-ocsd_datapath_resp_t TrcPktProcPtm::onReset()
-{
- ocsd_datapath_resp_t err = OCSD_RESP_FATAL_NOT_INIT;
- if(checkInit())
- {
- InitProcessorState();
- err = OCSD_RESP_CONT;
- }
- return err;
-}
-
-ocsd_datapath_resp_t TrcPktProcPtm::onFlush()
-{
- ocsd_datapath_resp_t err = OCSD_RESP_FATAL_NOT_INIT;
- if(checkInit())
- {
- err = OCSD_RESP_CONT;
- }
- return err;
-}
-
-const bool TrcPktProcPtm::isBadPacket() const
-{
- return m_curr_packet.isBadPacket();
-}
-
-void TrcPktProcPtm::InitPacketState()
-{
- m_curr_packet.Clear();
-
-}
-
-void TrcPktProcPtm::InitProcessorState()
-{
- m_curr_packet.SetType(PTM_PKT_NOTSYNC);
- m_pIPktFn = &TrcPktProcPtm::pktReserved;
- m_process_state = WAIT_SYNC;
- m_async_0 = 0;
- m_waitASyncSOPkt = false;
- m_bAsyncRawOp = false;
- m_bOPNotSyncPkt = false;
-
- m_curr_packet.ResetState();
- InitPacketState();
-}
-
-const bool TrcPktProcPtm::readByte(uint8_t &currByte)
-{
- bool bValidByte = false;
-
- if(m_dataInProcessed < m_dataInLen)
- {
- currByte = m_pDataIn[m_dataInProcessed++];
- m_currPacketData.push_back(currByte);
- bValidByte = true;
- }
- return bValidByte;
-}
-
-void TrcPktProcPtm::unReadByte()
-{
- m_dataInProcessed--;
- m_currPacketData.pop_back();
-}
-
-ocsd_datapath_resp_t TrcPktProcPtm::outputPacket()
-{
- ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
- resp = outputOnAllInterfaces(m_curr_pkt_index,&m_curr_packet,&m_curr_packet.type,m_currPacketData);
- m_currPacketData.clear();
- return resp;
-}
-
-/*** sync and packet functions ***/
-ocsd_datapath_resp_t TrcPktProcPtm::waitASync()
-{
- ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
-
- // looking for possible patterns in input buffer:-
- // a) ASYNC @ start : 00 00 00 00 00 80
- // b) unsync then async: xx xx xx xx xx xx xx xx 00 00 00 00 00 80
- // c) unsync (may have 00) xx xx xx xx 00 xx xx 00 00 00 xx xx xx xx
- // d) unsync then part async: xx xx xx xx xx xx xx xx xx xx xx 00 00 00
- // e) unsync with prev part async [00 00 00] 00 xx xx xx xx xx xx xx xx [] = byte in previous input buffer
-
- // bytes to read before throwing an unsynced packet
- #define UNSYNC_PKT_MAX 16
- static const uint8_t spare_zeros[] = { 0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0 };
-
- bool doScan = true;
- bool bSendUnsyncedData = false;
- bool bHaveASync = false;
- int unsynced_bytes = 0;
- int unsync_scan_block_start = 0;
- int pktBytesOnEntry = m_currPacketData.size(); // did we have part of a potential async last time?
-
- while(doScan && OCSD_DATA_RESP_IS_CONT(resp))
- {
- // may have spotted the start of an async
- if(m_waitASyncSOPkt == true)
- {
- switch(findAsync())
- {
- case ASYNC:
- case ASYNC_EXTRA_0:
- m_process_state = SEND_PKT;
- m_waitASyncSOPkt = false;
- bSendUnsyncedData = true;
- bHaveASync = true;
- doScan = false;
- break;
-
- case THROW_0:
- // remove a bunch of 0s
- unsynced_bytes += ASYNC_PAD_0_LIMIT;
- m_waitASyncSOPkt = false;
- m_currPacketData.erase( m_currPacketData.begin(), m_currPacketData.begin()+ASYNC_PAD_0_LIMIT);
- break;
-
- case NOT_ASYNC:
- unsynced_bytes += m_currPacketData.size();
- m_waitASyncSOPkt = false;
- m_currPacketData.clear();
- break;
-
- case ASYNC_INCOMPLETE:
- bSendUnsyncedData = true;
- doScan = false;
- break;
- }
- }
- else
- {
- if(m_pDataIn[m_dataInProcessed++] == 0x00)
- {
- m_waitASyncSOPkt = true;
- m_currPacketData.push_back(0);
- m_async_0 = 1;
- }
- else
- {
- unsynced_bytes++;
- }
- }
-
- // may need to send some unsynced data here, either if we have enought to make it worthwhile,
- // or are at the end of the buffer.
- if(unsynced_bytes >= UNSYNC_PKT_MAX)
- bSendUnsyncedData = true;
-
- if(m_dataInProcessed == m_dataInLen)
- {
- bSendUnsyncedData = true;
- doScan = false; // no more data available - stop the scan
- }
-
- // will send any unsynced data
- if(bSendUnsyncedData && (unsynced_bytes > 0))
- {
- if(m_bAsyncRawOp)
- {
- // there were some 0's in the packet buyffer from the last pass that are no longer in the raw buffer,
- // and these turned out not to be an async
- if(pktBytesOnEntry)
- {
- outputRawPacketToMonitor(m_curr_pkt_index,&m_curr_packet,pktBytesOnEntry,spare_zeros);
- m_curr_pkt_index += pktBytesOnEntry;
- }
- outputRawPacketToMonitor(m_curr_pkt_index,&m_curr_packet,unsynced_bytes,m_pDataIn+unsync_scan_block_start);
- }
- if (!m_bOPNotSyncPkt)
- {
- resp = outputDecodedPacket(m_curr_pkt_index, &m_curr_packet);
- m_bOPNotSyncPkt = true;
- }
- unsync_scan_block_start += unsynced_bytes;
- m_curr_pkt_index+= unsynced_bytes;
- unsynced_bytes = 0;
- bSendUnsyncedData = false;
- }
-
- // mark next packet as the ASYNC we are looking for.
- if(bHaveASync)
- m_curr_packet.SetType(PTM_PKT_A_SYNC);
- }
-
- return resp;
-}
-
-void TrcPktProcPtm::pktASync()
-{
- if(m_currPacketData.size() == 1) // header byte
- {
- m_async_0 = 1;
- }
-
- switch(findAsync())
- {
- case ASYNC:
- case ASYNC_EXTRA_0:
- m_process_state = SEND_PKT;
- break;
-
- case THROW_0:
- case NOT_ASYNC:
- throwMalformedPacketErr("Bad Async packet");
- break;
-
- case ASYNC_INCOMPLETE:
- break;
-
- }
-}
-
-TrcPktProcPtm::async_result_t TrcPktProcPtm::findAsync()
-{
- async_result_t async_res = NOT_ASYNC;
- bool bFound = false; // found non-zero byte in sequence
- bool bByteAvail = true;
- uint8_t currByte;
-
- while(!bFound && bByteAvail)
- {
- if(readByte(currByte))
- {
- if(currByte == 0x00)
- {
- m_async_0++;
- if(m_async_0 >= (ASYNC_PAD_0_LIMIT + ASYNC_REQ_0))
- {
- bFound = true;
- async_res = THROW_0;
- }
- }
- else
- {
- if(currByte == 0x80)
- {
- if(m_async_0 == 5)
- async_res = ASYNC;
- else if(m_async_0 > 5)
- async_res = ASYNC_EXTRA_0;
- }
- bFound = true;
- }
- }
- else
- {
- bByteAvail = false;
- async_res = ASYNC_INCOMPLETE;
- }
- }
- return async_res;
-}
-
-void TrcPktProcPtm::pktISync()
-{
- uint8_t currByte = 0;
- int pktIndex = m_currPacketData.size() - 1;
- bool bGotBytes = false, validByte = true;
-
- if(pktIndex == 0)
- {
- m_numCtxtIDBytes = m_config->CtxtIDBytes();
- m_gotCtxtIDBytes = 0;
-
- // total bytes = 6 + ctxtID; (perhaps more later)
- m_numPktBytesReq = 6 + m_numCtxtIDBytes;
- }
-
- while(validByte && !bGotBytes)
- {
- if(readByte(currByte))
- {
- pktIndex = m_currPacketData.size() - 1;
- if(pktIndex == 5)
- {
- // got the info byte
- int altISA = (currByte >> 2) & 0x1;
- int reason = (currByte >> 5) & 0x3;
- m_curr_packet.SetISyncReason((ocsd_iSync_reason)(reason));
- m_curr_packet.UpdateNS((currByte >> 3) & 0x1);
- m_curr_packet.UpdateAltISA((currByte >> 2) & 0x1);
- m_curr_packet.UpdateHyp((currByte >> 1) & 0x1);
-
- ocsd_isa isa = ocsd_isa_arm;
- if(m_currPacketData[1] & 0x1)
- isa = altISA ? ocsd_isa_tee : ocsd_isa_thumb2;
- m_curr_packet.UpdateISA(isa);
-
- // check cycle count required - not if reason == 0;
- m_needCycleCount = (reason != 0) ? m_config->enaCycleAcc() : false;
- m_gotCycleCount = false;
- m_numPktBytesReq += (m_needCycleCount ? 1 : 0);
- m_gotCCBytes = 0;
-
- }
- else if(pktIndex > 5)
- {
- // cycle count appears first if present
- if(m_needCycleCount && !m_gotCycleCount)
- {
- if(pktIndex == 6)
- m_gotCycleCount = (bool)((currByte & 0x40) == 0); // no cont bit, got cycle count
- else
- m_gotCycleCount = ((currByte & 0x80) == 0) || (pktIndex == 10);
-
- m_gotCCBytes++; // count the cycle count bytes for later use.
- if(!m_gotCycleCount) // need more cycle count bytes
- m_numPktBytesReq++;
- }
- // then context ID if present.
- else if( m_numCtxtIDBytes > m_gotCtxtIDBytes)
- {
- m_gotCtxtIDBytes++;
- }
- }
-
- // check if we have enough bytes
- bGotBytes = (bool)((unsigned)m_numPktBytesReq == m_currPacketData.size());
- }
- else
- validByte = false; // no byte available, exit.
- }
-
- if(bGotBytes)
- {
- // extract address value, cycle count and ctxt id.
- uint32_t cycleCount = 0;
- uint32_t ctxtID = 0;
- int optIdx = 6; // start index for optional elements.
-
- // address is always full fixed 32 bit value
- uint32_t address = ((uint32_t)m_currPacketData[1]) & 0xFE;
- address |= ((uint32_t)m_currPacketData[2]) << 8;
- address |= ((uint32_t)m_currPacketData[3]) << 16;
- address |= ((uint32_t)m_currPacketData[4]) << 24;
- m_curr_packet.UpdateAddress(address,32);
-
- if(m_needCycleCount)
- {
- extractCycleCount(optIdx,cycleCount);
- m_curr_packet.SetCycleCount(cycleCount);
- optIdx+=m_gotCCBytes;
- }
-
- if(m_numCtxtIDBytes)
- {
- extractCtxtID(optIdx,ctxtID);
- m_curr_packet.UpdateContextID(ctxtID);
- }
- m_process_state = SEND_PKT;
- }
-}
-
-void TrcPktProcPtm::pktTrigger()
-{
- m_process_state = SEND_PKT; // no payload
-}
-
-void TrcPktProcPtm::pktWPointUpdate()
-{
- bool bDone = false;
- bool bBytesAvail = true;
- uint8_t currByte = 0;
- int byteIdx = 0;
-
- if(m_currPacketData.size() == 1)
- {
- m_gotAddrBytes = false; // flag to indicate got all needed address bytes
- m_numAddrBytes = 0; // number of address bytes so far - in this case header is not part of the address
-
- m_gotExcepBytes = false; // mark as not got all required exception bytes thus far
- m_numExcepBytes = 0; // 0 read in
-
- m_addrPktIsa = ocsd_isa_unknown; // not set by this packet as yet
- }
-
- // collect all the bytes needed
- while(!bDone && bBytesAvail)
- {
- if(readByte(currByte))
- {
- byteIdx = m_currPacketData.size() - 1;
- if(!m_gotAddrBytes)
- {
- if(byteIdx < 4)
- {
- // address bytes 1 - 4;
- // ISA stays the same
- if((currByte & 0x80) == 0x00)
- {
- // no further bytes
- m_gotAddrBytes = true;
- bDone = true;
- m_gotExcepBytes = true;
- }
- }
- else
- {
- // 5th address byte - determine ISA from this.
- if((currByte & 0x40) == 0x00)
- m_gotExcepBytes = true; // no exception bytes - mark as done
- m_gotAddrBytes = true;
- bDone = m_gotExcepBytes;
-
- m_addrPktIsa = ocsd_isa_arm; // assume ARM, but then check
- if((currByte & 0x20) == 0x20) // bit 5 == 1'b1 - jazelle, bits 4 & 3 part of address.
- m_addrPktIsa = ocsd_isa_jazelle;
- else if((currByte & 0x30) == 0x10) // bit [5:4] == 2'b01 - thumb, bit 3 part of address.
- m_addrPktIsa = ocsd_isa_thumb2;
- }
- m_numAddrBytes++;
- }
- else if(!m_gotExcepBytes)
- {
- // excep byte is actually a WP update byte.
- m_excepAltISA = ((currByte & 0x40) == 0x40) ? 1 : 0;
- m_gotExcepBytes = true;
- m_numExcepBytes++;
- bDone = true;
- }
- }
- else
- bBytesAvail = false;
- }
-
- // analyse the bytes to create the packet
- if(bDone)
- {
- // ISA for the packet
- if(m_addrPktIsa == ocsd_isa_unknown) // unchanged by trace packet
- m_addrPktIsa = m_curr_packet.getISA(); // same as prev
-
- if(m_gotExcepBytes) // may adjust according to alt ISA in exception packet
- {
- if((m_addrPktIsa == ocsd_isa_tee) && (m_excepAltISA == 0))
- m_addrPktIsa = ocsd_isa_thumb2;
- else if((m_addrPktIsa == ocsd_isa_thumb2) && (m_excepAltISA == 1))
- m_addrPktIsa = ocsd_isa_tee;
- }
- m_curr_packet.UpdateISA(m_addrPktIsa); // mark ISA in packet (update changes current and prev to dectect an ISA change).
-
- uint8_t total_bits = 0;
- uint32_t addr_val = extractAddress(1,total_bits);
- m_curr_packet.UpdateAddress(addr_val,total_bits);
- m_process_state = SEND_PKT;
- }
-}
-
-void TrcPktProcPtm::pktIgnore()
-{
- m_process_state = SEND_PKT; // no payload
-}
-
-void TrcPktProcPtm::pktCtxtID()
-{
- int pktIndex = m_currPacketData.size() - 1;
-
- // if at the header, determine how many more bytes we need.
- if(pktIndex == 0)
- {
- m_numCtxtIDBytes = m_config->CtxtIDBytes();
- m_gotCtxtIDBytes = 0;
- }
-
- // read the necessary ctxtID bytes from the stream
- bool bGotBytes = false, bytesAvail = true;
- uint32_t ctxtID = 0;
-
- bGotBytes = m_numCtxtIDBytes == m_gotCtxtIDBytes;
- while(!bGotBytes & bytesAvail)
- {
- bytesAvail = readByte();
- if(bytesAvail)
- m_gotCtxtIDBytes++;
- bGotBytes = m_numCtxtIDBytes == m_gotCtxtIDBytes;
- }
-
- if(bGotBytes)
- {
- if(m_numCtxtIDBytes)
- {
- extractCtxtID(1,ctxtID);
- }
- m_curr_packet.UpdateContextID(ctxtID);
- m_process_state = SEND_PKT;
- }
-}
-
-void TrcPktProcPtm::pktVMID()
-{
- uint8_t currByte;
-
- // just need a single payload byte...
- if(readByte(currByte))
- {
- m_curr_packet.UpdateVMID(currByte);
- m_process_state = SEND_PKT;
- }
-}
-
-void TrcPktProcPtm::pktAtom()
-{
- uint8_t pHdr = m_currPacketData[0];
-
- if(!m_config->enaCycleAcc())
- {
- m_curr_packet.SetAtomFromPHdr(pHdr);
- m_process_state = SEND_PKT;
- }
- else
- {
- bool bGotAllPktBytes = false, byteAvail = true;
- uint8_t currByte = 0; // cycle accurate tracing -> atom + cycle count
-
- if(!(pHdr & 0x40))
- {
- // only the header byte present
- bGotAllPktBytes = true;
- }
- else
- {
- // up to 4 additional bytes of count data.
- while(byteAvail && !bGotAllPktBytes)
- {
- if(readByte(currByte))
- {
- if(!(currByte & 0x80) || (m_currPacketData.size() == 5))
- bGotAllPktBytes = true;
- }
- else
- byteAvail = false;
- }
- }
-
- // we have all the bytes for a cycle accurate packet.
- if(bGotAllPktBytes)
- {
- uint32_t cycleCount = 0;
- extractCycleCount(0,cycleCount);
- m_curr_packet.SetCycleCount(cycleCount);
- m_curr_packet.SetCycleAccAtomFromPHdr(pHdr);
- m_process_state = SEND_PKT;
- }
- }
-}
-
-void TrcPktProcPtm::pktTimeStamp()
-{
- uint8_t currByte = 0;
- int pktIndex = m_currPacketData.size() - 1;
- bool bGotBytes = false, byteAvail = true;
-
- if(pktIndex == 0)
- {
- m_gotTSBytes = false;
- m_needCycleCount = m_config->enaCycleAcc();
- m_gotCCBytes = 0;
-
- // max byte buffer size for full ts packet
- m_tsByteMax = m_config->TSPkt64() ? 10 : 8;
- }
-
- while(byteAvail && !bGotBytes)
- {
- if(readByte(currByte))
- {
- if(!m_gotTSBytes)
- {
- if(((currByte & 0x80) == 0) || (m_currPacketData.size() == (unsigned)m_tsByteMax))
- {
- m_gotTSBytes = true;
- if(!m_needCycleCount)
- bGotBytes = true;
- }
- }
- else
- {
- uint8_t cc_cont_mask = 0x80;
- // got TS bytes, collect cycle count
- if(m_gotCCBytes == 0)
- cc_cont_mask = 0x40;
- if((currByte & cc_cont_mask) == 0)
- bGotBytes = true;
- m_gotCCBytes++;
- if(m_gotCCBytes == 5)
- bGotBytes = true;
- }
- }
- else
- byteAvail = false;
- }
-
- if(bGotBytes)
- {
- uint64_t tsVal = 0;
- uint32_t cycleCount = 0;
- uint8_t tsUpdateBits = 0;
- int ts_end_idx = extractTS(tsVal,tsUpdateBits);
- if(m_needCycleCount)
- {
- extractCycleCount(ts_end_idx,cycleCount);
- m_curr_packet.SetCycleCount(cycleCount);
- }
- m_curr_packet.UpdateTimestamp(tsVal,tsUpdateBits);
- m_process_state = SEND_PKT;
- }
-}
-
-void TrcPktProcPtm::pktExceptionRet()
-{
- m_process_state = SEND_PKT; // no payload
-}
-
-void TrcPktProcPtm::pktBranchAddr()
-{
- uint8_t currByte = m_currPacketData[0];
- bool bDone = false;
- bool bBytesAvail = true;
- int byteIdx = 0;
-
- if(m_currPacketData.size() == 1)
- {
- m_gotAddrBytes = false; // flag to indicate got all needed address bytes
- m_numAddrBytes = 1; // number of address bytes so far
-
- m_needCycleCount = m_config->enaCycleAcc(); // check if we have a cycle count
- m_gotCCBytes = 0; // number of cc bytes read in so far.
-
- m_gotExcepBytes = false; // mark as not got all required exception bytes thus far
- m_numExcepBytes = 0; // 0 read in
-
- m_addrPktIsa = ocsd_isa_unknown; // not set by this packet as yet
-
- // header is also 1st address byte
- if((currByte & 0x80) == 0) // could be single byte packet
- {
- m_gotAddrBytes = true;
- if(!m_needCycleCount)
- bDone = true; // all done if no cycle count
- m_gotExcepBytes = true; // cannot have exception bytes following single byte packet
- }
-
- }
-
- // collect all the bytes needed
- while(!bDone && bBytesAvail)
- {
- if(readByte(currByte))
- {
- byteIdx = m_currPacketData.size() - 1;
- if(!m_gotAddrBytes)
- {
- if(byteIdx < 4)
- {
- // address bytes 2 - 4;
- // ISA stays the same
- if((currByte & 0x80) == 0x00)
- {
- // no further bytes
- if((currByte & 0x40) == 0x00)
- m_gotExcepBytes = true; // no exception bytes - mark as done
- m_gotAddrBytes = true;
- bDone = m_gotExcepBytes && !m_needCycleCount;
- }
- }
- else
- {
- // 5th address byte - determine ISA from this.
- if((currByte & 0x40) == 0x00)
- m_gotExcepBytes = true; // no exception bytes - mark as done
- m_gotAddrBytes = true;
- bDone = m_gotExcepBytes && !m_needCycleCount;
-
- m_addrPktIsa = ocsd_isa_arm; // assume ARM, but then check
- if((currByte & 0x20) == 0x20) // bit 5 == 1'b1 - jazelle, bits 4 & 3 part of address.
- m_addrPktIsa = ocsd_isa_jazelle;
- else if((currByte & 0x30) == 0x10) // bit [5:4] == 2'b01 - thumb, bit 3 part of address.
- m_addrPktIsa = ocsd_isa_thumb2;
- }
- m_numAddrBytes++;
- }
- else if(!m_gotExcepBytes)
- {
- // may need exception bytes
- if(m_numExcepBytes == 0)
- {
- if((currByte & 0x80) == 0x00)
- m_gotExcepBytes = true;
- m_excepAltISA = ((currByte & 0x40) == 0x40) ? 1 : 0;
- }
- else
- m_gotExcepBytes = true;
- m_numExcepBytes++;
-
- if(m_gotExcepBytes && !m_needCycleCount)
- bDone = true;
-
- }
- else if(m_needCycleCount)
- {
- // not done after exception bytes, collect cycle count
- if(m_gotCCBytes == 0)
- {
- bDone = ((currByte & 0x40) == 0x00 );
- }
- else
- {
- // done if no more or 5th byte
- bDone = (((currByte & 0x80) == 0x00 ) || (m_gotCCBytes == 4));
- }
- m_gotCCBytes++;
- }
- else
- // this should never be reached.
- throwMalformedPacketErr("sequencing error analysing branch packet");
- }
- else
- bBytesAvail = false;
- }
-
- // analyse the bytes to create the packet
- if(bDone)
- {
- // ISA for the packet
- if(m_addrPktIsa == ocsd_isa_unknown) // unchanged by trace packet
- m_addrPktIsa = m_curr_packet.getISA(); // same as prev
-
- if(m_gotExcepBytes) // may adjust according to alt ISA in exception packet
- {
- if((m_addrPktIsa == ocsd_isa_tee) && (m_excepAltISA == 0))
- m_addrPktIsa = ocsd_isa_thumb2;
- else if((m_addrPktIsa == ocsd_isa_thumb2) && (m_excepAltISA == 1))
- m_addrPktIsa = ocsd_isa_tee;
- }
- m_curr_packet.UpdateISA(m_addrPktIsa); // mark ISA in packet (update changes current and prev to dectect an ISA change).
-
-
-
- // we know the ISA, we can correctly interpret the address.
- uint8_t total_bits = 0;
- uint32_t addr_val = extractAddress(0,total_bits);
- m_curr_packet.UpdateAddress(addr_val,total_bits);
-
- if(m_numExcepBytes > 0)
- {
- uint8_t E1 = m_currPacketData[m_numAddrBytes];
- uint16_t ENum = (E1 >> 1) & 0xF;
- ocsd_armv7_exception excep = Excp_Reserved;
-
- m_curr_packet.UpdateNS(E1 & 0x1);
- if(m_numExcepBytes > 1)
- {
- uint8_t E2 = m_currPacketData[m_numAddrBytes+1];
- m_curr_packet.UpdateHyp((E2 >> 5) & 0x1);
- ENum |= ((uint16_t)(E2 & 0x1F) << 4);
- }
-
- if(ENum <= 0xF)
- {
- static ocsd_armv7_exception v7ARExceptions[16] = {
- Excp_NoException, Excp_DebugHalt, Excp_SMC, Excp_Hyp,
- Excp_AsyncDAbort, Excp_ThumbEECheckFail, Excp_Reserved, Excp_Reserved,
- Excp_Reset, Excp_Undef, Excp_SVC, Excp_PrefAbort,
- Excp_SyncDataAbort, Excp_Generic, Excp_IRQ, Excp_FIQ
- };
- excep = v7ARExceptions[ENum];
- }
- m_curr_packet.SetException(excep,ENum);
- }
-
- if(m_needCycleCount)
- {
- int countIdx = m_numAddrBytes + m_numExcepBytes;
- uint32_t cycleCount = 0;
- extractCycleCount(countIdx,cycleCount);
- m_curr_packet.SetCycleCount(cycleCount);
- }
- m_process_state = SEND_PKT;
- }
-}
-
-void TrcPktProcPtm::pktReserved()
-{
- m_process_state = SEND_PKT; // no payload
-}
-
-void TrcPktProcPtm::extractCtxtID(int idx, uint32_t &ctxtID)
-{
- ctxtID = 0;
- int shift = 0;
- for(int i=0; i < m_numCtxtIDBytes; i++)
- {
- if((size_t)idx+i >= m_currPacketData.size())
- throwMalformedPacketErr("Insufficient packet bytes for Context ID value.");
- ctxtID |= ((uint32_t)m_currPacketData[idx+i]) << shift;
- shift+=8;
- }
-}
-
-void TrcPktProcPtm::extractCycleCount(int offset, uint32_t &cycleCount)
-{
- bool bCont = true;
- cycleCount = 0;
- int by_idx = 0;
- uint8_t currByte;
- int shift = 4;
-
- while(bCont)
- {
- if((size_t)by_idx+offset >= m_currPacketData.size())
- throwMalformedPacketErr("Insufficient packet bytes for Cycle Count value.");
-
- currByte = m_currPacketData[offset+by_idx];
- if(by_idx == 0)
- {
- bCont = (currByte & 0x40) != 0;
- cycleCount = (currByte >> 2) & 0xF;
- }
- else
- {
-
- bCont = (currByte & 0x80) != 0;
- if(by_idx == 4)
- bCont = false;
- cycleCount |= (((uint32_t)(currByte & 0x7F)) << shift);
- shift += 7;
- }
- by_idx++;
- }
-}
-
-int TrcPktProcPtm::extractTS(uint64_t &tsVal,uint8_t &tsUpdateBits)
-{
- bool bCont = true;
- int tsIdx = 1; // start index;
- uint8_t byteVal;
- bool b64BitVal = m_config->TSPkt64();
- int shift = 0;
-
- tsVal = 0;
- tsUpdateBits = 0;
-
- while(bCont)
- {
- if((size_t)tsIdx >= m_currPacketData.size())
- throwMalformedPacketErr("Insufficient packet bytes for Timestamp value.");
-
- byteVal = m_currPacketData[tsIdx];
-
- if(b64BitVal)
- {
- if(tsIdx < 9)
- {
- bCont = ((byteVal & 0x80) == 0x80);
- byteVal &= 0x7F;
- tsUpdateBits += 7;
- }
- else
- {
- bCont = false;
- tsUpdateBits += 8;
- }
- }
- else
- {
- if(tsIdx < 7)
- {
- bCont = ((byteVal & 0x80) == 0x80);
- byteVal &= 0x7F;
- tsUpdateBits += 7;
- }
- else
- {
- byteVal &=0x3F;
- bCont = false;
- tsUpdateBits += 6;
- }
- }
- tsVal |= (((uint64_t)byteVal) << shift);
- tsIdx++;
- shift += 7;
- }
- return tsIdx; // return next byte index in packet.
-}
-
-uint32_t TrcPktProcPtm::extractAddress(const int offset, uint8_t &total_bits)
-{
- // we know the ISA, we can correctly interpret the address.
- uint32_t addr_val = 0;
- uint8_t mask = 0x7E; // first byte mask (always);
- uint8_t num_bits = 0x7; // number of bits in the 1st byte (thumb);
- int shift = 0;
- int next_shift = 0;
-
- total_bits = 0;
-
- for(int i = 0; i < m_numAddrBytes; i++)
- {
- if(i == 4)
- {
- // 5th byte mask
- mask = 0x0f; // thumb mask;
- num_bits = 4;
- if(m_addrPktIsa == ocsd_isa_jazelle)
- {
- mask = 0x1F;
- num_bits = 5;
- }
- else if(m_addrPktIsa == ocsd_isa_arm)
- {
- mask = 0x07;
- num_bits = 3;
- }
- }
- else if(i > 0)
- {
- mask = 0x7F;
- num_bits = 7;
- // check for last byte but not 1st or 5th byte mask
- if(i == m_numAddrBytes-1)
- {
- mask = 0x3F;
- num_bits = 6;
- }
- }
-
- // extract data
- shift = next_shift;
- addr_val |= ((uint32_t)(m_currPacketData[i+offset] & mask) << shift);
- total_bits += num_bits;
-
- // how much we shift the next value
- if(i == 0)
- {
- if(m_addrPktIsa == ocsd_isa_jazelle)
- {
- addr_val >>= 1;
- next_shift = 6;
- total_bits--; // adjust bits for jazelle offset
- }
- else
- {
- next_shift = 7;
- }
- }
- else
- {
- next_shift += 7;
- }
- }
-
- if(m_addrPktIsa == ocsd_isa_arm)
- {
- addr_val <<= 1; // shift one extra bit for ARM address alignment.
- total_bits++;
- }
- return addr_val;
-}
-
-
-void TrcPktProcPtm::BuildIPacketTable()
-{
- // initialise all to branch, atom or reserved packet header
- for(unsigned i = 0; i < 256; i++)
- {
- // branch address packets all end in 8'bxxxxxxx1
- if((i & 0x01) == 0x01)
- {
- m_i_table[i].pkt_type = PTM_PKT_BRANCH_ADDRESS;
- m_i_table[i].pptkFn = &TrcPktProcPtm::pktBranchAddr;
- }
- // atom packets are 8'b1xxxxxx0
- else if((i & 0x81) == 0x80)
- {
- m_i_table[i].pkt_type = PTM_PKT_ATOM;
- m_i_table[i].pptkFn = &TrcPktProcPtm::pktAtom;
- }
- else
- {
- // set all the others to reserved for now
- m_i_table[i].pkt_type = PTM_PKT_RESERVED;
- m_i_table[i].pptkFn = &TrcPktProcPtm::pktReserved;
- }
- }
-
- // pick out the other packet types by individual codes.
-
- // A-sync 8'b00000000
- m_i_table[0x00].pkt_type = PTM_PKT_A_SYNC;
- m_i_table[0x00].pptkFn = &TrcPktProcPtm::pktASync;
-
- // I-sync 8'b00001000
- m_i_table[0x08].pkt_type = PTM_PKT_I_SYNC;
- m_i_table[0x08].pptkFn = &TrcPktProcPtm::pktISync;
-
- // waypoint update 8'b01110010
- m_i_table[0x72].pkt_type = PTM_PKT_WPOINT_UPDATE;
- m_i_table[0x72].pptkFn = &TrcPktProcPtm::pktWPointUpdate;
-
- // trigger 8'b00001100
- m_i_table[0x0C].pkt_type = PTM_PKT_TRIGGER;
- m_i_table[0x0C].pptkFn = &TrcPktProcPtm::pktTrigger;
-
- // context ID 8'b01101110
- m_i_table[0x6E].pkt_type = PTM_PKT_CONTEXT_ID;
- m_i_table[0x6E].pptkFn = &TrcPktProcPtm::pktCtxtID;
-
- // VMID 8'b00111100
- m_i_table[0x3C].pkt_type = PTM_PKT_VMID;
- m_i_table[0x3C].pptkFn = &TrcPktProcPtm::pktVMID;
-
- // Timestamp 8'b01000x10
- m_i_table[0x42].pkt_type = PTM_PKT_TIMESTAMP;
- m_i_table[0x42].pptkFn = &TrcPktProcPtm::pktTimeStamp;
- m_i_table[0x46].pkt_type = PTM_PKT_TIMESTAMP;
- m_i_table[0x46].pptkFn = &TrcPktProcPtm::pktTimeStamp;
-
- // Exception return 8'b01110110
- m_i_table[0x76].pkt_type = PTM_PKT_EXCEPTION_RET;
- m_i_table[0x76].pptkFn = &TrcPktProcPtm::pktExceptionRet;
-
- // Ignore 8'b01100110
- m_i_table[0x66].pkt_type = PTM_PKT_IGNORE;
- m_i_table[0x66].pptkFn = &TrcPktProcPtm::pktIgnore;
-}
-
-/* End of File trc_pkt_proc_ptm.cpp */
diff --git a/contrib/opencsd/decoder/source/stm/trc_pkt_decode_stm.cpp b/contrib/opencsd/decoder/source/stm/trc_pkt_decode_stm.cpp
deleted file mode 100644
index a47e96312546..000000000000
--- a/contrib/opencsd/decoder/source/stm/trc_pkt_decode_stm.cpp
+++ /dev/null
@@ -1,299 +0,0 @@
-/*
- * \file trc_pkt_decode_stm.cpp
- * \brief OpenCSD : STM packet decoder - output generic SW trace packets.
- *
- * \copyright Copyright (c) 2016, 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 "opencsd/stm/trc_pkt_decode_stm.h"
-#define DCD_NAME "DCD_STM"
-
-TrcPktDecodeStm::TrcPktDecodeStm()
- : TrcPktDecodeBase(DCD_NAME)
-{
- initDecoder();
-}
-
-TrcPktDecodeStm::TrcPktDecodeStm(int instIDNum)
- : TrcPktDecodeBase(DCD_NAME, instIDNum)
-{
- initDecoder();
-}
-
-TrcPktDecodeStm::~TrcPktDecodeStm()
-{
- if(m_payload_buffer)
- delete [] m_payload_buffer;
- m_payload_buffer = 0;
-}
-
-/* implementation packet decoding interface */
-ocsd_datapath_resp_t TrcPktDecodeStm::processPacket()
-{
- ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
- bool bPktDone = false;
-
- m_decode_pass1 = true;
-
- while(!bPktDone)
- {
- switch(m_curr_state)
- {
- case NO_SYNC:
- m_output_elem.setType(OCSD_GEN_TRC_ELEM_NO_SYNC);
- resp = outputTraceElement(m_output_elem);
- m_curr_state = WAIT_SYNC;
- break;
-
- case WAIT_SYNC:
- if(m_curr_packet_in->getPktType() == STM_PKT_ASYNC)
- m_curr_state = DECODE_PKTS;
- bPktDone = true;
- break;
-
- case DECODE_PKTS:
- resp = decodePacket(bPktDone);
- break;
- }
- }
- return resp;
-}
-
-ocsd_datapath_resp_t TrcPktDecodeStm::onEOT()
-{
- ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
- m_output_elem.setType(OCSD_GEN_TRC_ELEM_EO_TRACE);
- resp = outputTraceElement(m_output_elem);
- return resp;
-}
-
-ocsd_datapath_resp_t TrcPktDecodeStm::onReset()
-{
- ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
- resetDecoder();
- return resp;
-}
-
-ocsd_datapath_resp_t TrcPktDecodeStm::onFlush()
-{
- ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
- // don't currently save unsent packets so nothing to flush
- return resp;
-}
-
-ocsd_err_t TrcPktDecodeStm::onProtocolConfig()
-{
- if(m_config == 0)
- return OCSD_ERR_NOT_INIT;
-
- // static config - copy of CSID for easy reference
- m_CSID = m_config->getTraceID();
- return OCSD_OK;
-}
-
-void TrcPktDecodeStm::initDecoder()
-{
- m_payload_buffer = 0;
- m_num_pkt_correlation = 1; // fixed at single packet payload correlation - add feature later
- m_CSID = 0;
-
- // base decoder state - STM requires no memory and instruction decode.
- setUsesMemAccess(false);
- setUsesIDecode(false);
-
- resetDecoder();
-}
-
-void TrcPktDecodeStm::resetDecoder()
-{
- m_curr_state = NO_SYNC;
- m_payload_size = 0;
- m_payload_used = 0;
- m_payload_odd_nibble = false;
- m_output_elem.init();
- m_swt_packet_info.swt_flag_bits = 0; // zero out everything
- initPayloadBuffer();
-}
-
-void TrcPktDecodeStm::initPayloadBuffer()
-{
- // set up the payload buffer. If we are correlating indentical packets then
- // need a buffer that is a multiple of 64bit packets.
- // otherwise a single packet length will do.
- if(m_payload_buffer)
- delete [] m_payload_buffer;
- m_payload_buffer = new (std::nothrow) uint8_t[m_num_pkt_correlation * sizeof(uint64_t)];
-}
-
-ocsd_datapath_resp_t TrcPktDecodeStm::decodePacket(bool &bPktDone)
-{
- ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
- bool bSendPacket = false; // flag to indicate output required.
-
- bPktDone = true; // assume complete unless 2nd pass required.
- m_output_elem.setType(OCSD_GEN_TRC_ELEM_SWTRACE);
- clearSWTPerPcktInfo();
-
- switch (m_curr_packet_in->getPktType())
- {
- case STM_PKT_BAD_SEQUENCE: /**< Incorrect protocol sequence */
- case STM_PKT_RESERVED:
- resp = OCSD_RESP_FATAL_INVALID_DATA;
- case STM_PKT_NOTSYNC:
- resetDecoder();
- break;
-
- case STM_PKT_VERSION: /**< Version packet - not relevant to generic (versionless) o/p */
- case STM_PKT_ASYNC: /**< Alignment synchronisation packet */
- case STM_PKT_INCOMPLETE_EOT: /**< Incomplete packet flushed at end of trace. */
- // no action required.
- break;
-
-/* markers for valid packets*/
- case STM_PKT_NULL: /**< Null packet */
- if(m_curr_packet_in->isTSPkt())
- bSendPacket = true; // forward NULL packet if associated timestamp.
- break;
-
- case STM_PKT_FREQ: /**< Frequency packet */
- m_swt_packet_info.swt_frequency = 1;
- updatePayload(bSendPacket);
- break;
-
- case STM_PKT_TRIG: /**< Trigger event packet. */
- m_swt_packet_info.swt_trigger_event = 1;
- updatePayload(bSendPacket);
- break;
-
- case STM_PKT_GERR: /**< Global error packet - protocol error but unknown which master had error */
- m_swt_packet_info.swt_master_id = m_curr_packet_in->getMaster();
- m_swt_packet_info.swt_channel_id = m_curr_packet_in->getChannel();
- m_swt_packet_info.swt_global_err = 1;
- m_swt_packet_info.swt_id_valid = 0;
- updatePayload(bSendPacket);
- break;
-
- case STM_PKT_MERR: /**< Master error packet - current master detected an error (e.g. dropped trace) */
- m_swt_packet_info.swt_channel_id = m_curr_packet_in->getChannel();
- m_swt_packet_info.swt_master_err = 1;
- updatePayload(bSendPacket);
- break;
-
- case STM_PKT_M8: /**< Set current master */
- m_swt_packet_info.swt_master_id = m_curr_packet_in->getMaster();
- m_swt_packet_info.swt_channel_id = m_curr_packet_in->getChannel(); // forced to 0
- m_swt_packet_info.swt_id_valid = 1;
- break;
-
- case STM_PKT_C8: /**< Set lower 8 bits of current channel - packet proc hadnles this */
- case STM_PKT_C16: /**< Set current channel */
- m_swt_packet_info.swt_channel_id = m_curr_packet_in->getChannel();
- break;
-
- case STM_PKT_FLAG: /**< Flag packet */
- m_swt_packet_info.swt_marker_packet = 1;
- bSendPacket = true; // send 0 payload marker packet./
- break;
-
-
- case STM_PKT_D4: /**< 4 bit data payload packet */
- case STM_PKT_D8: /**< 8 bit data payload packet */
- case STM_PKT_D16: /**< 16 bit data payload packet */
- case STM_PKT_D32: /**< 32 bit data payload packet */
- case STM_PKT_D64: /**< 64 bit data payload packet */
- updatePayload(bSendPacket);
- break;
-
- }
-
- if(bSendPacket)
- {
- if(m_curr_packet_in->isTSPkt())
- {
- m_output_elem.setTS(m_curr_packet_in->getTSVal());
- m_swt_packet_info.swt_has_timestamp = 1;
- }
- m_output_elem.setSWTInfo(m_swt_packet_info);
- resp = outputTraceElement(m_output_elem);
- }
-
- return resp;
-}
-
-void TrcPktDecodeStm::clearSWTPerPcktInfo()
-{
- m_swt_packet_info.swt_flag_bits &= (uint32_t)(0x0 | SWT_ID_VALID_MASK); // clear flags and current payload size (save id valid flag).
-}
-
-void TrcPktDecodeStm::updatePayload(bool &bSendPacket)
-{
- // without buffering similar packets - this function is quite simple
- bSendPacket = true;
- m_swt_packet_info.swt_payload_num_packets = 1;
-
- switch(m_curr_packet_in->getPktType())
- {
- case STM_PKT_D4: /**< 4 bit data payload packet */
- m_swt_packet_info.swt_payload_pkt_bitsize = 4;
- *(uint8_t *)m_payload_buffer = m_curr_packet_in->getD4Val();
- break;
-
- case STM_PKT_D8: /**< 8 bit data payload packet */
- case STM_PKT_TRIG: /**< Trigger event packet - 8 bits. */
- case STM_PKT_GERR: /**< error packet - 8 bits. */
- case STM_PKT_MERR: /**< error packet - 8 bits. */
- m_swt_packet_info.swt_payload_pkt_bitsize = 8;
- *(uint8_t *)m_payload_buffer = m_curr_packet_in->getD8Val();
- break;
-
- case STM_PKT_D16: /**< 16 bit data payload packet */
- m_swt_packet_info.swt_payload_pkt_bitsize = 16;
- *(uint16_t *)m_payload_buffer = m_curr_packet_in->getD16Val();
- break;
-
- case STM_PKT_D32: /**< 32 bit data payload packet */
- case STM_PKT_FREQ: /**< Frequency packet */
- m_swt_packet_info.swt_payload_pkt_bitsize = 32;
- *(uint32_t *)m_payload_buffer = m_curr_packet_in->getD32Val();
- break;
-
-
- case STM_PKT_D64: /**< 64 bit data payload packet */
- m_swt_packet_info.swt_payload_pkt_bitsize = 64;
- *(uint64_t *)m_payload_buffer = m_curr_packet_in->getD64Val();
- break;
- }
- m_output_elem.setExtendedDataPtr(m_payload_buffer);
- if (m_curr_packet_in->isMarkerPkt())
- m_swt_packet_info.swt_marker_packet = 1;
-
-}
-
-/* End of File trc_pkt_decode_stm.cpp */
diff --git a/contrib/opencsd/decoder/source/stm/trc_pkt_elem_stm.cpp b/contrib/opencsd/decoder/source/stm/trc_pkt_elem_stm.cpp
deleted file mode 100644
index d9adaf695556..000000000000
--- a/contrib/opencsd/decoder/source/stm/trc_pkt_elem_stm.cpp
+++ /dev/null
@@ -1,314 +0,0 @@
-/*
- * \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 */
diff --git a/contrib/opencsd/decoder/source/stm/trc_pkt_proc_stm.cpp b/contrib/opencsd/decoder/source/stm/trc_pkt_proc_stm.cpp
deleted file mode 100644
index b39a053b39c0..000000000000
--- a/contrib/opencsd/decoder/source/stm/trc_pkt_proc_stm.cpp
+++ /dev/null
@@ -1,1043 +0,0 @@
-/*
- * \file trc_pkt_proc_stm.cpp
- * \brief OpenCSD :
- *
- * \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 "opencsd/stm/trc_pkt_proc_stm.h"
-
-
-// processor object construction
-// ************************
-
-#ifdef __GNUC__
-// G++ doesn't like the ## pasting
-#define STM_PKTS_NAME "PKTP_STM"
-#else
-#define STM_PKTS_NAME OCSD_CMPNAME_PREFIX_PKTPROC##"_STM"
-#endif
-
-static const uint32_t STM_SUPPORTED_OP_FLAGS = OCSD_OPFLG_PKTPROC_COMMON;
-
-TrcPktProcStm::TrcPktProcStm() : TrcPktProcBase(STM_PKTS_NAME)
-{
- initObj();
-}
-
-TrcPktProcStm::TrcPktProcStm(int instIDNum) : TrcPktProcBase(STM_PKTS_NAME, instIDNum)
-{
- initObj();
-}
-
-TrcPktProcStm::~TrcPktProcStm()
-{
- getRawPacketMonAttachPt()->set_notifier(0);
-}
-
-void TrcPktProcStm::initObj()
-{
- m_supported_op_flags = STM_SUPPORTED_OP_FLAGS;
- initProcessorState();
- getRawPacketMonAttachPt()->set_notifier(&mon_in_use);
- buildOpTables();
-}
-
-// implementation packet processing interface overrides
-// ************************
-ocsd_datapath_resp_t TrcPktProcStm::processData( const ocsd_trc_index_t index,
- const uint32_t dataBlockSize,
- const uint8_t *pDataBlock,
- uint32_t *numBytesProcessed)
-{
- ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
- m_p_data_in = pDataBlock;
- m_data_in_size = dataBlockSize;
- m_data_in_used = 0;
-
- // while there is data and a continue response on the data path
- while( dataToProcess() && OCSD_DATA_RESP_IS_CONT(resp) )
- {
- try
- {
- switch(m_proc_state)
- {
- case WAIT_SYNC:
- waitForSync(index);
- break;
-
- case PROC_HDR:
- m_packet_index = index + m_data_in_used;
- if(readNibble())
- {
- m_proc_state = PROC_DATA; // read the header nibble, next if any has to be data
- m_pCurrPktFn = m_1N_ops[m_nibble]; // set packet function and fall through
- }
- else
- break;
-
- case PROC_DATA:
- (this->*m_pCurrPktFn)();
-
- // if we have enough to send, fall through, otherwise stop
- if(m_proc_state != SEND_PKT)
- break;
-
- case SEND_PKT:
- resp = outputPacket();
- break;
- }
- }
- catch(ocsdError &err)
- {
- LogError(err);
- if( ((err.getErrorCode() == OCSD_ERR_BAD_PACKET_SEQ) ||
- (err.getErrorCode() == OCSD_ERR_INVALID_PCKT_HDR)) &&
- !(getComponentOpMode() & OCSD_OPFLG_PKTPROC_ERR_BAD_PKTS))
- {
- // send invalid packets up the pipe to let the next stage decide what to do.
- resp = outputPacket();
- if(getComponentOpMode() & OCSD_OPFLG_PKTPROC_UNSYNC_ON_BAD_PKTS)
- m_proc_state = WAIT_SYNC;
- }
- else
- {
- // bail out on any other error.
- resp = OCSD_RESP_FATAL_INVALID_DATA;
- }
- }
- catch(...)
- {
- /// vv bad at this point.
- resp = OCSD_RESP_FATAL_SYS_ERR;
- ocsdError fatal = ocsdError(OCSD_ERR_SEV_ERROR,OCSD_ERR_FAIL,m_packet_index,m_config->getTraceID());
- fatal.setMessage("Unknown System Error decoding trace.");
- LogError(fatal);
- }
- }
-
- *numBytesProcessed = m_data_in_used;
- return resp;
-
-}
-
-ocsd_datapath_resp_t TrcPktProcStm::onEOT()
-{
- ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
- if(m_num_nibbles > 0) // there is a partial packet in flight
- {
- m_curr_packet.updateErrType(STM_PKT_INCOMPLETE_EOT); // re mark as incomplete
- resp = outputPacket();
- }
- return resp;
-}
-
-ocsd_datapath_resp_t TrcPktProcStm::onReset()
-{
- initProcessorState();
- return OCSD_RESP_CONT;
-}
-
-ocsd_datapath_resp_t TrcPktProcStm::onFlush()
-{
- // packet processor never holds on to flushable data (may have partial packet,
- // but any full packets are immediately sent)
- return OCSD_RESP_CONT;
-}
-
-ocsd_err_t TrcPktProcStm::onProtocolConfig()
-{
- return OCSD_OK; // nothing to do on config for this processor
-}
-
-const bool TrcPktProcStm::isBadPacket() const
-{
- return m_curr_packet.isBadPacket();
-}
-
-ocsd_datapath_resp_t TrcPktProcStm::outputPacket()
-{
- ocsd_datapath_resp_t resp = OCSD_RESP_CONT;
- resp = outputOnAllInterfaces(m_packet_index,&m_curr_packet,&m_curr_packet.type,m_packet_data);
- m_packet_data.clear();
- initNextPacket();
- if(m_nibble_2nd_valid)
- savePacketByte(m_nibble_2nd << 4); // put the unused nibble back on to the data stack and pad for output next time.
- m_proc_state = m_bStreamSync ? PROC_HDR : WAIT_SYNC;
- return resp;
-}
-
-void TrcPktProcStm::throwBadSequenceError(const char *pszMessage /*= ""*/)
-{
- m_curr_packet.updateErrType(STM_PKT_BAD_SEQUENCE);
- throw ocsdError(OCSD_ERR_SEV_ERROR,OCSD_ERR_BAD_PACKET_SEQ,m_packet_index,this->m_config->getTraceID(),pszMessage);
-}
-
-void TrcPktProcStm::throwReservedHdrError(const char *pszMessage /*= ""*/)
-{
- m_curr_packet.setPacketType(STM_PKT_RESERVED,false);
- throw ocsdError(OCSD_ERR_SEV_ERROR,OCSD_ERR_INVALID_PCKT_HDR,m_packet_index,this->m_config->getTraceID(),pszMessage);
-}
-
-// processor / packet init
-// ************************
-
-void TrcPktProcStm::initProcessorState()
-{
- // clear any state that persists between packets
- setProcUnsynced();
- clearSyncCount();
- m_curr_packet.initStartState();
- m_nibble_2nd_valid = false;
- initNextPacket();
- m_bWaitSyncSaveSuppressed = false;
-
- m_packet_data.clear();
-}
-
-void TrcPktProcStm::initNextPacket()
-{
- // clear state that is unique to each packet
- m_bNeedsTS = false;
- m_bIsMarker = false;
- m_num_nibbles = 0;
- m_num_data_nibbles = 0;
- m_curr_packet.initNextPacket();
-}
-
-// search remaining buffer for a start of sync or full sync packet
-void TrcPktProcStm::waitForSync(const ocsd_trc_index_t blk_st_index)
-{
- bool bGotData = true;
- uint32_t start_offset = m_data_in_used; // record the offset into the buffer at start of this fn.
-
- // input conditions:
- // out of sync - either at start of input stream, or due to bad packet.
- // m_data_in_used -> bytes already processed
- // m_sync_start -> seen potential start of sync in current stream
-
- // set a packet index for the start of the data
- m_packet_index = blk_st_index + m_data_in_used;
- m_num_nibbles = m_is_sync ? m_num_F_nibbles + 1 : m_num_F_nibbles; // sending unsync data may have cleared down num_nibbles.
-
- m_bWaitSyncSaveSuppressed = true; // no need to save bytes until we want to send data.
-
- while(bGotData && !m_is_sync)
- {
- bGotData = readNibble(); // read until we have a sync or run out of data
- }
-
- m_bWaitSyncSaveSuppressed = false;
-
- // no data from first attempt to read
- if(m_num_nibbles == 0)
- return;
-
- // we have found a sync or run out of data
- // five possible scenarios
- // a) all data none sync data.
- // b) some none sync data + start of sync sequence
- // c) some none sync data + full sync sequence in this frame
- // d) full sync sequence @ start of this frame followed by ???
- // e) completion of sync sequence in this frame (from b)).
-
- if(!bGotData || m_num_nibbles > 22)
- {
- // for a), b), c) send the none sync data then re-enter
- // if out of data, or sync with some previous data, this is sent as unsynced.
-
- m_curr_packet.setPacketType(STM_PKT_NOTSYNC,false);
- if(mon_in_use.usingMonitor())
- {
- uint8_t nibbles_to_send = m_num_nibbles - (m_is_sync ? 22 : m_num_F_nibbles);
- uint8_t bytes_to_send = (nibbles_to_send / 2) + (nibbles_to_send % 2);
- for(uint8_t i = 0; i < bytes_to_send; i++)
- savePacketByte(m_p_data_in[start_offset+i]);
- }
-
- // if we have found a sync then we will re-enter this function with no pre data,
- // but the found flags set.
- }
- else
- {
- // send the async packet
- m_curr_packet.setPacketType(STM_PKT_ASYNC,false);
- m_bStreamSync = true; // mark the stream as synchronised
- clearSyncCount();
- m_packet_index = m_sync_index;
- if(mon_in_use.usingMonitor())
- {
- // we may not have the full sync packet still in the local buffer so synthesise it.
- for(int i = 0; i < 10; i++)
- savePacketByte(0xFF);
- savePacketByte(0x0F);
- }
- }
- sendPacket(); // mark packet for sending
-}
-
-// packet processing routines
-// ************************
-// 1 nibble opcodes
-void TrcPktProcStm::stmPktReserved()
-{
- uint16_t bad_opcode = (uint16_t)m_nibble;
- m_curr_packet.setD16Payload(bad_opcode);
- throwReservedHdrError("STM: Unsupported or Reserved STPv2 Header");
-}
-
-void TrcPktProcStm::stmPktNull()
-{
- m_curr_packet.setPacketType(STM_PKT_NULL,false);
- if(m_bNeedsTS)
- {
- m_pCurrPktFn = &TrcPktProcStm::stmExtractTS;
- (this->*m_pCurrPktFn)();
- }
- else
- {
- sendPacket();
- }
-}
-
-void TrcPktProcStm::stmPktNullTS()
-{
- pktNeedsTS();
- m_pCurrPktFn = &TrcPktProcStm::stmPktNull;
- (this->*m_pCurrPktFn)();
-}
-
-void TrcPktProcStm::stmPktM8()
-{
- if(m_num_nibbles == 1) // 1st nibble - header - set type
- m_curr_packet.setPacketType(STM_PKT_M8,false);
-
- stmExtractVal8(3);
- if(m_num_nibbles == 3)
- {
- m_curr_packet.setMaster(m_val8);
- sendPacket();
- }
-}
-
-void TrcPktProcStm::stmPktMERR()
-{
- if(m_num_nibbles == 1) // 1st nibble - header - set type
- m_curr_packet.setPacketType(STM_PKT_MERR,false);
-
- stmExtractVal8(3);
- if(m_num_nibbles == 3)
- {
- m_curr_packet.setChannel(0,false); // MERR resets channel for current master to 0.
- m_curr_packet.setD8Payload(m_val8);
- sendPacket();
- }
-
-}
-
-void TrcPktProcStm::stmPktC8()
-{
- if(m_num_nibbles == 1) // 1st nibble - header - set type
- m_curr_packet.setPacketType(STM_PKT_C8,false);
- stmExtractVal8(3);
- if(m_num_nibbles == 3)
- {
- m_curr_packet.setChannel((uint16_t)m_val8,true);
- sendPacket();
- }
-}
-
-void TrcPktProcStm::stmPktD4()
-{
- if(m_num_nibbles == 1) // 1st nibble - header - set type
- {
- m_curr_packet.setPacketType(STM_PKT_D4,m_bIsMarker);
- m_num_data_nibbles = 2; // need 2 nibbles to complete data
- }
-
- if(m_num_nibbles != m_num_data_nibbles)
- {
- if(readNibble())
- {
- m_curr_packet.setD4Payload(m_nibble);
- if(m_bNeedsTS)
- {
- m_pCurrPktFn = &TrcPktProcStm::stmExtractTS;
- (this->*m_pCurrPktFn)();
- }
- else
- sendPacket();
- }
- }
-}
-
-void TrcPktProcStm::stmPktD8()
-{
- if(m_num_nibbles == 1) // 1st nibble - header - set type
- {
- m_curr_packet.setPacketType(STM_PKT_D8,m_bIsMarker);
- m_num_data_nibbles = 3; // need 3 nibbles in total to complete data
- }
-
- stmExtractVal8(m_num_data_nibbles);
- if(m_num_nibbles == m_num_data_nibbles)
- {
- m_curr_packet.setD8Payload(m_val8);
- if(m_bNeedsTS)
- {
- m_pCurrPktFn = &TrcPktProcStm::stmExtractTS;
- (this->*m_pCurrPktFn)();
- }
- else
- {
- sendPacket();
- }
- }
-}
-
-void TrcPktProcStm::stmPktD16()
-{
- if(m_num_nibbles == 1) // 1st nibble - header - set type
- {
- m_curr_packet.setPacketType(STM_PKT_D16,m_bIsMarker);
- m_num_data_nibbles = 5;
- }
-
- stmExtractVal16(m_num_data_nibbles);
- if(m_num_nibbles == m_num_data_nibbles)
- {
- m_curr_packet.setD16Payload(m_val16);
- if(m_bNeedsTS)
- {
- m_pCurrPktFn = &TrcPktProcStm::stmExtractTS;
- (this->*m_pCurrPktFn)();
- }
- else
- {
- sendPacket();
- }
- }
-}
-
-void TrcPktProcStm::stmPktD32()
-{
- if(m_num_nibbles == 1) // 1st nibble - header - set type
- {
- m_curr_packet.setPacketType(STM_PKT_D32,m_bIsMarker);
- m_num_data_nibbles = 9;
- }
-
- stmExtractVal32(m_num_data_nibbles);
- if(m_num_nibbles == m_num_data_nibbles)
- {
- m_curr_packet.setD32Payload(m_val32);
- if(m_bNeedsTS)
- {
- m_pCurrPktFn = &TrcPktProcStm::stmExtractTS;
- (this->*m_pCurrPktFn)();
- }
- else
- {
- sendPacket();
- }
- }
-}
-
-void TrcPktProcStm::stmPktD64()
-{
- if(m_num_nibbles == 1) // 1st nibble - header - set type
- {
- m_curr_packet.setPacketType(STM_PKT_D64,m_bIsMarker);
- m_num_data_nibbles = 17;
- }
-
- stmExtractVal64(m_num_data_nibbles);
- if(m_num_nibbles == m_num_data_nibbles)
- {
- m_curr_packet.setD64Payload(m_val64);
- if(m_bNeedsTS)
- {
- m_pCurrPktFn = &TrcPktProcStm::stmExtractTS;
- (this->*m_pCurrPktFn)();
- }
- else
- {
- sendPacket();
- }
- }
-}
-
-void TrcPktProcStm::stmPktD4MTS()
-{
- pktNeedsTS();
- m_bIsMarker = true;
- m_pCurrPktFn = &TrcPktProcStm::stmPktD4;
- (this->*m_pCurrPktFn)();
-}
-
-void TrcPktProcStm::stmPktD8MTS()
-{
- pktNeedsTS();
- m_bIsMarker = true;
- m_pCurrPktFn = &TrcPktProcStm::stmPktD8;
- (this->*m_pCurrPktFn)();
-}
-
-void TrcPktProcStm::stmPktD16MTS()
-{
- pktNeedsTS();
- m_bIsMarker = true;
- m_pCurrPktFn = &TrcPktProcStm::stmPktD16;
- (this->*m_pCurrPktFn)();
-}
-
-void TrcPktProcStm::stmPktD32MTS()
-{
- pktNeedsTS();
- m_bIsMarker = true;
- m_pCurrPktFn = &TrcPktProcStm::stmPktD32;
- (this->*m_pCurrPktFn)();
-}
-
-void TrcPktProcStm::stmPktD64MTS()
-{
- pktNeedsTS();
- m_bIsMarker = true;
- m_pCurrPktFn = &TrcPktProcStm::stmPktD64;
- (this->*m_pCurrPktFn)();
-}
-
-void TrcPktProcStm::stmPktFlagTS()
-{
- pktNeedsTS();
- m_curr_packet.setPacketType(STM_PKT_FLAG,false);
- m_pCurrPktFn = &TrcPktProcStm::stmExtractTS;
- (this->*m_pCurrPktFn)();
-}
-
-void TrcPktProcStm::stmPktFExt()
-{
- // no type, look at the next nibble
- if(readNibble())
- {
- // switch in 2N function
- m_pCurrPktFn = m_2N_ops[m_nibble];
- (this->*m_pCurrPktFn)();
- }
-}
-
-// ************************
-// 2 nibble opcodes 0xFn
-void TrcPktProcStm::stmPktReservedFn()
-{
- uint16_t bad_opcode = 0x00F;
- bad_opcode |= ((uint16_t)m_nibble) << 4;
- m_curr_packet.setD16Payload(bad_opcode);
- throwReservedHdrError("STM: Unsupported or Reserved STPv2 Header");
-}
-
-void TrcPktProcStm::stmPktF0Ext()
-{
- // no type yet, look at the next nibble
- if(readNibble())
- {
- // switch in 3N function
- m_pCurrPktFn = m_3N_ops[m_nibble];
- (this->*m_pCurrPktFn)();
- }
-}
-
-void TrcPktProcStm::stmPktGERR()
-{
- if(m_num_nibbles == 2) // 2nd nibble - header - set type
- m_curr_packet.setPacketType(STM_PKT_GERR,false);
- stmExtractVal8(4);
- if(m_num_nibbles == 4)
- {
- m_curr_packet.setD8Payload(m_val8);
- m_curr_packet.setMaster(0); // GERR sets current master to 0.
- sendPacket();
- }
-}
-
-void TrcPktProcStm::stmPktC16()
-{
- if(m_num_nibbles == 2) // 2nd nibble - header - set type
- m_curr_packet.setPacketType(STM_PKT_C16,false);
- stmExtractVal16(6);
- if(m_num_nibbles == 6)
- {
- m_curr_packet.setChannel(m_val16,false);
- sendPacket();
- }
-}
-
-void TrcPktProcStm::stmPktD4TS()
-{
- pktNeedsTS();
- m_curr_packet.setPacketType(STM_PKT_D4,false); // 2nd nibble, set type here
- m_num_data_nibbles = 3; // one more nibble for data
- m_pCurrPktFn = &TrcPktProcStm::stmPktD4;
- (this->*m_pCurrPktFn)();
-}
-
-void TrcPktProcStm::stmPktD8TS()
-{
- pktNeedsTS();
- m_curr_packet.setPacketType(STM_PKT_D8,false); // 2nd nibble, set type here
- m_num_data_nibbles = 4;
- m_pCurrPktFn = &TrcPktProcStm::stmPktD8;
- (this->*m_pCurrPktFn)();
-}
-
-void TrcPktProcStm::stmPktD16TS()
-{
- pktNeedsTS();
- m_curr_packet.setPacketType(STM_PKT_D16,false); // 2nd nibble, set type here
- m_num_data_nibbles = 6;
- m_pCurrPktFn = &TrcPktProcStm::stmPktD16;
- (this->*m_pCurrPktFn)();
-}
-
-void TrcPktProcStm::stmPktD32TS()
-{
- pktNeedsTS();
- m_curr_packet.setPacketType(STM_PKT_D32,false); // 2nd nibble, set type here
- m_num_data_nibbles = 10;
- m_pCurrPktFn = &TrcPktProcStm::stmPktD32;
- (this->*m_pCurrPktFn)();
-}
-
-void TrcPktProcStm::stmPktD64TS()
-{
- pktNeedsTS();
- m_curr_packet.setPacketType(STM_PKT_D64,false); // 2nd nibble, set type here
- m_num_data_nibbles = 18;
- m_pCurrPktFn = &TrcPktProcStm::stmPktD64;
- (this->*m_pCurrPktFn)();
-}
-
-void TrcPktProcStm::stmPktD4M()
-{
- m_curr_packet.setPacketType(STM_PKT_D4,true); // 2nd nibble, set type here
- m_num_data_nibbles = 3; // one more nibble for data
- m_pCurrPktFn = &TrcPktProcStm::stmPktD4;
- (this->*m_pCurrPktFn)();
-}
-
-void TrcPktProcStm::stmPktD8M()
-{
- m_curr_packet.setPacketType(STM_PKT_D8,true); // 2nd nibble, set type here
- m_num_data_nibbles = 4;
- m_pCurrPktFn = &TrcPktProcStm::stmPktD8;
- (this->*m_pCurrPktFn)();
-}
-
-void TrcPktProcStm::stmPktD16M()
-{
- m_curr_packet.setPacketType(STM_PKT_D16,true);
- m_num_data_nibbles = 6;
- m_pCurrPktFn = &TrcPktProcStm::stmPktD16;
- (this->*m_pCurrPktFn)();
-}
-
-void TrcPktProcStm::stmPktD32M()
-{
- m_curr_packet.setPacketType(STM_PKT_D32,true);
- m_num_data_nibbles = 10;
- m_pCurrPktFn = &TrcPktProcStm::stmPktD32;
- (this->*m_pCurrPktFn)();
-}
-
-void TrcPktProcStm::stmPktD64M()
-{
- m_curr_packet.setPacketType(STM_PKT_D64,true);
- m_num_data_nibbles = 18;
- m_pCurrPktFn = &TrcPktProcStm::stmPktD64;
- (this->*m_pCurrPktFn)();
-}
-
-void TrcPktProcStm::stmPktFlag()
-{
- m_curr_packet.setPacketType(STM_PKT_FLAG,false);
- sendPacket();
-}
-
-// ************************
-// 3 nibble opcodes 0xF0n
-void TrcPktProcStm::stmPktReservedF0n()
-{
- uint16_t bad_opcode = 0x00F;
- bad_opcode |= ((uint16_t)m_nibble) << 8;
- m_curr_packet.setD16Payload(bad_opcode);
- throwReservedHdrError("STM: Unsupported or Reserved STPv2 Header");
-}
-
-void TrcPktProcStm::stmPktVersion()
-{
- if(m_num_nibbles == 3)
- m_curr_packet.setPacketType(STM_PKT_VERSION,false);
-
- if(readNibble())
- {
- m_curr_packet.setD8Payload(m_nibble); // record the version number
- switch(m_nibble)
- {
- case 3:
- m_curr_packet.onVersionPkt(STM_TS_NATBINARY); break;
- case 4:
- m_curr_packet.onVersionPkt(STM_TS_GREY); break;
- default:
- // not a version we support.
- throwBadSequenceError("STM VERSION packet : unrecognised version number.");
- }
- sendPacket();
- }
-}
-
-void TrcPktProcStm::stmPktTrigger()
-{
- if(m_num_nibbles == 3)
- m_curr_packet.setPacketType(STM_PKT_TRIG,false);
- stmExtractVal8(5);
- if(m_num_nibbles == 5)
- {
- m_curr_packet.setD8Payload(m_val8);
- if(m_bNeedsTS)
- {
- m_pCurrPktFn = &TrcPktProcStm::stmExtractTS;
- (this->*m_pCurrPktFn)();
- }
- else
- {
- sendPacket();
- }
- }
-}
-
-void TrcPktProcStm::stmPktTriggerTS()
-{
- pktNeedsTS();
- m_pCurrPktFn = &TrcPktProcStm::stmPktTrigger;
- (this->*m_pCurrPktFn)();
-}
-
-void TrcPktProcStm::stmPktFreq()
-{
- if(m_num_nibbles == 3)
- {
- m_curr_packet.setPacketType(STM_PKT_FREQ,false);
- m_val32 = 0;
- }
- stmExtractVal32(11);
- if(m_num_nibbles == 11)
- {
- m_curr_packet.setD32Payload(m_val32);
- sendPacket();
- }
-}
-
-void TrcPktProcStm::stmPktASync()
-{
- // 2 nibbles - 0xFF - must be an async or error.
- bool bCont = true;
- while(bCont)
- {
- bCont = readNibble();
- if(bCont)
- {
- if(m_is_sync)
- {
- bCont = false; // stop reading nibbles
- m_bStreamSync = true; // mark stream in sync
- m_curr_packet.setPacketType(STM_PKT_ASYNC,false);
- clearSyncCount();
- sendPacket();
- }
- else if(!m_sync_start) // no longer valid sync packet
- {
- throwBadSequenceError("STM: Invalid ASYNC sequence");
- }
- }
- }
-}
-
-// ************************
-// general data processing
-
-// return false if no more data
-// in an STM byte, 3:0 is 1st nibble in protocol order, 7:4 is 2nd nibble.
-bool TrcPktProcStm::readNibble()
-{
- bool dataFound = true;
- if(m_nibble_2nd_valid)
- {
- m_nibble = m_nibble_2nd;
- m_nibble_2nd_valid = false;
- m_num_nibbles++;
- checkSyncNibble();
- }
- else if(m_data_in_used < m_data_in_size )
- {
- m_nibble = m_p_data_in[m_data_in_used++];
- savePacketByte(m_nibble);
- m_nibble_2nd = (m_nibble >> 4) & 0xF;
- m_nibble_2nd_valid = true;
- m_nibble &= 0xF;
- m_num_nibbles++;
- checkSyncNibble();
- }
- else
- dataFound = false; // no data available
- return dataFound;
-}
-
-void TrcPktProcStm::pktNeedsTS()
-{
- m_bNeedsTS = true;
- m_req_ts_nibbles = 0;
- m_curr_ts_nibbles = 0;
- m_ts_update_value = 0;
- m_ts_req_set = false;
-}
-
-void TrcPktProcStm::stmExtractTS()
-{
- if(!m_ts_req_set)
- {
- if(readNibble())
- {
- m_req_ts_nibbles = m_nibble;
- if(m_nibble == 0xD)
- m_req_ts_nibbles = 14;
- else if(m_nibble == 0xE)
- m_req_ts_nibbles = 16;
-
- if(m_nibble == 0xF)
- throwBadSequenceError("STM: Invalid timestamp size 0xF");
- m_ts_req_set = true;
- }
- }
-
- if(m_ts_req_set)
- {
- // if we do not have all the nibbles for the TS, get some...
- if(m_req_ts_nibbles != m_curr_ts_nibbles)
- {
- // extract the correct amount of nibbles for the ts value.
- bool bCont = true;
- while(bCont && (m_curr_ts_nibbles < m_req_ts_nibbles))
- {
- bCont = readNibble();
- if(bCont)
- {
- m_ts_update_value <<= 4;
- m_ts_update_value |= m_nibble;
- m_curr_ts_nibbles++;
- }
- }
- }
-
- // at this point we have the correct amount of nibbles, or have run out of data to process.
- if(m_req_ts_nibbles == m_curr_ts_nibbles)
- {
- uint8_t new_bits = m_req_ts_nibbles * 4;
- if(m_curr_packet.getTSType() == STM_TS_GREY)
- {
- uint64_t gray_val = bin_to_gray(m_curr_packet.getTSVal());
- if(new_bits == 64)
- {
- gray_val = m_ts_update_value;
- }
- else
- {
- uint64_t mask = (0x1ULL << new_bits) - 1;
- gray_val &= ~mask;
- gray_val |= m_ts_update_value & mask;
- }
- m_curr_packet.setTS(gray_to_bin(gray_val),new_bits);
- }
- else if(m_curr_packet.getTSType() == STM_TS_NATBINARY)
- {
- m_curr_packet.setTS(m_ts_update_value, new_bits);
- }
- else
- throwBadSequenceError("STM: unknown timestamp encoding");
-
- sendPacket();
- }
- }
-}
-
-// pass in number of nibbles needed to extract the value
-void TrcPktProcStm::stmExtractVal8(uint8_t nibbles_to_val)
-{
- bool bCont = true;
- while(bCont && (m_num_nibbles < nibbles_to_val))
- {
- bCont = readNibble();
- if(bCont) // got a nibble
- {
- m_val8 <<= 4;
- m_val8 |= m_nibble;
- }
- }
-}
-
-void TrcPktProcStm::stmExtractVal16(uint8_t nibbles_to_val)
-{
- bool bCont = true;
- while(bCont && (m_num_nibbles < nibbles_to_val))
- {
- bCont = readNibble();
- if(bCont) // got a nibble
- {
- m_val16 <<= 4;
- m_val16 |= m_nibble;
- }
- }
-}
-
-void TrcPktProcStm::stmExtractVal32(uint8_t nibbles_to_val)
-{
- bool bCont = true;
- while(bCont && (m_num_nibbles < nibbles_to_val))
- {
- bCont = readNibble();
- if(bCont) // got a nibble
- {
- m_val32 <<= 4;
- m_val32 |= m_nibble;
- }
- }
-}
-
-void TrcPktProcStm::stmExtractVal64(uint8_t nibbles_to_val)
-{
- bool bCont = true;
- while(bCont && (m_num_nibbles < nibbles_to_val))
- {
- bCont = readNibble();
- if(bCont) // got a nibble
- {
- m_val64 <<= 4;
- m_val64 |= m_nibble;
- }
- }
-}
-
-uint64_t TrcPktProcStm::bin_to_gray(uint64_t bin_value)
-{
- uint64_t gray_value = 0;
- gray_value = (1ull << 63) & bin_value;
- int i = 62;
- for (; i >= 0; i--) {
- uint64_t gray_arg_1 = ((1ull << (i+1)) & bin_value) >> (i+1);
- uint64_t gray_arg_2 = ((1ull << i) & bin_value) >> i;
- gray_value |= ((gray_arg_1 ^ gray_arg_2) << i);
- }
- return gray_value;
-}
-
-uint64_t TrcPktProcStm::gray_to_bin(uint64_t gray_value)
-{
- uint64_t bin_value = 0;
- int bin_bit = 0;
- for (; bin_bit < 64; bin_bit++) {
- uint8_t bit_tmp = ((1ull << bin_bit) & gray_value) >> bin_bit;
- uint8_t gray_bit = bin_bit + 1;
- for (; gray_bit < 64; gray_bit++)
- bit_tmp ^= (((1ull << gray_bit) & gray_value) >> gray_bit);
-
- bin_value |= (bit_tmp << bin_bit);
- }
-
- return bin_value;
-}
-
-
-void TrcPktProcStm::buildOpTables()
-{
- // init all reserved
- for(int i = 0; i < 0x10; i++)
- {
- m_1N_ops[i] = &TrcPktProcStm::stmPktReserved;
- m_2N_ops[i] = &TrcPktProcStm::stmPktReservedFn;
- m_3N_ops[i] = &TrcPktProcStm::stmPktReservedF0n;
- }
-
- // set the 1N operations
- m_1N_ops[0x0] = &TrcPktProcStm::stmPktNull;
- m_1N_ops[0x1] = &TrcPktProcStm::stmPktM8;
- m_1N_ops[0x2] = &TrcPktProcStm::stmPktMERR;
- m_1N_ops[0x3] = &TrcPktProcStm::stmPktC8;
- m_1N_ops[0x4] = &TrcPktProcStm::stmPktD8;
- m_1N_ops[0x5] = &TrcPktProcStm::stmPktD16;
- m_1N_ops[0x6] = &TrcPktProcStm::stmPktD32;
- m_1N_ops[0x7] = &TrcPktProcStm::stmPktD64;
- m_1N_ops[0x8] = &TrcPktProcStm::stmPktD8MTS;
- m_1N_ops[0x9] = &TrcPktProcStm::stmPktD16MTS;
- m_1N_ops[0xA] = &TrcPktProcStm::stmPktD32MTS;
- m_1N_ops[0xB] = &TrcPktProcStm::stmPktD64MTS;
- m_1N_ops[0xC] = &TrcPktProcStm::stmPktD4;
- m_1N_ops[0xD] = &TrcPktProcStm::stmPktD4MTS;
- m_1N_ops[0xE] = &TrcPktProcStm::stmPktFlagTS;
- m_1N_ops[0xF] = &TrcPktProcStm::stmPktFExt;
-
- // set the 2N operations 0xFn
- m_2N_ops[0x0] = &TrcPktProcStm::stmPktF0Ext;
- // 0x1 unused in CS STM
- m_2N_ops[0x2] = &TrcPktProcStm::stmPktGERR;
- m_2N_ops[0x3] = &TrcPktProcStm::stmPktC16;
- m_2N_ops[0x4] = &TrcPktProcStm::stmPktD8TS;
- m_2N_ops[0x5] = &TrcPktProcStm::stmPktD16TS;
- m_2N_ops[0x6] = &TrcPktProcStm::stmPktD32TS;
- m_2N_ops[0x7] = &TrcPktProcStm::stmPktD64TS;
- m_2N_ops[0x8] = &TrcPktProcStm::stmPktD8M;
- m_2N_ops[0x9] = &TrcPktProcStm::stmPktD16M;
- m_2N_ops[0xA] = &TrcPktProcStm::stmPktD32M;
- m_2N_ops[0xB] = &TrcPktProcStm::stmPktD64M;
- m_2N_ops[0xC] = &TrcPktProcStm::stmPktD4TS;
- m_2N_ops[0xD] = &TrcPktProcStm::stmPktD4M;
- m_2N_ops[0xE] = &TrcPktProcStm::stmPktFlag;
- m_2N_ops[0xF] = &TrcPktProcStm::stmPktASync;
-
- // set the 3N operations 0xF0n
- m_3N_ops[0x0] = &TrcPktProcStm::stmPktVersion;
- m_3N_ops[0x1] = &TrcPktProcStm::stmPktNullTS;
- // 0x2 .. 0x5 not used by CS STM
- m_3N_ops[0x6] = &TrcPktProcStm::stmPktTrigger;
- m_3N_ops[0x7] = &TrcPktProcStm::stmPktTriggerTS;
- m_3N_ops[0x8] = &TrcPktProcStm::stmPktFreq;
- // 0x9 .. 0xF not used by CS STM
-
-}
-
-/* End of File trc_pkt_proc_stm.cpp */
diff --git a/contrib/opencsd/decoder/source/trc_component.cpp b/contrib/opencsd/decoder/source/trc_component.cpp
deleted file mode 100644
index 47200a1ead67..000000000000
--- a/contrib/opencsd/decoder/source/trc_component.cpp
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * \file trc_component.cpp
- * \brief OpenCSD :
- *
- * \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 "common/trc_component.h"
-
-class errLogAttachMonitor : public IComponentAttachNotifier
-{
-public:
- errLogAttachMonitor()
- {
- m_pComp = 0;
- };
- virtual ~ errLogAttachMonitor() {};
- virtual void attachNotify(const int num_attached)
- {
- if(m_pComp)
- m_pComp->do_attach_notify(num_attached);
- }
- void Init(TraceComponent *pComp)
- {
- m_pComp = pComp;
- if(m_pComp)
- m_pComp->getErrorLogAttachPt()->set_notifier(this);
- }
-private:
- TraceComponent *m_pComp;
-};
-
-TraceComponent::TraceComponent(const std::string &name)
-{
- Init(name);
-}
-
-TraceComponent::TraceComponent(const std::string &name, int instIDNum)
-{
- std::string name_combined = name;
- char num_buffer[32];
- sprintf(num_buffer,"_%04d",instIDNum);
- name_combined += (std::string)num_buffer;
- Init(name_combined);
-}
-
-TraceComponent::~TraceComponent()
-{
-}
-
-void TraceComponent::Init(const std::string &name)
-{
- m_errLogHandle = OCSD_INVALID_HANDLE;
- m_errVerbosity = OCSD_ERR_SEV_NONE;
- m_name = name;
-
- m_supported_op_flags = 0;
- m_op_flags = 0;
- m_assocComp = 0;
-
- m_pErrAttachMon = new (std::nothrow) errLogAttachMonitor();
- if(m_pErrAttachMon)
- m_pErrAttachMon->Init(this);
-}
-
-void TraceComponent::LogError(const ocsdError &Error)
-{
- if((m_errLogHandle != OCSD_INVALID_HANDLE) &&
- isLoggingErrorLevel(Error.getErrorSeverity()))
- {
- // ensure we have not disabled the attachPt
- if(m_error_logger.first())
- m_error_logger.first()->LogError(m_errLogHandle,&Error);
- }
-}
-
-void TraceComponent::LogMessage(const ocsd_err_severity_t filter_level, const std::string &msg)
-{
- if ((m_errLogHandle != OCSD_INVALID_HANDLE) &&
- isLoggingErrorLevel(filter_level))
- {
- // ensure we have not disabled the attachPt
- if (m_error_logger.first())
- m_error_logger.first()->LogMessage(this->m_errLogHandle, filter_level, msg);
- }
-
-}
-
-void TraceComponent::do_attach_notify(const int num_attached)
-{
- if(num_attached)
- {
- // ensure we have not disabled the attachPt
- if(m_error_logger.first())
- {
- m_errLogHandle = m_error_logger.first()->RegisterErrorSource(m_name);
- m_errVerbosity = m_error_logger.first()->GetErrorLogVerbosity();
- }
- }
- else
- {
- m_errLogHandle = OCSD_INVALID_HANDLE;
- }
-}
-
-void TraceComponent::updateErrorLogLevel()
-{
- if(m_error_logger.first())
- {
- m_errVerbosity = m_error_logger.first()->GetErrorLogVerbosity();
- }
-}
-
-ocsd_err_t TraceComponent::setComponentOpMode(uint32_t op_flags)
-{
- if( (~m_supported_op_flags & op_flags) != 0)
- return OCSD_ERR_INVALID_PARAM_VAL;
- m_op_flags = op_flags;
- return OCSD_OK;
-}
-
-/* End of File trc_component.cpp */
diff --git a/contrib/opencsd/decoder/source/trc_core_arch_map.cpp b/contrib/opencsd/decoder/source/trc_core_arch_map.cpp
deleted file mode 100644
index 70a25eef0359..000000000000
--- a/contrib/opencsd/decoder/source/trc_core_arch_map.cpp
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * \file trc_core_arch_map.cpp
- * \brief OpenCSD : Map core names to architecture profiles
- *
- * \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 "common/trc_core_arch_map.h"
-
-static struct _ap_map_elements {
- const char *name;
- ocsd_arch_profile_t ap;
-} ap_map_array[] =
-{
- { "Cortex-A77", { ARCH_V8r3, profile_CortexA } },
- { "Cortex-A76", { ARCH_V8r3, profile_CortexA } },
- { "Cortex-A75", { ARCH_V8r3, profile_CortexA } },
- { "Cortex-A73", { ARCH_V8, profile_CortexA } },
- { "Cortex-A72", { ARCH_V8, profile_CortexA } },
- { "Cortex-A65", { ARCH_V8r3, profile_CortexA } },
- { "Cortex-A57", { ARCH_V8, profile_CortexA } },
- { "Cortex-A55", { ARCH_V8r3, profile_CortexA } },
- { "Cortex-A53", { ARCH_V8, profile_CortexA } },
- { "Cortex-A35", { ARCH_V8, profile_CortexA } },
- { "Cortex-A32", { ARCH_V8, profile_CortexA } },
- { "Cortex-A17", { ARCH_V7, profile_CortexA } },
- { "Cortex-A15", { ARCH_V7, profile_CortexA } },
- { "Cortex-A12", { ARCH_V7, profile_CortexA } },
- { "Cortex-A9", { ARCH_V7, profile_CortexA } },
- { "Cortex-A8", { ARCH_V7, profile_CortexA } },
- { "Cortex-A7", { ARCH_V7, profile_CortexA } },
- { "Cortex-A5", { ARCH_V7, profile_CortexA } },
- { "Cortex-R52", { ARCH_V8, profile_CortexR } },
- { "Cortex-R8", { ARCH_V7, profile_CortexR } },
- { "Cortex-R7", { ARCH_V7, profile_CortexR } },
- { "Cortex-R5", { ARCH_V7, profile_CortexR } },
- { "Cortex-R4", { ARCH_V7, profile_CortexR } },
- { "Cortex-M33", { ARCH_V8, profile_CortexM } },
- { "Cortex-M23", { ARCH_V8, profile_CortexM } },
- { "Cortex-M0", { ARCH_V7, profile_CortexM } },
- { "Cortex-M0+", { ARCH_V7, profile_CortexM } },
- { "Cortex-M3", { ARCH_V7, profile_CortexM } },
- { "Cortex-M4", { ARCH_V7, profile_CortexM } }
-};
-
-CoreArchProfileMap::CoreArchProfileMap()
-{
- for(unsigned i = 0; i < sizeof(ap_map_array)/sizeof(_ap_map_elements); i++)
- {
- core_profiles[ap_map_array[i].name] = ap_map_array[i].ap;
- }
-}
-
-/* End of File trc_core_arch_map.cpp */
diff --git a/contrib/opencsd/decoder/source/trc_frame_deformatter.cpp b/contrib/opencsd/decoder/source/trc_frame_deformatter.cpp
deleted file mode 100644
index 4d46854a655b..000000000000
--- a/contrib/opencsd/decoder/source/trc_frame_deformatter.cpp
+++ /dev/null
@@ -1,869 +0,0 @@
-/*
- * \file trc_frame_deformatter.cpp
- * \brief OpenCSD :
- *
- * \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 <cstring>
-
-#include "common/trc_frame_deformatter.h"
-#include "trc_frame_deformatter_impl.h"
-
-/***************************************************************/
-/* Implementation */
-/***************************************************************/
-
-#ifdef __GNUC__
-// G++ doesn't like the ## pasting
-#define DEFORMATTER_NAME "DFMT_CSFRAMES"
-#else
-// VC is fine
-#define DEFORMATTER_NAME OCSD_CMPNAME_PREFIX_FRAMEDEFORMATTER##"_CSFRAMES"
-#endif
-
-TraceFmtDcdImpl::TraceFmtDcdImpl() : TraceComponent(DEFORMATTER_NAME),
- m_cfgFlags(0),
- m_force_sync_idx(0),
- m_use_force_sync(false),
- m_alignment(16), // assume frame aligned data as default.
- m_b_output_packed_raw(false),
- m_b_output_unpacked_raw(false)
-
-{
- resetStateParams();
- setRawChanFilterAll(true);
-}
-
-TraceFmtDcdImpl::TraceFmtDcdImpl(int instNum) : TraceComponent(DEFORMATTER_NAME, instNum),
- m_cfgFlags(0),
- m_force_sync_idx(0),
- m_use_force_sync(false),
- m_alignment(16)
-{
- resetStateParams();
- setRawChanFilterAll(true);
-}
-
-TraceFmtDcdImpl::~TraceFmtDcdImpl()
-{
-}
-
-ocsd_datapath_resp_t TraceFmtDcdImpl::TraceDataIn(
- const ocsd_datapath_op_t op,
- const ocsd_trc_index_t index,
- const uint32_t dataBlockSize,
- const uint8_t *pDataBlock,
- uint32_t *numBytesProcessed)
-{
- ocsd_datapath_resp_t resp = OCSD_RESP_FATAL_INVALID_OP;
- InitCollateDataPathResp();
-
- m_b_output_packed_raw = m_RawTraceFrame.num_attached() && ((m_cfgFlags & OCSD_DFRMTR_PACKED_RAW_OUT) != 0);
- m_b_output_unpacked_raw = m_RawTraceFrame.num_attached() && ((m_cfgFlags & OCSD_DFRMTR_UNPACKED_RAW_OUT) != 0);
-
- switch(op)
- {
- case OCSD_OP_RESET:
- resp = Reset();
- break;
-
- case OCSD_OP_FLUSH:
- resp = Flush();
- break;
-
- case OCSD_OP_EOT:
- // local 'flush' here?
- // pass on EOT to connected ID streams
- resp = executeNoneDataOpAllIDs(OCSD_OP_EOT);
- break;
-
- case OCSD_OP_DATA:
- if((dataBlockSize <= 0) || ( pDataBlock == 0) || (numBytesProcessed == 0))
- resp = OCSD_RESP_FATAL_INVALID_PARAM;
- else
- resp = processTraceData(index,dataBlockSize, pDataBlock, numBytesProcessed);
- break;
-
- default:
- break;
- }
-
- return resp;
-}
-
-/* enable / disable ID streams - default as all enabled */
-ocsd_err_t TraceFmtDcdImpl::OutputFilterIDs(std::vector<uint8_t> &id_list, bool bEnable)
-{
- ocsd_err_t err = OCSD_OK;
- std::vector<uint8_t>::iterator iter = id_list.begin();
- uint8_t id = 0;
-
- while((iter < id_list.end()) && (err == OCSD_OK))
- {
- id = *iter;
- if(id > 128)
- err = OCSD_ERR_INVALID_ID;
- else
- {
- m_IDStreams[id].set_enabled(bEnable);
- m_raw_chan_enable[id] = bEnable;
- }
- iter++;
- }
- return err;
-}
-
-ocsd_err_t TraceFmtDcdImpl::OutputFilterAllIDs(bool bEnable)
-{
- for(uint8_t id = 0; id < 128; id++)
- {
- m_IDStreams[id].set_enabled(bEnable);
- }
- setRawChanFilterAll(bEnable);
- return OCSD_OK;
-}
-
-void TraceFmtDcdImpl::setRawChanFilterAll(bool bEnable)
-{
- for(int i=0; i<128; i++)
- {
- m_raw_chan_enable[i] = bEnable;
- }
-}
-
-const bool TraceFmtDcdImpl::rawChanEnabled(const uint8_t id) const
-{
- if(id < 128)
- return m_raw_chan_enable[id];
- return false;
-}
-
-/* decode control */
-ocsd_datapath_resp_t TraceFmtDcdImpl::Reset()
-{
- resetStateParams();
- InitCollateDataPathResp();
- return executeNoneDataOpAllIDs(OCSD_OP_RESET);
-}
-
-ocsd_datapath_resp_t TraceFmtDcdImpl::Flush()
-{
- executeNoneDataOpAllIDs(OCSD_OP_FLUSH); // flush any upstream data.
- if(dataPathCont())
- outputFrame(); // try to flush any partial frame data remaining
- return highestDataPathResp();
-}
-
-ocsd_datapath_resp_t TraceFmtDcdImpl::executeNoneDataOpAllIDs(ocsd_datapath_op_t op,
- const ocsd_trc_index_t index /* = 0*/)
-{
- ITrcDataIn *pTrcComp = 0;
- for(uint8_t id = 0; id < 128; id++)
- {
- if(m_IDStreams[id].num_attached())
- {
- pTrcComp = m_IDStreams[id].first();
- while(pTrcComp)
- {
- CollateDataPathResp(pTrcComp->TraceDataIn(op,index,0,0,0));
- pTrcComp = m_IDStreams[id].next();
- }
- }
- }
-
- if( m_RawTraceFrame.num_attached())
- {
- if(m_RawTraceFrame.first())
- m_RawTraceFrame.first()->TraceRawFrameIn(op,0,OCSD_FRM_NONE,0,0,0);
- }
- return highestDataPathResp();
-}
-
-void TraceFmtDcdImpl::outputRawMonBytes(const ocsd_datapath_op_t op,
- const ocsd_trc_index_t index,
- const ocsd_rawframe_elem_t frame_element,
- const int dataBlockSize,
- const uint8_t *pDataBlock,
- const uint8_t traceID)
-{
- if( m_RawTraceFrame.num_attached())
- {
- if(m_RawTraceFrame.first())
- m_RawTraceFrame.first()->TraceRawFrameIn(op,index,frame_element,dataBlockSize, pDataBlock,traceID);
- }
-}
-
-void TraceFmtDcdImpl::CollateDataPathResp(const ocsd_datapath_resp_t resp)
-{
- // simple most severe error across multiple IDs.
- if(resp > m_highestResp) m_highestResp = resp;
-}
-
-ocsd_datapath_resp_t TraceFmtDcdImpl::processTraceData(
- const ocsd_trc_index_t index,
- const uint32_t dataBlockSize,
- const uint8_t *pDataBlock,
- uint32_t *numBytesProcessed
- )
-{
- try {
-
- if(!m_first_data) // is this the initial data block?
- {
- m_trc_curr_idx = index;
- }
- else
- {
- if(m_trc_curr_idx != index) // none continuous trace data - throw an error.
- throw ocsdError(OCSD_ERR_SEV_ERROR,OCSD_ERR_DFMTR_NOTCONTTRACE,index);
- }
-
- if(dataBlockSize % m_alignment) // must be correctly aligned data
- {
- ocsdError err(OCSD_ERR_SEV_ERROR, OCSD_ERR_INVALID_PARAM_VAL);
- char msg_buffer[64];
- sprintf(msg_buffer,"Input block incorrect size, must be %d byte multiple", m_alignment);
- err.setMessage(msg_buffer);
- throw ocsdError(&err);
- }
-
- // record the incoming block for extraction routines to use.
- m_in_block_base = pDataBlock;
- m_in_block_size = dataBlockSize;
- m_in_block_processed = 0;
-
- // processing loop...
- if(checkForSync())
- {
- bool bProcessing = true;
- while(bProcessing)
- {
- bProcessing = extractFrame(); // will stop on end of input data.
- if(bProcessing)
- bProcessing = unpackFrame();
- if(bProcessing)
- bProcessing = outputFrame(); // will stop on data path halt.
- }
- }
- }
- catch(const ocsdError &err) {
- LogError(err);
- CollateDataPathResp(OCSD_RESP_FATAL_INVALID_DATA);
- }
- catch(...) {
- LogError(ocsdError(OCSD_ERR_SEV_ERROR, OCSD_ERR_FAIL));
- CollateDataPathResp(OCSD_RESP_FATAL_SYS_ERR);
- }
-
- if(!m_first_data)
- m_first_data = true;
-
- // update the outputs.
- *numBytesProcessed = m_in_block_processed;
-
- return highestDataPathResp();
-}
-
-ocsd_err_t TraceFmtDcdImpl::DecodeConfigure(uint32_t flags)
-{
- const char *pszErrMsg = "";
- ocsd_err_t err = OCSD_OK;
-
- if((flags & ~OCSD_DFRMTR_VALID_MASK) != 0)
- {
- err = OCSD_ERR_INVALID_PARAM_VAL;
- pszErrMsg = "Unknown Config Flags";
- }
-
- if((flags & OCSD_DFRMTR_VALID_MASK) == 0)
- {
- err = OCSD_ERR_INVALID_PARAM_VAL;
- pszErrMsg = "No Config Flags Set";
- }
-
- if((flags & (OCSD_DFRMTR_HAS_FSYNCS | OCSD_DFRMTR_HAS_HSYNCS)) &&
- (flags & OCSD_DFRMTR_FRAME_MEM_ALIGN)
- )
- {
- err = OCSD_ERR_INVALID_PARAM_VAL;
- pszErrMsg = "Invalid Config Flag Combination Set";
- }
-
- if(err != OCSD_OK)
- {
- ocsdError errObj(OCSD_ERR_SEV_ERROR,OCSD_ERR_INVALID_PARAM_VAL);
- errObj.setMessage(pszErrMsg);
- LogError(errObj);
- }
- else
- {
- m_cfgFlags = flags;
- m_alignment = 16;
- if(flags & OCSD_DFRMTR_HAS_FSYNCS)
- m_alignment = 4;
- else if(flags & OCSD_DFRMTR_HAS_HSYNCS)
- m_alignment = 2;
- }
- return err;
-}
-
-void TraceFmtDcdImpl::resetStateParams()
-{
- // overall dynamic state - intra frame
- m_trc_curr_idx = OCSD_BAD_TRC_INDEX; /* source index of current trace data */
- m_frame_synced = false;
- m_first_data = false;
- m_curr_src_ID = OCSD_BAD_CS_SRC_ID;
-
- // current frame processing
- m_ex_frm_n_bytes = 0;
- m_trc_curr_idx_sof = OCSD_BAD_TRC_INDEX;
-}
-
-bool TraceFmtDcdImpl::checkForSync()
-{
- // we can sync on:-
- // 16 byte alignment - standard input buffers such as ETB
- // FSYNC packets in the stream
- // forced index programmed into the object.
- uint32_t unsynced_bytes = 0;
-
- if(!m_frame_synced)
- {
- if(m_use_force_sync)
- {
- // is the force sync point in this block?
- if((m_force_sync_idx >= m_trc_curr_idx) && (m_force_sync_idx < (m_trc_curr_idx + m_in_block_size)))
- {
- unsynced_bytes = m_force_sync_idx - m_trc_curr_idx;
- m_frame_synced = true;
- }
- else
- {
- unsynced_bytes = m_in_block_size;
- }
- }
- else if( m_cfgFlags & OCSD_DFRMTR_HAS_FSYNCS) // memory aligned data
- {
- unsynced_bytes = findfirstFSync();
-
- }
- else
- {
- // OCSD_DFRMTR_FRAME_MEM_ALIGN - this has guaranteed 16 byte frame size and alignment.
- m_frame_synced = true;
- }
-
- if(unsynced_bytes)
- {
- outputUnsyncedBytes(unsynced_bytes);
- m_in_block_processed = unsynced_bytes;
- m_trc_curr_idx += unsynced_bytes;
- }
- }
- return m_frame_synced;
-}
-
-uint32_t TraceFmtDcdImpl::findfirstFSync()
-{
- uint32_t processed = 0;
- const uint32_t FSYNC_PATTERN = 0x7FFFFFFF; // LE host pattern for FSYNC
- const uint8_t *dataPtr = m_in_block_base;
-
- while (processed < (m_in_block_size - 3))
- {
- if (*((uint32_t *)(dataPtr)) == FSYNC_PATTERN)
- {
- m_frame_synced = true;
- break;
- }
- processed++;
- dataPtr++;
- }
- return processed;
-}
-
-void TraceFmtDcdImpl::outputUnsyncedBytes(uint32_t /*num_bytes*/)
-{
- //**TBD:
-}
-
-int TraceFmtDcdImpl::checkForResetFSyncPatterns()
-{
- const uint32_t FSYNC_PATTERN = 0x7FFFFFFF; // LE host pattern for FSYNC
- bool check_for_fsync = true;
- int num_fsyncs = 0;
- const uint8_t *dataPtr = m_in_block_base + m_in_block_processed;
-
- while (check_for_fsync && (m_in_block_processed < m_in_block_size))
- {
- // look for consecutive fsyncs as padding or for reset downstream - both cases will reset downstream....
- if (*((uint32_t *)(dataPtr)) == FSYNC_PATTERN)
- {
- dataPtr += sizeof(uint32_t);
- num_fsyncs++;
- }
- else
- check_for_fsync = false;
- }
-
- if (num_fsyncs)
- {
- printf("Frame deformatter: Found %d FSYNCS\n",num_fsyncs);
- if ((num_fsyncs % 4) == 0)
- {
- // reset the upstream decoders
- executeNoneDataOpAllIDs(OCSD_OP_RESET,m_trc_curr_idx);
-
- // reset the intra frame parameters
- m_curr_src_ID = OCSD_BAD_CS_SRC_ID;
- m_ex_frm_n_bytes = 0;
- m_trc_curr_idx_sof = OCSD_BAD_TRC_INDEX;
- }
- else
- {
- // TBD: throw processing error, none frame size block of fsyncs
- }
- }
- return num_fsyncs * 4;
-}
-
-
-bool TraceFmtDcdImpl::extractFrame()
-{
- const uint32_t FSYNC_PATTERN = 0x7FFFFFFF; // LE host pattern for FSYNC
- const uint16_t HSYNC_PATTERN = 0x7FFF; // LE host pattern for HSYNC
-
-
- bool cont_process = true; // continue processing after extraction.
- uint32_t f_sync_bytes = 0; // skipped f sync bytes
- uint32_t h_sync_bytes = 0; // skipped h sync bytes
- uint32_t ex_bytes = 0; // extracted this pass (may be filling out part frame)
-
- // memory aligned sources are always multiples of frames, aligned to start.
- if( m_cfgFlags & OCSD_DFRMTR_FRAME_MEM_ALIGN)
- {
- // some linux drivers (e.g. for perf) will insert FSYNCS to pad or differentiate
- // between blocks of aligned data, always in frame aligned complete 16 byte frames.
- if (m_cfgFlags & OCSD_DFRMTR_RESET_ON_4X_FSYNC)
- {
- f_sync_bytes = checkForResetFSyncPatterns();
-
- /* in this case the FSYNC pattern is output on both packed and unpacked cases */
- if (f_sync_bytes && (m_b_output_packed_raw || m_b_output_unpacked_raw))
- {
- outputRawMonBytes(OCSD_OP_DATA,
- m_trc_curr_idx,
- OCSD_FRM_FSYNC,
- f_sync_bytes,
- m_in_block_base + m_in_block_processed,
- 0);
- }
- }
-
- if((m_in_block_processed+f_sync_bytes) == m_in_block_size)
- {
- m_ex_frm_n_bytes = 0;
- cont_process = false; // end of input data.
- }
- else
- {
- // always a complete frame.
- m_ex_frm_n_bytes = OCSD_DFRMTR_FRAME_SIZE;
- memcpy(m_ex_frm_data, m_in_block_base + m_in_block_processed + f_sync_bytes, m_ex_frm_n_bytes);
- m_trc_curr_idx_sof = m_trc_curr_idx + f_sync_bytes;
- ex_bytes = OCSD_DFRMTR_FRAME_SIZE;
- }
- }
- else
- {
- // extract data accounting for frame syncs and hsyncs if present.
- // we know we are aligned at this point - could be FSYNC or HSYNCs here.
-
- // check what we a looking for
- bool hasFSyncs = ((m_cfgFlags & OCSD_DFRMTR_HAS_FSYNCS) == OCSD_DFRMTR_HAS_FSYNCS);
- bool hasHSyncs = ((m_cfgFlags & OCSD_DFRMTR_HAS_HSYNCS) == OCSD_DFRMTR_HAS_HSYNCS);
-
- const uint8_t *dataPtr = m_in_block_base+m_in_block_processed;
- const uint8_t *eodPtr = m_in_block_base+m_in_block_size;
-
- cont_process = (bool)(dataPtr < eodPtr);
-
- // can have FSYNCS at start of frame (in middle is an error).
- if(hasFSyncs && cont_process && (m_ex_frm_n_bytes == 0))
- {
- while((*((uint32_t *)(dataPtr)) == FSYNC_PATTERN) && cont_process)
- {
- f_sync_bytes += 4;
- dataPtr += 4;
- cont_process = (bool)(dataPtr < eodPtr);
- }
- }
-
- // not an FSYNC
- while((m_ex_frm_n_bytes < OCSD_DFRMTR_FRAME_SIZE) && cont_process)
- {
- // check for illegal out of sequence FSYNC
- if((m_ex_frm_n_bytes % 4) == 0)
- {
- if(*((uint32_t *)(dataPtr)) == FSYNC_PATTERN)
- {
- // throw an illegal FSYNC error
- throw ocsdError(OCSD_ERR_SEV_ERROR, OCSD_ERR_DFMTR_BAD_FHSYNC, m_trc_curr_idx, "Bad FSYNC in frame.");
- }
- }
-
- // mark start of frame after FSyncs
- if(m_ex_frm_n_bytes == 0)
- m_trc_curr_idx_sof = m_trc_curr_idx + f_sync_bytes;
-
- m_ex_frm_data[m_ex_frm_n_bytes] = dataPtr[0];
- m_ex_frm_data[m_ex_frm_n_bytes+1] = dataPtr[1];
- m_ex_frm_n_bytes+=2;
- ex_bytes +=2;
-
- // check pair is not HSYNC
- if(*((uint16_t *)(dataPtr)) == HSYNC_PATTERN)
- {
- if(hasHSyncs)
- {
- m_ex_frm_n_bytes-=2;
- ex_bytes -= 2;
- h_sync_bytes+=2;
- }
- else
- {
- // throw illegal HSYNC error.
- throw ocsdError(OCSD_ERR_SEV_ERROR, OCSD_ERR_DFMTR_BAD_FHSYNC, m_trc_curr_idx, "Bad HSYNC in frame.");
- }
- }
-
- dataPtr += 2;
- cont_process = (bool)(dataPtr < eodPtr);
- }
-
- // if we hit the end of data but still have a complete frame waiting,
- // need to continue processing to allow it to be used.
- if(!cont_process && (m_ex_frm_n_bytes == OCSD_DFRMTR_FRAME_SIZE))
- cont_process = true;
- }
-
- // total bytes processed this pass
- uint32_t total_processed = ex_bytes + f_sync_bytes + h_sync_bytes;
-
- // output raw data on raw frame channel - packed raw.
- if (((m_ex_frm_n_bytes == OCSD_DFRMTR_FRAME_SIZE) || !cont_process) && m_b_output_packed_raw)
- {
- outputRawMonBytes( OCSD_OP_DATA,
- m_trc_curr_idx,
- OCSD_FRM_PACKED,
- total_processed,
- m_in_block_base+m_in_block_processed,
- 0);
- }
-
- // update the processed count for the buffer
- m_in_block_processed += total_processed;
-
- // update index past the processed data
- m_trc_curr_idx += total_processed;
-
- return cont_process;
-}
-
-bool TraceFmtDcdImpl::unpackFrame()
-{
- // unpack cannot fail as never called on incomplete frame.
- uint8_t frameFlagBit = 0x1;
- uint8_t newSrcID = OCSD_BAD_CS_SRC_ID;
- bool PrevIDandIDChange = false;
-
- // init output processing
- m_out_data_idx = 0;
- m_out_processed = 0;
-
- // set up first out data packet...
- m_out_data[m_out_data_idx].id = m_curr_src_ID;
- m_out_data[m_out_data_idx].valid = 0;
- m_out_data[m_out_data_idx].index = m_trc_curr_idx_sof;
- m_out_data[m_out_data_idx].used = 0;
-
- // work on byte pairs - bytes 0 - 13.
- for(int i = 0; i < 14; i+=2)
- {
- PrevIDandIDChange = false;
-
- // it's an ID + data
- if(m_ex_frm_data[i] & 0x1)
- {
- newSrcID = (m_ex_frm_data[i] >> 1) & 0x7f;
- if(newSrcID != m_curr_src_ID) // ID change
- {
- PrevIDandIDChange = ((frameFlagBit & m_ex_frm_data[15]) != 0);
-
- // following byte for old id?
- if(PrevIDandIDChange)
- // 2nd byte always data
- m_out_data[m_out_data_idx].data[m_out_data[m_out_data_idx].valid++] = m_ex_frm_data[i+1];
-
- // change ID
- m_curr_src_ID = newSrcID;
-
- // if we already have data in this buffer
- if(m_out_data[m_out_data_idx].valid > 0)
- {
- m_out_data_idx++; // move to next buffer
- m_out_data[m_out_data_idx].valid = 0;
- m_out_data[m_out_data_idx].used = 0;
- m_out_data[m_out_data_idx].index = m_trc_curr_idx_sof + i;
- }
-
- // set new ID on buffer
- m_out_data[m_out_data_idx].id = m_curr_src_ID;
-
- /// TBD - ID indexing in here.
- }
- }
- else
- // it's just data
- {
- m_out_data[m_out_data_idx].data[m_out_data[m_out_data_idx].valid++] = m_ex_frm_data[i] | ((frameFlagBit & m_ex_frm_data[15]) ? 0x1 : 0x0);
- }
-
- // 2nd byte always data
- if(!PrevIDandIDChange) // output only if we didn't for an ID change + prev ID.
- m_out_data[m_out_data_idx].data[m_out_data[m_out_data_idx].valid++] = m_ex_frm_data[i+1];
-
- frameFlagBit <<= 1;
- }
-
- // unpack byte 14;
-
- // it's an ID
- if(m_ex_frm_data[14] & 0x1)
- {
- // no matter if change or not, no associated data in byte 15 anyway so just set.
- m_curr_src_ID = (m_ex_frm_data[14] >> 1) & 0x7f;
- }
- // it's data
- else
- {
- m_out_data[m_out_data_idx].data[m_out_data[m_out_data_idx].valid++] = m_ex_frm_data[14] | ((frameFlagBit & m_ex_frm_data[15]) ? 0x1 : 0x0);
- }
- m_ex_frm_n_bytes = 0; // mark frame as empty;
- return true;
-}
-
-// output data to channels.
-bool TraceFmtDcdImpl::outputFrame()
-{
- bool cont_processing = true;
- ITrcDataIn *pDataIn = 0;
- uint32_t bytes_used;
-
- // output each valid ID within the frame - stopping if we get a wait or error
- while((m_out_processed < (m_out_data_idx + 1)) && cont_processing)
- {
-
- // may have data prior to a valid ID appearing
- if(m_out_data[m_out_processed].id != OCSD_BAD_CS_SRC_ID)
- {
- if((pDataIn = m_IDStreams[m_out_data[m_out_processed].id].first()) != 0)
- {
- // log the stuff we are about to put out early so as to make it visible before interpretation
- // however, don't re-output if only part used first time round.
- if(m_b_output_unpacked_raw && (m_out_data[m_out_processed].used == 0) && rawChanEnabled( m_out_data[m_out_processed].id))
- {
- outputRawMonBytes( OCSD_OP_DATA,
- m_out_data[m_out_processed].index,
- OCSD_FRM_ID_DATA,
- m_out_data[m_out_processed].valid,
- m_out_data[m_out_processed].data,
- m_out_data[m_out_processed].id);
- }
-
- // output to the connected packet process
- CollateDataPathResp(pDataIn->TraceDataIn(OCSD_OP_DATA,
- m_out_data[m_out_processed].index + m_out_data[m_out_processed].used,
- m_out_data[m_out_processed].valid - m_out_data[m_out_processed].used,
- m_out_data[m_out_processed].data + m_out_data[m_out_processed].used,
- &bytes_used));
-
- if(!dataPathCont())
- {
- cont_processing = false;
- m_out_data[m_out_processed].used += bytes_used;
- if(m_out_data[m_out_processed].used == m_out_data[m_out_processed].valid)
- m_out_processed++; // we have used up all this data.
- }
- else
- {
- m_out_processed++; // we have sent this data;
- }
- }
- else
- {
- // optional raw output for debugging / monitor tools
- if(m_b_output_unpacked_raw && rawChanEnabled( m_out_data[m_out_processed].id))
- {
- outputRawMonBytes( OCSD_OP_DATA,
- m_out_data[m_out_processed].index,
- OCSD_FRM_ID_DATA,
- m_out_data[m_out_processed].valid,
- m_out_data[m_out_processed].data,
- m_out_data[m_out_processed].id);
- }
- m_out_processed++; // skip past this data.
- }
- }
- else
- {
- // optional raw output for debugging / monitor tools of unknown src ID data
- if(m_b_output_unpacked_raw)
- {
- outputRawMonBytes( OCSD_OP_DATA,
- m_out_data[m_out_processed].index,
- OCSD_FRM_ID_DATA,
- m_out_data[m_out_processed].valid,
- m_out_data[m_out_processed].data,
- m_out_data[m_out_processed].id);
- }
- m_out_processed++; // skip past this data.
- }
- }
- return cont_processing;
-}
-
-/***************************************************************/
-/* interface */
-/***************************************************************/
-TraceFormatterFrameDecoder::TraceFormatterFrameDecoder() : m_pDecoder(0)
-{
- m_instNum = -1;
-}
-
-TraceFormatterFrameDecoder::TraceFormatterFrameDecoder(int instNum) : m_pDecoder(0)
-{
- m_instNum = instNum;
-}
-
-TraceFormatterFrameDecoder::~TraceFormatterFrameDecoder()
-{
- if(m_pDecoder)
- {
- delete m_pDecoder;
- m_pDecoder = 0;
- }
-}
-
- /* the data input interface from the reader / source */
-ocsd_datapath_resp_t TraceFormatterFrameDecoder::TraceDataIn( const ocsd_datapath_op_t op,
- const ocsd_trc_index_t index,
- const uint32_t dataBlockSize,
- const uint8_t *pDataBlock,
- uint32_t *numBytesProcessed)
-{
- return (m_pDecoder == 0) ? OCSD_RESP_FATAL_NOT_INIT : m_pDecoder->TraceDataIn(op,index,dataBlockSize,pDataBlock,numBytesProcessed);
-}
-
-/* attach a data processor to a stream ID output */
-componentAttachPt<ITrcDataIn> *TraceFormatterFrameDecoder::getIDStreamAttachPt(uint8_t ID)
-{
- componentAttachPt<ITrcDataIn> *pAttachPt = 0;
- if((ID < 128) && (m_pDecoder != 0))
- pAttachPt = &(m_pDecoder->m_IDStreams[ID]);
- return pAttachPt;
-}
-
-/* attach a data processor to the raw frame output */
-componentAttachPt<ITrcRawFrameIn> *TraceFormatterFrameDecoder::getTrcRawFrameAttachPt()
-{
- return (m_pDecoder != 0) ? &m_pDecoder->m_RawTraceFrame : 0;
-}
-
-
-componentAttachPt<ITrcSrcIndexCreator> *TraceFormatterFrameDecoder::getTrcSrcIndexAttachPt()
-{
- return (m_pDecoder != 0) ? &m_pDecoder->m_SrcIndexer : 0;
-}
-
-componentAttachPt<ITraceErrorLog> *TraceFormatterFrameDecoder::getErrLogAttachPt()
-{
- return (m_pDecoder != 0) ? m_pDecoder->getErrorLogAttachPt() : 0;
-}
-
-/* configuration - set operational mode for incoming stream (has FSYNCS etc) */
-ocsd_err_t TraceFormatterFrameDecoder::Configure(uint32_t cfg_flags)
-{
- if(!m_pDecoder)
- {
- if(m_instNum >= 0)
- m_pDecoder = new (std::nothrow) TraceFmtDcdImpl(m_instNum);
- else
- m_pDecoder = new (std::nothrow) TraceFmtDcdImpl();
- if(!m_pDecoder) return OCSD_ERR_MEM;
- }
- m_pDecoder->DecodeConfigure(cfg_flags);
- return OCSD_OK;
-}
-
-const uint32_t TraceFormatterFrameDecoder::getConfigFlags() const
-{
- uint32_t flags = 0;
- if(m_pDecoder)
- flags = m_pDecoder->m_cfgFlags;
- return flags;
-}
-
-
-/* enable / disable ID streams - default as all enabled */
-ocsd_err_t TraceFormatterFrameDecoder::OutputFilterIDs(std::vector<uint8_t> &id_list, bool bEnable)
-{
- return (m_pDecoder == 0) ? OCSD_ERR_NOT_INIT : m_pDecoder->OutputFilterIDs(id_list,bEnable);
-}
-
-ocsd_err_t TraceFormatterFrameDecoder::OutputFilterAllIDs(bool bEnable)
-{
- return (m_pDecoder == 0) ? OCSD_ERR_NOT_INIT : m_pDecoder->OutputFilterAllIDs(bEnable);
-}
-
-/* decode control */
-ocsd_datapath_resp_t TraceFormatterFrameDecoder::Reset()
-{
- return (m_pDecoder == 0) ? OCSD_RESP_FATAL_NOT_INIT : m_pDecoder->Reset();
-}
-
-ocsd_datapath_resp_t TraceFormatterFrameDecoder::Flush()
-{
- return (m_pDecoder == 0) ? OCSD_RESP_FATAL_NOT_INIT : m_pDecoder->Flush();
-}
-
-
-/* End of File trc_frame_deformatter.cpp */
diff --git a/contrib/opencsd/decoder/source/trc_frame_deformatter_impl.h b/contrib/opencsd/decoder/source/trc_frame_deformatter_impl.h
deleted file mode 100644
index e1fc17ab259f..000000000000
--- a/contrib/opencsd/decoder/source/trc_frame_deformatter_impl.h
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * \file trc_frame_decoder_impl.h
- * \brief OpenCSD : Trace Deformatter implementation.
- *
- * \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.
- */
-
-#ifndef ARM_TRC_FRAME_DECODER_IMPL_H_INCLUDED
-#define ARM_TRC_FRAME_DECODER_IMPL_H_INCLUDED
-
-#include "opencsd/ocsd_if_types.h"
-#include "common/comp_attach_pt_t.h"
-#include "interfaces/trc_data_raw_in_i.h"
-#include "interfaces/trc_data_rawframe_in_i.h"
-#include "interfaces/trc_indexer_src_i.h"
-#include "common/trc_component.h"
-
-//! output data fragment from the current frame - collates bytes associated with an ID.
-typedef struct _out_chan_data {
- ocsd_trc_index_t index; //!< trace source index for start of these bytes
- uint8_t id; //!< Id for these bytes
- uint8_t data[15]; //!< frame data bytes for this ID
- uint32_t valid; //!< Valid data bytes.
- uint32_t used; //!< Data bytes output (used by attached processor).
-} out_chan_data;
-
-class TraceFmtDcdImpl : public TraceComponent, ITrcDataIn
-{
-private:
- TraceFmtDcdImpl();
- TraceFmtDcdImpl(int instNum);
- virtual ~TraceFmtDcdImpl();
-
- /* the data input interface from the reader */
- virtual ocsd_datapath_resp_t TraceDataIn( const ocsd_datapath_op_t op,
- const ocsd_trc_index_t index,
- const uint32_t dataBlockSize,
- const uint8_t *pDataBlock,
- uint32_t *numBytesProcessed);
-
- /* enable / disable ID streams - default as all enabled */
- ocsd_err_t OutputFilterIDs(std::vector<uint8_t> &id_list, bool bEnable);
- ocsd_err_t OutputFilterAllIDs(bool bEnable);
-
- /* decode control */
- ocsd_datapath_resp_t Reset(); /* reset the decode to the start state, drop partial data - propogate to attached components */
- ocsd_datapath_resp_t Flush();
- ocsd_err_t DecodeConfigure(uint32_t flags);
- ocsd_err_t SetForcedSyncIndex(ocsd_trc_index_t index, bool bSet);
-
-private:
- ocsd_datapath_resp_t executeNoneDataOpAllIDs(ocsd_datapath_op_t op, const ocsd_trc_index_t index = 0);
- ocsd_datapath_resp_t processTraceData(const ocsd_trc_index_t index,
- const uint32_t dataBlockSize,
- const uint8_t *pDataBlock,
- uint32_t *numBytesProcessed);
- // process phases
- bool checkForSync(); // find the sync point in the incoming block
- bool extractFrame(); // extract the frame data from incoming stream
- bool unpackFrame(); // process a complete frame.
- bool outputFrame(); // output data to channels.
-
-
- // managing data path responses.
- void InitCollateDataPathResp() { m_highestResp = OCSD_RESP_CONT; };
- void CollateDataPathResp(const ocsd_datapath_resp_t resp);
- const ocsd_datapath_resp_t highestDataPathResp() const { return m_highestResp; };
- const bool dataPathCont() const { return (bool)(m_highestResp < OCSD_RESP_WAIT); };
-
- // deformat state
- void resetStateParams();
-
- // synchronisation
- uint32_t findfirstFSync();
- void outputUnsyncedBytes(uint32_t num_bytes); // output bytes as unsynced from current buffer position.
-
- // output bytes to raw frame monitor
- void outputRawMonBytes(const ocsd_datapath_op_t op,
- const ocsd_trc_index_t index,
- const ocsd_rawframe_elem_t frame_element,
- const int dataBlockSize,
- const uint8_t *pDataBlock,
- const uint8_t traceID);
-
-
- void setRawChanFilterAll(bool bEnable);
- const bool rawChanEnabled(const uint8_t id) const;
-
- int checkForResetFSyncPatterns();
-
- friend class TraceFormatterFrameDecoder;
-
- // attachment points
-
- componentAttachPt<ITrcDataIn> m_IDStreams[128];
- componentAttachPt<ITrcRawFrameIn> m_RawTraceFrame;
-
- componentAttachPt<ITrcSrcIndexCreator> m_SrcIndexer;
-
-
- ocsd_datapath_resp_t m_highestResp;
-
- /* static configuration */
- uint32_t m_cfgFlags; /* configuration flags */
- ocsd_trc_index_t m_force_sync_idx;
- bool m_use_force_sync;
- uint32_t m_alignment;
-
- /* dynamic state */
- ocsd_trc_index_t m_trc_curr_idx; /* index of current trace data */
- bool m_frame_synced;
- bool m_first_data;
- uint8_t m_curr_src_ID;
-
- // incoming frame buffer
- uint8_t m_ex_frm_data[OCSD_DFRMTR_FRAME_SIZE]; // buffer the current frame in case we have to stop part way through
- int m_ex_frm_n_bytes; // number of valid bytes in the current frame (extraction)
- ocsd_trc_index_t m_trc_curr_idx_sof; // trace source index at start of frame.
-
- // channel output data - can never be more than a frame of data for a single ID.
- out_chan_data m_out_data[7]; // can only be 8 ID changes in a frame, but last on has no associated data so 7 possible data blocks
- int m_out_data_idx; // number of out_chan_data frames used.
- int m_out_processed; // number of complete out_chan_data frames output.
-
- /* local copy of input buffer pointers*/
- const uint8_t *m_in_block_base;
- uint32_t m_in_block_size;
- uint32_t m_in_block_processed;
-
- /* raw output options */
- bool m_b_output_packed_raw;
- bool m_b_output_unpacked_raw;
-
- bool m_raw_chan_enable[128];
-};
-
-
-#endif // ARM_TRC_FRAME_DECODER_IMPL_H_INCLUDED
-
-/* End of File trc_frame_decoder_impl.h */
diff --git a/contrib/opencsd/decoder/source/trc_gen_elem.cpp b/contrib/opencsd/decoder/source/trc_gen_elem.cpp
deleted file mode 100644
index b3ec75f059d4..000000000000
--- a/contrib/opencsd/decoder/source/trc_gen_elem.cpp
+++ /dev/null
@@ -1,259 +0,0 @@
-/*
- * \file trc_gen_elem.cpp
- * \brief OpenCSD :
- *
- * \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 "common/trc_gen_elem.h"
-
-#include <string>
-#include <sstream>
-#include <iomanip>
-
-static const char *s_elem_descs[][2] =
-{
- {"OCSD_GEN_TRC_ELEM_UNKNOWN","Unknown trace element - default value or indicate error in stream to client."},
- {"OCSD_GEN_TRC_ELEM_NO_SYNC","Waiting for sync - either at start of decode, or after overflow / bad packet"},
- {"OCSD_GEN_TRC_ELEM_TRACE_ON","Start of trace - beginning of elements or restart after discontinuity (overflow, trace filtering)."},
- {"OCSD_GEN_TRC_ELEM_EO_TRACE","End of the available trace in the buffer."},
- {"OCSD_GEN_TRC_ELEM_PE_CONTEXT","PE status update / change (arch, ctxtid, vmid etc)."},
- {"OCSD_GEN_TRC_ELEM_INSTR_RANGE","Traced N consecutive instructions from addr (no intervening events or data elements), may have data assoc key"},
- {"OCSD_GEN_TRC_ELEM_ADDR_NACC","Tracing in inaccessible memory area."},
- {"OCSD_GEN_TRC_ELEM_ADDR_UNKNOWN","Tracing unknown address area."},
- {"OCSD_GEN_TRC_ELEM_EXCEPTION","Exception"},
- {"OCSD_GEN_TRC_ELEM_EXCEPTION_RET","Exception return"},
- {"OCSD_GEN_TRC_ELEM_TIMESTAMP","Timestamp - preceding elements happeded before this time."},
- {"OCSD_GEN_TRC_ELEM_CYCLE_COUNT","Cycle count - cycles since last cycle count value - associated with a preceding instruction range."},
- {"OCSD_GEN_TRC_ELEM_EVENT","Event - numbered event or trigger"},
- {"OCSD_GEN_TRC_ELEM_SWTRACE","Software trace packet - may contain data payload."},
- {"OCSD_GEN_TRC_ELEM_CUSTOM","Fully custom packet type."}
-};
-
-static const char *instr_type[] = {
- "--- ",
- "BR ",
- "iBR ",
- "ISB ",
- "DSB.DMB"
-};
-
-#define T_SIZE (sizeof(instr_type) / sizeof(const char *))
-
-static const char *instr_sub_type[] = {
- "--- ",
- "b+link ",
- "A64:ret ",
- "A64:eret ",
- "V7:impl ret",
-};
-
-#define ST_SIZE (sizeof(instr_sub_type) / sizeof(const char *))
-
-static const char *s_trace_on_reason[] = {
- "begin or filter",
- "overflow",
- "debug restart"
-};
-
-
-static const char *s_isa_str[] = {
- "A32", /**< V7 ARM 32, V8 AArch32 */
- "T32", /**< Thumb2 -> 16/32 bit instructions */
- "A64", /**< V8 AArch64 */
- "TEE", /**< Thumb EE - unsupported */
- "Jaz", /**< Jazelle - unsupported in trace */
- "Cst", /**< ISA custom */
- "Unk" /**< ISA not yet known */
-};
-
-void OcsdTraceElement::toString(std::string &str) const
-{
- std::ostringstream oss;
- int num_str = ((sizeof(s_elem_descs) / sizeof(const char *)) / 2);
- int typeIdx = (int)this->elem_type;
- if(typeIdx < num_str)
- {
- oss << s_elem_descs[typeIdx][0] << "(";
- switch(elem_type)
- {
- case OCSD_GEN_TRC_ELEM_INSTR_RANGE:
- oss << "exec range=0x" << std::hex << st_addr << ":[0x" << en_addr << "] ";
- oss << "num_i(" << std::dec << num_instr_range << ") ";
- oss << "last_sz(" << last_instr_sz << ") ";
- oss << "(ISA=" << s_isa_str[(int)isa] << ") ";
- oss << ((last_instr_exec == 1) ? "E " : "N ");
- if((int)last_i_type < T_SIZE)
- oss << instr_type[last_i_type];
- if((last_i_subtype != OCSD_S_INSTR_NONE) && ((int)last_i_subtype < ST_SIZE))
- oss << instr_sub_type[last_i_subtype];
- if (last_instr_cond)
- oss << " <cond>";
- break;
-
- case OCSD_GEN_TRC_ELEM_ADDR_NACC:
- oss << " 0x" << std::hex << st_addr << " ";
- break;
-
- case OCSD_GEN_TRC_ELEM_EXCEPTION:
- if (excep_ret_addr == 1)
- {
- oss << "pref ret addr:0x" << std::hex << en_addr;
- if (excep_ret_addr_br_tgt)
- {
- oss << " [addr also prev br tgt]";
- }
- oss << "; ";
- }
- oss << "excep num (0x" << std::setfill('0') << std::setw(2) << std::hex << exception_number << ") ";
- break;
-
- case OCSD_GEN_TRC_ELEM_PE_CONTEXT:
- oss << "(ISA=" << s_isa_str[(int)isa] << ") ";
- if((context.exception_level > ocsd_EL_unknown) && (context.el_valid))
- {
- oss << "EL" << std::dec << (int)(context.exception_level);
- }
- oss << (context.security_level == ocsd_sec_secure ? "S; " : "N; ") << (context.bits64 ? "64-bit; " : "32-bit; ");
- if(context.vmid_valid)
- oss << "VMID=0x" << std::hex << context.vmid << "; ";
- if(context.ctxt_id_valid)
- oss << "CTXTID=0x" << std::hex << context.context_id << "; ";
- break;
-
- case OCSD_GEN_TRC_ELEM_TRACE_ON:
- oss << " [" << s_trace_on_reason[trace_on_reason] << "]";
- break;
-
- case OCSD_GEN_TRC_ELEM_TIMESTAMP:
- oss << " [ TS=0x" << std::setfill('0') << std::setw(12) << std::hex << timestamp << "]; ";
- break;
-
- case OCSD_GEN_TRC_ELEM_SWTRACE:
- printSWInfoPkt(oss);
- break;
-
- case OCSD_GEN_TRC_ELEM_EVENT:
- if(trace_event.ev_type == EVENT_TRIGGER)
- oss << " Trigger; ";
- else if(trace_event.ev_type == EVENT_NUMBERED)
- oss << " Numbered:" << std::dec << trace_event.ev_number << "; ";
- break;
-
- default: break;
- }
- if(has_cc)
- oss << std::dec << " [CC=" << cycle_count << "]; ";
- oss << ")";
- }
- else
- {
- oss << "OCSD_GEN_TRC_ELEM??: index out of range.";
- }
- str = oss.str();
-}
-
-OcsdTraceElement &OcsdTraceElement::operator =(const ocsd_generic_trace_elem* p_elem)
-{
- *dynamic_cast<ocsd_generic_trace_elem*>(this) = *p_elem;
- return *this;
-}
-
-
-void OcsdTraceElement::printSWInfoPkt(std::ostringstream & oss) const
-{
- if (!sw_trace_info.swt_global_err)
- {
- if (sw_trace_info.swt_id_valid)
- {
- oss << " (Ma:0x" << std::setfill('0') << std::setw(2) << std::hex << sw_trace_info.swt_master_id << "; ";
- oss << "Ch:0x" << std::setfill('0') << std::setw(2) << std::hex << sw_trace_info.swt_channel_id << ") ";
- }
- else
- oss << "(Ma:0x??; Ch:0x??" << ") ";
-
- if (sw_trace_info.swt_payload_pkt_bitsize > 0)
- {
- oss << "0x" << std::setfill('0') << std::hex;
- if (sw_trace_info.swt_payload_pkt_bitsize == 4)
- {
- oss << std::setw(1);
- oss << (uint16_t)(((uint8_t *)ptr_extended_data)[0] & 0xF);
- }
- else
- {
- switch (sw_trace_info.swt_payload_pkt_bitsize)
- {
- case 8:
- // force uint8 to uint16 so oss 'sees' them as something to be stringised, rather than absolute char values
- oss << std::setw(2) << (uint16_t)((uint8_t *)ptr_extended_data)[0];
- break;
- case 16:
- oss << std::setw(4) << ((uint16_t *)ptr_extended_data)[0];
- break;
- case 32:
- oss << std::setw(8) << ((uint32_t *)ptr_extended_data)[0];
- break;
- case 64:
- oss << std::setw(16) << ((uint64_t *)ptr_extended_data)[0];
- break;
- default:
- oss << "{Data Error : unsupported bit width.}";
- break;
- }
- }
- oss << "; ";
- }
- if (sw_trace_info.swt_marker_packet)
- oss << "+Mrk ";
- if (sw_trace_info.swt_trigger_event)
- oss << "Trig ";
- if (sw_trace_info.swt_has_timestamp)
- oss << " [ TS=0x" << std::setfill('0') << std::setw(12) << std::hex << timestamp << "]; ";
- if (sw_trace_info.swt_frequency)
- oss << "Freq";
- if (sw_trace_info.swt_master_err)
- oss << "{Master Error.}";
- }
- else
- {
- oss << "{Global Error.}";
- }
-}
-
-/*
-void OcsdTraceElement::toString(const ocsd_generic_trace_elem *p_elem, std::string &str)
-{
- OcsdTraceElement elem;
- elem = p_elem;
- elem.toString(str);
-}
-*/
-/* End of File trc_gen_elem.cpp */
diff --git a/contrib/opencsd/decoder/source/trc_printable_elem.cpp b/contrib/opencsd/decoder/source/trc_printable_elem.cpp
deleted file mode 100644
index 88c7bb226f41..000000000000
--- a/contrib/opencsd/decoder/source/trc_printable_elem.cpp
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * \file trc_printable_elem.cpp
- * \brief OpenCSD :
- *
- * \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 "common/trc_printable_elem.h"
-#include <cassert>
-#include <cstring>
-#if defined(_MSC_VER) && (_MSC_VER < 1900)
- /** VS2010 does not support inttypes - remove when VS2010 support is dropped */
-#define __PRI64_PREFIX "ll"
-#define PRIX64 __PRI64_PREFIX "X"
-#define PRIu64 __PRI64_PREFIX "u"
-#define PRIu32 "u"
-#else
-#include <cinttypes>
-#endif
-
-void trcPrintableElem::getValStr(std::string &valStr, const int valTotalBitSize, const int valValidBits, const uint64_t value, const bool asHex /* = true*/, const int updateBits /* = 0*/)
-{
- static char szStrBuffer[128];
- static char szFormatBuffer[32];
-
- assert((valTotalBitSize >= 4) && (valTotalBitSize <= 64));
-
- uint64_t LimitMask = ~0ULL;
- LimitMask >>= 64-valTotalBitSize;
- valStr = "0x";
-
- if(asHex)
- {
- int numHexChars = valTotalBitSize / 4;
- numHexChars += ((valTotalBitSize % 4) > 0) ? 1 : 0;
-
- int validChars = valValidBits / 4;
- if((valValidBits % 4) > 0) validChars++;
- if (validChars < numHexChars)
- {
- int QM = numHexChars - validChars;
- while (QM)
- {
- QM--;
- valStr += "?";
- }
- }
- if(valValidBits > 32)
- {
- sprintf(szFormatBuffer,"%%0%dllX",validChars); // create the format
- sprintf(szStrBuffer,szFormatBuffer,value); // fill the buffer
- }
- else
- {
- sprintf(szFormatBuffer,"%%0%dlX",validChars); // create the format
- sprintf(szStrBuffer,szFormatBuffer,(uint32_t)value); // fill the buffer
- }
- valStr+=szStrBuffer;
- if(valValidBits < valTotalBitSize)
- {
- sprintf(szStrBuffer," (%d:0)", valValidBits-1);
- valStr+=szStrBuffer;
- }
-
- if(updateBits)
- {
- uint64_t updateMask = ~0ULL;
- updateMask >>= 64-updateBits;
- sprintf(szStrBuffer," ~[0x%" PRIX64 "]",value & updateMask);
- valStr+=szStrBuffer;
- }
- }
- else
- {
- valStr = "";
- if(valValidBits < valTotalBitSize)
- valStr += "??";
- if(valValidBits > 32)
- {
- sprintf(szStrBuffer,"%" PRIu64 ,value);
- }
- else
- {
- sprintf(szStrBuffer,"%" PRIu32 ,(uint32_t)value);
- }
- valStr += szStrBuffer;
- if(valValidBits < valTotalBitSize)
- {
- sprintf(szStrBuffer," (%d:0)", valValidBits-1);
- valStr+=szStrBuffer;
- }
- }
-}
-
-
-/* End of File trc_printable_elem.cpp */
diff --git a/contrib/opencsd/decoder/source/trc_ret_stack.cpp b/contrib/opencsd/decoder/source/trc_ret_stack.cpp
deleted file mode 100644
index a56c6e6c1d60..000000000000
--- a/contrib/opencsd/decoder/source/trc_ret_stack.cpp
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
-* \file trc_ret_stack.cpp
-* \brief OpenCSD : trace decoder return stack feature.
-*
-* \copyright Copyright (c) 2017, 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 "common/trc_ret_stack.h"
-
-#ifdef TRC_RET_STACK_DEBUG
-#include <sstream>
-#include <iostream>
-#include "common/trc_component.h"
-
-#define LOG_POP(A,O,I) LogOp("Pop",A,O,I)
-#define LOG_PUSH(A,O,I) LogOp("Push",A,O,I)
-#define LOG_FLUSH() LogOp("Flush",0,-1000,(const ocsd_isa)0)
-
-// uncomment for forced std::cout log, bypassing normal library debug logger.
-// useful perhaps when perf is decoding w/o printing.
-// #define FORCE_STD_COUT
-
-#else
-#define LOG_POP(A,O,I)
-#define LOG_PUSH(A,O,I)
-#define LOG_FLUSH()
-#endif
-
-TrcAddrReturnStack::TrcAddrReturnStack() :
- m_active(false),
- m_pop_pending(false),
- head_idx(0),
- num_entries(0)
-{
-#ifdef TRC_RET_STACK_DEBUG
- m_p_debug_logger = 0;
-#endif
-}
-
-void TrcAddrReturnStack::push(const ocsd_vaddr_t addr, const ocsd_isa isa)
-{
- if (is_active())
- {
- head_idx++;
- head_idx &= 0xF;
- m_stack[head_idx].ret_addr = addr;
- m_stack[head_idx].ret_isa = isa;
- num_entries++;
- if (num_entries > 16)
- num_entries = 16;
- LOG_PUSH(addr,0,isa);
- m_pop_pending = false;
- }
-}
-
-ocsd_vaddr_t TrcAddrReturnStack::pop(ocsd_isa &isa)
-{
- ocsd_vaddr_t addr = (ocsd_vaddr_t)-1;
- if (is_active())
- {
- if (num_entries > 0)
- {
- addr = m_stack[head_idx].ret_addr;
- isa = m_stack[head_idx].ret_isa;
- head_idx--;
- head_idx &= 0xF;
- }
- num_entries--;
- LOG_POP(addr,1,isa);
- m_pop_pending = false;
- }
- return addr;
-}
-
-
-void TrcAddrReturnStack::flush()
-{
- num_entries = 0;
- m_pop_pending = false;
- LOG_FLUSH();
-}
-
-#ifdef TRC_RET_STACK_DEBUG
-void TrcAddrReturnStack::LogOp(const char * pszOpString, ocsd_vaddr_t addr, int head_off, ocsd_isa isa)
-{
- static const char *isa_names[] =
- {
- "A32", /**< V7 ARM 32, V8 AArch32 */
- "T32", /**< Thumb2 -> 16/32 bit instructions */
- "A64", /**< V8 AArch64 */
- "TEE", /**< Thumb EE - unsupported */
- "JZL", /**< Jazelle - unsupported in trace */
- "custom", /**< Instruction set - custom arch decoder */
- "unknown" /**< ISA not yet known */
- };
-
- if (m_p_debug_logger)
- {
- std::ostringstream oss;
- if(head_off == -1000)
- {
- oss << "Return stack " << pszOpString << "\n";
- }
- else
- {
- int name_idx = (int)isa;
- if (name_idx > 6)
- name_idx = 6;
- oss << "Return stack " << pszOpString << "[" << std::dec << (head_idx+head_off) << "](0x" << std::hex << addr << "), " << isa_names[name_idx] << ";";
- oss << "current entries = " << std::dec << num_entries << ";";
- oss << "new head idx = " << head_idx << ";";
- oss << "pop pend (pre op) = " << (m_pop_pending ? "true\n" : "false\n");
- }
-#ifdef FORCE_STD_COUT
- std::cout << oss.str();
- std::cout.flush();
-#endif
- m_p_debug_logger->LogDefMessage(oss.str());
- }
-}
-#endif
-
-/* End of File trc_ret_stack.cpp */