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 65c8d6cc61SHarisuddin Mohamed Isa * @param[in] plugins - Vector of strings of plugins found in filesystem 66c8d6cc61SHarisuddin Mohamed Isa * @param[in] creatorID - Creator Subsystem ID from Private Header 67a214ed30SHarisuddin Mohamed Isa * @return std::optional<std::string> - If a section comes with a JSON 68a214ed30SHarisuddin Mohamed Isa * representation, this would return the string for it. 69a214ed30SHarisuddin Mohamed Isa */ 70a214ed30SHarisuddin Mohamed Isa virtual std::optional<std::string> 71*d26fa3e7SPatrick Williams getJSON(message::Registry& /*registry*/, 72*d26fa3e7SPatrick Williams const std::vector<std::string>& /*plugins*/, 73*d26fa3e7SPatrick Williams uint8_t /*creatorID*/) const 74a214ed30SHarisuddin Mohamed Isa { 75a214ed30SHarisuddin Mohamed Isa return std::nullopt; 76a214ed30SHarisuddin Mohamed Isa } 77a214ed30SHarisuddin Mohamed Isa 78cbf3c4d4SMatt Spinler /** 79f67bafd0SHarisuddin Mohamed Isa * @brief Get section in JSON. Derived classes to override when required to. 80f67bafd0SHarisuddin Mohamed Isa * @param[in] creatorID - Creator Subsystem ID from Private Header 813fdcd4e8SHarisuddin Mohamed Isa * @param[in] plugins - Vector of strings of plugins found in filesystem 82f67bafd0SHarisuddin Mohamed Isa * @return std::optional<std::string> - If a section comes with a JSON 83f67bafd0SHarisuddin Mohamed Isa * representation, this would return the string for it. 84f67bafd0SHarisuddin Mohamed Isa */ 853fdcd4e8SHarisuddin Mohamed Isa virtual std::optional<std::string> 86*d26fa3e7SPatrick Williams getJSON(uint8_t /*creatorID*/, 87*d26fa3e7SPatrick Williams const std::vector<std::string>& /*plugins*/) const 88f67bafd0SHarisuddin Mohamed Isa { 89f67bafd0SHarisuddin Mohamed Isa return std::nullopt; 90f67bafd0SHarisuddin Mohamed Isa } 91f67bafd0SHarisuddin Mohamed Isa 92f67bafd0SHarisuddin Mohamed Isa /** 93cbf3c4d4SMatt Spinler * @brief Shrinks a PEL section 94cbf3c4d4SMatt Spinler * 95cbf3c4d4SMatt Spinler * If this is even possible for a section depends on which section 96cbf3c4d4SMatt Spinler * it is. If a section cannot be shrunk, it doesn't need to implement 97cbf3c4d4SMatt Spinler * shrink so it will just return false, meaning no shrinking was done. 98cbf3c4d4SMatt Spinler * 99cbf3c4d4SMatt Spinler * If a section can be shrunk, this function will be overridden in that 100cbf3c4d4SMatt Spinler * class. 101cbf3c4d4SMatt Spinler * 102cbf3c4d4SMatt Spinler * @param[in] newSize - The new size, in bytes, to shrink to 103cbf3c4d4SMatt Spinler * 104cbf3c4d4SMatt Spinler * @return bool - true if successful, false else 105cbf3c4d4SMatt Spinler */ 106*d26fa3e7SPatrick Williams virtual bool shrink(size_t /*newSize*/) 107cbf3c4d4SMatt Spinler { 108cbf3c4d4SMatt Spinler return false; 109cbf3c4d4SMatt Spinler } 110cbf3c4d4SMatt Spinler 11185f61a63SMatt Spinler /** 11285f61a63SMatt Spinler * @brief Returns any debug data stored in the object 11385f61a63SMatt Spinler * 11485f61a63SMatt Spinler * @return std::vector<std::string>& - The debug data 11585f61a63SMatt Spinler */ 11685f61a63SMatt Spinler const std::vector<std::string>& getDebugData() const 11785f61a63SMatt Spinler { 11885f61a63SMatt Spinler return _debugData; 11985f61a63SMatt Spinler } 12085f61a63SMatt Spinler 121d3335dfaSMatt Spinler protected: 122d3335dfaSMatt Spinler /** 123d3335dfaSMatt Spinler * @brief Returns the flattened size of the section header 124d3335dfaSMatt Spinler */ 125d3335dfaSMatt Spinler static constexpr size_t flattenedSize() 126d3335dfaSMatt Spinler { 127d3335dfaSMatt Spinler return SectionHeader::flattenedSize(); 128d3335dfaSMatt Spinler } 129d3335dfaSMatt Spinler 130d3335dfaSMatt Spinler /** 13185f61a63SMatt Spinler * @brief Adds debug data to the object that may be displayed 13285f61a63SMatt Spinler * in a UserData section in the PEL. 13385f61a63SMatt Spinler * 13485f61a63SMatt Spinler * @param[in] data - The new entry to add to the vector of data. 13585f61a63SMatt Spinler */ 13685f61a63SMatt Spinler void addDebugData(const std::string& data) 13785f61a63SMatt Spinler { 13885f61a63SMatt Spinler _debugData.push_back(data); 13985f61a63SMatt Spinler } 14085f61a63SMatt Spinler 14185f61a63SMatt Spinler /** 142d3335dfaSMatt Spinler * @brief Used to validate the section. 143d3335dfaSMatt Spinler * 144d3335dfaSMatt Spinler * Implemented by derived classes. 145d3335dfaSMatt Spinler */ 146d3335dfaSMatt Spinler virtual void validate() = 0; 147d3335dfaSMatt Spinler 148d3335dfaSMatt Spinler /** 149d3335dfaSMatt Spinler * @brief The section header structure. 150d3335dfaSMatt Spinler * 151d3335dfaSMatt Spinler * Filled in by derived classes. 152d3335dfaSMatt Spinler */ 153d3335dfaSMatt Spinler SectionHeader _header; 154d3335dfaSMatt Spinler 155d3335dfaSMatt Spinler /** 156d3335dfaSMatt Spinler * @brief The section valid flag. 157d3335dfaSMatt Spinler * 158d3335dfaSMatt Spinler * This is determined by the derived class. 159d3335dfaSMatt Spinler */ 160d3335dfaSMatt Spinler bool _valid = false; 16185f61a63SMatt Spinler 16285f61a63SMatt Spinler /** 16385f61a63SMatt Spinler * @brief Messages that derived classes can add during construction 16485f61a63SMatt Spinler * of a PEL when something happens that would be useful to 16585f61a63SMatt Spinler * store in the PEL. This may get added into a UserData section 16685f61a63SMatt Spinler * in the PEL. 16785f61a63SMatt Spinler */ 16885f61a63SMatt Spinler std::vector<std::string> _debugData; 169d3335dfaSMatt Spinler }; 170d3335dfaSMatt Spinler } // namespace pels 171d3335dfaSMatt Spinler } // namespace openpower 172