1 /*
2  * \file       ss_to_dcdtree.cpp
3  * \brief      OpenCSD :
4  *
5  * \copyright  Copyright (c) 2015, ARM Limited. All Rights Reserved.
6  */
7 
8 /*
9  * Redistribution and use in source and binary forms, with or without modification,
10  * are permitted provided that the following conditions are met:
11  *
12  * 1. Redistributions of source code must retain the above copyright notice,
13  * this list of conditions and the following disclaimer.
14  *
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.
18  *
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.
22  *
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.
33  */
34 
35 #include "ss_to_dcdtree.h"
36 #include "ss_key_value_names.h"
37 
38 
CreateDcdTreeFromSnapShot()39 CreateDcdTreeFromSnapShot::CreateDcdTreeFromSnapShot() :
40     m_bInit(false),
41     m_pDecodeTree(0),
42     m_pReader(0),
43     m_pErrLogInterface(0),
44     m_bPacketProcOnly(false),
45     m_BufferFileName("")
46 {
47     m_errlog_handle = 0;
48     m_add_create_flags = 0;
49 }
50 
~CreateDcdTreeFromSnapShot()51 CreateDcdTreeFromSnapShot::~CreateDcdTreeFromSnapShot()
52 {
53     destroyDecodeTree();
54 }
55 
initialise(SnapShotReader * pReader,ITraceErrorLog * pErrLogInterface)56 void CreateDcdTreeFromSnapShot::initialise(SnapShotReader *pReader, ITraceErrorLog *pErrLogInterface)
57 {
58     if((pErrLogInterface != 0) && (pReader != 0))
59     {
60         m_pReader = pReader;
61         m_pErrLogInterface = pErrLogInterface;
62         m_errlog_handle = m_pErrLogInterface->RegisterErrorSource("ss2_dcdtree");
63         m_bInit = true;
64     }
65 }
66 
createDecodeTree(const std::string & SourceName,bool bPacketProcOnly,uint32_t add_create_flags)67 bool CreateDcdTreeFromSnapShot::createDecodeTree(const std::string &SourceName, bool bPacketProcOnly, uint32_t add_create_flags)
68 {
69     m_add_create_flags = add_create_flags;
70     if(m_bInit)
71     {
72         if(!m_pReader->snapshotReadOK())
73         {
74             LogError("Supplied snapshot reader has not correctly read the snapshot.\n");
75             return false;
76         }
77 
78         m_bPacketProcOnly = bPacketProcOnly;
79         Parser::TraceBufferSourceTree tree;
80 
81         if(m_pReader->getTraceBufferSourceTree(SourceName, tree))
82         {
83             int numDecodersCreated = 0; // count how many we create - if none then give up.
84             uint32_t formatter_flags = OCSD_DFRMTR_FRAME_MEM_ALIGN;
85 
86             /* make a note of the trace binary file name + path to ss directory */
87             m_BufferFileName = m_pReader->getSnapShotDir() + tree.buffer_info.dataFileName;
88 
89             ocsd_dcd_tree_src_t src_format = tree.buffer_info.dataFormat == "source_data" ? OCSD_TRC_SRC_SINGLE : OCSD_TRC_SRC_FRAME_FORMATTED;
90 
91             if (tree.buffer_info.dataFormat == "dstream_coresight")
92                 formatter_flags = OCSD_DFRMTR_HAS_FSYNCS;
93 
94             /* create the initial device tree */
95             // TBD:     handle syncs / hsyncs data from TPIU
96             m_pDecodeTree = DecodeTree::CreateDecodeTree(src_format, formatter_flags);
97             if(m_pDecodeTree == 0)
98             {
99                 LogError("Failed to create decode tree object\n");
100                 return false;
101             }
102 
103             // use our error logger - don't use the tree default.
104             m_pDecodeTree->setAlternateErrorLogger(m_pErrLogInterface);
105 
106             if(!bPacketProcOnly)
107             {
108                 m_pDecodeTree->createMemAccMapper();
109             }
110 
111             /* run through each protocol source to this buffer... */
112             std::map<std::string, std::string>::iterator it = tree.source_core_assoc.begin();
113 
114             while(it != tree.source_core_assoc.end())
115             {
116                 Parser::Parsed *etm_dev, *core_dev;
117                 if(m_pReader->getDeviceData(it->first,&etm_dev))
118                 {
119                     // found the device data for this device.
120 
121                     // see if we have a core name (STM / ITM not associated with a core);
122                     std::string coreDevName = it->second;
123                     if(coreDevName.size() > 0)
124                     {
125                         if(m_pReader->getDeviceData(coreDevName,&core_dev))
126                         {
127                             if(createPEDecoder(core_dev->deviceTypeName,etm_dev))
128                             {
129                                 numDecodersCreated++;
130                                 if(!bPacketProcOnly &&(core_dev->dumpDefs.size() > 0))
131                                 {
132                                     processDumpfiles(core_dev->dumpDefs);
133                                 }
134                             }
135                             else
136                             {
137                                 std::ostringstream oss;
138                                 oss << "Failed to create decoder for source " << it->first << ".\n";
139                                 LogError(oss.str());
140                             }
141                         }
142                         else
143                         {
144                             // Could not find the device data for the core.
145                             // unexpected - since we created the associations.
146                             std::ostringstream oss;
147                             oss << "Failed to get device data for source " << it->first << ".\n";
148                             LogError(oss.str());
149                         }
150                     }
151                     else
152                     {
153                         // none-core source
154                         if(createSTDecoder(etm_dev))
155                         {
156                              numDecodersCreated++;
157                         }
158                         else
159                         {
160                             std::ostringstream oss;
161                             oss << "Failed to create decoder for none core source " << it->first << ".\n";
162                             LogError(oss.str());
163                         }
164                     }
165                 }
166                 else
167                 {
168                     // TBD: could not find the device data for the source.
169                     // again unexpected - suggests ss format error.
170                     std::ostringstream oss;
171                     oss << "Failed to find device data for source " << it->first << ".\n";
172                     LogError(oss.str());
173                 }
174                 if(src_format == OCSD_TRC_SRC_SINGLE)
175                     it = tree.source_core_assoc.end();
176                 else
177                     it++;
178             }
179 
180             if(numDecodersCreated == 0)
181             {
182                 // nothing useful found
183                 destroyDecodeTree();
184             }
185         }
186         else
187         {
188             std::ostringstream oss;
189             oss << "Failed to get parsed source tree for buffer " << SourceName << ".\n";
190             LogError(oss.str());
191         }
192     }
193     return (bool)(m_pDecodeTree != 0);
194 }
195 
destroyDecodeTree()196 void CreateDcdTreeFromSnapShot::destroyDecodeTree()
197 {
198     if(m_pDecodeTree)
199         DecodeTree::DestroyDecodeTree(m_pDecodeTree);
200     m_pDecodeTree = 0;
201     m_pReader = 0;
202     m_pErrLogInterface = 0;
203     m_errlog_handle = 0;
204     m_BufferFileName = "";
205 }
206 
LogError(const std::string & msg)207 void  CreateDcdTreeFromSnapShot::LogError(const std::string &msg)
208 {
209     ocsdError err(OCSD_ERR_SEV_ERROR,OCSD_ERR_TEST_SS_TO_DECODER,msg);
210     m_pErrLogInterface->LogError(m_errlog_handle,&err);
211 }
212 
LogError(const ocsdError & err)213 void CreateDcdTreeFromSnapShot::LogError(const ocsdError &err)
214 {
215     m_pErrLogInterface->LogError(m_errlog_handle,&err);
216 }
217 
createPEDecoder(const std::string & coreName,Parser::Parsed * devSrc)218 bool CreateDcdTreeFromSnapShot::createPEDecoder(const std::string &coreName, Parser::Parsed *devSrc)
219 {
220     bool bCreatedDecoder = false;
221     std::string devTypeName = devSrc->deviceTypeName;
222 
223     // split off .x from type name.
224     std::string::size_type pos = devTypeName.find_first_of('.');
225     if(pos != std::string::npos)
226         devTypeName = devTypeName.substr(0,pos);
227 
228     // split according to protocol
229     if(devTypeName == ETMv4Protocol)
230     {
231         bCreatedDecoder = createETMv4Decoder(coreName,devSrc);
232     }
233     else if(devTypeName == ETMv3Protocol)
234     {
235         bCreatedDecoder = createETMv3Decoder(coreName,devSrc);
236     }
237     else if(devTypeName == PTMProtocol || devTypeName == PFTProtocol)
238     {
239         bCreatedDecoder = createPTMDecoder(coreName,devSrc);
240     }
241     else if (devTypeName == ETEProtocol)
242     {
243         bCreatedDecoder = createETEDecoder(coreName, devSrc);
244     }
245 
246     return bCreatedDecoder;
247 }
248 
249 // create an ETMv4 decoder based on the deviceN.ini file.
createETMv4Decoder(const std::string & coreName,Parser::Parsed * devSrc,const bool bDataChannel)250 bool CreateDcdTreeFromSnapShot::createETMv4Decoder(const std::string &coreName, Parser::Parsed *devSrc, const bool bDataChannel /* = false*/)
251 {
252     bool createdDecoder = false;
253     bool configOK = true;
254 
255     // generate the config data from the device data.
256     ocsd_etmv4_cfg config;
257 
258     regs_to_access_t regs_to_access[] = {
259         { ETMv4RegCfg, true, &config.reg_configr, 0 },
260         { ETMv4RegIDR, true, &config.reg_traceidr, 0 },
261         { ETMv4RegIDR0, true, &config.reg_idr0, 0 },
262         { ETMv4RegIDR1, false, &config.reg_idr1, 0x4100F403 },
263         { ETMv4RegIDR2, true, &config.reg_idr2, 0 },
264         { ETMv4RegIDR8, false, &config.reg_idr8, 0 },
265         { ETMv4RegIDR9, false, &config.reg_idr9, 0 },
266         { ETMv4RegIDR10, false, &config.reg_idr10, 0 },
267         { ETMv4RegIDR11, false, &config.reg_idr11, 0 },
268         { ETMv4RegIDR12, false, &config.reg_idr12, 0 },
269         { ETMv4RegIDR13,false, &config.reg_idr13, 0 },
270     };
271 
272     // extract registers
273     configOK = getRegisters(devSrc->regDefs,sizeof(regs_to_access)/sizeof(regs_to_access_t), regs_to_access);
274 
275     // extract core profile
276     if(configOK)
277         configOK = getCoreProfile(coreName,config.arch_ver,config.core_prof);
278 
279     // good config - generate the decoder on the tree.
280     if(configOK)
281     {
282         ocsd_err_t err = OCSD_OK;
283         EtmV4Config configObj(&config);
284         const char *decoderName = bDataChannel ? OCSD_BUILTIN_DCD_ETMV4D : OCSD_BUILTIN_DCD_ETMV4I;
285 
286         err = m_pDecodeTree->createDecoder(decoderName, m_add_create_flags | (m_bPacketProcOnly ? OCSD_CREATE_FLG_PACKET_PROC : OCSD_CREATE_FLG_FULL_DECODER),&configObj);
287 
288         if(err ==  OCSD_OK)
289             createdDecoder = true;
290         else
291         {
292             std::string msg = "Snapshot processor : failed to create " +  (std::string)decoderName + " decoder on decode tree.";
293             LogError(ocsdError(OCSD_ERR_SEV_ERROR,err,msg));
294         }
295     }
296 
297     return createdDecoder;
298 }
299 
createETEDecoder(const std::string & coreName,Parser::Parsed * devSrc)300 bool CreateDcdTreeFromSnapShot::createETEDecoder(const std::string &coreName, Parser::Parsed *devSrc)
301 {
302     bool createdDecoder = false;
303     bool configOK = true;
304 
305     // generate the config data from the device data.
306     ocsd_ete_cfg config;
307 
308     // ete regs are same names Etmv4 in places...
309     regs_to_access_t regs_to_access[] = {
310         { ETMv4RegCfg, true, &config.reg_configr, 0 },
311         { ETMv4RegIDR, true, &config.reg_traceidr, 0 },
312         { ETMv4RegIDR0, true, &config.reg_idr0, 0 },
313         { ETMv4RegIDR1, false, &config.reg_idr1, 0x4100F403 },
314         { ETMv4RegIDR2, true, &config.reg_idr2, 0 },
315         { ETMv4RegIDR8, false, &config.reg_idr8, 0 },
316         { ETERegDevArch, false, &config.reg_devarch, 0x47705A13 },
317     };
318 
319     // extract registers
320     configOK = getRegisters(devSrc->regDefs, sizeof(regs_to_access) / sizeof(regs_to_access_t), regs_to_access);
321 
322     // extract core profile
323     if (configOK)
324         configOK = getCoreProfile(coreName, config.arch_ver, config.core_prof);
325 
326     // good config - generate the decoder on the tree.
327     if (configOK)
328     {
329         ocsd_err_t err = OCSD_OK;
330         ETEConfig configObj(&config);
331         const char *decoderName = OCSD_BUILTIN_DCD_ETE;
332 
333         err = m_pDecodeTree->createDecoder(decoderName, m_add_create_flags | (m_bPacketProcOnly ? OCSD_CREATE_FLG_PACKET_PROC : OCSD_CREATE_FLG_FULL_DECODER), &configObj);
334 
335         if (err == OCSD_OK)
336             createdDecoder = true;
337         else
338         {
339             std::string msg = "Snapshot processor : failed to create " + (std::string)decoderName + " decoder on decode tree.";
340             LogError(ocsdError(OCSD_ERR_SEV_ERROR, err, msg));
341         }
342     }
343 
344     return createdDecoder;
345 }
346 
347 // create an ETMv3 decoder based on the register values in the deviceN.ini file.
createETMv3Decoder(const std::string & coreName,Parser::Parsed * devSrc)348 bool CreateDcdTreeFromSnapShot::createETMv3Decoder(const std::string &coreName, Parser::Parsed *devSrc)
349 {
350     bool createdDecoder = false;
351     bool configOK = true;
352 
353     // generate the config data from the device data.
354     ocsd_etmv3_cfg cfg_regs;
355 
356     regs_to_access_t regs_to_access[] = {
357         { ETMv3PTMRegIDR, true, &cfg_regs.reg_idr, 0 },
358         { ETMv3PTMRegCR, true, &cfg_regs.reg_ctrl, 0 },
359         { ETMv3PTMRegCCER, true, &cfg_regs.reg_ccer, 0 },
360         { ETMv3PTMRegTraceIDR, true, &cfg_regs.reg_trc_id, 0}
361     };
362 
363     // extract registers
364     configOK = getRegisters(devSrc->regDefs,sizeof(regs_to_access)/sizeof(regs_to_access_t), regs_to_access);
365 
366     // extract core profile
367     if(configOK)
368         configOK = getCoreProfile(coreName,cfg_regs.arch_ver,cfg_regs.core_prof);
369 
370     // good config - generate the decoder on the tree.
371     if(configOK)
372     {
373         EtmV3Config config(&cfg_regs);
374         ocsd_err_t err = OCSD_OK;
375         err = m_pDecodeTree->createDecoder(OCSD_BUILTIN_DCD_ETMV3, m_bPacketProcOnly ? OCSD_CREATE_FLG_PACKET_PROC : OCSD_CREATE_FLG_FULL_DECODER,&config);
376 
377         if(err ==  OCSD_OK)
378             createdDecoder = true;
379         else
380             LogError(ocsdError(OCSD_ERR_SEV_ERROR,err,"Snapshot processor : failed to create ETMV3 decoder on decode tree."));
381     }
382     return createdDecoder;
383 }
384 
createPTMDecoder(const std::string & coreName,Parser::Parsed * devSrc)385 bool CreateDcdTreeFromSnapShot::createPTMDecoder(const std::string &coreName, Parser::Parsed *devSrc)
386 {
387     bool createdDecoder = false;
388     bool configOK = true;
389 
390     // generate the config data from the device data.
391 
392     ocsd_ptm_cfg config;
393 
394     regs_to_access_t regs_to_access[] = {
395         { ETMv3PTMRegIDR, true, &config.reg_idr, 0 },
396         { ETMv3PTMRegCR, true, &config.reg_ctrl, 0 },
397         { ETMv3PTMRegCCER, true, &config.reg_ccer, 0 },
398         { ETMv3PTMRegTraceIDR, true, &config.reg_trc_id, 0}
399     };
400 
401     // extract registers
402     configOK = getRegisters(devSrc->regDefs,sizeof(regs_to_access)/sizeof(regs_to_access_t), regs_to_access);
403 
404     // extract core profile
405     if(configOK)
406         configOK = getCoreProfile(coreName,config.arch_ver,config.core_prof);
407 
408     // good config - generate the decoder on the tree.
409     if(configOK)
410     {
411         PtmConfig configObj(&config);
412         ocsd_err_t err = OCSD_OK;
413         err = m_pDecodeTree->createDecoder(OCSD_BUILTIN_DCD_PTM, m_bPacketProcOnly ? OCSD_CREATE_FLG_PACKET_PROC : OCSD_CREATE_FLG_FULL_DECODER,&configObj);
414 
415         if(err ==  OCSD_OK)
416             createdDecoder = true;
417         else
418             LogError(ocsdError(OCSD_ERR_SEV_ERROR,err,"Snapshot processor : failed to create PTM decoder on decode tree."));
419     }
420     return createdDecoder;
421 }
422 
createSTDecoder(Parser::Parsed * devSrc)423 bool CreateDcdTreeFromSnapShot::createSTDecoder(Parser::Parsed *devSrc)
424 {
425     bool bCreatedDecoder = false;
426     std::string devTypeName = devSrc->deviceTypeName;
427 
428     // split off .x from type name.
429     std::string::size_type pos = devTypeName.find_first_of('.');
430     if(pos != std::string::npos)
431         devTypeName = devTypeName.substr(0,pos);
432 
433     if(devTypeName == STMProtocol)
434     {
435         bCreatedDecoder = createSTMDecoder(devSrc);
436     }
437 
438     return bCreatedDecoder;
439 }
440 
createSTMDecoder(Parser::Parsed * devSrc)441 bool CreateDcdTreeFromSnapShot::createSTMDecoder(Parser::Parsed *devSrc)
442 {
443     bool createdDecoder = false;
444     bool configOK = true;
445 
446     // generate the config data from the device data.
447 
448     ocsd_stm_cfg config;
449 
450     regs_to_access_t regs_to_access[] = {
451         { STMRegTCSR, true, &config.reg_tcsr, 0 }
452     };
453 
454     configOK = getRegisters(devSrc->regDefs,sizeof(regs_to_access)/sizeof(regs_to_access_t), regs_to_access);
455     if(configOK)
456     {
457         ocsd_err_t err = OCSD_OK;
458         STMConfig configObj(&config);
459 
460         err = m_pDecodeTree->createDecoder(OCSD_BUILTIN_DCD_STM, m_bPacketProcOnly ? OCSD_CREATE_FLG_PACKET_PROC : OCSD_CREATE_FLG_FULL_DECODER,&configObj);
461 
462         if(err ==  OCSD_OK)
463             createdDecoder = true;
464         else
465             LogError(ocsdError(OCSD_ERR_SEV_ERROR,err,"Snapshot processor : failed to create STM decoder on decode tree."));
466     }
467 
468     return createdDecoder;
469 }
470 
471 
472 
473 // get a set of register values.
getRegisters(std::map<std::string,std::string,Util::CaseInsensitiveLess> & regDefs,int numRegs,regs_to_access_t * reg_access_array)474 bool CreateDcdTreeFromSnapShot::getRegisters(std::map<std::string, std::string, Util::CaseInsensitiveLess> &regDefs, int numRegs, regs_to_access_t *reg_access_array)
475 {
476     bool regsOK = true;
477 
478     for(int rv = 0; rv < numRegs; rv++)
479     {
480         if(!getRegByPrefix( regDefs,reg_access_array[rv]))
481             regsOK = false;
482     }
483     return regsOK;
484 }
485 
486 // strip out any parts with brackets
getRegByPrefix(std::map<std::string,std::string,Util::CaseInsensitiveLess> & regDefs,regs_to_access_t & reg_accessor)487 bool CreateDcdTreeFromSnapShot::getRegByPrefix(std::map<std::string, std::string, Util::CaseInsensitiveLess> &regDefs,
488     regs_to_access_t &reg_accessor)
489 {
490     std::ostringstream oss;
491     bool bFound = false;
492     std::map<std::string, std::string, Util::CaseInsensitiveLess>::iterator it;
493     std::string prefix_cmp;
494     std::string::size_type pos;
495     std::string strval;
496 
497     *reg_accessor.value = 0;
498 
499     it = regDefs.begin();
500     while((it != regDefs.end()) && !bFound)
501     {
502         prefix_cmp = it->first;
503         pos = prefix_cmp.find_first_of('(');
504         if(pos != std::string::npos)
505         {
506             prefix_cmp = prefix_cmp.substr(0, pos);
507         }
508         if(prefix_cmp == reg_accessor.pszName)
509         {
510             strval = it->second;
511             bFound = true;
512         }
513         it++;
514     }
515 
516     if(bFound)
517         *reg_accessor.value = strtoul(strval.c_str(),0,0);
518     else
519     {
520         ocsd_err_severity_t sev = OCSD_ERR_SEV_ERROR;
521         if(reg_accessor.failIfMissing)
522         {
523             oss << "Error:";
524         }
525         else
526         {
527             // no fail if missing - set any default and just warn.
528             bFound = true;
529             oss << "Warning: Default set for register. ";
530             sev = OCSD_ERR_SEV_WARN;
531             *reg_accessor.value = reg_accessor.val_default;
532         }
533         oss << "Missing " << reg_accessor.pszName << "\n";
534         m_pErrLogInterface->LogMessage(m_errlog_handle, sev, oss.str());
535     }
536     return bFound;
537 }
538 
getCoreProfile(const std::string & coreName,ocsd_arch_version_t & arch_ver,ocsd_core_profile_t & core_prof)539 bool CreateDcdTreeFromSnapShot::getCoreProfile(const std::string &coreName, ocsd_arch_version_t &arch_ver, ocsd_core_profile_t &core_prof)
540 {
541     bool profileOK = true;
542     ocsd_arch_profile_t ap = m_arch_profiles.getArchProfile(coreName);
543     if(ap.arch != ARCH_UNKNOWN)
544     {
545         arch_ver = ap.arch;
546         core_prof = ap.profile;
547     }
548     else
549     {
550         std::ostringstream oss;
551         oss << "Unrecognized Core name " << coreName << ". Cannot evaluate profile or architecture.";
552         LogError(oss.str());
553         profileOK = false;
554     }
555     return profileOK;
556 }
557 
processDumpfiles(std::vector<Parser::DumpDef> & dumps)558 void CreateDcdTreeFromSnapShot::processDumpfiles(std::vector<Parser::DumpDef> &dumps)
559 {
560     std::string dumpFilePathName;
561     std::vector<Parser::DumpDef>::const_iterator it;
562 
563     it = dumps.begin();
564     while(it != dumps.end())
565     {
566         dumpFilePathName = m_pReader->getSnapShotDir() + it->path;
567         ocsd_file_mem_region_t region;
568         ocsd_err_t err = OCSD_OK;
569 
570         region.start_address = it->address;
571         region.file_offset = it->offset;
572         region.region_size = it->length;
573 
574         // ensure we respect optional length and offset parameter and
575         // allow multiple dump entries with same file name to define regions
576         if (!TrcMemAccessorFile::isExistingFileAccessor(dumpFilePathName))
577             err = m_pDecodeTree->addBinFileRegionMemAcc(&region, 1, OCSD_MEM_SPACE_ANY, dumpFilePathName);
578         else
579             err = m_pDecodeTree->updateBinFileRegionMemAcc(&region, 1, OCSD_MEM_SPACE_ANY, dumpFilePathName);
580         if(err != OCSD_OK)
581         {
582             std::ostringstream oss;
583             oss << "Failed to create memory accessor for file " << dumpFilePathName << ".";
584             LogError(ocsdError(OCSD_ERR_SEV_ERROR,err,oss.str()));
585         }
586         it++;
587     }
588 }
589 
590 /* End of File ss_to_dcdtree.cpp */
591