#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