#pragma once //#include "bcd_time.hpp" #include "pel_common.hpp" #include "pel_section.hpp" #include "stream.hpp" namespace attn { namespace pel { // creator version field type, init to null terminated // struct CreatorVersion //{ // uint8_t version[8]; // CreatorVersion() // { // memset(version, '\0', sizeof(version)); // } //}; /** * @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 SectionHeader structure that every * PEL section has at offset zero. * * |--------+----------------------+----------+----------+---------------| * | length | byte0 | byte1 | byte2 | byte3 | * |--------+----------------------+----------+----------+---------------| * | 8 | Section Header | * | | | * |--------+------------------------------------------------------------| * | 8 | Timestamp - Creation | * | | | * |--------+------------------------------------------------------------| * | 8 | Timestamp - Commit | * | | | * |--------+----------------------+----------+----------+---------------| * | 4 | Creator ID | reserved | reserved | section count | * |--------+----------------------+----------+----------+---------------| * | 4 | OpenBMC Event Log ID | * |--------+------------------------------------------------------------| * | 8 | Creator Implementation | * | | | * |--------+------------------------------------------------------------| * | 4 | Platform Log ID | * |--------+------------------------------------------------------------| * | 4 | Log Entry ID | * |--------+------------------------------------------------------------| */ class PrivateHeader : public Section { public: PrivateHeader() = delete; ~PrivateHeader() = default; PrivateHeader(const PrivateHeader&) = default; PrivateHeader& operator=(const PrivateHeader&) = default; PrivateHeader(PrivateHeader&&) = default; PrivateHeader& operator=(PrivateHeader&&) = default; /** * @brief Constructor * * Fills in this class's data fields from raw data. * * @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 Fills in the object from the stream data * * @param[in] stream - The stream to read from */ void unflatten(Stream& stream); /** * @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::flattenedSize() + sizeof(_createTimestamp) + sizeof(_commitTimestamp) + sizeof(_creatorID) + sizeof(_reservedByte1) + sizeof(_reservedByte2) + sizeof(_sectionCount) + sizeof(_obmcLogID) + sizeof(_creatorVersion) + sizeof(_plid) + sizeof(_id); } /** * @brief Get the total number of sections in this PEL * * @return Number of sections */ uint8_t getSectionCount(); /** * @brief Set the total number of sections in this PEL * * @param[in] sectionCount - Number of sections */ void setSectionCount(uint8_t sectionCount); private: /** * @brief The creation time timestamp */ uint64_t _createTimestamp; // BCDTime _createTimestamp; /** * @brief The commit time timestamp */ uint64_t _commitTimestamp; // BCDTime _commitTimestamp; /** * @brief The creator ID field */ uint8_t _creatorID; /** * @brief A reserved byte. */ uint8_t _reservedByte1 = 0; /** * @brief A reserved byte. */ uint8_t _reservedByte2 = 0; /** * @brief Total number of sections in the PEL */ uint8_t _sectionCount = 3; // private header, user header, primary src = 3 /** * @brief The OpenBMC event log ID that corresponds to this PEL. */ uint32_t _obmcLogID = 0; /** * @brief The creator subsystem version field */ uint64_t _creatorVersion; // CreatorVersion _creatorVersion; /** * @brief The platform log ID field */ uint32_t _plid; /** * @brief The log entry ID field */ uint32_t _id = 0; }; /** * @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); /** * @brief Stream extraction operator for the CreatorVersion * * @param[in] s - the stream * @param[out] cv - the CreatorVersion object */ // Stream& operator>>(Stream& s, CreatorVersion& cv); } // namespace pel } // namespace attn