1 #include <analyzer/resolution.hpp>
2 #include <util/pdbg.hpp>
3 #include <util/trace.hpp>
4 
5 namespace analyzer
6 {
7 
8 void HardwareCalloutResolution::resolve(ServiceData& io_sd) const
9 {
10     // Get the chip target from the root cause signature.
11     auto trgt = util::pdbg::getTrgt(io_sd.getRootCause().getChip());
12     auto path = std::string{util::pdbg::getPath(trgt)};
13 
14     // Get the unit target, if needed.
15     if (!iv_path.empty())
16     {
17         path += "/" + iv_path;
18         trgt = util::pdbg::getTrgt(path);
19         if (nullptr == trgt)
20         {
21             trace::err("Unable to find target for %s", path.c_str());
22             return; // can't continue
23         }
24     }
25 
26     // Add location code to callout list.
27     auto locCode = util::pdbg::getLocationCode(trgt);
28     if (locCode.empty())
29     {
30         trace::err("Unable to find location code for %s", path.c_str());
31     }
32     else
33     {
34         io_sd.addCallout(
35             std::make_shared<HardwareCallout>(locCode, iv_priority));
36     }
37 
38     // Add entity path to gard list.
39     auto entityPath = util::pdbg::getPhysDevPath(trgt);
40     if (entityPath.empty())
41     {
42         trace::err("Unable to find entity path for %s", path.c_str());
43     }
44     else
45     {
46         io_sd.addGuard(std::make_shared<Guard>(entityPath, iv_guard));
47     }
48 }
49 
50 } // namespace analyzer
51