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> ®Defs, 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> ®Defs,
488 regs_to_access_t ®_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(®ion, 1, OCSD_MEM_SPACE_ANY, dumpFilePathName);
578 else
579 err = m_pDecodeTree->updateBinFileRegionMemAcc(®ion, 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