Attn: Add support for raw pel symptom-id

Update raw pel symptom-id based on TI info data.

Signed-off-by: Ben Tyner <ben.tyner@ibm.com>
Change-Id: I501938e0fc9dba189999ab1491d23acd15628068
diff --git a/attn/pel/extended_user_header.hpp b/attn/pel/extended_user_header.hpp
new file mode 100644
index 0000000..d6486f1
--- /dev/null
+++ b/attn/pel/extended_user_header.hpp
@@ -0,0 +1,164 @@
+#pragma once
+
+#include "pel_common.hpp"
+#include "pel_section.hpp"
+#include "stream.hpp"
+
+namespace attn
+{
+namespace pel
+{
+
+constexpr uint8_t extendedUserHeaderVersion = 0x01;
+constexpr size_t firmwareVersionSize        = 16;
+
+/**
+ * @class ExtendedUserHeader
+ *
+ * This represents the Extended User Header section in a PEL
+ *
+ * |----------+---------------------------+-------+-------+-------------------|
+ * | length   | byte0                     | byte1 | byte2 | byte3             |
+ * |----------+---------------------------+-------+-------+-------------------|
+ * | 8        | Section Header                                                |
+ * |----------+---------------------------------------------------------------|
+ * | 20       | Machine Type/Model/Serial                                     |
+ * |----------+---------------------------------------------------------------|
+ * | 16       | FW Released Version                                           |
+ * |----------+---------------------------------------------------------------|
+ * | 16       | FW Sub-system driver ver.                                     |
+ * |----------+---------------------------+-------+-------+-------------------|
+ * | 4        | Reserved                  | rsvd  | rsvd  | Symptom ID length |
+ * |----------+---------------------------+-------+-------+-------------------|
+ * | 8        | Event Common Reference Time                                   |
+ * |----------+---------------------------------------------------------------|
+ * | 4        | Reserved                                                      |
+ * |----------+---------------------------------------------------------------|
+ * | variable | Symptom ID                                                    |
+ * |----------+---------------------------------------------------------------|
+ *
+ */
+class ExtendedUserHeader : public Section
+{
+  public:
+    ExtendedUserHeader()                          = delete;
+    ~ExtendedUserHeader()                         = default;
+    ExtendedUserHeader(const ExtendedUserHeader&) = default;
+    ExtendedUserHeader& operator=(const ExtendedUserHeader&) = default;
+    ExtendedUserHeader(ExtendedUserHeader&&)                 = default;
+    ExtendedUserHeader& operator=(ExtendedUserHeader&&) = default;
+
+    /**
+     * @brief Constructor
+     *
+     * Fills in this class's data fields from raw data.
+     *
+     * @param[in] pel - the PEL data stream
+     */
+    explicit ExtendedUserHeader(Stream& pel);
+
+    /**
+     * @brief Flatten the section into the stream
+     *
+     * @param[in] stream - The stream to write to
+     */
+    void flatten(Stream& stream) const override;
+
+    /**
+     * @brief Fills in the object from the stream data
+     *
+     * @param[in] stream - The stream to read from
+     */
+    void unflatten(Stream& stream);
+
+    /**
+     * @brief Returns the size of this section when flattened into a PEL
+     *
+     * @return size_t - the size of the section
+     */
+    size_t flattenedSize()
+    {
+        return Section::flattenedSize() + mtmsSize + _serverFWVersion.size() +
+               _subsystemFWVersion.size() + sizeof(_reserved4B) +
+               sizeof(_refTime) + sizeof(_reserved1B1) + sizeof(_reserved1B2) +
+               sizeof(_reserved1B3) + sizeof(_symptomIdSize) + _symptomIdSize;
+    }
+
+    /**
+     * @brief Set the symptom id field in extended user header
+     *
+     * @param[in] symptomId - The symptom ID to set
+     */
+    void setSymptomId(const std::string& symptomId);
+
+  private:
+    /**
+     * @brief The structure that holds the machine TM and SN fields.
+     */
+    uint8_t _mtms[mtmsSize];
+
+    /**
+     * @brief The server firmware version
+     *
+     * NULL terminated.
+     *
+     * The release version of the full firmware image.
+     */
+    std::array<uint8_t, firmwareVersionSize> _serverFWVersion;
+
+    /**
+     * @brief The subsystem firmware version
+     *
+     * NULL terminated.
+     *
+     * On PELs created on the BMC, this will be the BMC code version.
+     */
+    std::array<uint8_t, firmwareVersionSize> _subsystemFWVersion;
+
+    /**
+     * @brief Reserved
+     */
+    uint32_t _reserved4B = 0;
+
+    /**
+     * @brief Event Common Reference Time
+     *
+     * This is not used by PELs created on the BMC.
+     */
+    uint64_t _refTime;
+
+    /**
+     * @brief Reserved
+     */
+    uint8_t _reserved1B1 = 0;
+
+    /**
+     * @brief Reserved
+     */
+    uint8_t _reserved1B2 = 0;
+
+    /**
+     * @brief Reserved
+     */
+    uint8_t _reserved1B3 = 0;
+
+    /**
+     * @brief The size of the symptom ID field
+     */
+    uint8_t _symptomIdSize;
+
+    /**
+     * @brief The symptom ID field
+     *
+     * Describes a unique event signature for the log.
+     * Required for serviceable events, otherwise optional.
+     * When present, must start with the first 8 characters
+     * of the ASCII string field from the SRC.
+     *
+     * NULL terminated.
+     */
+    std::vector<uint8_t> _symptomId;
+};
+
+} // namespace pel
+} // namespace attn