xref: /openbmc/openpower-occ-control/occ_ffdc.hpp (revision 9789e71f254c4f543c5eabffb0c4ac963b605eb9)
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