PEL: Support for CheckstopFlag msg reg field

Similiar to the DeconfigFlag field that was recently added, this one
indicates the PEL is for a hardware checkstop and results in a bit in
SRC hex word 5 being set.

Signed-off-by: Matt Spinler <spinler@us.ibm.com>
Change-Id: Ib05de7471ad3e32f48e7f20a5c611abc119fe82a
diff --git a/extensions/openpower-pels/registry.cpp b/extensions/openpower-pels/registry.cpp
index aeba998..a96f661 100644
--- a/extensions/openpower-pels/registry.cpp
+++ b/extensions/openpower-pels/registry.cpp
@@ -195,6 +195,11 @@
     return src["DeconfigFlag"].get<bool>();
 }
 
+bool getSRCCheckstopFlag(const nlohmann::json& src)
+{
+    return src["CheckstopFlag"].get<bool>();
+}
+
 std::optional<std::map<SRC::WordNum, SRC::AdditionalDataField>>
     getSRCHexwordFields(const nlohmann::json& src, const std::string& name)
 {
@@ -745,6 +750,11 @@
                 entry.src.deconfigFlag = helper::getSRCDeconfigFlag(src);
             }
 
+            if (src.contains("CheckstopFlag"))
+            {
+                entry.src.checkstopFlag = helper::getSRCCheckstopFlag(src);
+            }
+
             auto& doc = (*e)["Documentation"];
             entry.doc.message = doc["Message"];
             entry.doc.description = doc["Description"];
diff --git a/extensions/openpower-pels/registry.hpp b/extensions/openpower-pels/registry.hpp
index e72fafb..cd39b3f 100644
--- a/extensions/openpower-pels/registry.hpp
+++ b/extensions/openpower-pels/registry.hpp
@@ -110,7 +110,12 @@
      */
     bool deconfigFlag;
 
-    SRC() : type(0), reasonCode(0), deconfigFlag(false) {}
+    /**
+     * @brief If the checkstop flag should be set in hex word 5
+     */
+    bool checkstopFlag;
+
+    SRC() : type(0), reasonCode(0), deconfigFlag(false), checkstopFlag(false) {}
 };
 
 struct AppCapture
diff --git a/extensions/openpower-pels/registry/README.md b/extensions/openpower-pels/registry/README.md
index f914bfc..05a35e9 100644
--- a/extensions/openpower-pels/registry/README.md
+++ b/extensions/openpower-pels/registry/README.md
@@ -253,6 +253,15 @@
 "DeconfigFlag": true
 ```
 
+### SRC Checkstop Flag
+
+This is used to indicate the PEL is for a hardware checkstop, and causes bit 0
+in hex word 5 of the SRC to be set.
+
+```json
+"CheckstopFlag": true
+```
+
 ### Documentation Fields
 
 The documentation fields are used by PEL parsers to display a human readable
diff --git a/extensions/openpower-pels/registry/message_registry.json b/extensions/openpower-pels/registry/message_registry.json
index c2b3e91..6c2e807 100644
--- a/extensions/openpower-pels/registry/message_registry.json
+++ b/extensions/openpower-pels/registry/message_registry.json
@@ -1677,6 +1677,7 @@
             "SRC": {
                 "ReasonCode": "0xE510",
                 "SymptomIDFields": ["SRCWord6", "SRCWord7", "SRCWord8"],
+                "CheckstopFlag": true,
                 "Words6To9": {
                     "6": {
                         "AdditionalDataPropSource": "SRC6"
diff --git a/extensions/openpower-pels/registry/schema/schema.json b/extensions/openpower-pels/registry/schema/schema.json
index 11885e5..4c548e5 100644
--- a/extensions/openpower-pels/registry/schema/schema.json
+++ b/extensions/openpower-pels/registry/schema/schema.json
@@ -102,7 +102,9 @@
 
                 "Words6To9": { "$ref": "#/definitions/srcWords6To9" },
 
-                "DeconfigFlag": { "$ref": "#/definitions/deconfigFlag" }
+                "DeconfigFlag": { "$ref": "#/definitions/deconfigFlag" },
+
+                "CheckstopFlag": { "$ref": "#/definitions/checkstopFlag" }
             },
 
             "required": ["ReasonCode", "Words6To9"],
@@ -139,6 +141,11 @@
             "type": "boolean"
         },
 
+        "checkstopFlag": {
+            "description": "Indicates the SRC is for a hardware checkstop.",
+            "type": "boolean"
+        },
+
         "docNotes": {
             "description": "Any notes/comments about the error. An array of strings for manual line wrapping. Optional.",
             "type": "array",
diff --git a/extensions/openpower-pels/src.cpp b/extensions/openpower-pels/src.cpp
index d78c07a..00ea0b8 100644
--- a/extensions/openpower-pels/src.cpp
+++ b/extensions/openpower-pels/src.cpp
@@ -350,6 +350,11 @@
     setBMCPosition();
     setMotherboardCCIN(dataIface);
 
+    if (regEntry.src.checkstopFlag)
+    {
+        setErrorStatusFlag(ErrorStatusFlags::hwCheckstop);
+    }
+
     if (regEntry.src.deconfigFlag)
     {
         setErrorStatusFlag(ErrorStatusFlags::deconfigured);
diff --git a/extensions/openpower-pels/src.hpp b/extensions/openpower-pels/src.hpp
index bc73fa2..a09f286 100644
--- a/extensions/openpower-pels/src.hpp
+++ b/extensions/openpower-pels/src.hpp
@@ -62,8 +62,9 @@
      * @brief Enums for the error status bits in hex word 5
      *        of BMC SRCs.
      */
-    enum class ErrorStatusFlags
+    enum class ErrorStatusFlags : uint32_t
     {
+        hwCheckstop = 0x80000000,
         terminateFwErr = 0x20000000,
         deconfigured = 0x02000000,
         guarded = 0x01000000