12f9f9bbaSEddie James #pragma once 22f9f9bbaSEddie James 32f9f9bbaSEddie James #include "config.h" 42f9f9bbaSEddie James 52f9f9bbaSEddie James #include "occ_errors.hpp" 62f9f9bbaSEddie James 72f9f9bbaSEddie James namespace open_power 82f9f9bbaSEddie James { 92f9f9bbaSEddie James namespace occ 102f9f9bbaSEddie James { 112f9f9bbaSEddie James 122f9f9bbaSEddie James /** @class FFDC 132f9f9bbaSEddie James * @brief Monitors for SBE FFDC availability 142f9f9bbaSEddie James */ 152f9f9bbaSEddie James class FFDC : public Error 162f9f9bbaSEddie James { 172f9f9bbaSEddie James public: 182f9f9bbaSEddie James FFDC() = delete; 192f9f9bbaSEddie James FFDC(const FFDC&) = delete; 202f9f9bbaSEddie James FFDC& operator=(const FFDC&) = delete; 212f9f9bbaSEddie James FFDC(FFDC&&) = default; 222f9f9bbaSEddie James FFDC& operator=(FFDC&&) = default; 232f9f9bbaSEddie James 242f9f9bbaSEddie James /** @brief Constructs the FFDC object 252f9f9bbaSEddie James * 262f9f9bbaSEddie James * @param[in] event - reference to sd_event unique_ptr 272f9f9bbaSEddie James * @param[in] file - File used by driver to communicate FFDC data 282f9f9bbaSEddie James * @param[in] instance - OCC instance number 292f9f9bbaSEddie James */ 302f9f9bbaSEddie James FFDC(EventPtr& event, const fs::path& file, unsigned int instance) : 312f9f9bbaSEddie James Error(event, file, nullptr), instance(instance) 322f9f9bbaSEddie James { 332f9f9bbaSEddie James // Nothing to do here. 342f9f9bbaSEddie James } 352f9f9bbaSEddie James 362f9f9bbaSEddie James ~FFDC() 372f9f9bbaSEddie James { 382f9f9bbaSEddie James for (auto&& it : temporaryFiles) 392f9f9bbaSEddie James { 402f9f9bbaSEddie James close(it.second); 412f9f9bbaSEddie James fs::remove(it.first); 422f9f9bbaSEddie James } 432f9f9bbaSEddie James } 442f9f9bbaSEddie James 452f9f9bbaSEddie James /** @brief Helper function to create a PEL with the OpenPower DBus 462f9f9bbaSEddie James * interface 472f9f9bbaSEddie James * 482f9f9bbaSEddie James * @param[in] path - the DBus error path 492f9f9bbaSEddie James * @param[in] src6 - the SBE error SRC6 word 502f9f9bbaSEddie James * @param[in] msg - the error message 512f9f9bbaSEddie James * @param[in] fd - the file descriptor for any FFDC 522f9f9bbaSEddie James */ 532f9f9bbaSEddie James static uint32_t createPEL(const char* path, uint32_t src6, const char* msg, 542f9f9bbaSEddie James int fd = -1); 552f9f9bbaSEddie James 56*9789e71fSEddie James /** @brief Helper function to create a PEL for the OCC reset with the 57*9789e71fSEddie James * OpenPower DBus interface 58*9789e71fSEddie James * 59*9789e71fSEddie James * @param[in] instance - the OCC instance id 60*9789e71fSEddie James * @param[in] path - the DBus error path 61*9789e71fSEddie James * @param[in] err - the error return code 62*9789e71fSEddie James * @param[in] callout - the PEL callout path 63*9789e71fSEddie James */ 64*9789e71fSEddie James static void createOCCResetPEL(unsigned int instance, const char* path, 65*9789e71fSEddie James int err, const char* callout); 66*9789e71fSEddie James 672f9f9bbaSEddie James private: 682f9f9bbaSEddie James /** @brief OCC instance number. Ex, 0,1, etc */ 692f9f9bbaSEddie James unsigned int instance; 702f9f9bbaSEddie James 712f9f9bbaSEddie James /** @brief Stores the temporary files and file descriptors 722f9f9bbaSEddie James * in usage. They will be cleaned up when the class 732f9f9bbaSEddie James * is destroyed (when the application exits). 742f9f9bbaSEddie James */ 752f9f9bbaSEddie James std::vector<std::pair<fs::path, int>> temporaryFiles; 762f9f9bbaSEddie James 772f9f9bbaSEddie James /** @brief When the error event is received, analyzes it 782f9f9bbaSEddie James * and makes a callback to error handler if the 792f9f9bbaSEddie James * content denotes an error condition 802f9f9bbaSEddie James */ 812f9f9bbaSEddie James void analyzeEvent() override; 822f9f9bbaSEddie James }; 832f9f9bbaSEddie James 842f9f9bbaSEddie James } // namespace occ 852f9f9bbaSEddie James } // namespace open_power 86