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