blob: 9ad750258be1deacb2bbc905fc0aefbba8c789da [file] [log] [blame]
#include <analyzer/resolution.hpp>
#include <util/pdbg.hpp>
#include <util/trace.hpp>
namespace analyzer
{
void HardwareCalloutResolution::resolve(ServiceData& io_sd) const
{
// Get the chip target from the root cause signature.
auto trgt = util::pdbg::getTrgt(io_sd.getRootCause().getChip());
auto path = std::string{util::pdbg::getPath(trgt)};
// Get the unit target, if needed.
if (!iv_path.empty())
{
path += "/" + iv_path;
trgt = util::pdbg::getTrgt(path);
if (nullptr == trgt)
{
trace::err("Unable to find target for %s", path.c_str());
return; // can't continue
}
}
// Add location code to callout list.
auto locCode = util::pdbg::getLocationCode(trgt);
if (locCode.empty())
{
trace::err("Unable to find location code for %s", path.c_str());
}
else
{
io_sd.addCallout(
std::make_shared<HardwareCallout>(locCode, iv_priority));
}
// Add entity path to gard list.
auto entityPath = util::pdbg::getPhysDevPath(trgt);
if (entityPath.empty())
{
trace::err("Unable to find entity path for %s", path.c_str());
}
else
{
Guard::Type guard = Guard::NONE;
if (iv_guard)
{
guard = io_sd.queryCheckstop() ? Guard::FATAL : Guard::NON_FATAL;
}
io_sd.addGuard(std::make_shared<Guard>(entityPath, guard));
}
}
} // namespace analyzer