PEL: Add a Generic section object

This object will be created when unflattening a PEL when there is no
other class to use for that section.  It just contains a vector<uint8_t>
for its data.

This is done so that the code can always have objects for all PEL
sections, which helps in validating (can at least ensure every section
has a valid header and size), printing (will always have an object to
get its data to at least hex dump), and re-flattening (no need to keep
around the original data buffer).

Signed-off-by: Matt Spinler <spinler@us.ibm.com>
Change-Id: I2b79feb4abc0f44179bdb8eab950f0d274e4e472
diff --git a/extensions/openpower-pels/generic.cpp b/extensions/openpower-pels/generic.cpp
new file mode 100644
index 0000000..78d9e81
--- /dev/null
+++ b/extensions/openpower-pels/generic.cpp
@@ -0,0 +1,55 @@
+#include "generic.hpp"
+
+#include <phosphor-logging/log.hpp>
+
+namespace openpower
+{
+namespace pels
+{
+
+using namespace phosphor::logging;
+
+void Generic::unflatten(Stream& stream)
+{
+    stream >> _header;
+
+    if (_header.size <= SectionHeader::flattenedSize())
+    {
+        throw std::out_of_range(
+            "Generic::unflatten: SectionHeader::size field too small");
+    }
+
+    size_t dataLength = _header.size - SectionHeader::flattenedSize();
+    _data.resize(dataLength);
+
+    stream >> _data;
+}
+
+void Generic::flatten(Stream& stream)
+{
+    stream << _header << _data;
+}
+
+Generic::Generic(Stream& pel)
+{
+    try
+    {
+        unflatten(pel);
+        validate();
+    }
+    catch (const std::exception& e)
+    {
+        log<level::ERR>("Cannot unflatten generic section",
+                        entry("ERROR=%s", e.what()));
+        _valid = false;
+    }
+}
+
+void Generic::validate()
+{
+    // Nothing to validate
+    _valid = true;
+}
+
+} // namespace pels
+} // namespace openpower
diff --git a/extensions/openpower-pels/generic.hpp b/extensions/openpower-pels/generic.hpp
new file mode 100644
index 0000000..892e249
--- /dev/null
+++ b/extensions/openpower-pels/generic.hpp
@@ -0,0 +1,87 @@
+#pragma once
+
+#include "section.hpp"
+#include "stream.hpp"
+
+namespace openpower
+{
+namespace pels
+{
+
+/**
+ * @class Generic
+ *
+ * This class is used for a PEL section when there is no other class to use.
+ * It just contains a vector of the raw data.  Its purpose is so that a PEL
+ * can be completely unflattened even if the code doesn't have a class for
+ * every section type.
+ */
+class Generic : public Section
+{
+  public:
+    Generic() = delete;
+    ~Generic() = default;
+    Generic(const Generic&) = default;
+    Generic& operator=(const Generic&) = default;
+    Generic(Generic&&) = default;
+    Generic& operator=(Generic&&) = default;
+
+    /**
+     * @brief Constructor
+     *
+     * Fills in this class's data fields from the stream.
+     *
+     * @param[in] pel - the PEL data stream
+     */
+    explicit Generic(Stream& pel);
+
+    /**
+     * @brief Flatten the section into the stream
+     *
+     * @param[in] stream - The stream to write to
+     */
+    void flatten(Stream& stream) override;
+
+    /**
+     * @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() + _data.size();
+    }
+
+    /**
+     * @brief Returns the raw section data
+     *
+     * @return std::vector<uint8_t>&
+     */
+    const std::vector<uint8_t>& data() const
+    {
+        return _data;
+    }
+
+  private:
+    /**
+     * @brief Fills in the object from the stream data
+     *
+     * @param[in] stream - The stream to read from
+     */
+    void unflatten(Stream& stream);
+
+    /**
+     * @brief Validates the section contents
+     *
+     * Updates _valid (in Section) with the results.
+     */
+    void validate() override;
+
+    /**
+     * @brief The section data
+     */
+    std::vector<uint8_t> _data;
+};
+
+} // namespace pels
+} // namespace openpower
diff --git a/extensions/openpower-pels/openpower-pels.mk b/extensions/openpower-pels/openpower-pels.mk
index 89143b2..f1603b6 100644
--- a/extensions/openpower-pels/openpower-pels.mk
+++ b/extensions/openpower-pels/openpower-pels.mk
@@ -3,6 +3,7 @@
 	extensions/openpower-pels/data_interface.cpp \
 	extensions/openpower-pels/entry_points.cpp \
 	extensions/openpower-pels/failing_mtms.cpp \
+	extensions/openpower-pels/generic.cpp \
 	extensions/openpower-pels/log_id.cpp \
 	extensions/openpower-pels/manager.cpp \
 	extensions/openpower-pels/mtms.cpp \