blob: cce581fe8913ecca9d7de5f50c28c1ab0b012463 [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
}
}
// Get the location code for this target.
auto locCode = util::pdbg::getLocationCode(trgt);
// Add the actual callout to the service data.
nlohmann::json callout;
callout["LocationCode"] = locCode;
callout["Priority"] = iv_priority.getUserDataString();
io_sd.addCallout(callout);
// 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));
}
}
//------------------------------------------------------------------------------
void ProcedureCalloutResolution::resolve(ServiceData& io_sd) const
{
// Add the actual callout to the service data.
nlohmann::json callout;
callout["Procedure"] = iv_procedure.getString();
callout["Priority"] = iv_priority.getUserDataString();
io_sd.addCallout(callout);
}
//------------------------------------------------------------------------------
} // namespace analyzer