#pragma once #include "callout.hpp" #include "stream.hpp" namespace openpower { namespace pels { namespace src { constexpr uint8_t calloutsSubsectionID = 0xC0; constexpr size_t maxNumberOfCallouts = 10; /** * @class Callouts * * This is an optional subsection of the SRC section in a PEL * that holds callouts (represented as Callout objects). * It is at the end of the SRC section, and there can only be one * of these present in the SRC. * * If an SRC doesn't have any callouts, this object won't be created. */ class Callouts { public: ~Callouts() = default; Callouts(const Callouts&) = delete; Callouts& operator=(const Callouts&) = delete; Callouts(Callouts&&) = delete; Callouts& operator=(Callouts&&) = delete; /** * @brief Constructor * * Creates the object with no callouts. */ Callouts() : _subsectionID(calloutsSubsectionID), _subsectionFlags(0), _subsectionWordLength(1) { } /** * @brief Constructor * * Fills in this class's data fields from the stream. * * @param[in] pel - the PEL data stream */ explicit Callouts(Stream& pel); /** * @brief Flatten the object into the stream * * @param[in] stream - The stream to write to */ void flatten(Stream& pel) const; /** * @brief Returns the size of this object when flattened into a PEL * * @return size_t - The size of the section */ size_t flattenedSize() { return _subsectionWordLength * 4; } /** * @brief Returns the contained callouts * * @return const std::vector>& */ const std::vector>& callouts() const { return _callouts; } /** * @brief Adds a callout * * @param[in] callout - The callout to add */ void addCallout(std::unique_ptr callout); private: /** * @brief The ID of this subsection, which is 0xC0. */ uint8_t _subsectionID; /** * @brief Subsection flags. Always 0. */ uint8_t _subsectionFlags; /** * @brief Subsection length in 4B words. * * (Subsection is always a multiple of 4B) */ uint16_t _subsectionWordLength; /** * @brief The contained callouts */ std::vector> _callouts; }; } // namespace src } // namespace pels } // namespace openpower