Attn: Add support for raw PEL creation

Attention handler needs to pass raw PEL's to phosphor logging in order
to submit PEL's on behalf of other components (e.g. hypervisor)

Signed-off-by: Ben Tyner <ben.tyner@ibm.com>
Change-Id: Id9a30728e7b463ac876b5dca023ca2627a25bb16
diff --git a/attn/pel/pel_section.hpp b/attn/pel/pel_section.hpp
new file mode 100644
index 0000000..ca8dce4
--- /dev/null
+++ b/attn/pel/pel_section.hpp
@@ -0,0 +1,59 @@
+#pragma once
+
+#include "section_header.hpp"
+
+namespace attn
+{
+namespace pel
+{
+/**
+ * @class Section
+ *
+ * The base class for a PEL section.  It contains the SectionHeader
+ * as all sections start with it.
+ *
+ */
+class Section
+{
+  public:
+    Section()               = default;
+    virtual ~Section()      = default;
+    Section(const Section&) = default;
+    Section& operator=(const Section&) = default;
+    Section(Section&&)                 = default;
+    Section& operator=(Section&&) = default;
+
+    /**
+     * @brief Returns a reference to the SectionHeader
+     */
+    const SectionHeader& header() const
+    {
+        return _header;
+    }
+
+    /**
+     * @brief Flatten the section into the stream
+     *
+     * @param[in] stream - The stream to write to
+     */
+    virtual void flatten(Stream& stream) const = 0;
+
+  protected:
+    /**
+     * @brief Returns the flattened size of the section header
+     */
+    static constexpr size_t flattenedSize()
+    {
+        return SectionHeader::flattenedSize();
+    }
+
+    /**
+     * @brief The section header structure.
+     *
+     * Filled in by derived classes.
+     */
+    SectionHeader _header;
+};
+
+} // namespace pel
+} // namespace attn