xref: /freebsd-src/contrib/opencsd/decoder/include/mem_acc/trc_mem_acc_mapper.h (revision 46e6e290975f19ea62d03f90ac3e523af4dae557)
1c120c564SAndrew Turner /*
2c120c564SAndrew Turner  * \file       trc_mem_acc_mapper.h
3c120c564SAndrew Turner  * \brief      OpenCSD :
4c120c564SAndrew Turner  *
5c120c564SAndrew Turner  * \copyright  Copyright (c) 2015, ARM Limited. All Rights Reserved.
6c120c564SAndrew Turner  */
7c120c564SAndrew Turner 
8c120c564SAndrew Turner /*
9c120c564SAndrew Turner  * Redistribution and use in source and binary forms, with or without modification,
10c120c564SAndrew Turner  * are permitted provided that the following conditions are met:
11c120c564SAndrew Turner  *
12c120c564SAndrew Turner  * 1. Redistributions of source code must retain the above copyright notice,
13c120c564SAndrew Turner  * this list of conditions and the following disclaimer.
14c120c564SAndrew Turner  *
15c120c564SAndrew Turner  * 2. Redistributions in binary form must reproduce the above copyright notice,
16c120c564SAndrew Turner  * this list of conditions and the following disclaimer in the documentation
17c120c564SAndrew Turner  * and/or other materials provided with the distribution.
18c120c564SAndrew Turner  *
19c120c564SAndrew Turner  * 3. Neither the name of the copyright holder nor the names of its contributors
20c120c564SAndrew Turner  * may be used to endorse or promote products derived from this software without
21c120c564SAndrew Turner  * specific prior written permission.
22c120c564SAndrew Turner  *
23c120c564SAndrew Turner  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
24c120c564SAndrew Turner  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
25c120c564SAndrew Turner  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26c120c564SAndrew Turner  * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
27c120c564SAndrew Turner  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
28c120c564SAndrew Turner  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
29c120c564SAndrew Turner  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
30c120c564SAndrew Turner  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31c120c564SAndrew Turner  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
32c120c564SAndrew Turner  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33c120c564SAndrew Turner  */
34c120c564SAndrew Turner 
35c120c564SAndrew Turner #ifndef ARM_TRC_MEM_ACC_MAPPER_H_INCLUDED
36c120c564SAndrew Turner #define ARM_TRC_MEM_ACC_MAPPER_H_INCLUDED
37c120c564SAndrew Turner 
38c120c564SAndrew Turner #include <vector>
39c120c564SAndrew Turner 
40c120c564SAndrew Turner #include "opencsd/ocsd_if_types.h"
41c120c564SAndrew Turner #include "interfaces/trc_tgt_mem_access_i.h"
42c120c564SAndrew Turner #include "interfaces/trc_error_log_i.h"
43c120c564SAndrew Turner #include "mem_acc/trc_mem_acc_base.h"
44c120c564SAndrew Turner #include "mem_acc/trc_mem_acc_cache.h"
45c120c564SAndrew Turner 
46c120c564SAndrew Turner typedef enum _memacc_mapper_t {
47c120c564SAndrew Turner     MEMACC_MAP_GLOBAL,
48c120c564SAndrew Turner } memacc_mapper_t;
49c120c564SAndrew Turner 
50c120c564SAndrew Turner class TrcMemAccMapper : public ITargetMemAccess
51c120c564SAndrew Turner {
52c120c564SAndrew Turner public:
53c120c564SAndrew Turner     TrcMemAccMapper();
54c120c564SAndrew Turner     TrcMemAccMapper(bool using_trace_id);
55c120c564SAndrew Turner     virtual ~TrcMemAccMapper();
56c120c564SAndrew Turner 
57c120c564SAndrew Turner // decoder memory access interface
58c120c564SAndrew Turner     virtual ocsd_err_t ReadTargetMemory(   const ocsd_vaddr_t address,
59c120c564SAndrew Turner                                             const uint8_t cs_trace_id,
60c120c564SAndrew Turner                                             const ocsd_mem_space_acc_t mem_space,
61c120c564SAndrew Turner                                             uint32_t *num_bytes,
62c120c564SAndrew Turner                                             uint8_t *p_buffer);
63c120c564SAndrew Turner 
64*46e6e290SRuslan Bukin     virtual void InvalidateMemAccCache(const uint8_t cs_trace_id);
65*46e6e290SRuslan Bukin 
66c120c564SAndrew Turner // mapper memory area configuration interface
67c120c564SAndrew Turner 
68c120c564SAndrew Turner     // add an accessor to this map
69c120c564SAndrew Turner     virtual ocsd_err_t AddAccessor(TrcMemAccessorBase *p_accessor, const uint8_t cs_trace_id) = 0;
70c120c564SAndrew Turner 
71c120c564SAndrew Turner     // remove a specific accessor
72c120c564SAndrew Turner     virtual ocsd_err_t RemoveAccessor(const TrcMemAccessorBase *p_accessor) = 0;
73c120c564SAndrew Turner 
74c120c564SAndrew Turner 
75c120c564SAndrew Turner     // clear all attached accessors from the map
76c120c564SAndrew Turner     void RemoveAllAccessors();
77c120c564SAndrew Turner 
78c120c564SAndrew Turner     // remove a single accessor based on address.
79c120c564SAndrew Turner     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);
80c120c564SAndrew Turner 
81c120c564SAndrew Turner     // set the error log.
82c120c564SAndrew Turner     void setErrorLog(ITraceErrorLog *err_log_i);
83c120c564SAndrew Turner 
84c120c564SAndrew Turner     // print out the ranges in this mapper.
85c120c564SAndrew Turner     virtual void logMappedRanges() = 0;
86c120c564SAndrew Turner 
87c120c564SAndrew Turner protected:
88c120c564SAndrew Turner     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.
89c120c564SAndrew Turner     virtual bool readFromCurrent(const ocsd_vaddr_t address, const ocsd_mem_space_acc_t mem_space, const uint8_t cs_trace_id) = 0;
90c120c564SAndrew Turner     virtual TrcMemAccessorBase *getFirstAccessor() = 0;
91c120c564SAndrew Turner     virtual TrcMemAccessorBase *getNextAccessor() = 0;
92c120c564SAndrew Turner     virtual void clearAccessorList() = 0;
93c120c564SAndrew Turner 
94c120c564SAndrew Turner     void LogMessage(const std::string &msg);
95c120c564SAndrew Turner     void LogWarn(const ocsd_err_t err, const std::string &msg);
96c120c564SAndrew Turner 
97c120c564SAndrew Turner     TrcMemAccessorBase *m_acc_curr;     // most recently used - try this first.
98c120c564SAndrew Turner     uint8_t m_trace_id_curr;            // trace ID for the current accessor
99c120c564SAndrew Turner     const bool m_using_trace_id;        // true if we are using separate memory spaces by TraceID.
100c120c564SAndrew Turner     ITraceErrorLog *m_err_log;          // error log to print out mappings on request.
101c120c564SAndrew Turner     TrcMemAccCache m_cache;             // memory accessor caching.
102c120c564SAndrew Turner };
103c120c564SAndrew Turner 
104c120c564SAndrew Turner 
105c120c564SAndrew Turner // address spaces common to all sources using this mapper.
106c120c564SAndrew Turner // trace id unused.
107c120c564SAndrew Turner class TrcMemAccMapGlobalSpace : public TrcMemAccMapper
108c120c564SAndrew Turner {
109c120c564SAndrew Turner public:
110c120c564SAndrew Turner     TrcMemAccMapGlobalSpace();
111c120c564SAndrew Turner     virtual ~TrcMemAccMapGlobalSpace();
112c120c564SAndrew Turner 
113c120c564SAndrew Turner     // mapper creation interface - prevent overlaps
114c120c564SAndrew Turner     virtual ocsd_err_t AddAccessor(TrcMemAccessorBase *p_accessor, const uint8_t cs_trace_id);
115c120c564SAndrew Turner 
116c120c564SAndrew Turner     // print out the ranges in this mapper.
117c120c564SAndrew Turner     virtual void logMappedRanges();
118c120c564SAndrew Turner 
119c120c564SAndrew Turner protected:
120c120c564SAndrew Turner     virtual bool findAccessor(const ocsd_vaddr_t address, const ocsd_mem_space_acc_t mem_space, const uint8_t cs_trace_id);
121c120c564SAndrew Turner     virtual bool readFromCurrent(const ocsd_vaddr_t address,const ocsd_mem_space_acc_t mem_space,  const uint8_t cs_trace_id);
122c120c564SAndrew Turner     virtual TrcMemAccessorBase *getFirstAccessor();
123c120c564SAndrew Turner     virtual TrcMemAccessorBase *getNextAccessor();
124c120c564SAndrew Turner     virtual void clearAccessorList();
125c120c564SAndrew Turner     virtual ocsd_err_t RemoveAccessor(const TrcMemAccessorBase *p_accessor);
126c120c564SAndrew Turner 
127c120c564SAndrew Turner     std::vector<TrcMemAccessorBase *> m_acc_global;
128c120c564SAndrew Turner     std::vector<TrcMemAccessorBase *>::iterator m_acc_it;
129c120c564SAndrew Turner };
130c120c564SAndrew Turner 
131c120c564SAndrew Turner #endif // ARM_TRC_MEM_ACC_MAPPER_H_INCLUDED
132c120c564SAndrew Turner 
133c120c564SAndrew Turner /* End of File trc_mem_acc_mapper.h */
134