xref: /freebsd-src/contrib/opencsd/decoder/source/mem_acc/trc_mem_acc_file.cpp (revision c120c5646da1a1d2c4d90fd069a7e2a8d559eb46)
1*c120c564SAndrew Turner /*
2*c120c564SAndrew Turner  * \file       trc_mem_acc_file.cpp
3*c120c564SAndrew Turner  * \brief      OpenCSD :
4*c120c564SAndrew Turner  *
5*c120c564SAndrew Turner  * \copyright  Copyright (c) 2015, ARM Limited. All Rights Reserved.
6*c120c564SAndrew Turner  */
7*c120c564SAndrew Turner /*
8*c120c564SAndrew Turner  * Redistribution and use in source and binary forms, with or without modification,
9*c120c564SAndrew Turner  * are permitted provided that the following conditions are met:
10*c120c564SAndrew Turner  *
11*c120c564SAndrew Turner  * 1. Redistributions of source code must retain the above copyright notice,
12*c120c564SAndrew Turner  * this list of conditions and the following disclaimer.
13*c120c564SAndrew Turner  *
14*c120c564SAndrew Turner  * 2. Redistributions in binary form must reproduce the above copyright notice,
15*c120c564SAndrew Turner  * this list of conditions and the following disclaimer in the documentation
16*c120c564SAndrew Turner  * and/or other materials provided with the distribution.
17*c120c564SAndrew Turner  *
18*c120c564SAndrew Turner  * 3. Neither the name of the copyright holder nor the names of its contributors
19*c120c564SAndrew Turner  * may be used to endorse or promote products derived from this software without
20*c120c564SAndrew Turner  * specific prior written permission.
21*c120c564SAndrew Turner  *
22*c120c564SAndrew Turner  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
23*c120c564SAndrew Turner  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
24*c120c564SAndrew Turner  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
25*c120c564SAndrew Turner  * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
26*c120c564SAndrew Turner  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
27*c120c564SAndrew Turner  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28*c120c564SAndrew Turner  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
29*c120c564SAndrew Turner  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30*c120c564SAndrew Turner  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
31*c120c564SAndrew Turner  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32*c120c564SAndrew Turner  */
33*c120c564SAndrew Turner 
34*c120c564SAndrew Turner #include "mem_acc/trc_mem_acc_file.h"
35*c120c564SAndrew Turner 
36*c120c564SAndrew Turner #include <sstream>
37*c120c564SAndrew Turner #include <iomanip>
38*c120c564SAndrew Turner 
39*c120c564SAndrew Turner /***************************************************/
40*c120c564SAndrew Turner /* protected construction and reference counting   */
41*c120c564SAndrew Turner /***************************************************/
42*c120c564SAndrew Turner 
TrcMemAccessorFile()43*c120c564SAndrew Turner TrcMemAccessorFile::TrcMemAccessorFile() : TrcMemAccessorBase(MEMACC_FILE)
44*c120c564SAndrew Turner {
45*c120c564SAndrew Turner     m_ref_count = 0;
46*c120c564SAndrew Turner     m_base_range_set = false;
47*c120c564SAndrew Turner     m_has_access_regions = false;
48*c120c564SAndrew Turner     m_file_size = 0;
49*c120c564SAndrew Turner }
50*c120c564SAndrew Turner 
~TrcMemAccessorFile()51*c120c564SAndrew Turner TrcMemAccessorFile::~TrcMemAccessorFile()
52*c120c564SAndrew Turner {
53*c120c564SAndrew Turner     if(m_mem_file.is_open())
54*c120c564SAndrew Turner         m_mem_file.close();
55*c120c564SAndrew Turner     if(m_access_regions.size())
56*c120c564SAndrew Turner     {
57*c120c564SAndrew Turner         std::list<FileRegionMemAccessor *>::iterator it;
58*c120c564SAndrew Turner         it = m_access_regions.begin();
59*c120c564SAndrew Turner         while(it != m_access_regions.end())
60*c120c564SAndrew Turner         {
61*c120c564SAndrew Turner             delete (*it);
62*c120c564SAndrew Turner             it++;
63*c120c564SAndrew Turner         }
64*c120c564SAndrew Turner         m_access_regions.clear();
65*c120c564SAndrew Turner     }
66*c120c564SAndrew Turner }
67*c120c564SAndrew Turner 
initAccessor(const std::string & pathToFile,ocsd_vaddr_t startAddr,size_t offset,size_t size)68*c120c564SAndrew Turner ocsd_err_t TrcMemAccessorFile::initAccessor(const std::string &pathToFile, ocsd_vaddr_t startAddr, size_t offset, size_t size)
69*c120c564SAndrew Turner {
70*c120c564SAndrew Turner     ocsd_err_t err = OCSD_OK;
71*c120c564SAndrew Turner     bool init = false;
72*c120c564SAndrew Turner 
73*c120c564SAndrew Turner     m_mem_file.open(pathToFile.c_str(), std::ifstream::binary | std::ifstream::ate);
74*c120c564SAndrew Turner     if(m_mem_file.is_open())
75*c120c564SAndrew Turner     {
76*c120c564SAndrew Turner         m_file_size = (ocsd_vaddr_t)m_mem_file.tellg() & ((ocsd_vaddr_t)~0x1);
77*c120c564SAndrew Turner         m_mem_file.seekg(0, m_mem_file.beg);
78*c120c564SAndrew Turner         // adding an offset of 0, sets the base range.
79*c120c564SAndrew Turner         if((offset == 0) && (size == 0))
80*c120c564SAndrew Turner         {
81*c120c564SAndrew Turner             init = AddOffsetRange(startAddr, ((size_t)m_file_size)-offset, offset);
82*c120c564SAndrew Turner         }
83*c120c564SAndrew Turner         else if((offset + size) <= m_file_size)
84*c120c564SAndrew Turner         {
85*c120c564SAndrew Turner             // if offset != 0, size must by != 0
86*c120c564SAndrew Turner             init = AddOffsetRange(startAddr, size, offset);
87*c120c564SAndrew Turner         }
88*c120c564SAndrew Turner         m_file_path = pathToFile;
89*c120c564SAndrew Turner     }
90*c120c564SAndrew Turner     else
91*c120c564SAndrew Turner         err = OCSD_ERR_MEM_ACC_FILE_NOT_FOUND;
92*c120c564SAndrew Turner     if(!init)
93*c120c564SAndrew Turner         err = OCSD_ERR_NOT_INIT;
94*c120c564SAndrew Turner     return err;
95*c120c564SAndrew Turner }
96*c120c564SAndrew Turner 
97*c120c564SAndrew Turner 
getRegionForAddress(const ocsd_vaddr_t startAddr) const98*c120c564SAndrew Turner FileRegionMemAccessor *TrcMemAccessorFile::getRegionForAddress(const ocsd_vaddr_t startAddr) const
99*c120c564SAndrew Turner {
100*c120c564SAndrew Turner     FileRegionMemAccessor *p_region = 0;
101*c120c564SAndrew Turner     if(m_has_access_regions)
102*c120c564SAndrew Turner     {
103*c120c564SAndrew Turner         std::list<FileRegionMemAccessor *>::const_iterator it;
104*c120c564SAndrew Turner         it = m_access_regions.begin();
105*c120c564SAndrew Turner         while((it != m_access_regions.end()) && (p_region == 0))
106*c120c564SAndrew Turner         {
107*c120c564SAndrew Turner             if((*it)->addrInRange(startAddr))
108*c120c564SAndrew Turner                 p_region = *it;
109*c120c564SAndrew Turner             it++;
110*c120c564SAndrew Turner         }
111*c120c564SAndrew Turner     }
112*c120c564SAndrew Turner     return p_region;
113*c120c564SAndrew Turner }
114*c120c564SAndrew Turner 
115*c120c564SAndrew Turner 
116*c120c564SAndrew Turner /***************************************************/
117*c120c564SAndrew Turner /* static object creation                          */
118*c120c564SAndrew Turner /***************************************************/
119*c120c564SAndrew Turner 
120*c120c564SAndrew Turner std::map<std::string, TrcMemAccessorFile *> TrcMemAccessorFile::s_FileAccessorMap;
121*c120c564SAndrew Turner 
122*c120c564SAndrew Turner // return existing or create new accessor
createFileAccessor(TrcMemAccessorFile ** p_acc,const std::string & pathToFile,ocsd_vaddr_t startAddr,size_t offset,size_t size)123*c120c564SAndrew Turner ocsd_err_t TrcMemAccessorFile::createFileAccessor(TrcMemAccessorFile **p_acc, const std::string &pathToFile, ocsd_vaddr_t startAddr, size_t offset /*= 0*/, size_t size /*= 0*/)
124*c120c564SAndrew Turner {
125*c120c564SAndrew Turner     ocsd_err_t err = OCSD_OK;
126*c120c564SAndrew Turner     TrcMemAccessorFile * acc = 0;
127*c120c564SAndrew Turner     std::map<std::string, TrcMemAccessorFile *>::iterator it = s_FileAccessorMap.find(pathToFile);
128*c120c564SAndrew Turner     if(it != s_FileAccessorMap.end())
129*c120c564SAndrew Turner     {
130*c120c564SAndrew Turner         acc = it->second;
131*c120c564SAndrew Turner         if(acc->addrStartOfRange(startAddr))
132*c120c564SAndrew Turner             acc->IncRefCount();
133*c120c564SAndrew Turner         else
134*c120c564SAndrew Turner         {
135*c120c564SAndrew Turner             err = OCSD_ERR_MEM_ACC_FILE_DIFF_RANGE;
136*c120c564SAndrew Turner             acc = 0;
137*c120c564SAndrew Turner         }
138*c120c564SAndrew Turner     }
139*c120c564SAndrew Turner     else
140*c120c564SAndrew Turner     {
141*c120c564SAndrew Turner         acc = new (std::nothrow) TrcMemAccessorFile();
142*c120c564SAndrew Turner         if(acc != 0)
143*c120c564SAndrew Turner         {
144*c120c564SAndrew Turner             if((err = acc->initAccessor(pathToFile,startAddr, offset,size)) == OCSD_OK)
145*c120c564SAndrew Turner             {
146*c120c564SAndrew Turner                 acc->IncRefCount();
147*c120c564SAndrew Turner                 s_FileAccessorMap.insert(std::pair<std::string, TrcMemAccessorFile *>(pathToFile,acc));
148*c120c564SAndrew Turner             }
149*c120c564SAndrew Turner             else
150*c120c564SAndrew Turner             {
151*c120c564SAndrew Turner                 delete acc;
152*c120c564SAndrew Turner                 acc = 0;
153*c120c564SAndrew Turner             }
154*c120c564SAndrew Turner         }
155*c120c564SAndrew Turner         else
156*c120c564SAndrew Turner             err = OCSD_ERR_MEM;
157*c120c564SAndrew Turner     }
158*c120c564SAndrew Turner     *p_acc = acc;
159*c120c564SAndrew Turner     return err;
160*c120c564SAndrew Turner }
161*c120c564SAndrew Turner 
destroyFileAccessor(TrcMemAccessorFile * p_accessor)162*c120c564SAndrew Turner void TrcMemAccessorFile::destroyFileAccessor(TrcMemAccessorFile *p_accessor)
163*c120c564SAndrew Turner {
164*c120c564SAndrew Turner     if(p_accessor != 0)
165*c120c564SAndrew Turner     {
166*c120c564SAndrew Turner         p_accessor->DecRefCount();
167*c120c564SAndrew Turner         if(p_accessor->getRefCount() == 0)
168*c120c564SAndrew Turner         {
169*c120c564SAndrew Turner             std::map<std::string, TrcMemAccessorFile *>::iterator it = s_FileAccessorMap.find(p_accessor->getFilePath());
170*c120c564SAndrew Turner             if(it != s_FileAccessorMap.end())
171*c120c564SAndrew Turner             {
172*c120c564SAndrew Turner                 s_FileAccessorMap.erase(it);
173*c120c564SAndrew Turner             }
174*c120c564SAndrew Turner             delete p_accessor;
175*c120c564SAndrew Turner         }
176*c120c564SAndrew Turner     }
177*c120c564SAndrew Turner }
178*c120c564SAndrew Turner 
isExistingFileAccessor(const std::string & pathToFile)179*c120c564SAndrew Turner const bool TrcMemAccessorFile::isExistingFileAccessor(const std::string &pathToFile)
180*c120c564SAndrew Turner {
181*c120c564SAndrew Turner     bool bExists = false;
182*c120c564SAndrew Turner     std::map<std::string, TrcMemAccessorFile *>::const_iterator it = s_FileAccessorMap.find(pathToFile);
183*c120c564SAndrew Turner     if(it != s_FileAccessorMap.end())
184*c120c564SAndrew Turner         bExists = true;
185*c120c564SAndrew Turner     return bExists;
186*c120c564SAndrew Turner }
187*c120c564SAndrew Turner 
getExistingFileAccessor(const std::string & pathToFile)188*c120c564SAndrew Turner TrcMemAccessorFile * TrcMemAccessorFile::getExistingFileAccessor(const std::string &pathToFile)
189*c120c564SAndrew Turner {
190*c120c564SAndrew Turner     TrcMemAccessorFile * p_acc = 0;
191*c120c564SAndrew Turner     std::map<std::string, TrcMemAccessorFile *>::iterator it = s_FileAccessorMap.find(pathToFile);
192*c120c564SAndrew Turner     if(it != s_FileAccessorMap.end())
193*c120c564SAndrew Turner         p_acc = it->second;
194*c120c564SAndrew Turner     return p_acc;
195*c120c564SAndrew Turner }
196*c120c564SAndrew Turner 
197*c120c564SAndrew Turner 
198*c120c564SAndrew Turner 
199*c120c564SAndrew Turner /***************************************************/
200*c120c564SAndrew Turner /* accessor instance functions                     */
201*c120c564SAndrew Turner /***************************************************/
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)202*c120c564SAndrew Turner 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)
203*c120c564SAndrew Turner {
204*c120c564SAndrew Turner     if(!m_mem_file.is_open())
205*c120c564SAndrew Turner         return 0;
206*c120c564SAndrew Turner     uint32_t bytesRead = 0;
207*c120c564SAndrew Turner 
208*c120c564SAndrew Turner     if(m_base_range_set)
209*c120c564SAndrew Turner     {
210*c120c564SAndrew Turner         bytesRead = TrcMemAccessorBase::bytesInRange(address,reqBytes);    // get avialable bytes in range.
211*c120c564SAndrew Turner         if(bytesRead)
212*c120c564SAndrew Turner         {
213*c120c564SAndrew Turner             ocsd_vaddr_t addr_pos = (ocsd_vaddr_t)m_mem_file.tellg();
214*c120c564SAndrew Turner             if((address - m_startAddress) != addr_pos)
215*c120c564SAndrew Turner                 m_mem_file.seekg(address - m_startAddress);
216*c120c564SAndrew Turner             m_mem_file.read((char *)byteBuffer,bytesRead);
217*c120c564SAndrew Turner         }
218*c120c564SAndrew Turner     }
219*c120c564SAndrew Turner 
220*c120c564SAndrew Turner     if((bytesRead == 0) && m_has_access_regions)
221*c120c564SAndrew Turner     {
222*c120c564SAndrew Turner         bytesRead = bytesInRange(address,reqBytes);
223*c120c564SAndrew Turner         if(bytesRead)
224*c120c564SAndrew Turner         {
225*c120c564SAndrew Turner             FileRegionMemAccessor *p_region = getRegionForAddress(address);
226*c120c564SAndrew Turner             ocsd_vaddr_t addr_pos = (ocsd_vaddr_t)m_mem_file.tellg();
227*c120c564SAndrew Turner             if((address - p_region->regionStartAddress() + p_region->getOffset()) != addr_pos)
228*c120c564SAndrew Turner                 m_mem_file.seekg(address - p_region->regionStartAddress() + p_region->getOffset());
229*c120c564SAndrew Turner              m_mem_file.read((char *)byteBuffer,bytesRead);
230*c120c564SAndrew Turner         }
231*c120c564SAndrew Turner     }
232*c120c564SAndrew Turner     return bytesRead;
233*c120c564SAndrew Turner }
234*c120c564SAndrew Turner 
AddOffsetRange(const ocsd_vaddr_t startAddr,const size_t size,const size_t offset)235*c120c564SAndrew Turner bool TrcMemAccessorFile::AddOffsetRange(const ocsd_vaddr_t startAddr, const size_t size, const size_t offset)
236*c120c564SAndrew Turner {
237*c120c564SAndrew Turner     bool addOK = false;
238*c120c564SAndrew Turner     if(m_file_size == 0)    // must have set the file size
239*c120c564SAndrew Turner         return false;
240*c120c564SAndrew Turner     if(addrInRange(startAddr) || addrInRange(startAddr+size-1))  // cannot be overlapping
241*c120c564SAndrew Turner         return false;
242*c120c564SAndrew Turner 
243*c120c564SAndrew Turner     // now either set the base range or an offset range
244*c120c564SAndrew Turner     if(offset == 0)
245*c120c564SAndrew Turner     {
246*c120c564SAndrew Turner         if(!m_base_range_set)
247*c120c564SAndrew Turner         {
248*c120c564SAndrew Turner             setRange(startAddr, startAddr+size-1);
249*c120c564SAndrew Turner             m_base_range_set = true;
250*c120c564SAndrew Turner             addOK = true;
251*c120c564SAndrew Turner         }
252*c120c564SAndrew Turner     }
253*c120c564SAndrew Turner     else
254*c120c564SAndrew Turner     {
255*c120c564SAndrew Turner         if((offset + size) <= m_file_size)
256*c120c564SAndrew Turner         {
257*c120c564SAndrew Turner             FileRegionMemAccessor *frmacc = new (std::nothrow) FileRegionMemAccessor();
258*c120c564SAndrew Turner             if(frmacc)
259*c120c564SAndrew Turner             {
260*c120c564SAndrew Turner                 frmacc->setOffset(offset);
261*c120c564SAndrew Turner                 frmacc->setRange(startAddr,startAddr+size-1);
262*c120c564SAndrew Turner                 m_access_regions.push_back(frmacc);
263*c120c564SAndrew Turner                 m_access_regions.sort();
264*c120c564SAndrew Turner                 // may need to trim the 0 offset base range...
265*c120c564SAndrew Turner                 if(m_base_range_set)
266*c120c564SAndrew Turner                 {
267*c120c564SAndrew Turner                     std::list<FileRegionMemAccessor *>::iterator it;
268*c120c564SAndrew Turner                     it = m_access_regions.begin();
269*c120c564SAndrew Turner                     size_t first_range_offset = (*it)->getOffset();
270*c120c564SAndrew Turner                     if((m_startAddress + first_range_offset - 1) > m_endAddress)
271*c120c564SAndrew Turner                         m_endAddress = m_startAddress + first_range_offset - 1;
272*c120c564SAndrew Turner                 }
273*c120c564SAndrew Turner                 addOK = true;
274*c120c564SAndrew Turner                 m_has_access_regions = true;
275*c120c564SAndrew Turner             }
276*c120c564SAndrew Turner         }
277*c120c564SAndrew Turner     }
278*c120c564SAndrew Turner     return addOK;
279*c120c564SAndrew Turner }
280*c120c564SAndrew Turner 
addrInRange(const ocsd_vaddr_t s_address) const281*c120c564SAndrew Turner const bool TrcMemAccessorFile::addrInRange(const ocsd_vaddr_t s_address) const
282*c120c564SAndrew Turner {
283*c120c564SAndrew Turner     bool bInRange = false;
284*c120c564SAndrew Turner     if(m_base_range_set)
285*c120c564SAndrew Turner         bInRange = TrcMemAccessorBase::addrInRange(s_address);
286*c120c564SAndrew Turner 
287*c120c564SAndrew Turner     if(!bInRange && m_has_access_regions)
288*c120c564SAndrew Turner     {
289*c120c564SAndrew Turner         if(getRegionForAddress(s_address) != 0)
290*c120c564SAndrew Turner             bInRange = true;
291*c120c564SAndrew Turner     }
292*c120c564SAndrew Turner     return bInRange;
293*c120c564SAndrew Turner }
294*c120c564SAndrew Turner 
addrStartOfRange(const ocsd_vaddr_t s_address) const295*c120c564SAndrew Turner const bool TrcMemAccessorFile::addrStartOfRange(const ocsd_vaddr_t s_address) const
296*c120c564SAndrew Turner {
297*c120c564SAndrew Turner     bool bInRange = false;
298*c120c564SAndrew Turner     if(m_base_range_set)
299*c120c564SAndrew Turner         bInRange = TrcMemAccessorBase::addrStartOfRange(s_address);
300*c120c564SAndrew Turner     if(!bInRange && m_has_access_regions)
301*c120c564SAndrew Turner     {
302*c120c564SAndrew Turner         FileRegionMemAccessor *pRegion = getRegionForAddress(s_address);
303*c120c564SAndrew Turner         if(pRegion)
304*c120c564SAndrew Turner             bInRange = (pRegion->regionStartAddress() == s_address);
305*c120c564SAndrew Turner     }
306*c120c564SAndrew Turner     return bInRange;
307*c120c564SAndrew Turner }
308*c120c564SAndrew Turner 
309*c120c564SAndrew Turner 
310*c120c564SAndrew Turner     /* validate ranges */
validateRange()311*c120c564SAndrew Turner const bool TrcMemAccessorFile::validateRange()
312*c120c564SAndrew Turner {
313*c120c564SAndrew Turner     bool bRangeValid = true;
314*c120c564SAndrew Turner     if(m_base_range_set)
315*c120c564SAndrew Turner         bRangeValid = TrcMemAccessorBase::validateRange();
316*c120c564SAndrew Turner 
317*c120c564SAndrew Turner     if(m_has_access_regions && bRangeValid)
318*c120c564SAndrew Turner     {
319*c120c564SAndrew Turner         std::list<FileRegionMemAccessor *>::const_iterator it;
320*c120c564SAndrew Turner         it = m_access_regions.begin();
321*c120c564SAndrew Turner         while((it != m_access_regions.end()) && bRangeValid)
322*c120c564SAndrew Turner         {
323*c120c564SAndrew Turner             bRangeValid = (*it)->validateRange();
324*c120c564SAndrew Turner             it++;
325*c120c564SAndrew Turner         }
326*c120c564SAndrew Turner     }
327*c120c564SAndrew Turner     return bRangeValid;
328*c120c564SAndrew Turner }
329*c120c564SAndrew Turner 
bytesInRange(const ocsd_vaddr_t s_address,const uint32_t reqBytes) const330*c120c564SAndrew Turner const uint32_t TrcMemAccessorFile::bytesInRange(const ocsd_vaddr_t s_address, const uint32_t reqBytes) const
331*c120c564SAndrew Turner {
332*c120c564SAndrew Turner     uint32_t bytesInRange = 0;
333*c120c564SAndrew Turner     if(m_base_range_set)
334*c120c564SAndrew Turner         bytesInRange = TrcMemAccessorBase::bytesInRange(s_address,reqBytes);
335*c120c564SAndrew Turner 
336*c120c564SAndrew Turner     if((bytesInRange == 0) && (m_has_access_regions))
337*c120c564SAndrew Turner     {
338*c120c564SAndrew Turner         FileRegionMemAccessor *p_region = getRegionForAddress(s_address);
339*c120c564SAndrew Turner         bytesInRange = p_region->bytesInRange(s_address,reqBytes);
340*c120c564SAndrew Turner     }
341*c120c564SAndrew Turner 
342*c120c564SAndrew Turner     return bytesInRange;
343*c120c564SAndrew Turner }
344*c120c564SAndrew Turner 
overLapRange(const TrcMemAccessorBase * p_test_acc) const345*c120c564SAndrew Turner const bool TrcMemAccessorFile::overLapRange(const TrcMemAccessorBase *p_test_acc) const
346*c120c564SAndrew Turner {
347*c120c564SAndrew Turner     bool bOverLapRange = false;
348*c120c564SAndrew Turner     if(m_base_range_set)
349*c120c564SAndrew Turner         bOverLapRange = TrcMemAccessorBase::overLapRange(p_test_acc);
350*c120c564SAndrew Turner 
351*c120c564SAndrew Turner     if(!bOverLapRange && (m_has_access_regions))
352*c120c564SAndrew Turner     {
353*c120c564SAndrew Turner         std::list<FileRegionMemAccessor *>::const_iterator it;
354*c120c564SAndrew Turner         it = m_access_regions.begin();
355*c120c564SAndrew Turner         while((it != m_access_regions.end()) && !bOverLapRange)
356*c120c564SAndrew Turner         {
357*c120c564SAndrew Turner             bOverLapRange = (*it)->overLapRange(p_test_acc);
358*c120c564SAndrew Turner             it++;
359*c120c564SAndrew Turner         }
360*c120c564SAndrew Turner     }
361*c120c564SAndrew Turner     return bOverLapRange;
362*c120c564SAndrew Turner }
363*c120c564SAndrew Turner 
364*c120c564SAndrew Turner     /*! Override to handle ranges and offset accessors plus add in file name. */
getMemAccString(std::string & accStr) const365*c120c564SAndrew Turner void TrcMemAccessorFile::getMemAccString(std::string &accStr) const
366*c120c564SAndrew Turner {
367*c120c564SAndrew Turner     std::ostringstream oss;
368*c120c564SAndrew Turner     accStr = "";
369*c120c564SAndrew Turner     if(m_base_range_set)
370*c120c564SAndrew Turner     {
371*c120c564SAndrew Turner         TrcMemAccessorBase::getMemAccString(accStr);
372*c120c564SAndrew Turner     }
373*c120c564SAndrew Turner 
374*c120c564SAndrew Turner     if(m_has_access_regions)
375*c120c564SAndrew Turner     {
376*c120c564SAndrew Turner         std::string addStr;
377*c120c564SAndrew Turner         std::list<FileRegionMemAccessor *>::const_iterator it;
378*c120c564SAndrew Turner         it = m_access_regions.begin();
379*c120c564SAndrew Turner         while(it != m_access_regions.end())
380*c120c564SAndrew Turner         {
381*c120c564SAndrew Turner             (*it)->getMemAccString(addStr);
382*c120c564SAndrew Turner             if(accStr.length())
383*c120c564SAndrew Turner                 accStr += "\n";
384*c120c564SAndrew Turner             accStr += addStr;
385*c120c564SAndrew Turner             it++;
386*c120c564SAndrew Turner         }
387*c120c564SAndrew Turner     }
388*c120c564SAndrew Turner     accStr += (std::string)"\nFilename=" + m_file_path;
389*c120c564SAndrew Turner }
390*c120c564SAndrew Turner 
391*c120c564SAndrew Turner /* End of File trc_mem_acc_file.cpp */
392