1 #pragma once 2 3 #include "callout.hpp" 4 #include "stream.hpp" 5 6 namespace openpower 7 { 8 namespace pels 9 { 10 namespace src 11 { 12 13 /** 14 * @class Callouts 15 * 16 * This is an optional subsection of the SRC section in a PEL 17 * that holds callouts (represented as Callout objects). 18 * It is at the end of the SRC section, and there can only be one 19 * of these present in the SRC. 20 * 21 * If an SRC doesn't have any callouts, this object won't be created. 22 */ 23 class Callouts 24 { 25 public: 26 Callouts() = default; 27 ~Callouts() = default; 28 Callouts(const Callouts&) = delete; 29 Callouts& operator=(const Callouts&) = delete; 30 Callouts(Callouts&&) = delete; 31 Callouts& operator=(Callouts&&) = delete; 32 33 /** 34 * @brief Constructor 35 * 36 * Fills in this class's data fields from the stream. 37 * 38 * @param[in] pel - the PEL data stream 39 */ 40 explicit Callouts(Stream& pel); 41 42 /** 43 * @brief Flatten the object into the stream 44 * 45 * @param[in] stream - The stream to write to 46 */ 47 void flatten(Stream& pel) const; 48 49 /** 50 * @brief Returns the size of this object when flattened into a PEL 51 * 52 * @return size_t - The size of the section 53 */ 54 size_t flattenedSize() 55 { 56 return _subsectionWordLength * 4; 57 } 58 59 /** 60 * @brief Returns the contained callouts 61 * 62 * @return const std::vector<std::unique_ptr<Callout>>& 63 */ 64 const std::vector<std::unique_ptr<Callout>>& callouts() const 65 { 66 return _callouts; 67 } 68 69 private: 70 /** 71 * @brief The ID of this subsection, which is 0xC0. 72 */ 73 uint8_t _subsectionID; 74 75 /** 76 * @brief Subsection flags. Always 0. 77 */ 78 uint8_t _subsectionFlags; 79 80 /** 81 * @brief Subsection length in 4B words. 82 * 83 * (Subsection is always a multiple of 4B) 84 */ 85 uint16_t _subsectionWordLength; 86 87 /** 88 * @brief The contained callouts 89 */ 90 std::vector<std::unique_ptr<Callout>> _callouts; 91 }; 92 93 } // namespace src 94 95 } // namespace pels 96 } // namespace openpower 97