blob: fb451aada6d80d9b76adc11dbb7f12a9b4ee81b2 [file] [log] [blame]
#include <analyzer/resolution.hpp>
#include <util/pdbg.hpp>
#include <util/trace.hpp>
namespace analyzer
{
//------------------------------------------------------------------------------
// Helper function to get the root cause chip target from the service data.
pdbg_target* __getRootCauseChipTarget(const ServiceData& i_sd)
{
auto target = util::pdbg::getTrgt(i_sd.getRootCause().getChip());
assert(nullptr != target); // This would be a really bad bug.
return target;
}
//------------------------------------------------------------------------------
// Helper function to get a unit target from the given unit path, which is a
// devtree path relative the the containing chip. An empty string indicates the
// chip target should be returned.
pdbg_target* __getUnitTarget(pdbg_target* i_chipTarget,
const std::string& i_unitPath)
{
assert(nullptr != i_chipTarget);
auto target = i_chipTarget; // default, if i_unitPath is empty
if (!i_unitPath.empty())
{
auto path = std::string{util::pdbg::getPath(target)} + "/" + i_unitPath;
target = util::pdbg::getTrgt(path);
if (nullptr == target)
{
// Likely a bug the RAS data files.
throw std::logic_error("Unable to find target for " + path);
}
}
return target;
}
//------------------------------------------------------------------------------
void HardwareCalloutResolution::resolve(ServiceData& io_sd) const
{
// Get the target for the hardware callout.
auto target = __getUnitTarget(__getRootCauseChipTarget(io_sd), iv_unitPath);
// Get the location code and entity path for this target.
auto locCode = util::pdbg::getLocationCode(target);
auto entityPath = util::pdbg::getPhysDevPath(target);
// Add the actual callout to the service data.
nlohmann::json callout;
callout["LocationCode"] = locCode;
callout["Priority"] = iv_priority.getUserDataString();
io_sd.addCallout(callout);
// Add the guard info to the service data.
Guard guard = io_sd.addGuard(entityPath, iv_guard);
// Add the callout FFDC to the service data.
nlohmann::json ffdc;
ffdc["Callout Type"] = "Hardware Callout";
ffdc["Target"] = entityPath;
ffdc["Priority"] = iv_priority.getRegistryString();
ffdc["Guard Type"] = guard.getString();
io_sd.addCalloutFFDC(ffdc);
}
//------------------------------------------------------------------------------
void ClockCalloutResolution::resolve(ServiceData& io_sd) const
{
// Add the callout to the service data.
// TODO: For P10, the callout is simply the backplane. There isn't a devtree
// object for this, yet. So will need to hardcode the location code
// for now. In the future, we will need a mechanism to make this data
// driven.
nlohmann::json callout;
callout["LocationCode"] = "P0";
callout["Priority"] = iv_priority.getUserDataString();
io_sd.addCallout(callout);
// Add the guard info to the service data.
// TODO: Still waiting for clock targets to be defined in the device tree.
// For get the processor path for the FFDC.
// static const std::map<callout::ClockType, std::string> m = {
// {callout::ClockType::OSC_REF_CLOCK_0, ""},
// {callout::ClockType::OSC_REF_CLOCK_1, ""},
// };
// auto target = std::string{util::pdbg::getPath(m.at(iv_clockType))};
// auto guardPath = util::pdbg::getPhysDevPath(target);
// Guard guard = io_sd.addGuard(guardPath, iv_guard);
auto target = __getRootCauseChipTarget(io_sd);
auto guardPath = util::pdbg::getPhysDevPath(target);
// Add the callout FFDC to the service data.
nlohmann::json ffdc;
ffdc["Callout Type"] = "Clock Callout";
ffdc["Clock Type"] = iv_clockType.getString();
ffdc["Target"] = guardPath;
ffdc["Priority"] = iv_priority.getRegistryString();
ffdc["Guard Type"] = ""; // TODO: guard.getString();
io_sd.addCalloutFFDC(ffdc);
}
//------------------------------------------------------------------------------
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);
// Add the callout FFDC to the service data.
nlohmann::json ffdc;
ffdc["Callout Type"] = "Procedure Callout";
ffdc["Procedure"] = iv_procedure.getString();
ffdc["Priority"] = iv_priority.getRegistryString();
io_sd.addCalloutFFDC(ffdc);
}
//------------------------------------------------------------------------------
} // namespace analyzer