blob: 14842ad5d4b219b7685b629c42055943feac08ba [file] [log] [blame]
Zane Shelley0b8368c2021-03-18 17:33:41 -05001#include <analyzer/resolution.hpp>
Zane Shelley236bb732021-03-24 17:07:46 -05002#include <util/pdbg.hpp>
3#include <util/trace.hpp>
Zane Shelley0b8368c2021-03-18 17:33:41 -05004
5namespace analyzer
6{
7
Zane Shelley236bb732021-03-24 17:07:46 -05008void HardwareCalloutResolution::resolve(ServiceData& io_sd) const
Zane Shelley0b8368c2021-03-18 17:33:41 -05009{
Zane Shelley236bb732021-03-24 17:07:46 -050010 // 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 }
Zane Shelley0b8368c2021-03-18 17:33:41 -050048}
49
50} // namespace analyzer