1c120c564SAndrew Turner /*! 2c120c564SAndrew Turner * \file ocsd_dcd_tree.h 3c120c564SAndrew Turner * \brief OpenCSD : Trace Decode Tree. 4c120c564SAndrew Turner * 5c120c564SAndrew Turner * \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved. 6c120c564SAndrew Turner */ 7c120c564SAndrew Turner 8c120c564SAndrew Turner 9c120c564SAndrew Turner /* 10c120c564SAndrew Turner * Redistribution and use in source and binary forms, with or without modification, 11c120c564SAndrew Turner * are permitted provided that the following conditions are met: 12c120c564SAndrew Turner * 13c120c564SAndrew Turner * 1. Redistributions of source code must retain the above copyright notice, 14c120c564SAndrew Turner * this list of conditions and the following disclaimer. 15c120c564SAndrew Turner * 16c120c564SAndrew Turner * 2. Redistributions in binary form must reproduce the above copyright notice, 17c120c564SAndrew Turner * this list of conditions and the following disclaimer in the documentation 18c120c564SAndrew Turner * and/or other materials provided with the distribution. 19c120c564SAndrew Turner * 20c120c564SAndrew Turner * 3. Neither the name of the copyright holder nor the names of its contributors 21c120c564SAndrew Turner * may be used to endorse or promote products derived from this software without 22c120c564SAndrew Turner * specific prior written permission. 23c120c564SAndrew Turner * 24c120c564SAndrew Turner * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND 25c120c564SAndrew Turner * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 26c120c564SAndrew Turner * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 27c120c564SAndrew Turner * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 28c120c564SAndrew Turner * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 29c120c564SAndrew Turner * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 30c120c564SAndrew Turner * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 31c120c564SAndrew Turner * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 32c120c564SAndrew Turner * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 33c120c564SAndrew Turner * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 34c120c564SAndrew Turner */ 35c120c564SAndrew Turner 36c120c564SAndrew Turner #ifndef ARM_OCSD_DCD_TREE_H_INCLUDED 37c120c564SAndrew Turner #define ARM_OCSD_DCD_TREE_H_INCLUDED 38c120c564SAndrew Turner 39c120c564SAndrew Turner #include <vector> 40c120c564SAndrew Turner #include <list> 41c120c564SAndrew Turner 42c120c564SAndrew Turner #include "opencsd.h" 43c120c564SAndrew Turner #include "ocsd_dcd_tree_elem.h" 44c120c564SAndrew Turner 45c120c564SAndrew Turner /** @defgroup dcd_tree OpenCSD Library : Trace Decode Tree. 46c120c564SAndrew Turner @brief Create a multi source decode tree for a single trace capture buffer. 47c120c564SAndrew Turner 48c120c564SAndrew Turner Use to create a connected set of decoder objects to decode a trace buffer. 49c120c564SAndrew Turner There may be multiple trace sources within the capture buffer. 50c120c564SAndrew Turner 51c120c564SAndrew Turner @{*/ 52c120c564SAndrew Turner 53c120c564SAndrew Turner /*! 54c120c564SAndrew Turner * @class DecodeTree 55c120c564SAndrew Turner * @brief Class to manage the decoding of data from a single trace sink . 56c120c564SAndrew Turner * 57c120c564SAndrew Turner * Provides functionality to build a tree of decode objects capable of decoding 58c120c564SAndrew Turner * multiple trace sources within a single trace sink (capture buffer). 59c120c564SAndrew Turner * 60c120c564SAndrew Turner */ 61c120c564SAndrew Turner class DecodeTree : public ITrcDataIn 62c120c564SAndrew Turner { 63c120c564SAndrew Turner public: 64c120c564SAndrew Turner /** @name Creation and Destruction 65c120c564SAndrew Turner @{*/ 66c120c564SAndrew Turner DecodeTree(); //!< default constructor 67c120c564SAndrew Turner ~DecodeTree(); //!< default destructor 68c120c564SAndrew Turner 69c120c564SAndrew Turner /*! 70c120c564SAndrew Turner * @brief Create a decode tree. 71c120c564SAndrew Turner * Automatically creates a trace frame deformatter if required and a default error log component. 72c120c564SAndrew Turner * 73c120c564SAndrew Turner * @param src_type : Data stream source type, can be CoreSight frame formatted trace, or single demuxed trace data stream, 74c120c564SAndrew Turner * @param formatterCfgFlags : Configuration flags for trace de-formatter. 75c120c564SAndrew Turner * 76c120c564SAndrew Turner * @return DecodeTree * : pointer to the decode tree, 0 if creation failed. 77c120c564SAndrew Turner */ 78c120c564SAndrew Turner static DecodeTree *CreateDecodeTree(const ocsd_dcd_tree_src_t src_type, const uint32_t formatterCfgFlags); 79c120c564SAndrew Turner 80c120c564SAndrew Turner /** @brief Destroy a decode tree */ 81c120c564SAndrew Turner static void DestroyDecodeTree(DecodeTree *p_dcd_tree); 82c120c564SAndrew Turner 83c120c564SAndrew Turner /** @}*/ 84c120c564SAndrew Turner 85c120c564SAndrew Turner 86c120c564SAndrew Turner /** @name Error and element Logging 87c120c564SAndrew Turner @{*/ 88c120c564SAndrew Turner /** @brief The library default error logger */ getDefaultErrorLogger()89c120c564SAndrew Turner static ocsdDefaultErrorLogger* getDefaultErrorLogger() { return &s_error_logger; }; 90c120c564SAndrew Turner 91c120c564SAndrew Turner /** the current error logging interface in use */ getCurrentErrorLogI()92c120c564SAndrew Turner static ITraceErrorLog *getCurrentErrorLogI() { return s_i_error_logger; }; 93c120c564SAndrew Turner 94c120c564SAndrew Turner /** set an alternate error logging interface. */ 95c120c564SAndrew Turner static void setAlternateErrorLogger(ITraceErrorLog *p_error_logger); 96c120c564SAndrew Turner 97c120c564SAndrew Turner /** get the list of packet printers for this decode tree */ getPrinterList()98c120c564SAndrew Turner std::vector<ItemPrinter *> &getPrinterList() { return m_printer_list; }; 99c120c564SAndrew Turner 100c120c564SAndrew Turner /** add a protocol packet printer */ 101c120c564SAndrew Turner ocsd_err_t addPacketPrinter(uint8_t CSID, bool bMonitor, ItemPrinter **ppPrinter); 102c120c564SAndrew Turner 103c120c564SAndrew Turner /** add a raw frame printer */ 104c120c564SAndrew Turner ocsd_err_t addRawFramePrinter(RawFramePrinter **ppPrinter, uint32_t flags); 105c120c564SAndrew Turner 106c120c564SAndrew Turner /** add a generic element output printer */ 107c120c564SAndrew Turner ocsd_err_t addGenElemPrinter(TrcGenericElementPrinter **ppPrinter); 108c120c564SAndrew Turner 109c120c564SAndrew Turner 110c120c564SAndrew Turner 111c120c564SAndrew Turner /** @}*/ 112c120c564SAndrew Turner 113c120c564SAndrew Turner 114c120c564SAndrew Turner /** @name Trace Data Path 115c120c564SAndrew Turner @{*/ 116c120c564SAndrew Turner /** @brief Trace Data input interface (ITrcDataIn) 117c120c564SAndrew Turner 118c120c564SAndrew Turner Decode tree implements the data in interface : ITrcDataIn . 119c120c564SAndrew Turner Captured raw trace data is passed into the deformatter and decoders via this method. 120c120c564SAndrew Turner */ 121c120c564SAndrew Turner virtual ocsd_datapath_resp_t TraceDataIn( const ocsd_datapath_op_t op, 122c120c564SAndrew Turner const ocsd_trc_index_t index, 123c120c564SAndrew Turner const uint32_t dataBlockSize, 124c120c564SAndrew Turner const uint8_t *pDataBlock, 125c120c564SAndrew Turner uint32_t *numBytesProcessed); 126c120c564SAndrew Turner 127c120c564SAndrew Turner /*! 128c120c564SAndrew Turner * @brief Decoded Trace output. 129c120c564SAndrew Turner * 130c120c564SAndrew Turner * Client trace analysis program attaches a generic trace element interface to 131c120c564SAndrew Turner * receive the output from the trace decode operations. 132c120c564SAndrew Turner * 133c120c564SAndrew Turner * @param *i_gen_trace_elem : Pointer to the interface. 134c120c564SAndrew Turner */ 135c120c564SAndrew Turner void setGenTraceElemOutI(ITrcGenElemIn *i_gen_trace_elem); 136c120c564SAndrew Turner 137c120c564SAndrew Turner /*! @brief Return the connected generic element interface */ getGenTraceElemOutI()138c120c564SAndrew Turner ITrcGenElemIn *getGenTraceElemOutI() const { return m_i_gen_elem_out; }; 139c120c564SAndrew Turner 140c120c564SAndrew Turner /** @}*/ 141c120c564SAndrew Turner 142c120c564SAndrew Turner /** @name Decoder Management 143c120c564SAndrew Turner @{*/ 144c120c564SAndrew Turner 145c120c564SAndrew Turner /*! 146c120c564SAndrew Turner * Creates a decoder that is registered with the library under the supplied name. 147c120c564SAndrew Turner * createFlags determine if a full packet processor / packet decoder pair or 148c120c564SAndrew Turner * packet processor only is created. 149c120c564SAndrew Turner * Uses the supplied configuration structure. 150c120c564SAndrew Turner * 151c120c564SAndrew Turner * @param &decoderName : registered name of decoder 152c120c564SAndrew Turner * @param createFlags : Decoder creation options. 153c120c564SAndrew Turner * @param *pConfig : Pointer to a valid configuration structure for the named decoder. 154c120c564SAndrew Turner * 155c120c564SAndrew Turner * @return ocsd_err_t : Library error code or OCSD_OK if successful. 156c120c564SAndrew Turner */ 157c120c564SAndrew Turner ocsd_err_t createDecoder(const std::string &decoderName, const int createFlags, const CSConfig *pConfig); 158c120c564SAndrew Turner 159c120c564SAndrew Turner /* */ 160c120c564SAndrew Turner /*! 161c120c564SAndrew Turner * Remove a decoder / packet processor attached to an Trace ID output on the frame de-mux. 162c120c564SAndrew Turner * 163c120c564SAndrew Turner * Once removed another decoder can be created that has a CSConfig using that ID. 164c120c564SAndrew Turner * 165c120c564SAndrew Turner * @param CSID : Trace ID to remove. 166c120c564SAndrew Turner * 167c120c564SAndrew Turner * @return ocsd_err_t : Library error code or OCSD_OK if successful. 168c120c564SAndrew Turner */ 169c120c564SAndrew Turner ocsd_err_t removeDecoder(const uint8_t CSID); 170c120c564SAndrew Turner 17146e6e290SRuslan Bukin /*! 17246e6e290SRuslan Bukin * Get the stats block for the channel indicated. 17346e6e290SRuslan Bukin * Caller must check p_stats_block->version to esure that the block 17446e6e290SRuslan Bukin * is filled in a compatible manner. 17546e6e290SRuslan Bukin * 17646e6e290SRuslan Bukin * @param CSID : Configured CoreSight trace ID for the decoder. 17746e6e290SRuslan Bukin * @param p_stats_block: block pointer to set to reference the stats block. 17846e6e290SRuslan Bukin * 17946e6e290SRuslan Bukin * @return ocsd_err_t : Library error code - OCSD_OK if valid block pointer returned, 18046e6e290SRuslan Bukin * OCSD_ERR_NOTINIT if decoder does not support stats counting. 18146e6e290SRuslan Bukin */ 18246e6e290SRuslan Bukin ocsd_err_t getDecoderStats(const uint8_t CSID, ocsd_decode_stats_t **p_stats_block); 18346e6e290SRuslan Bukin 18446e6e290SRuslan Bukin /*! 18546e6e290SRuslan Bukin * Reset the stats block for the chosens decode channel. 18646e6e290SRuslan Bukin * stats block is reset independently of the decoder reset to allow counts across 18746e6e290SRuslan Bukin * multiple decode runs. 18846e6e290SRuslan Bukin * 18946e6e290SRuslan Bukin * @param handle : Handle to decode tree. 19046e6e290SRuslan Bukin * @param CSID : Configured CoreSight trace ID for the decoder. 19146e6e290SRuslan Bukin * 19246e6e290SRuslan Bukin * @return ocsd_err_t : Library error code - OCSD_OK if successful. 19346e6e290SRuslan Bukin */ 19446e6e290SRuslan Bukin ocsd_err_t resetDecoderStats(const uint8_t CSID); 195c120c564SAndrew Turner 196c120c564SAndrew Turner /* get decoder elements currently in use */ 197c120c564SAndrew Turner 198c120c564SAndrew Turner /*! 199c120c564SAndrew Turner * Find a decode tree element associated with a specific CoreSight trace ID. * 200c120c564SAndrew Turner */ 201c120c564SAndrew Turner DecodeTreeElement *getDecoderElement(const uint8_t CSID) const; 202c120c564SAndrew Turner /* iterate decoder elements */ 203c120c564SAndrew Turner 204c120c564SAndrew Turner /*! 205c120c564SAndrew Turner * Decode tree iteration. Return the first tree element 0 if no elements avaiable. 206c120c564SAndrew Turner * 207c120c564SAndrew Turner * @param &elemID : CoreSight Trace ID associated with this element 208c120c564SAndrew Turner */ 209c120c564SAndrew Turner DecodeTreeElement *getFirstElement(uint8_t &elemID); 210c120c564SAndrew Turner /*! 211c120c564SAndrew Turner * Return the next tree element - or 0 if no futher elements avaiable. 212c120c564SAndrew Turner * 213c120c564SAndrew Turner * @param &elemID : CoreSight Trace ID associated with this element 214c120c564SAndrew Turner */ 215c120c564SAndrew Turner DecodeTreeElement *getNextElement(uint8_t &elemID); 216c120c564SAndrew Turner 217c120c564SAndrew Turner /* set key interfaces - attach / replace on any existing tree components */ 218c120c564SAndrew Turner 219c120c564SAndrew Turner /*! 220c120c564SAndrew Turner * Set an ARM instruction opcode decoder. 221c120c564SAndrew Turner * 222c120c564SAndrew Turner * @param *i_instr_decode : Pointer to the interface. 223c120c564SAndrew Turner */ 224c120c564SAndrew Turner void setInstrDecoder(IInstrDecode *i_instr_decode); 225c120c564SAndrew Turner /*! 226c120c564SAndrew Turner * Set a target memory access interface - used to access program image memory for instruction 227c120c564SAndrew Turner * trace decode. 228c120c564SAndrew Turner * 229c120c564SAndrew Turner * @param *i_mem_access : Pointer to the interface. 230c120c564SAndrew Turner */ 231c120c564SAndrew Turner void setMemAccessI(ITargetMemAccess *i_mem_access); 232c120c564SAndrew Turner 233c120c564SAndrew Turner 234c120c564SAndrew Turner /** @}*/ 235c120c564SAndrew Turner 236c120c564SAndrew Turner /** @name Memory Access Mapper 237c120c564SAndrew Turner 238c120c564SAndrew Turner A memory mapper is used to organise a collection of memory accessor objects that contain the 239c120c564SAndrew Turner memory images for different areas of traced instruction memory. These areas could be the executed 240c120c564SAndrew Turner program and a set of loaded .so libraries for example - each of which would have code sections in 241c120c564SAndrew Turner different memory locations. 242c120c564SAndrew Turner 243c120c564SAndrew Turner A memory accessor represents a snapshot of an area of memory as it appeared during trace capture, 244c120c564SAndrew Turner for a given memory space. Memory spaces are described by the ocsd_mem_space_acc_t enum. The most 245c120c564SAndrew Turner general memory space is OCSD_MEM_SPACE_ANY. This represents memory that can be secure or none-secure, 246c120c564SAndrew Turner available at any exception level. 247c120c564SAndrew Turner 248c120c564SAndrew Turner The memory mapper will not allow two accessors to overlap in the same memory space. 249c120c564SAndrew Turner 250c120c564SAndrew Turner The trace decdoer will access memory with a memory space parameter that represents the current core 251c120c564SAndrew Turner state - the mapper will find the closest memory space match for the address. 252c120c564SAndrew Turner 253c120c564SAndrew Turner e.g. if the core is accessing secure EL3, then the most specialised matching space will be accessed. 254c120c564SAndrew Turner If an EL3 space matches that will be used, otherwise the any secure, and finally _ANY. 255c120c564SAndrew Turner 256c120c564SAndrew Turner It is no necessary for clients to register memory accessors for all spaces - _ANY will be sufficient 257c120c564SAndrew Turner in many cases. 258c120c564SAndrew Turner 259c120c564SAndrew Turner 260c120c564SAndrew Turner @{*/ 261c120c564SAndrew Turner 262c120c564SAndrew Turner /* */ 263c120c564SAndrew Turner /*! 264c120c564SAndrew Turner * This creates a memory mapper within the decode tree. 265c120c564SAndrew Turner * 266c120c564SAndrew Turner * @param type : defaults to MEMACC_MAP_GLOBAL (only type available at present) 267c120c564SAndrew Turner * 268c120c564SAndrew Turner * @return ocsd_err_t : Library error code or OCSD_OK if successful. 269c120c564SAndrew Turner */ 270c120c564SAndrew Turner ocsd_err_t createMemAccMapper(memacc_mapper_t type = MEMACC_MAP_GLOBAL); 271c120c564SAndrew Turner 272c120c564SAndrew Turner /*! 273c120c564SAndrew Turner * Get a pointer to the memory mapper. Allows a client to add memory accessors directly to the mapper. 274c120c564SAndrew Turner * @return TrcMemAccMapper : Pointer to the mapper. 275c120c564SAndrew Turner */ getMemAccMapper()276c120c564SAndrew Turner TrcMemAccMapper *getMemAccMapper() const { return m_default_mapper; }; 277c120c564SAndrew Turner 278c120c564SAndrew Turner /*! 279c120c564SAndrew Turner * Set an external mapper rather than create a mapper in the decode tree. 280c120c564SAndrew Turner * Setting this will also destroy any internal mapper that was previously created. 281c120c564SAndrew Turner * 282c120c564SAndrew Turner * @param pMapper : pointer to the mapper to add. 283c120c564SAndrew Turner */ 284c120c564SAndrew Turner void setExternMemAccMapper(TrcMemAccMapper * pMapper); 285c120c564SAndrew Turner 286c120c564SAndrew Turner /*! 287c120c564SAndrew Turner * Return true if a mapper has been set (internal or external 288c120c564SAndrew Turner */ hasMemAccMapper()289c120c564SAndrew Turner const bool hasMemAccMapper() const { return (bool)(m_default_mapper != 0); }; 290c120c564SAndrew Turner 291c120c564SAndrew Turner void logMappedRanges(); //!< Log the mapped memory ranges to the default message logger. 292c120c564SAndrew Turner 293c120c564SAndrew Turner /** @}*/ 294c120c564SAndrew Turner 295c120c564SAndrew Turner /** @name Memory Accessors 296c120c564SAndrew Turner A memory accessor represents a snapshot of an area of memory as it appeared during trace capture. 297c120c564SAndrew Turner 298c120c564SAndrew Turner Memory spaces represent either common global memory, or Secure / none-secure and EL specific spaces. 299c120c564SAndrew Turner 300c120c564SAndrew Turner @{*/ 301c120c564SAndrew Turner 302c120c564SAndrew Turner /*! 303c120c564SAndrew Turner * Creates a memory accessor for a memory block in the supplied buffer and adds to the current mapper. 304c120c564SAndrew Turner * 305c120c564SAndrew Turner * @param address : Start address for the memory block in the memory map. 306c120c564SAndrew Turner * @param mem_space : Memory space 307c120c564SAndrew Turner * @param *p_mem_buffer : start of the buffer. 308c120c564SAndrew Turner * @param mem_length : length of the buffer. 309c120c564SAndrew Turner * 310c120c564SAndrew Turner * @return ocsd_err_t : Library error code or OCSD_OK if successful. 311c120c564SAndrew Turner */ 312c120c564SAndrew Turner 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); 313c120c564SAndrew Turner 314c120c564SAndrew Turner /*! 315c120c564SAndrew Turner * Creates a memory accessor for a memory block supplied as a contiguous binary data file, and adds to the current mapper. 316c120c564SAndrew Turner * 317c120c564SAndrew Turner * @param address : Start address for the memory block in the memory map. 318c120c564SAndrew Turner * @param mem_space : Memory space 319c120c564SAndrew Turner * @param &filepath : Path to the binary data file 320c120c564SAndrew Turner * 321c120c564SAndrew Turner * @return ocsd_err_t : Library error code or OCSD_OK if successful. 322c120c564SAndrew Turner */ 323c120c564SAndrew Turner ocsd_err_t addBinFileMemAcc(const ocsd_vaddr_t address, const ocsd_mem_space_acc_t mem_space, const std::string &filepath); 324c120c564SAndrew Turner 325c120c564SAndrew Turner /*! 326c120c564SAndrew Turner * Creates a memory accessor for a memory block supplied as a one or more memory regions in a binary file. 327c120c564SAndrew Turner * Region structures are created that describe the memory start address, the offset within the binary file 328c120c564SAndrew Turner * for that address, and the length of the region. This accessor can be used to point to the code section 329c120c564SAndrew Turner * in a program file for example. 330c120c564SAndrew Turner * 331c120c564SAndrew Turner * @param *region_array : array of valid memory regions in the file. 332c120c564SAndrew Turner * @param num_regions : number of regions 333c120c564SAndrew Turner * @param mem_space : Memory space 334c120c564SAndrew Turner * @param &filepath : Path to the binary data file 335c120c564SAndrew Turner * 336c120c564SAndrew Turner * @return ocsd_err_t : Library error code or OCSD_OK if successful. 337c120c564SAndrew Turner */ 338c120c564SAndrew Turner 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); 339c120c564SAndrew Turner 340c120c564SAndrew Turner 341c120c564SAndrew Turner /*! 342c120c564SAndrew Turner * Updates/adds to a memory accessor for a memory block supplied as a one or more memory regions in a binary file. 343c120c564SAndrew Turner * Region structures are created that describe the memory start address, the offset within the binary file 344c120c564SAndrew Turner * for that address, and the length of the region. This accessor can be used to point to the code section 345c120c564SAndrew Turner * in a program file for example. 346c120c564SAndrew Turner * 347c120c564SAndrew Turner * @param *region_array : array of valid memory regions in the file. 348c120c564SAndrew Turner * @param num_regions : number of regions 349c120c564SAndrew Turner * @param mem_space : Memory space 350c120c564SAndrew Turner * @param &filepath : Path to the binary data file 351c120c564SAndrew Turner * 352c120c564SAndrew Turner * @return ocsd_err_t : Library error code or OCSD_OK if successful. 353c120c564SAndrew Turner */ 354c120c564SAndrew Turner 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); 355c120c564SAndrew Turner 356c120c564SAndrew Turner /*! 357c120c564SAndrew Turner * This memory accessor allows the client to supply a callback function for the region 358c120c564SAndrew Turner * defined by the start and end addresses. This can be used to supply a custom memory accessor, 359c120c564SAndrew Turner * or to directly access memory if the decode is running live on a target system. 360c120c564SAndrew Turner * 361c120c564SAndrew Turner * @param st_address : start address of region. 362c120c564SAndrew Turner * @param en_address : end address of region. 363c120c564SAndrew Turner * @param mem_space : Memory space 364c120c564SAndrew Turner * @param p_cb_func : Callback function 365c120c564SAndrew Turner * @param *p_context : client supplied context information 366c120c564SAndrew Turner * 367c120c564SAndrew Turner * @return ocsd_err_t : Library error code or OCSD_OK if successful. 368c120c564SAndrew Turner */ 369c120c564SAndrew Turner 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); 370c120c564SAndrew Turner 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); 371c120c564SAndrew Turner 372c120c564SAndrew Turner /*! 373c120c564SAndrew Turner * Remove the memory accessor from the map, that begins at the given address, for the memory space provided. 374c120c564SAndrew Turner * 375c120c564SAndrew Turner * @param address : Start address of the memory accessor. 376c120c564SAndrew Turner * @param mem_space : Memory space for the memory accessor. 377c120c564SAndrew Turner * 378c120c564SAndrew Turner * @return ocsd_err_t : Library error code or OCSD_OK if successful. 379c120c564SAndrew Turner */ 380c120c564SAndrew Turner ocsd_err_t removeMemAccByAddress(const ocsd_vaddr_t address, const ocsd_mem_space_acc_t mem_space); 381c120c564SAndrew Turner 382c120c564SAndrew Turner /** @}*/ 383c120c564SAndrew Turner 384c120c564SAndrew Turner /** @name CoreSight Trace Frame De-mux 385c120c564SAndrew Turner @{*/ 386c120c564SAndrew Turner 387c120c564SAndrew Turner //! Get the Trace Frame de-mux. getFrameDeformatter()388c120c564SAndrew Turner TraceFormatterFrameDecoder *getFrameDeformatter() const { return m_frame_deformatter_root; }; 389c120c564SAndrew Turner 390c120c564SAndrew Turner 391c120c564SAndrew Turner /*! @brief ID filtering - sets the output filter on the trace deformatter. 392c120c564SAndrew Turner 393c120c564SAndrew Turner Only supplied IDs will be decoded. 394c120c564SAndrew Turner 395c120c564SAndrew Turner No effect if no decoder attached for the ID 396c120c564SAndrew Turner 397c120c564SAndrew Turner @param ids : Vector of CS Trace IDs 398c120c564SAndrew Turner */ 399c120c564SAndrew Turner ocsd_err_t setIDFilter(std::vector<uint8_t> &ids); // only supplied IDs will be decoded 400c120c564SAndrew Turner 401c120c564SAndrew Turner ocsd_err_t clearIDFilter(); //!< remove filter, all IDs will be decoded 402c120c564SAndrew Turner 403c120c564SAndrew Turner /** @}*/ 404c120c564SAndrew Turner 405c120c564SAndrew Turner private: 406c120c564SAndrew Turner bool initialise(const ocsd_dcd_tree_src_t type, uint32_t formatterCfgFlags); usingFormatter()407c120c564SAndrew Turner const bool usingFormatter() const { return (bool)(m_dcd_tree_type == OCSD_TRC_SRC_FRAME_FORMATTED); }; 408c120c564SAndrew Turner void setSingleRoot(TrcPktProcI *pComp); 409c120c564SAndrew Turner ocsd_err_t createDecodeElement(const uint8_t CSID); 410c120c564SAndrew Turner void destroyDecodeElement(const uint8_t CSID); 411c120c564SAndrew Turner void destroyMemAccMapper(); 412c120c564SAndrew Turner ocsd_err_t initCallbackMemAcc(const ocsd_vaddr_t st_address, const ocsd_vaddr_t en_address, 413c120c564SAndrew Turner const ocsd_mem_space_acc_t mem_space, void *p_cb_func, bool IDfn, const void *p_context); 41446e6e290SRuslan Bukin TrcPktProcI *getPktProcI(const uint8_t CSID); 415c120c564SAndrew Turner 416c120c564SAndrew Turner ocsd_dcd_tree_src_t m_dcd_tree_type; 417c120c564SAndrew Turner 418c120c564SAndrew Turner IInstrDecode *m_i_instr_decode; 419c120c564SAndrew Turner ITargetMemAccess *m_i_mem_access; 420c120c564SAndrew Turner ITrcGenElemIn *m_i_gen_elem_out; //!< Output interface for generic elements from decoder. 421c120c564SAndrew Turner 422c120c564SAndrew Turner ITrcDataIn* m_i_decoder_root; /*!< root decoder object interface - either deformatter or single packet processor */ 423c120c564SAndrew Turner 424c120c564SAndrew Turner TraceFormatterFrameDecoder *m_frame_deformatter_root; 425c120c564SAndrew Turner 426c120c564SAndrew Turner DecodeTreeElement *m_decode_elements[0x80]; 427c120c564SAndrew Turner 428c120c564SAndrew Turner uint8_t m_decode_elem_iter; 429c120c564SAndrew Turner 430c120c564SAndrew Turner TrcMemAccMapper *m_default_mapper; //!< the mem acc mapper to use 431c120c564SAndrew Turner bool m_created_mapper; //!< true if created by decode tree object 432c120c564SAndrew Turner 433c120c564SAndrew Turner std::vector<ItemPrinter *> m_printer_list; //!< list of packet printers. 434c120c564SAndrew Turner 435c120c564SAndrew Turner /* global error logger - all sources */ 436c120c564SAndrew Turner static ITraceErrorLog *s_i_error_logger; 437c120c564SAndrew Turner static std::list<DecodeTree *> s_trace_dcd_trees; 438c120c564SAndrew Turner 439c120c564SAndrew Turner /**! default error logger */ 440c120c564SAndrew Turner static ocsdDefaultErrorLogger s_error_logger; 441c120c564SAndrew Turner 442c120c564SAndrew Turner /**! default instruction decoder */ 443c120c564SAndrew Turner static TrcIDecode s_instruction_decoder; 44446e6e290SRuslan Bukin 44546e6e290SRuslan Bukin /**! demux stats block */ 44646e6e290SRuslan Bukin ocsd_demux_stats_t m_demux_stats; 447c120c564SAndrew Turner }; 448c120c564SAndrew Turner 449c120c564SAndrew Turner /** @}*/ 450c120c564SAndrew Turner 451c120c564SAndrew Turner #endif // ARM_OCSD_DCD_TREE_H_INCLUDED 452c120c564SAndrew Turner 453c120c564SAndrew Turner /* End of File ocsd_dcd_tree.h */ 454