|  | #pragma once | 
|  |  | 
|  | #include "bcd_time.hpp" | 
|  | #include "section.hpp" | 
|  | #include "stream.hpp" | 
|  |  | 
|  | namespace openpower | 
|  | { | 
|  | namespace pels | 
|  | { | 
|  |  | 
|  | struct CreatorVersion | 
|  | { | 
|  | uint8_t version[8]; | 
|  |  | 
|  | CreatorVersion() | 
|  | { | 
|  | memset(version, '\0', sizeof(version)); | 
|  | } | 
|  | }; | 
|  |  | 
|  | static constexpr uint8_t privateHeaderVersion = 0x01; | 
|  | static constexpr uint8_t minSectionCount = 2; | 
|  |  | 
|  | /** | 
|  | * @class PrivateHeader | 
|  | * | 
|  | * This represents the Private Header section in a PEL.  It is required, | 
|  | * and it is always the first section. | 
|  | * | 
|  | * The Section base class handles the section header structure that every | 
|  | * PEL section has at offset zero. | 
|  | * | 
|  | * The fields in this class directly correspond to the order and sizes of | 
|  | * the fields in the section. | 
|  | */ | 
|  | class PrivateHeader : public Section | 
|  | { | 
|  | public: | 
|  | PrivateHeader() = delete; | 
|  | ~PrivateHeader() override = default; | 
|  | PrivateHeader(const PrivateHeader&) = default; | 
|  | PrivateHeader& operator=(const PrivateHeader&) = default; | 
|  | PrivateHeader(PrivateHeader&&) = default; | 
|  | PrivateHeader& operator=(PrivateHeader&&) = default; | 
|  |  | 
|  | /** | 
|  | * @brief Constructor | 
|  | * | 
|  | * Creates a valid PrivateHeader with the passed in data | 
|  | * | 
|  | * @param[in] componentID - the creator's component ID | 
|  | * @param[in] obmcLogID - the corresponding OpenBMC event log ID | 
|  | * @param[in] timestamp - the creation timestamp, in epoch milliseconds | 
|  | */ | 
|  | PrivateHeader(uint16_t componentID, uint32_t obmcLogID, uint64_t timestamp); | 
|  |  | 
|  | /** | 
|  | * @brief Constructor | 
|  | * | 
|  | * Fills in this class's data fields from the stream. | 
|  | * | 
|  | * @param[in] pel - the PEL data stream | 
|  | * | 
|  | */ | 
|  | explicit PrivateHeader(Stream& pel); | 
|  |  | 
|  | /** | 
|  | * @brief Flatten the section into the stream | 
|  | * | 
|  | * @param[in] stream - The stream to write to | 
|  | */ | 
|  | void flatten(Stream& stream) const override; | 
|  |  | 
|  | /** | 
|  | * @brief Returns the creation timestamp | 
|  | * | 
|  | * @return const BCDTime& - the timestamp | 
|  | */ | 
|  | const BCDTime& createTimestamp() const | 
|  | { | 
|  | return _createTimestamp; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * @brief Returns the commit time timestamp | 
|  | * | 
|  | * @return const BCDTime& - the timestamp | 
|  | */ | 
|  | const BCDTime& commitTimestamp() const | 
|  | { | 
|  | return _commitTimestamp; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * @brief Sets the commit timestamp | 
|  | * | 
|  | * @param[in] time - the new timestamp | 
|  | */ | 
|  | void setCommitTimestamp(const BCDTime& time) | 
|  | { | 
|  | _commitTimestamp = time; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * @brief Returns the creator ID field | 
|  | * | 
|  | * @return uint8_t - the creator ID | 
|  | */ | 
|  | uint8_t creatorID() const | 
|  | { | 
|  | return _creatorID; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * @brief Returns the log type field | 
|  | * | 
|  | * @return uint8_t - the log type | 
|  | */ | 
|  | uint8_t logType() const | 
|  | { | 
|  | return _logType; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * @brief Returns the section count field | 
|  | * | 
|  | * @return uint8_t - the section count | 
|  | */ | 
|  | uint8_t sectionCount() const | 
|  | { | 
|  | return _sectionCount; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * @brief Sets the section count field | 
|  | * | 
|  | * @param[in] count - the new section count | 
|  | */ | 
|  | void setSectionCount(uint8_t count) | 
|  | { | 
|  | _sectionCount = count; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * @brief Returns the OpenBMC log ID field | 
|  | * | 
|  | * This is the ID the OpenBMC event log that corresponds | 
|  | * to this PEL. | 
|  | * | 
|  | * @return uint32_t - the OpenBMC event log ID | 
|  | */ | 
|  | uint32_t obmcLogID() const | 
|  | { | 
|  | return _obmcLogID; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * @brief Sets the OpenBMC log ID field | 
|  | * | 
|  | * @param[in] id - the new ID | 
|  | */ | 
|  | void setOBMCLogID(uint32_t id) | 
|  | { | 
|  | _obmcLogID = id; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * @brief Returns the Creator Version field | 
|  | * | 
|  | * @return CreatorVersion& - the creator version | 
|  | */ | 
|  | const CreatorVersion& creatorVersion() const | 
|  | { | 
|  | return _creatorVersion; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * @brief Returns the error log ID field | 
|  | * | 
|  | * @return uint32_t - the error log ID | 
|  | */ | 
|  | uint32_t id() const | 
|  | { | 
|  | return _id; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * @brief Sets the ID field | 
|  | * | 
|  | * @param[in] id - the new ID | 
|  | */ | 
|  | void setID(uint32_t id) | 
|  | { | 
|  | _id = id; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * @brief Returns the platform log ID field | 
|  | * | 
|  | * @return uint32_t - the platform log ID | 
|  | */ | 
|  | uint32_t plid() const | 
|  | { | 
|  | return _plid; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * @brief Returns the size of this section when flattened into a PEL | 
|  | * | 
|  | * @return size_t - the size of the section | 
|  | */ | 
|  | static constexpr size_t flattenedSize() | 
|  | { | 
|  | return Section::headerSize() + sizeof(_createTimestamp) + | 
|  | sizeof(_commitTimestamp) + sizeof(_creatorID) + | 
|  | sizeof(_logType) + sizeof(_reservedByte) + | 
|  | sizeof(_sectionCount) + sizeof(_obmcLogID) + | 
|  | sizeof(_creatorVersion) + sizeof(_plid) + sizeof(_id); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * @brief Get section in JSON. | 
|  | * | 
|  | * @param[in] creatorID - The creator ID for the PEL | 
|  | * | 
|  | * @return std::optional<std::string> - Private header section's JSON | 
|  | */ | 
|  | std::optional<std::string> getJSON(uint8_t creatorID) const override; | 
|  |  | 
|  | private: | 
|  | /** | 
|  | * @brief Fills in the object from the stream data | 
|  | * | 
|  | * @param[in] stream - The stream to read from | 
|  | */ | 
|  | void unflatten(Stream& stream); | 
|  |  | 
|  | /** | 
|  | * @brief Validates the section contents | 
|  | * | 
|  | * Updates _valid (in Section) with the results. | 
|  | */ | 
|  | void validate(); | 
|  |  | 
|  | /** | 
|  | * @brief The creation time timestamp | 
|  | */ | 
|  | BCDTime _createTimestamp; | 
|  |  | 
|  | /** | 
|  | * @brief The commit time timestamp | 
|  | */ | 
|  | BCDTime _commitTimestamp; | 
|  |  | 
|  | /** | 
|  | * @brief The creator ID field | 
|  | */ | 
|  | uint8_t _creatorID; | 
|  |  | 
|  | /** | 
|  | * @brief The log type field | 
|  | */ | 
|  | uint8_t _logType; | 
|  |  | 
|  | /** | 
|  | * @brief A reserved byte. | 
|  | */ | 
|  | uint8_t _reservedByte; | 
|  |  | 
|  | /** | 
|  | * @brief The section count field, which is the total number | 
|  | * of sections in the PEL. | 
|  | */ | 
|  | uint8_t _sectionCount; | 
|  |  | 
|  | /** | 
|  | * @brief The OpenBMC event log ID that corresponds to this PEL. | 
|  | */ | 
|  | uint32_t _obmcLogID; | 
|  |  | 
|  | /** | 
|  | * @brief The creator subsystem version field | 
|  | */ | 
|  | CreatorVersion _creatorVersion; | 
|  |  | 
|  | /** | 
|  | * @brief The platform log ID field | 
|  | */ | 
|  | uint32_t _plid; | 
|  |  | 
|  | /** | 
|  | * @brief The log entry ID field | 
|  | */ | 
|  | uint32_t _id; | 
|  | }; | 
|  |  | 
|  | /** | 
|  | * @brief Stream extraction operator for the CreatorVersion | 
|  | * | 
|  | * @param[in] s - the stream | 
|  | * @param[out] cv - the CreatorVersion object | 
|  | */ | 
|  | Stream& operator>>(Stream& s, CreatorVersion& cv); | 
|  |  | 
|  | /** | 
|  | * @brief Stream insertion operator for the CreatorVersion | 
|  | * | 
|  | * @param[out] s - the stream | 
|  | * @param[in] cv - the CreatorVersion object | 
|  | */ | 
|  | Stream& operator<<(Stream& s, const CreatorVersion& cv); | 
|  |  | 
|  | } // namespace pels | 
|  | } // namespace openpower |