Add FFDC collection
Add a class to watch for the presence of SBEFIFO FFDC reported up
through the OCC hwmon driver.
Signed-off-by: Eddie James <eajames@linux.ibm.com>
Change-Id: Ia8bf6eddb037aec547b72ecce39c1a977d9374bc
diff --git a/occ_ffdc.hpp b/occ_ffdc.hpp
new file mode 100644
index 0000000..a4c882d
--- /dev/null
+++ b/occ_ffdc.hpp
@@ -0,0 +1,74 @@
+#pragma once
+
+#include "config.h"
+
+#include "occ_errors.hpp"
+
+namespace open_power
+{
+namespace occ
+{
+
+/** @class FFDC
+ * @brief Monitors for SBE FFDC availability
+ */
+class FFDC : public Error
+{
+ public:
+ FFDC() = delete;
+ FFDC(const FFDC&) = delete;
+ FFDC& operator=(const FFDC&) = delete;
+ FFDC(FFDC&&) = default;
+ FFDC& operator=(FFDC&&) = default;
+
+ /** @brief Constructs the FFDC object
+ *
+ * @param[in] event - reference to sd_event unique_ptr
+ * @param[in] file - File used by driver to communicate FFDC data
+ * @param[in] instance - OCC instance number
+ */
+ FFDC(EventPtr& event, const fs::path& file, unsigned int instance) :
+ Error(event, file, nullptr), instance(instance)
+ {
+ // Nothing to do here.
+ }
+
+ ~FFDC()
+ {
+ for (auto&& it : temporaryFiles)
+ {
+ close(it.second);
+ fs::remove(it.first);
+ }
+ }
+
+ /** @brief Helper function to create a PEL with the OpenPower DBus
+ * interface
+ *
+ * @param[in] path - the DBus error path
+ * @param[in] src6 - the SBE error SRC6 word
+ * @param[in] msg - the error message
+ * @param[in] fd - the file descriptor for any FFDC
+ */
+ static uint32_t createPEL(const char* path, uint32_t src6, const char* msg,
+ int fd = -1);
+
+ private:
+ /** @brief OCC instance number. Ex, 0,1, etc */
+ unsigned int instance;
+
+ /** @brief Stores the temporary files and file descriptors
+ * in usage. They will be cleaned up when the class
+ * is destroyed (when the application exits).
+ */
+ std::vector<std::pair<fs::path, int>> temporaryFiles;
+
+ /** @brief When the error event is received, analyzes it
+ * and makes a callback to error handler if the
+ * content denotes an error condition
+ */
+ void analyzeEvent() override;
+};
+
+} // namespace occ
+} // namespace open_power