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