blob: 9ad750258be1deacb2bbc905fc0aefbba8c789da [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 {
Zane Shelley2f921302021-08-09 13:23:25 -050046 Guard::Type guard = Guard::NONE;
47 if (iv_guard)
48 {
49 guard = io_sd.queryCheckstop() ? Guard::FATAL : Guard::NON_FATAL;
50 }
51
52 io_sd.addGuard(std::make_shared<Guard>(entityPath, guard));
Zane Shelley236bb732021-03-24 17:07:46 -050053 }
Zane Shelley0b8368c2021-03-18 17:33:41 -050054}
55
56} // namespace analyzer