Implemented HardwareCalloutResolution::resolve()

Change-Id: I19a0d1da6b172fd74fab8680c515391b883dac95
Signed-off-by: Zane Shelley <zshelle@us.ibm.com>
diff --git a/analyzer/resolution.cpp b/analyzer/resolution.cpp
index 9d994ce..14842ad 100644
--- a/analyzer/resolution.cpp
+++ b/analyzer/resolution.cpp
@@ -1,11 +1,50 @@
 #include <analyzer/resolution.hpp>
+#include <util/pdbg.hpp>
+#include <util/trace.hpp>
 
 namespace analyzer
 {
 
-void HardwareCalloutResolution::resolve(ServiceData&) const
+void HardwareCalloutResolution::resolve(ServiceData& io_sd) const
 {
-    // TODO: Add location code to callout list and entity path to gard list.
+    // 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
+    {
+        io_sd.addGuard(std::make_shared<Guard>(entityPath, iv_guard));
+    }
 }
 
 } // namespace analyzer