xref: /openbmc/openpower-hw-diags/attn/ti_handler.cpp (revision 44d6f25ff8eb175afe5a29dd7986f2c98c73e499)
1bcf65a8bSBen Tyner #include <attn/attn_common.hpp>
25c5db65aSBen Tyner #include <attn/attn_dbus.hpp>
30f481a44SBen Tyner #include <attn/attn_dump.hpp>
4b797b3e1SBen Tyner #include <attn/attn_logging.hpp>
5f5210bb6SBen Tyner #include <attn/pel/pel_common.hpp>
6b797b3e1SBen Tyner #include <attn/ti_handler.hpp>
79ae5ca41SBen Tyner #include <sdbusplus/bus.hpp>
8ff17f963SBen Tyner #include <sdbusplus/exception.hpp>
99306716dSBen Tyner #include <util/dbus.hpp>
10bfa831a8Saustinfcui #include <util/trace.hpp>
119ae5ca41SBen Tyner 
12710101c0SPatrick Williams #include <format>
1340717725SBen Tyner #include <iomanip>
1440717725SBen Tyner #include <iostream>
1540717725SBen Tyner 
169ae5ca41SBen Tyner namespace attn
179ae5ca41SBen Tyner {
189ae5ca41SBen Tyner 
198c5e4f4eSBen Tyner /**
208c5e4f4eSBen Tyner  * @brief Determine if this is a HB or PHYP TI event
218c5e4f4eSBen Tyner  *
228c5e4f4eSBen Tyner  * Use the TI info data area to determine if this is either a HB or a PHYP
238c5e4f4eSBen Tyner  * TI event then handle the event.
248c5e4f4eSBen Tyner  *
25f5210bb6SBen Tyner  * @param i_tiDataArea pointer to the TI info data
268c5e4f4eSBen Tyner  */
tiHandler(TiDataArea * i_tiDataArea)27792f32f7SBen Tyner int tiHandler(TiDataArea* i_tiDataArea)
28792f32f7SBen Tyner {
29e4f5dbefSBen Tyner     int rc = RC_SUCCESS;
30792f32f7SBen Tyner 
31b8335568SBen Tyner     // capture some additional data for logs/traces
32b8335568SBen Tyner     addHbStatusRegs();
33b8335568SBen Tyner 
348c5e4f4eSBen Tyner     // check TI data area if it is available
35e4f5dbefSBen Tyner     if (nullptr != i_tiDataArea)
36e4f5dbefSBen Tyner     {
378c5e4f4eSBen Tyner         // HB v. PHYP TI logic: Only hosboot will fill in hbTerminateType
388882c32aSBen Tyner         // and it will be non-zero. Only hostboot will fill out source and
398882c32aSBen Tyner         // it it will be non-zero. Only PHYP will fill in srcFormat and it
408882c32aSBen Tyner         // will be non-zero.
418c5e4f4eSBen Tyner         if ((0 == i_tiDataArea->hbTerminateType) &&
428c5e4f4eSBen Tyner             (0 == i_tiDataArea->source) && (0 != i_tiDataArea->srcFormat))
439ae5ca41SBen Tyner         {
448c5e4f4eSBen Tyner             handlePhypTi(i_tiDataArea);
45e4f5dbefSBen Tyner         }
46e4f5dbefSBen Tyner         else
47e4f5dbefSBen Tyner         {
488c5e4f4eSBen Tyner             handleHbTi(i_tiDataArea);
49e4f5dbefSBen Tyner         }
508c5e4f4eSBen Tyner     }
518c5e4f4eSBen Tyner     else
528c5e4f4eSBen Tyner     {
5329651ef8SBen Tyner         // TI data was not available This should not happen since we provide
5429651ef8SBen Tyner         // a default TI info in the case where get TI info was not successful.
557a0dd543SBen Tyner         eventAttentionFail((int)AttnSection::tiHandler | ATTN_INFO_NULL);
5629651ef8SBen Tyner         rc = RC_NOT_HANDLED;
57e4f5dbefSBen Tyner     }
5840717725SBen Tyner 
598c5e4f4eSBen Tyner     return rc;
608c5e4f4eSBen Tyner }
61e4f5dbefSBen Tyner 
628c5e4f4eSBen Tyner /**
638c5e4f4eSBen Tyner  * @brief Handle a PHYP terminate immediate special attention
648c5e4f4eSBen Tyner  *
658c5e4f4eSBen Tyner  * The TI info data area will contain information pertaining to the TI
668c5e4f4eSBen Tyner  * condition. We will wither quiesce the host or initiate a MPIPL depending
678c5e4f4eSBen Tyner  * depending on the auto reboot configuration. We will also create a PEL which
688c5e4f4eSBen Tyner  * will contain the TI info data and FFDC data captured in the system journal.
698c5e4f4eSBen Tyner  *
708c5e4f4eSBen Tyner  * @param i_tiDataArea pointer to TI information filled in by hostboot
718c5e4f4eSBen Tyner  */
handlePhypTi(TiDataArea * i_tiDataArea)728c5e4f4eSBen Tyner void handlePhypTi(TiDataArea* i_tiDataArea)
73e4f5dbefSBen Tyner {
74bfa831a8Saustinfcui     trace::inf("PHYP TI");
75e4f5dbefSBen Tyner 
768c5e4f4eSBen Tyner     // gather additional data for PEL
778c5e4f4eSBen Tyner     std::map<std::string, std::string> tiAdditionalData;
788c5e4f4eSBen Tyner 
79135793a8SBen Tyner     // make note of recoverable errors present
80135793a8SBen Tyner     tiAdditionalData["recoverables"] = recoverableErrors() ? "true" : "false";
81135793a8SBen Tyner 
828c5e4f4eSBen Tyner     if (nullptr != i_tiDataArea)
838c5e4f4eSBen Tyner     {
848c5e4f4eSBen Tyner         parsePhypOpalTiInfo(tiAdditionalData, i_tiDataArea);
858c5e4f4eSBen Tyner 
86f5210bb6SBen Tyner         tiAdditionalData["Subsystem"] =
87f5210bb6SBen Tyner             std::to_string(static_cast<uint8_t>(pel::SubsystemID::hypervisor));
88f5210bb6SBen Tyner 
899d4f91cdSBen Tyner         // Copy all ascii src chars to additional data
909d4f91cdSBen Tyner         char srcChar[33]; // 32 ascii chars + null term
919d4f91cdSBen Tyner         memcpy(srcChar, &(i_tiDataArea->asciiData0), 32);
929d4f91cdSBen Tyner         srcChar[32] = 0;
93f5210bb6SBen Tyner         tiAdditionalData["SrcAscii"] = std::string{srcChar};
94f5210bb6SBen Tyner 
9529651ef8SBen Tyner         // TI event
96f5210bb6SBen Tyner         eventTerminate(tiAdditionalData, (char*)i_tiDataArea);
978c5e4f4eSBen Tyner     }
9829651ef8SBen Tyner     else
9929651ef8SBen Tyner     {
10029651ef8SBen Tyner         // TI data was not available This should not happen since we provide
10129651ef8SBen Tyner         // a default TI info in the case where get TI info was not successful.
1027a0dd543SBen Tyner         eventAttentionFail((int)AttnSection::handlePhypTi | ATTN_INFO_NULL);
10329651ef8SBen Tyner     }
104063f6bdcSBen Tyner 
105063f6bdcSBen Tyner     // We are finished creating the event log entries so transition host to
106063f6bdcSBen Tyner     // the required state.
10739fcf65dSBen Tyner     if (true == util::dbus::dumpPolicyEnabled())
108063f6bdcSBen Tyner     {
10939fcf65dSBen Tyner         // MPIPL is considered a "dump" so we will qualify this transition with
11039fcf65dSBen Tyner         // the dumpPolicyEnabled property. MPIPL is triggered by by starting
11139fcf65dSBen Tyner         // the host "crash" target.
1129306716dSBen Tyner         util::dbus::transitionHost(util::dbus::HostState::Crash);
113063f6bdcSBen Tyner     }
114063f6bdcSBen Tyner     else
115063f6bdcSBen Tyner     {
11639fcf65dSBen Tyner         // If dumpPolicyEnabled property is disabled we will quiesce the host
1179306716dSBen Tyner         util::dbus::transitionHost(util::dbus::HostState::Quiesce);
118063f6bdcSBen Tyner     }
11929651ef8SBen Tyner }
1208c5e4f4eSBen Tyner 
1218c5e4f4eSBen Tyner /**
1220f481a44SBen Tyner  * @brief Handle a hostboot terminate immediate with SRC provided
1238c5e4f4eSBen Tyner  *
1240f481a44SBen Tyner  * The TI info will contain the log ID of the event log that has already been
1250f481a44SBen Tyner  * submitted by hostboot. In this case the attention handler does not need to
1260f481a44SBen Tyner  * create a PEL. A hostboot dump may be requested and the host will be
1270f481a44SBen Tyner  * transitioned.
1288c5e4f4eSBen Tyner  *
1298c5e4f4eSBen Tyner  * @param i_tiDataArea pointer to TI information filled in by hostboot
1308c5e4f4eSBen Tyner  */
handleHbTiWithEid(TiDataArea * i_tiDataArea)1310f481a44SBen Tyner void handleHbTiWithEid(TiDataArea* i_tiDataArea)
1328c5e4f4eSBen Tyner {
133bfa831a8Saustinfcui     trace::inf("HB TI with PLID/EID");
1348c5e4f4eSBen Tyner 
1350f481a44SBen Tyner     if (nullptr != i_tiDataArea)
1360f481a44SBen Tyner     {
137*44d6f25fSZane Shelley         // Trace relevant TI data.
138*44d6f25fSZane Shelley         trace::inf("TI data HB Flags = 0x%02x", i_tiDataArea->hbFlags);
139*44d6f25fSZane Shelley         trace::inf("TI data HB Word 0 = 0x%08x",
140*44d6f25fSZane Shelley                    be32toh(i_tiDataArea->srcWord12HbWord0));
141*44d6f25fSZane Shelley         trace::inf("TI data HB Word 2 = 0x%08x",
142*44d6f25fSZane Shelley                    be32toh(i_tiDataArea->srcWord13HbWord2));
143*44d6f25fSZane Shelley         trace::inf("TI data HB Word 3 = 0x%08x",
144*44d6f25fSZane Shelley                    be32toh(i_tiDataArea->srcWord14HbWord3));
145*44d6f25fSZane Shelley         trace::inf("TI data HB Word 4 = 0x%08x",
146*44d6f25fSZane Shelley                    be32toh(i_tiDataArea->srcWord15HbWord4));
147*44d6f25fSZane Shelley         trace::inf("TI data HB Word 5 = 0x%08x",
148*44d6f25fSZane Shelley                    be32toh(i_tiDataArea->srcWord16HbWord5));
149*44d6f25fSZane Shelley         trace::inf("TI data HB Word 6 = 0x%08x",
150*44d6f25fSZane Shelley                    be32toh(i_tiDataArea->srcWord17HbWord6));
151*44d6f25fSZane Shelley         trace::inf("TI data HB Word 7 = 0x%08x",
152*44d6f25fSZane Shelley                    be32toh(i_tiDataArea->srcWord18HbWord7));
153*44d6f25fSZane Shelley         trace::inf("TI data HB Word 8 = 0x%08x",
154*44d6f25fSZane Shelley                    be32toh(i_tiDataArea->srcWord19HbWord8));
155*44d6f25fSZane Shelley         trace::inf("TI data Error Data = 0x%08x",
156*44d6f25fSZane Shelley                    be32toh(i_tiDataArea->asciiData0));
157*44d6f25fSZane Shelley         trace::inf("TI data EID = 0x%08x", be32toh(i_tiDataArea->asciiData1));
158*44d6f25fSZane Shelley 
1590f481a44SBen Tyner         // see if HB dump is requested
160ac5bd05cSBen Tyner         if (i_tiDataArea->hbFlags & hbDumpFlag)
1610f481a44SBen Tyner         {
1620f481a44SBen Tyner             // retrieve log ID from TI info data
1630f481a44SBen Tyner             uint32_t logId = be32toh(i_tiDataArea->asciiData1);
164611b3442SZane Shelley             requestDump(logId, DumpParameters{0, DumpType::Hostboot});
1650f481a44SBen Tyner         }
1660f481a44SBen Tyner     }
1670f481a44SBen Tyner 
1680f481a44SBen Tyner     util::dbus::transitionHost(util::dbus::HostState::Quiesce);
1690f481a44SBen Tyner }
1700f481a44SBen Tyner 
1710f481a44SBen Tyner /**
1720f481a44SBen Tyner  * @brief Handle a hostboot terminate immediate with SRC provided
1730f481a44SBen Tyner  *
1740f481a44SBen Tyner  * The TI info will contain the reason code and additional data necessary
1750f481a44SBen Tyner  * to create a PEL on behalf of hostboot. A hostboot dump may be created
1760f481a44SBen Tyner  * (after generating the PEL) and the host may be transitioned depending
1770f481a44SBen Tyner  * on the reason code.
1780f481a44SBen Tyner  *
1790f481a44SBen Tyner  * @param i_tiDataArea pointer to TI information filled in by hostboot
1800f481a44SBen Tyner  */
handleHbTiWithSrc(TiDataArea * i_tiDataArea)1810f481a44SBen Tyner void handleHbTiWithSrc(TiDataArea* i_tiDataArea)
1820f481a44SBen Tyner {
183bfa831a8Saustinfcui     trace::inf("HB TI with SRC");
1848c5e4f4eSBen Tyner 
1858c5e4f4eSBen Tyner     // handle specific hostboot reason codes
1868c5e4f4eSBen Tyner     if (nullptr != i_tiDataArea)
1878c5e4f4eSBen Tyner     {
1888882c32aSBen Tyner         // Reason code is byte 2 and 3 of 4 byte srcWord12HbWord0
1898882c32aSBen Tyner         uint16_t reasonCode = be32toh(i_tiDataArea->srcWord12HbWord0);
1908c5e4f4eSBen Tyner 
191bfa831a8Saustinfcui         trace::inf("reason code %04x", reasonCode);
19286aa97a5SBen Tyner 
19386aa97a5SBen Tyner         // for clean shutdown (reason code 050B) no PEL and no dump
1940f481a44SBen Tyner         if (reasonCode != HB_SRC_SHUTDOWN_REQUEST)
1955c5db65aSBen Tyner         {
1965c5db65aSBen Tyner             // gather additional data for PEL
1975c5db65aSBen Tyner             std::map<std::string, std::string> tiAdditionalData;
1985c5db65aSBen Tyner 
199135793a8SBen Tyner             // make note of recoverable errors present
200a0c724d3SPatrick Williams             tiAdditionalData["recoverables"] =
201a0c724d3SPatrick Williams                 recoverableErrors() ? "true" : "false";
202135793a8SBen Tyner 
2035c5db65aSBen Tyner             parseHbTiInfo(tiAdditionalData, i_tiDataArea);
2045c5db65aSBen Tyner 
20529651ef8SBen Tyner             tiAdditionalData["Subsystem"] = std::to_string(
20629651ef8SBen Tyner                 static_cast<uint8_t>(pel::SubsystemID::hostboot));
2079ae5ca41SBen Tyner 
2085c5db65aSBen Tyner             // Translate hex src value to ascii. This results in an 8
2095c5db65aSBen Tyner             // character SRC (hostboot SRC is 32 bits)
210444fa1c0Saustinfcui             tiAdditionalData["SrcAscii"] =
211710101c0SPatrick Williams                 std::format("{:08X}", be32toh(i_tiDataArea->srcWord12HbWord0));
21240717725SBen Tyner 
21386aa97a5SBen Tyner             // dump flag is only valid for TI with EID (not TI with SRC)
214bfa831a8Saustinfcui             trace::inf("Ignoring TI info dump flag for HB TI with SRC");
21586aa97a5SBen Tyner             tiAdditionalData["Dump"] = "true";
2165c5db65aSBen Tyner 
217ac5bd05cSBen Tyner             // TI with SRC will honor hbNotVisibleFlag
218ac5bd05cSBen Tyner             if (i_tiDataArea->hbFlags & hbNotVisibleFlag)
219ac5bd05cSBen Tyner             {
220ac5bd05cSBen Tyner                 tiAdditionalData["hidden"] = "true";
221ac5bd05cSBen Tyner             }
222ac5bd05cSBen Tyner 
2235c5db65aSBen Tyner             // Generate event log
224f5210bb6SBen Tyner             eventTerminate(tiAdditionalData, (char*)i_tiDataArea);
22540717725SBen Tyner         }
2260f481a44SBen Tyner 
2270f481a44SBen Tyner         if (HB_SRC_KEY_TRANSITION != reasonCode)
2280f481a44SBen Tyner         {
2290f481a44SBen Tyner             util::dbus::transitionHost(util::dbus::HostState::Quiesce);
2300f481a44SBen Tyner         }
2310f481a44SBen Tyner     }
23229651ef8SBen Tyner     else
23329651ef8SBen Tyner     {
2340f481a44SBen Tyner         // TI data was not available, this should not happen
2357a0dd543SBen Tyner         eventAttentionFail((int)AttnSection::handleHbTi | ATTN_INFO_NULL);
23629651ef8SBen Tyner     }
2375c5db65aSBen Tyner }
238063f6bdcSBen Tyner 
2390f481a44SBen Tyner /**
2400f481a44SBen Tyner  * @brief Handle a hostboot terminate immediate special attention
2410f481a44SBen Tyner  *
2420f481a44SBen Tyner  * The TI info data area will contain information pertaining to the TI
2430f481a44SBen Tyner  * condition. The course of action to take regarding the host state will
2440f481a44SBen Tyner  * depend on the contents of the TI info data area. We will also create a
2450f481a44SBen Tyner  * PEL containing the TI info data and FFDC data captured in the system
2460f481a44SBen Tyner  * journal.
2470f481a44SBen Tyner  *
2480f481a44SBen Tyner  * @param i_tiDataArea pointer to TI information filled in by hostboot
2490f481a44SBen Tyner  */
handleHbTi(TiDataArea * i_tiDataArea)2500f481a44SBen Tyner void handleHbTi(TiDataArea* i_tiDataArea)
251063f6bdcSBen Tyner {
252bfa831a8Saustinfcui     trace::inf("HB TI");
2530f481a44SBen Tyner 
2540f481a44SBen Tyner     // handle specific hostboot reason codes
2550f481a44SBen Tyner     if (nullptr != i_tiDataArea)
2560f481a44SBen Tyner     {
2570f481a44SBen Tyner         uint8_t terminateType = i_tiDataArea->hbTerminateType;
2580f481a44SBen Tyner 
2590f481a44SBen Tyner         if (TI_WITH_SRC == terminateType)
2600f481a44SBen Tyner         {
2610f481a44SBen Tyner             handleHbTiWithSrc(i_tiDataArea);
2620f481a44SBen Tyner         }
2630f481a44SBen Tyner         else
2640f481a44SBen Tyner         {
2650f481a44SBen Tyner             handleHbTiWithEid(i_tiDataArea);
2660f481a44SBen Tyner         }
2670f481a44SBen Tyner     }
2680f481a44SBen Tyner     else
2690f481a44SBen Tyner     {
2700f481a44SBen Tyner         // TI data was not available, this should not happen
2710f481a44SBen Tyner         eventAttentionFail((int)AttnSection::handleHbTi | ATTN_INFO_NULL);
272063f6bdcSBen Tyner     }
27329651ef8SBen Tyner }
27440717725SBen Tyner 
27540717725SBen Tyner /** @brief Parse the TI info data area into map as PHYP/OPAL data */
parsePhypOpalTiInfo(std::map<std::string,std::string> & i_map,TiDataArea * i_tiDataArea)27640717725SBen Tyner void parsePhypOpalTiInfo(std::map<std::string, std::string>& i_map,
27740717725SBen Tyner                          TiDataArea* i_tiDataArea)
27840717725SBen Tyner {
2791c4b02eaSBen Tyner     if (nullptr == i_tiDataArea)
2801c4b02eaSBen Tyner     {
2811c4b02eaSBen Tyner         return;
2821c4b02eaSBen Tyner     }
2831c4b02eaSBen Tyner 
284a0c724d3SPatrick Williams     i_map["0x00 TI Area Valid"] =
285a0c724d3SPatrick Williams         std::format("{:02x}", i_tiDataArea->tiAreaValid);
286710101c0SPatrick Williams     i_map["0x01 Command"] = std::format("{:02x}", i_tiDataArea->command);
287444fa1c0Saustinfcui     i_map["0x02 Num. Data Bytes"] =
288710101c0SPatrick Williams         std::format("{:04x}", be16toh(i_tiDataArea->numDataBytes));
289710101c0SPatrick Williams     i_map["0x04 Reserved"] = std::format("{:02x}", i_tiDataArea->reserved1);
290444fa1c0Saustinfcui     i_map["0x06 HWDump Type"] =
291710101c0SPatrick Williams         std::format("{:04x}", be16toh(i_tiDataArea->hardwareDumpType));
292710101c0SPatrick Williams     i_map["0x08 SRC Format"] = std::format("{:02x}", i_tiDataArea->srcFormat);
293710101c0SPatrick Williams     i_map["0x09 SRC Flags"] = std::format("{:02x}", i_tiDataArea->srcFlags);
294a0c724d3SPatrick Williams     i_map["0x0a Num. ASCII Words"] =
295a0c724d3SPatrick Williams         std::format("{:02x}", i_tiDataArea->numAsciiWords);
296a0c724d3SPatrick Williams     i_map["0x0b Num. Hex Words"] =
297a0c724d3SPatrick Williams         std::format("{:02x}", i_tiDataArea->numHexWords);
298a0c724d3SPatrick Williams     i_map["0x0e Length of SRC"] =
299a0c724d3SPatrick Williams         std::format("{:04x}", be16toh(i_tiDataArea->lenSrc));
300444fa1c0Saustinfcui     i_map["0x10 SRC Word 12"] =
301710101c0SPatrick Williams         std::format("{:08x}", be32toh(i_tiDataArea->srcWord12HbWord0));
302444fa1c0Saustinfcui     i_map["0x14 SRC Word 13"] =
303710101c0SPatrick Williams         std::format("{:08x}", be32toh(i_tiDataArea->srcWord13HbWord2));
304444fa1c0Saustinfcui     i_map["0x18 SRC Word 14"] =
305710101c0SPatrick Williams         std::format("{:08x}", be32toh(i_tiDataArea->srcWord14HbWord3));
306444fa1c0Saustinfcui     i_map["0x1c SRC Word 15"] =
307710101c0SPatrick Williams         std::format("{:08x}", be32toh(i_tiDataArea->srcWord15HbWord4));
308444fa1c0Saustinfcui     i_map["0x20 SRC Word 16"] =
309710101c0SPatrick Williams         std::format("{:08x}", be32toh(i_tiDataArea->srcWord16HbWord5));
310444fa1c0Saustinfcui     i_map["0x24 SRC Word 17"] =
311710101c0SPatrick Williams         std::format("{:08x}", be32toh(i_tiDataArea->srcWord17HbWord6));
312444fa1c0Saustinfcui     i_map["0x28 SRC Word 18"] =
313710101c0SPatrick Williams         std::format("{:08x}", be32toh(i_tiDataArea->srcWord18HbWord7));
314444fa1c0Saustinfcui     i_map["0x2c SRC Word 19"] =
315710101c0SPatrick Williams         std::format("{:08x}", be32toh(i_tiDataArea->srcWord19HbWord8));
316a0c724d3SPatrick Williams     i_map["0x30 ASCII Data"] =
317a0c724d3SPatrick Williams         std::format("{:08x}", be32toh(i_tiDataArea->asciiData0));
318a0c724d3SPatrick Williams     i_map["0x34 ASCII Data"] =
319a0c724d3SPatrick Williams         std::format("{:08x}", be32toh(i_tiDataArea->asciiData1));
320a0c724d3SPatrick Williams     i_map["0x38 ASCII Data"] =
321a0c724d3SPatrick Williams         std::format("{:08x}", be32toh(i_tiDataArea->asciiData2));
322a0c724d3SPatrick Williams     i_map["0x3c ASCII Data"] =
323a0c724d3SPatrick Williams         std::format("{:08x}", be32toh(i_tiDataArea->asciiData3));
324a0c724d3SPatrick Williams     i_map["0x40 ASCII Data"] =
325a0c724d3SPatrick Williams         std::format("{:08x}", be32toh(i_tiDataArea->asciiData4));
326a0c724d3SPatrick Williams     i_map["0x44 ASCII Data"] =
327a0c724d3SPatrick Williams         std::format("{:08x}", be32toh(i_tiDataArea->asciiData5));
328a0c724d3SPatrick Williams     i_map["0x48 ASCII Data"] =
329a0c724d3SPatrick Williams         std::format("{:08x}", be32toh(i_tiDataArea->asciiData6));
330a0c724d3SPatrick Williams     i_map["0x4c ASCII Data"] =
331a0c724d3SPatrick Williams         std::format("{:08x}", be32toh(i_tiDataArea->asciiData7));
332710101c0SPatrick Williams     i_map["0x50 Location"] = std::format("{:02x}", i_tiDataArea->location);
333a0c724d3SPatrick Williams     i_map["0x51 Code Sections"] =
334a0c724d3SPatrick Williams         std::format("{:02x}", i_tiDataArea->codeSection);
335a0c724d3SPatrick Williams     i_map["0x52 Additional Size"] =
336a0c724d3SPatrick Williams         std::format("{:02x}", i_tiDataArea->additionalSize);
337a0c724d3SPatrick Williams     i_map["0x53 Additional Data"] =
338a0c724d3SPatrick Williams         std::format("{:02x}", i_tiDataArea->andData);
33940717725SBen Tyner }
34040717725SBen Tyner 
34140717725SBen Tyner /** @brief Parse the TI info data area into map as hostboot data */
parseHbTiInfo(std::map<std::string,std::string> & i_map,TiDataArea * i_tiDataArea)34240717725SBen Tyner void parseHbTiInfo(std::map<std::string, std::string>& i_map,
34340717725SBen Tyner                    TiDataArea* i_tiDataArea)
34440717725SBen Tyner {
3451c4b02eaSBen Tyner     if (nullptr == i_tiDataArea)
3461c4b02eaSBen Tyner     {
3471c4b02eaSBen Tyner         return;
3481c4b02eaSBen Tyner     }
3491c4b02eaSBen Tyner 
350a0c724d3SPatrick Williams     i_map["0x00 TI Area Valid"] =
351a0c724d3SPatrick Williams         std::format("{:02x}", i_tiDataArea->tiAreaValid);
352710101c0SPatrick Williams     i_map["0x04 Reserved"] = std::format("{:02x}", i_tiDataArea->reserved1);
353a0c724d3SPatrick Williams     i_map["0x05 HB_Term. Type"] =
354a0c724d3SPatrick Williams         std::format("{:02x}", i_tiDataArea->hbTerminateType);
355710101c0SPatrick Williams     i_map["0x0c HB Flags"] = std::format("{:02x}", i_tiDataArea->hbFlags);
356710101c0SPatrick Williams     i_map["0x0d Source"] = std::format("{:02x}", i_tiDataArea->source);
357444fa1c0Saustinfcui     i_map["0x10 HB Word 0"] =
358710101c0SPatrick Williams         std::format("{:08x}", be32toh(i_tiDataArea->srcWord12HbWord0));
359444fa1c0Saustinfcui     i_map["0x14 HB Word 2"] =
360710101c0SPatrick Williams         std::format("{:08x}", be32toh(i_tiDataArea->srcWord13HbWord2));
361444fa1c0Saustinfcui     i_map["0x18 HB Word 3"] =
362710101c0SPatrick Williams         std::format("{:08x}", be32toh(i_tiDataArea->srcWord14HbWord3));
363444fa1c0Saustinfcui     i_map["0x1c HB Word 4"] =
364710101c0SPatrick Williams         std::format("{:08x}", be32toh(i_tiDataArea->srcWord15HbWord4));
365444fa1c0Saustinfcui     i_map["0x20 HB Word 5"] =
366710101c0SPatrick Williams         std::format("{:08x}", be32toh(i_tiDataArea->srcWord16HbWord5));
367444fa1c0Saustinfcui     i_map["0x24 HB Word 6"] =
368710101c0SPatrick Williams         std::format("{:08x}", be32toh(i_tiDataArea->srcWord17HbWord6));
369444fa1c0Saustinfcui     i_map["0x28 HB Word 7"] =
370710101c0SPatrick Williams         std::format("{:08x}", be32toh(i_tiDataArea->srcWord18HbWord7));
371444fa1c0Saustinfcui     i_map["0x2c HB Word 8"] =
372710101c0SPatrick Williams         std::format("{:08x}", be32toh(i_tiDataArea->srcWord19HbWord8));
373a0c724d3SPatrick Williams     i_map["0x30 error_data"] =
374a0c724d3SPatrick Williams         std::format("{:08x}", be32toh(i_tiDataArea->asciiData0));
375a0c724d3SPatrick Williams     i_map["0x34 EID"] =
376a0c724d3SPatrick Williams         std::format("{:08x}", be32toh(i_tiDataArea->asciiData1));
37740717725SBen Tyner }
37840717725SBen Tyner 
3799ae5ca41SBen Tyner } // namespace attn
380