1d3335dfaSMatt Spinler #pragma once 2ad0e0476SAatir Manzur 3a214ed30SHarisuddin Mohamed Isa #include "registry.hpp" 4d3335dfaSMatt Spinler #include "section_header.hpp" 5d3335dfaSMatt Spinler 6ad0e0476SAatir Manzur #include <optional> 7ad0e0476SAatir Manzur 8d3335dfaSMatt Spinler namespace openpower 9d3335dfaSMatt Spinler { 10d3335dfaSMatt Spinler namespace pels 11d3335dfaSMatt Spinler { 12d3335dfaSMatt Spinler /** 13d3335dfaSMatt Spinler * @class Section 14d3335dfaSMatt Spinler * 15d3335dfaSMatt Spinler * The base class for a PEL section. It contains the SectionHeader 16d3335dfaSMatt Spinler * as all sections start with it. 17d3335dfaSMatt Spinler * 18d3335dfaSMatt Spinler */ 19d3335dfaSMatt Spinler class Section 20d3335dfaSMatt Spinler { 21d3335dfaSMatt Spinler public: 22d3335dfaSMatt Spinler Section() = default; 23d3335dfaSMatt Spinler virtual ~Section() = default; 24d3335dfaSMatt Spinler Section(const Section&) = default; 25d3335dfaSMatt Spinler Section& operator=(const Section&) = default; 26d3335dfaSMatt Spinler Section(Section&&) = default; 27d3335dfaSMatt Spinler Section& operator=(Section&&) = default; 28d3335dfaSMatt Spinler 29d3335dfaSMatt Spinler /** 30d3335dfaSMatt Spinler * @brief Returns a reference to the SectionHeader 31d3335dfaSMatt Spinler */ 320688545bSMatt Spinler const SectionHeader& header() const 33d3335dfaSMatt Spinler { 34d3335dfaSMatt Spinler return _header; 35d3335dfaSMatt Spinler } 36d3335dfaSMatt Spinler 37d3335dfaSMatt Spinler /** 38d3335dfaSMatt Spinler * @brief Says if the section is valid. 39d3335dfaSMatt Spinler */ 40d3335dfaSMatt Spinler bool valid() const 41d3335dfaSMatt Spinler { 42d3335dfaSMatt Spinler return _valid; 43d3335dfaSMatt Spinler } 44d3335dfaSMatt Spinler 45cf5a8d0fSMatt Spinler /** 46cf5a8d0fSMatt Spinler * @brief Flatten the section into the stream 47cf5a8d0fSMatt Spinler * 48cf5a8d0fSMatt Spinler * @param[in] stream - The stream to write to 49cf5a8d0fSMatt Spinler */ 500688545bSMatt Spinler virtual void flatten(Stream& stream) const = 0; 51cf5a8d0fSMatt Spinler 52ad0e0476SAatir Manzur /** 53ad0e0476SAatir Manzur * @brief Get section in JSON. Derived classes to override when required to. 54ad0e0476SAatir Manzur * @return std::optional<std::string> - If a section comes with a JSON 55a214ed30SHarisuddin Mohamed Isa * representation, this would return the string for it. 56ad0e0476SAatir Manzur */ 57ad0e0476SAatir Manzur virtual std::optional<std::string> getJSON() const 58ad0e0476SAatir Manzur { 59ad0e0476SAatir Manzur return std::nullopt; 60ad0e0476SAatir Manzur } 61ad0e0476SAatir Manzur 62a214ed30SHarisuddin Mohamed Isa /** 63a214ed30SHarisuddin Mohamed Isa * @brief Get section in JSON. Derived classes to override when required to. 64a214ed30SHarisuddin Mohamed Isa * @param[in] registry - Registry object reference 65a214ed30SHarisuddin Mohamed Isa * @return std::optional<std::string> - If a section comes with a JSON 66a214ed30SHarisuddin Mohamed Isa * representation, this would return the string for it. 67a214ed30SHarisuddin Mohamed Isa */ 68a214ed30SHarisuddin Mohamed Isa virtual std::optional<std::string> 69a214ed30SHarisuddin Mohamed Isa getJSON(message::Registry& registry) const 70a214ed30SHarisuddin Mohamed Isa { 71a214ed30SHarisuddin Mohamed Isa return std::nullopt; 72a214ed30SHarisuddin Mohamed Isa } 73a214ed30SHarisuddin Mohamed Isa 74cbf3c4d4SMatt Spinler /** 75*f67bafd0SHarisuddin Mohamed Isa * @brief Get section in JSON. Derived classes to override when required to. 76*f67bafd0SHarisuddin Mohamed Isa * @param[in] creatorID - Creator Subsystem ID from Private Header 77*f67bafd0SHarisuddin Mohamed Isa * @return std::optional<std::string> - If a section comes with a JSON 78*f67bafd0SHarisuddin Mohamed Isa * representation, this would return the string for it. 79*f67bafd0SHarisuddin Mohamed Isa */ 80*f67bafd0SHarisuddin Mohamed Isa virtual std::optional<std::string> getJSON(uint8_t creatorID) const 81*f67bafd0SHarisuddin Mohamed Isa { 82*f67bafd0SHarisuddin Mohamed Isa return std::nullopt; 83*f67bafd0SHarisuddin Mohamed Isa } 84*f67bafd0SHarisuddin Mohamed Isa 85*f67bafd0SHarisuddin Mohamed Isa /** 86cbf3c4d4SMatt Spinler * @brief Shrinks a PEL section 87cbf3c4d4SMatt Spinler * 88cbf3c4d4SMatt Spinler * If this is even possible for a section depends on which section 89cbf3c4d4SMatt Spinler * it is. If a section cannot be shrunk, it doesn't need to implement 90cbf3c4d4SMatt Spinler * shrink so it will just return false, meaning no shrinking was done. 91cbf3c4d4SMatt Spinler * 92cbf3c4d4SMatt Spinler * If a section can be shrunk, this function will be overridden in that 93cbf3c4d4SMatt Spinler * class. 94cbf3c4d4SMatt Spinler * 95cbf3c4d4SMatt Spinler * @param[in] newSize - The new size, in bytes, to shrink to 96cbf3c4d4SMatt Spinler * 97cbf3c4d4SMatt Spinler * @return bool - true if successful, false else 98cbf3c4d4SMatt Spinler */ 99cbf3c4d4SMatt Spinler virtual bool shrink(size_t newSize) 100cbf3c4d4SMatt Spinler { 101cbf3c4d4SMatt Spinler return false; 102cbf3c4d4SMatt Spinler } 103cbf3c4d4SMatt Spinler 10485f61a63SMatt Spinler /** 10585f61a63SMatt Spinler * @brief Returns any debug data stored in the object 10685f61a63SMatt Spinler * 10785f61a63SMatt Spinler * @return std::vector<std::string>& - The debug data 10885f61a63SMatt Spinler */ 10985f61a63SMatt Spinler const std::vector<std::string>& getDebugData() const 11085f61a63SMatt Spinler { 11185f61a63SMatt Spinler return _debugData; 11285f61a63SMatt Spinler } 11385f61a63SMatt Spinler 114d3335dfaSMatt Spinler protected: 115d3335dfaSMatt Spinler /** 116d3335dfaSMatt Spinler * @brief Returns the flattened size of the section header 117d3335dfaSMatt Spinler */ 118d3335dfaSMatt Spinler static constexpr size_t flattenedSize() 119d3335dfaSMatt Spinler { 120d3335dfaSMatt Spinler return SectionHeader::flattenedSize(); 121d3335dfaSMatt Spinler } 122d3335dfaSMatt Spinler 123d3335dfaSMatt Spinler /** 12485f61a63SMatt Spinler * @brief Adds debug data to the object that may be displayed 12585f61a63SMatt Spinler * in a UserData section in the PEL. 12685f61a63SMatt Spinler * 12785f61a63SMatt Spinler * @param[in] data - The new entry to add to the vector of data. 12885f61a63SMatt Spinler */ 12985f61a63SMatt Spinler void addDebugData(const std::string& data) 13085f61a63SMatt Spinler { 13185f61a63SMatt Spinler _debugData.push_back(data); 13285f61a63SMatt Spinler } 13385f61a63SMatt Spinler 13485f61a63SMatt Spinler /** 135d3335dfaSMatt Spinler * @brief Used to validate the section. 136d3335dfaSMatt Spinler * 137d3335dfaSMatt Spinler * Implemented by derived classes. 138d3335dfaSMatt Spinler */ 139d3335dfaSMatt Spinler virtual void validate() = 0; 140d3335dfaSMatt Spinler 141d3335dfaSMatt Spinler /** 142d3335dfaSMatt Spinler * @brief The section header structure. 143d3335dfaSMatt Spinler * 144d3335dfaSMatt Spinler * Filled in by derived classes. 145d3335dfaSMatt Spinler */ 146d3335dfaSMatt Spinler SectionHeader _header; 147d3335dfaSMatt Spinler 148d3335dfaSMatt Spinler /** 149d3335dfaSMatt Spinler * @brief The section valid flag. 150d3335dfaSMatt Spinler * 151d3335dfaSMatt Spinler * This is determined by the derived class. 152d3335dfaSMatt Spinler */ 153d3335dfaSMatt Spinler bool _valid = false; 15485f61a63SMatt Spinler 15585f61a63SMatt Spinler /** 15685f61a63SMatt Spinler * @brief Messages that derived classes can add during construction 15785f61a63SMatt Spinler * of a PEL when something happens that would be useful to 15885f61a63SMatt Spinler * store in the PEL. This may get added into a UserData section 15985f61a63SMatt Spinler * in the PEL. 16085f61a63SMatt Spinler */ 16185f61a63SMatt Spinler std::vector<std::string> _debugData; 162d3335dfaSMatt Spinler }; 163d3335dfaSMatt Spinler } // namespace pels 164d3335dfaSMatt Spinler } // namespace openpower 165