Attn: Treat HB primary src as hex not ascii

When retrieving the HB primary src from TI info the field needs to be
treated as hex (versus ascii in hypervisor case).

Signed-off-by: Ben Tyner <ben.tyner@ibm.com>
Change-Id: I2f9bfb7a04693d5435e242381025eb15a1177641
diff --git a/attn/attn_logging.cpp b/attn/attn_logging.cpp
index f8a34b1..f51bb46 100644
--- a/attn/attn_logging.cpp
+++ b/attn/attn_logging.cpp
@@ -222,12 +222,19 @@
             (uint32_t)std::stoul(i_additional["0x28 SRC Word 18"], 0, 16),
             (uint32_t)std::stoul(i_additional["0x2c SRC Word 19"], 0, 16)});
 
-        // populate hypervisor primary SRC
+        // Populate phyp primary SRC
+
+        // char array for raw pel src
         std::array<char, pel::asciiStringSize> srcChars{'0'};
+
+        // src from TI info
         std::string srcString = i_additional["SrcAscii"];
+
+        // copy from string to char array
         srcString.copy(srcChars.data(),
                        std::min(srcString.size(), pel::asciiStringSize), 0);
-        tiPel->setAsciiString(srcChars);
+
+        tiPel->setAsciiString(srcChars); // pel object src is char array
     }
     else
     {
@@ -245,12 +252,19 @@
             (uint32_t)std::stoul(i_additional["0x28 HB Word 7"], 0, 16),
             (uint32_t)std::stoul(i_additional["0x2c HB Word 8"], 0, 16)});
 
-        // populate hostboot primary SRC
+        // Populate hostboot primary SRC
+
+        // char array for raw pel src
         std::array<char, pel::asciiStringSize> srcChars{'0'};
-        std::string srcString = i_additional["0x30 error_data"];
+
+        // src from TI info
+        std::string srcString = i_additional["SrcAscii"];
+
+        // copy from string to char array
         srcString.copy(srcChars.data(),
                        std::min(srcString.size(), pel::asciiStringSize), 0);
-        tiPel->setAsciiString(srcChars);
+
+        tiPel->setAsciiString(srcChars); // pel object src is char array
     }
 
     // set severity, event type and action flags
diff --git a/attn/ti_handler.cpp b/attn/ti_handler.cpp
index f04f111..9752fca 100644
--- a/attn/ti_handler.cpp
+++ b/attn/ti_handler.cpp
@@ -87,11 +87,10 @@
         tiAdditionalData["Subsystem"] =
             std::to_string(static_cast<uint8_t>(pel::SubsystemID::hypervisor));
 
-        // copy ascii src chars to additional data
-        char srcChar[9]; // 8 char src + null term
-        memcpy(srcChar, &(i_tiDataArea->asciiData0), 4);
-        memcpy(&srcChar[4], &(i_tiDataArea->asciiData1), 4);
-        srcChar[8]                   = 0;
+        // Copy all ascii src chars to additional data
+        char srcChar[33]; // 32 ascii chars + null term
+        memcpy(srcChar, &(i_tiDataArea->asciiData0), 32);
+        srcChar[32]                  = 0;
         tiAdditionalData["SrcAscii"] = std::string{srcChar};
 
         // TI event
@@ -244,10 +243,12 @@
             tiAdditionalData["Subsystem"] = std::to_string(
                 static_cast<uint8_t>(pel::SubsystemID::hostboot));
 
-            char srcChar[8];
-            memcpy(srcChar, &(i_tiDataArea->srcWord12HbWord0), 4);
-            memcpy(&srcChar[4], &(i_tiDataArea->asciiData1), 4);
-            tiAdditionalData["SrcAscii"] = std::string{srcChar};
+            // Translate hex src value to ascii. This results in an 8 character
+            // SRC (hostboot SRC is 32 bits)
+            std::stringstream src;
+            src << std::setw(8) << std::setfill('0') << std::hex
+                << be32toh(i_tiDataArea->srcWord12HbWord0);
+            tiAdditionalData["SrcAscii"] = src.str();
 
             eventTerminate(tiAdditionalData, (char*)i_tiDataArea);
         }