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 /** 75cbf3c4d4SMatt Spinler * @brief Shrinks a PEL section 76cbf3c4d4SMatt Spinler * 77cbf3c4d4SMatt Spinler * If this is even possible for a section depends on which section 78cbf3c4d4SMatt Spinler * it is. If a section cannot be shrunk, it doesn't need to implement 79cbf3c4d4SMatt Spinler * shrink so it will just return false, meaning no shrinking was done. 80cbf3c4d4SMatt Spinler * 81cbf3c4d4SMatt Spinler * If a section can be shrunk, this function will be overridden in that 82cbf3c4d4SMatt Spinler * class. 83cbf3c4d4SMatt Spinler * 84cbf3c4d4SMatt Spinler * @param[in] newSize - The new size, in bytes, to shrink to 85cbf3c4d4SMatt Spinler * 86cbf3c4d4SMatt Spinler * @return bool - true if successful, false else 87cbf3c4d4SMatt Spinler */ 88cbf3c4d4SMatt Spinler virtual bool shrink(size_t newSize) 89cbf3c4d4SMatt Spinler { 90cbf3c4d4SMatt Spinler return false; 91cbf3c4d4SMatt Spinler } 92cbf3c4d4SMatt Spinler 93*85f61a63SMatt Spinler /** 94*85f61a63SMatt Spinler * @brief Returns any debug data stored in the object 95*85f61a63SMatt Spinler * 96*85f61a63SMatt Spinler * @return std::vector<std::string>& - The debug data 97*85f61a63SMatt Spinler */ 98*85f61a63SMatt Spinler const std::vector<std::string>& getDebugData() const 99*85f61a63SMatt Spinler { 100*85f61a63SMatt Spinler return _debugData; 101*85f61a63SMatt Spinler } 102*85f61a63SMatt Spinler 103d3335dfaSMatt Spinler protected: 104d3335dfaSMatt Spinler /** 105d3335dfaSMatt Spinler * @brief Returns the flattened size of the section header 106d3335dfaSMatt Spinler */ 107d3335dfaSMatt Spinler static constexpr size_t flattenedSize() 108d3335dfaSMatt Spinler { 109d3335dfaSMatt Spinler return SectionHeader::flattenedSize(); 110d3335dfaSMatt Spinler } 111d3335dfaSMatt Spinler 112d3335dfaSMatt Spinler /** 113*85f61a63SMatt Spinler * @brief Adds debug data to the object that may be displayed 114*85f61a63SMatt Spinler * in a UserData section in the PEL. 115*85f61a63SMatt Spinler * 116*85f61a63SMatt Spinler * @param[in] data - The new entry to add to the vector of data. 117*85f61a63SMatt Spinler */ 118*85f61a63SMatt Spinler void addDebugData(const std::string& data) 119*85f61a63SMatt Spinler { 120*85f61a63SMatt Spinler _debugData.push_back(data); 121*85f61a63SMatt Spinler } 122*85f61a63SMatt Spinler 123*85f61a63SMatt Spinler /** 124d3335dfaSMatt Spinler * @brief Used to validate the section. 125d3335dfaSMatt Spinler * 126d3335dfaSMatt Spinler * Implemented by derived classes. 127d3335dfaSMatt Spinler */ 128d3335dfaSMatt Spinler virtual void validate() = 0; 129d3335dfaSMatt Spinler 130d3335dfaSMatt Spinler /** 131d3335dfaSMatt Spinler * @brief The section header structure. 132d3335dfaSMatt Spinler * 133d3335dfaSMatt Spinler * Filled in by derived classes. 134d3335dfaSMatt Spinler */ 135d3335dfaSMatt Spinler SectionHeader _header; 136d3335dfaSMatt Spinler 137d3335dfaSMatt Spinler /** 138d3335dfaSMatt Spinler * @brief The section valid flag. 139d3335dfaSMatt Spinler * 140d3335dfaSMatt Spinler * This is determined by the derived class. 141d3335dfaSMatt Spinler */ 142d3335dfaSMatt Spinler bool _valid = false; 143*85f61a63SMatt Spinler 144*85f61a63SMatt Spinler /** 145*85f61a63SMatt Spinler * @brief Messages that derived classes can add during construction 146*85f61a63SMatt Spinler * of a PEL when something happens that would be useful to 147*85f61a63SMatt Spinler * store in the PEL. This may get added into a UserData section 148*85f61a63SMatt Spinler * in the PEL. 149*85f61a63SMatt Spinler */ 150*85f61a63SMatt Spinler std::vector<std::string> _debugData; 151d3335dfaSMatt Spinler }; 152d3335dfaSMatt Spinler } // namespace pels 153d3335dfaSMatt Spinler } // namespace openpower 154