2 * \file trc_mem_acc_mapper.cpp
5 * \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
9 * Redistribution and use in source and binary forms, with or without modification,
10 * are permitted provided that the following conditions are met:
12 * 1. Redistributions of source code must retain the above copyright notice,
13 * this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright notice,
16 * this list of conditions and the following disclaimer in the documentation
17 * and/or other materials provided with the distribution.
19 * 3. Neither the name of the copyright holder nor the names of its contributors
20 * may be used to endorse or promote products derived from this software without
21 * specific prior written permission.
23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
25 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26 * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
27 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
28 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
29 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
30 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
32 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35 #include "mem_acc/trc_mem_acc_mapper.h"
36 #include "mem_acc/trc_mem_acc_file.h"
38 /************************************************************************************/
39 /* mappers base class */
40 /************************************************************************************/
42 TrcMemAccMapper::TrcMemAccMapper() :
45 m_using_trace_id(false),
50 TrcMemAccMapper::TrcMemAccMapper(bool using_trace_id) :
53 m_using_trace_id(using_trace_id),
58 TrcMemAccMapper::~TrcMemAccMapper()
62 // memory access interface
63 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)
65 bool bReadFromCurr = true;
67 /* see if the address is in any range we know */
68 if(!readFromCurrent(address, mem_space, cs_trace_id))
69 bReadFromCurr = findAccessor(address, mem_space, cs_trace_id);
71 /* if bReadFromCurr then we know m_acc_curr is set */
73 *num_bytes = m_acc_curr->readBytes(address, mem_space, *num_bytes,p_buffer);
79 void TrcMemAccMapper::RemoveAllAccessors()
81 TrcMemAccessorBase *pAcc = 0;
82 pAcc = getFirstAccessor();
85 TrcMemAccFactory::DestroyAccessor(pAcc);
86 pAcc = getNextAccessor();
91 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 */)
93 ocsd_err_t err = OCSD_OK;
94 if(findAccessor(st_address,mem_space,cs_trace_id))
96 err = RemoveAccessor(m_acc_curr);
100 err = OCSD_ERR_INVALID_PARAM_VAL;
104 void TrcMemAccMapper::LogMessage(const std::string &msg)
107 m_err_log->LogMessage(ITraceErrorLog::HANDLE_GEN_INFO,OCSD_ERR_SEV_INFO,msg);
110 /************************************************************************************/
111 /* mappers global address space class - no differentiation in core trace IDs */
112 /************************************************************************************/
113 TrcMemAccMapGlobalSpace::TrcMemAccMapGlobalSpace() : TrcMemAccMapper()
117 TrcMemAccMapGlobalSpace::~TrcMemAccMapGlobalSpace()
121 ocsd_err_t TrcMemAccMapGlobalSpace::AddAccessor(TrcMemAccessorBase *p_accessor, const uint8_t /*cs_trace_id*/)
123 ocsd_err_t err = OCSD_OK;
124 bool bOverLap = false;
126 if(!p_accessor->validateRange())
127 return OCSD_ERR_MEM_ACC_RANGE_INVALID;
129 std::vector<TrcMemAccessorBase *>::const_iterator it = m_acc_global.begin();
130 while((it != m_acc_global.end()) && !bOverLap)
132 // if overlap and memory space match
133 if( ((*it)->overLapRange(p_accessor)) &&
134 ((*it)->inMemSpace(p_accessor->getMemSpace()))
138 err = OCSD_ERR_MEM_ACC_OVERLAP;
143 // no overlap - add to the list of ranges.
145 m_acc_global.push_back(p_accessor);
150 bool TrcMemAccMapGlobalSpace::findAccessor(const ocsd_vaddr_t address, const ocsd_mem_space_acc_t mem_space, const uint8_t /*cs_trace_id*/)
153 std::vector<TrcMemAccessorBase *>::const_iterator it = m_acc_global.begin();
154 while((it != m_acc_global.end()) && !bFound)
156 if( (*it)->addrInRange(address) &&
157 (*it)->inMemSpace(mem_space))
167 bool TrcMemAccMapGlobalSpace::readFromCurrent(const ocsd_vaddr_t address, const ocsd_mem_space_acc_t mem_space, const uint8_t /*cs_trace_id*/)
169 bool readFromCurr = false;
171 readFromCurr = (m_acc_curr->addrInRange(address) && m_acc_curr->inMemSpace(mem_space));
176 TrcMemAccessorBase * TrcMemAccMapGlobalSpace::getFirstAccessor()
178 TrcMemAccessorBase *p_acc = 0;
179 m_acc_it = m_acc_global.begin();
180 if(m_acc_it != m_acc_global.end())
187 TrcMemAccessorBase *TrcMemAccMapGlobalSpace::getNextAccessor()
189 TrcMemAccessorBase *p_acc = 0;
191 if(m_acc_it != m_acc_global.end())
198 void TrcMemAccMapGlobalSpace::clearAccessorList()
200 m_acc_global.clear();
203 ocsd_err_t TrcMemAccMapGlobalSpace::RemoveAccessor(const TrcMemAccessorBase *p_accessor)
206 TrcMemAccessorBase *p_acc = getFirstAccessor();
209 if(p_acc == p_accessor)
211 m_acc_global.erase(m_acc_it);
212 TrcMemAccFactory::DestroyAccessor(p_acc);
217 p_acc = getNextAccessor();
219 return bFound ? OCSD_OK : OCSD_ERR_INVALID_PARAM_VAL;
223 void TrcMemAccMapGlobalSpace::logMappedRanges()
226 TrcMemAccessorBase *pAccessor = getFirstAccessor();
227 LogMessage("Mapped Memory Accessors\n");
228 while(pAccessor != 0)
230 pAccessor->getMemAccString(accStr);
233 pAccessor = getNextAccessor();
235 LogMessage("========================\n");
238 /* End of File trc_mem_acc_mapper.cpp */