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