PEL: Support user supplied flag to indicate a fatal/terminating
User can supply SEVERITY_DETAIL=SYSTEM_TERM as part
of AdditionalData entry in the event log to set the
severity level in User Header of PEL
Tested: I ran unit test using docker. Also tested manually
by setting D-bus event log
Change-Id: I9205c084c32576734c2b5b4c79c273f8defde9d4
Signed-off-by: Vijay Lobo <vijaylobo@gmail.com>
diff --git a/extensions/openpower-pels/README.md b/extensions/openpower-pels/README.md
index 1aba263..c38d06d 100644
--- a/extensions/openpower-pels/README.md
+++ b/extensions/openpower-pels/README.md
@@ -45,6 +45,21 @@
Note that TRUE is the only value supported.
+#### SEVERITY_DETAIL
+
+This is used when the passed in event log severity determines the PEL
+severity and a more granular PEL severity is needed beyond what the normal
+event log to PEL severity conversion could give.
+
+The syntax is:
+```
+SEVERITY_DETAIL=<SEVERITY_TYPE>
+e.g.
+SEVERITY_DETAIL=SYSTEM_TERM
+```
+Option Supported:
+- SYSTEM_TERM, changes the Severity value from 0x50 to 0x51
+
#### ESEL
This keyword's data contains a full PEL in string format. This is how hostboot
diff --git a/extensions/openpower-pels/pel.cpp b/extensions/openpower-pels/pel.cpp
index f66d985..48dff51 100644
--- a/extensions/openpower-pels/pel.cpp
+++ b/extensions/openpower-pels/pel.cpp
@@ -55,7 +55,8 @@
_ph = std::make_unique<PrivateHeader>(regEntry.componentID, obmcLogID,
timestamp);
- _uh = std::make_unique<UserHeader>(regEntry, severity, dataIface);
+ _uh = std::make_unique<UserHeader>(regEntry, severity, additionalData,
+ dataIface);
// Extract any callouts embedded in an FFDC file.
if (!ffdcFiles.empty())
diff --git a/extensions/openpower-pels/user_header.cpp b/extensions/openpower-pels/user_header.cpp
index 276c506..a7d8023 100644
--- a/extensions/openpower-pels/user_header.cpp
+++ b/extensions/openpower-pels/user_header.cpp
@@ -47,6 +47,7 @@
UserHeader::UserHeader(const message::Entry& entry,
phosphor::logging::Entry::Level severity,
+ const AdditionalData& additionalData,
const DataInterfaceBase& dataIface)
{
_header.id = static_cast<uint16_t>(SectionID::userHeader);
@@ -88,6 +89,18 @@
}
}
+ // Convert Critical error (0x50) to Critical Error-System Termination
+ // (0x51), if the AdditionalData is set to SYSTEM_TERM
+ auto sevLevel = additionalData.getValue("SEVERITY_DETAIL");
+ if ((_eventSeverity & 0xF0) == 0x50)
+ {
+ if (sevLevel.value_or("") == "SYSTEM_TERM")
+ {
+ // Change to Critical Error, System Termination
+ _eventSeverity = 0x51;
+ }
+ }
+
// TODO: ibm-dev/dev/#1144 Handle manufacturing sev & action flags
if (entry.eventType)
@@ -99,7 +112,6 @@
// There are different default event types for info errors
// vs non info ones.
auto sevType = static_cast<SeverityType>(_eventSeverity & 0xF0);
-
_eventType = (sevType == SeverityType::nonError)
? static_cast<uint8_t>(EventType::miscInformational)
: static_cast<uint8_t>(EventType::notApplicable);
diff --git a/extensions/openpower-pels/user_header.hpp b/extensions/openpower-pels/user_header.hpp
index da9be6c..e17d0cf 100644
--- a/extensions/openpower-pels/user_header.hpp
+++ b/extensions/openpower-pels/user_header.hpp
@@ -44,10 +44,13 @@
*
* @param[in] entry - The message registry entry for this error
* @param[in] severity - The OpenBMC event log severity for this error
+ * @param[in] additionalData - The AdditionalData properties in this
+ * error log
* @param[in] dataIface - The DataInterface object
*/
UserHeader(const message::Entry& entry,
phosphor::logging::Entry::Level severity,
+ const AdditionalData& additionalData,
const DataInterfaceBase& dataIface);
/**