1 #pragma once 2 3 #include "bcd_time.hpp" 4 #include "section.hpp" 5 #include "stream.hpp" 6 7 namespace openpower 8 { 9 namespace pels 10 { 11 12 struct CreatorVersion 13 { 14 uint8_t version[8]; 15 CreatorVersionopenpower::pels::CreatorVersion16 CreatorVersion() 17 { 18 memset(version, '\0', sizeof(version)); 19 } 20 }; 21 22 static constexpr uint8_t privateHeaderVersion = 0x01; 23 static constexpr uint8_t minSectionCount = 2; 24 25 /** 26 * @class PrivateHeader 27 * 28 * This represents the Private Header section in a PEL. It is required, 29 * and it is always the first section. 30 * 31 * The Section base class handles the section header structure that every 32 * PEL section has at offset zero. 33 * 34 * The fields in this class directly correspond to the order and sizes of 35 * the fields in the section. 36 */ 37 class PrivateHeader : public Section 38 { 39 public: 40 PrivateHeader() = delete; 41 ~PrivateHeader() = default; 42 PrivateHeader(const PrivateHeader&) = default; 43 PrivateHeader& operator=(const PrivateHeader&) = default; 44 PrivateHeader(PrivateHeader&&) = default; 45 PrivateHeader& operator=(PrivateHeader&&) = default; 46 47 /** 48 * @brief Constructor 49 * 50 * Creates a valid PrivateHeader with the passed in data 51 * 52 * @param[in] componentID - the creator's component ID 53 * @param[in] obmcLogID - the corresponding OpenBMC event log ID 54 * @param[in] timestamp - the creation timestamp, in epoch milliseconds 55 */ 56 PrivateHeader(uint16_t componentID, uint32_t obmcLogID, uint64_t timestamp); 57 58 /** 59 * @brief Constructor 60 * 61 * Fills in this class's data fields from the stream. 62 * 63 * @param[in] pel - the PEL data stream 64 * 65 */ 66 explicit PrivateHeader(Stream& pel); 67 68 /** 69 * @brief Flatten the section into the stream 70 * 71 * @param[in] stream - The stream to write to 72 */ 73 void flatten(Stream& stream) const override; 74 75 /** 76 * @brief Returns the creation timestamp 77 * 78 * @return const BCDTime& - the timestamp 79 */ createTimestamp() const80 const BCDTime& createTimestamp() const 81 { 82 return _createTimestamp; 83 } 84 85 /** 86 * @brief Returns the commit time timestamp 87 * 88 * @return const BCDTime& - the timestamp 89 */ commitTimestamp() const90 const BCDTime& commitTimestamp() const 91 { 92 return _commitTimestamp; 93 } 94 95 /** 96 * @brief Sets the commit timestamp 97 * 98 * @param[in] time - the new timestamp 99 */ setCommitTimestamp(const BCDTime & time)100 void setCommitTimestamp(const BCDTime& time) 101 { 102 _commitTimestamp = time; 103 } 104 105 /** 106 * @brief Returns the creator ID field 107 * 108 * @return uint8_t - the creator ID 109 */ creatorID() const110 uint8_t creatorID() const 111 { 112 return _creatorID; 113 } 114 115 /** 116 * @brief Returns the log type field 117 * 118 * @return uint8_t - the log type 119 */ logType() const120 uint8_t logType() const 121 { 122 return _logType; 123 } 124 125 /** 126 * @brief Returns the section count field 127 * 128 * @return uint8_t - the section count 129 */ sectionCount() const130 uint8_t sectionCount() const 131 { 132 return _sectionCount; 133 } 134 135 /** 136 * @brief Sets the section count field 137 * 138 * @param[in] count - the new section count 139 */ setSectionCount(uint8_t count)140 void setSectionCount(uint8_t count) 141 { 142 _sectionCount = count; 143 } 144 145 /** 146 * @brief Returns the OpenBMC log ID field 147 * 148 * This is the ID the OpenBMC event log that corresponds 149 * to this PEL. 150 * 151 * @return uint32_t - the OpenBMC event log ID 152 */ obmcLogID() const153 uint32_t obmcLogID() const 154 { 155 return _obmcLogID; 156 } 157 158 /** 159 * @brief Sets the OpenBMC log ID field 160 * 161 * @param[in] id - the new ID 162 */ setOBMCLogID(uint32_t id)163 void setOBMCLogID(uint32_t id) 164 { 165 _obmcLogID = id; 166 } 167 168 /** 169 * @brief Returns the Creator Version field 170 * 171 * @return CreatorVersion& - the creator version 172 */ creatorVersion() const173 const CreatorVersion& creatorVersion() const 174 { 175 return _creatorVersion; 176 } 177 178 /** 179 * @brief Returns the error log ID field 180 * 181 * @return uint32_t - the error log ID 182 */ id() const183 uint32_t id() const 184 { 185 return _id; 186 } 187 188 /** 189 * @brief Sets the ID field 190 * 191 * @param[in] id - the new ID 192 */ setID(uint32_t id)193 void setID(uint32_t id) 194 { 195 _id = id; 196 } 197 198 /** 199 * @brief Returns the platform log ID field 200 * 201 * @return uint32_t - the platform log ID 202 */ plid() const203 uint32_t plid() const 204 { 205 return _plid; 206 } 207 208 /** 209 * @brief Returns the size of this section when flattened into a PEL 210 * 211 * @return size_t - the size of the section 212 */ flattenedSize()213 static constexpr size_t flattenedSize() 214 { 215 return Section::flattenedSize() + sizeof(_createTimestamp) + 216 sizeof(_commitTimestamp) + sizeof(_creatorID) + 217 sizeof(_logType) + sizeof(_reservedByte) + 218 sizeof(_sectionCount) + sizeof(_obmcLogID) + 219 sizeof(_creatorVersion) + sizeof(_plid) + sizeof(_id); 220 } 221 222 /** 223 * @brief Get section in JSON. 224 * 225 * @param[in] creatorID - The creator ID for the PEL 226 * 227 * @return std::optional<std::string> - Private header section's JSON 228 */ 229 std::optional<std::string> getJSON(uint8_t creatorID) const override; 230 231 private: 232 /** 233 * @brief Fills in the object from the stream data 234 * 235 * @param[in] stream - The stream to read from 236 */ 237 void unflatten(Stream& stream); 238 239 /** 240 * @brief Validates the section contents 241 * 242 * Updates _valid (in Section) with the results. 243 */ 244 void validate() override; 245 246 /** 247 * @brief The creation time timestamp 248 */ 249 BCDTime _createTimestamp; 250 251 /** 252 * @brief The commit time timestamp 253 */ 254 BCDTime _commitTimestamp; 255 256 /** 257 * @brief The creator ID field 258 */ 259 uint8_t _creatorID; 260 261 /** 262 * @brief The log type field 263 */ 264 uint8_t _logType; 265 266 /** 267 * @brief A reserved byte. 268 */ 269 uint8_t _reservedByte; 270 271 /** 272 * @brief The section count field, which is the total number 273 * of sections in the PEL. 274 */ 275 uint8_t _sectionCount; 276 277 /** 278 * @brief The OpenBMC event log ID that corresponds to this PEL. 279 */ 280 uint32_t _obmcLogID; 281 282 /** 283 * @brief The creator subsystem version field 284 */ 285 CreatorVersion _creatorVersion; 286 287 /** 288 * @brief The platform log ID field 289 */ 290 uint32_t _plid; 291 292 /** 293 * @brief The log entry ID field 294 */ 295 uint32_t _id; 296 }; 297 298 /** 299 * @brief Stream extraction operator for the CreatorVersion 300 * 301 * @param[in] s - the stream 302 * @param[out] cv - the CreatorVersion object 303 */ 304 Stream& operator>>(Stream& s, CreatorVersion& cv); 305 306 /** 307 * @brief Stream insertion operator for the CreatorVersion 308 * 309 * @param[out] s - the stream 310 * @param[in] cv - the CreatorVersion object 311 */ 312 Stream& operator<<(Stream& s, const CreatorVersion& cv); 313 314 } // namespace pels 315 } // namespace openpower 316