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 /** 75f67bafd0SHarisuddin Mohamed Isa * @brief Get section in JSON. Derived classes to override when required to. 76f67bafd0SHarisuddin Mohamed Isa * @param[in] creatorID - Creator Subsystem ID from Private Header 77*3fdcd4e8SHarisuddin Mohamed Isa * @param[in] plugins - Vector of strings of plugins found in filesystem 78f67bafd0SHarisuddin Mohamed Isa * @return std::optional<std::string> - If a section comes with a JSON 79f67bafd0SHarisuddin Mohamed Isa * representation, this would return the string for it. 80f67bafd0SHarisuddin Mohamed Isa */ 81*3fdcd4e8SHarisuddin Mohamed Isa virtual std::optional<std::string> 82*3fdcd4e8SHarisuddin Mohamed Isa getJSON(uint8_t creatorID, 83*3fdcd4e8SHarisuddin Mohamed Isa const std::vector<std::string>& plugins) const 84f67bafd0SHarisuddin Mohamed Isa { 85f67bafd0SHarisuddin Mohamed Isa return std::nullopt; 86f67bafd0SHarisuddin Mohamed Isa } 87f67bafd0SHarisuddin Mohamed Isa 88f67bafd0SHarisuddin Mohamed Isa /** 89cbf3c4d4SMatt Spinler * @brief Shrinks a PEL section 90cbf3c4d4SMatt Spinler * 91cbf3c4d4SMatt Spinler * If this is even possible for a section depends on which section 92cbf3c4d4SMatt Spinler * it is. If a section cannot be shrunk, it doesn't need to implement 93cbf3c4d4SMatt Spinler * shrink so it will just return false, meaning no shrinking was done. 94cbf3c4d4SMatt Spinler * 95cbf3c4d4SMatt Spinler * If a section can be shrunk, this function will be overridden in that 96cbf3c4d4SMatt Spinler * class. 97cbf3c4d4SMatt Spinler * 98cbf3c4d4SMatt Spinler * @param[in] newSize - The new size, in bytes, to shrink to 99cbf3c4d4SMatt Spinler * 100cbf3c4d4SMatt Spinler * @return bool - true if successful, false else 101cbf3c4d4SMatt Spinler */ 102cbf3c4d4SMatt Spinler virtual bool shrink(size_t newSize) 103cbf3c4d4SMatt Spinler { 104cbf3c4d4SMatt Spinler return false; 105cbf3c4d4SMatt Spinler } 106cbf3c4d4SMatt Spinler 10785f61a63SMatt Spinler /** 10885f61a63SMatt Spinler * @brief Returns any debug data stored in the object 10985f61a63SMatt Spinler * 11085f61a63SMatt Spinler * @return std::vector<std::string>& - The debug data 11185f61a63SMatt Spinler */ 11285f61a63SMatt Spinler const std::vector<std::string>& getDebugData() const 11385f61a63SMatt Spinler { 11485f61a63SMatt Spinler return _debugData; 11585f61a63SMatt Spinler } 11685f61a63SMatt Spinler 117d3335dfaSMatt Spinler protected: 118d3335dfaSMatt Spinler /** 119d3335dfaSMatt Spinler * @brief Returns the flattened size of the section header 120d3335dfaSMatt Spinler */ 121d3335dfaSMatt Spinler static constexpr size_t flattenedSize() 122d3335dfaSMatt Spinler { 123d3335dfaSMatt Spinler return SectionHeader::flattenedSize(); 124d3335dfaSMatt Spinler } 125d3335dfaSMatt Spinler 126d3335dfaSMatt Spinler /** 12785f61a63SMatt Spinler * @brief Adds debug data to the object that may be displayed 12885f61a63SMatt Spinler * in a UserData section in the PEL. 12985f61a63SMatt Spinler * 13085f61a63SMatt Spinler * @param[in] data - The new entry to add to the vector of data. 13185f61a63SMatt Spinler */ 13285f61a63SMatt Spinler void addDebugData(const std::string& data) 13385f61a63SMatt Spinler { 13485f61a63SMatt Spinler _debugData.push_back(data); 13585f61a63SMatt Spinler } 13685f61a63SMatt Spinler 13785f61a63SMatt Spinler /** 138d3335dfaSMatt Spinler * @brief Used to validate the section. 139d3335dfaSMatt Spinler * 140d3335dfaSMatt Spinler * Implemented by derived classes. 141d3335dfaSMatt Spinler */ 142d3335dfaSMatt Spinler virtual void validate() = 0; 143d3335dfaSMatt Spinler 144d3335dfaSMatt Spinler /** 145d3335dfaSMatt Spinler * @brief The section header structure. 146d3335dfaSMatt Spinler * 147d3335dfaSMatt Spinler * Filled in by derived classes. 148d3335dfaSMatt Spinler */ 149d3335dfaSMatt Spinler SectionHeader _header; 150d3335dfaSMatt Spinler 151d3335dfaSMatt Spinler /** 152d3335dfaSMatt Spinler * @brief The section valid flag. 153d3335dfaSMatt Spinler * 154d3335dfaSMatt Spinler * This is determined by the derived class. 155d3335dfaSMatt Spinler */ 156d3335dfaSMatt Spinler bool _valid = false; 15785f61a63SMatt Spinler 15885f61a63SMatt Spinler /** 15985f61a63SMatt Spinler * @brief Messages that derived classes can add during construction 16085f61a63SMatt Spinler * of a PEL when something happens that would be useful to 16185f61a63SMatt Spinler * store in the PEL. This may get added into a UserData section 16285f61a63SMatt Spinler * in the PEL. 16385f61a63SMatt Spinler */ 16485f61a63SMatt Spinler std::vector<std::string> _debugData; 165d3335dfaSMatt Spinler }; 166d3335dfaSMatt Spinler } // namespace pels 167d3335dfaSMatt Spinler } // namespace openpower 168