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 16 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 */ 80 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 */ 90 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 */ 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 */ 110 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 */ 120 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 */ 130 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 */ 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 */ 153 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 */ 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 */ 173 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 */ 183 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 */ 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 */ 203 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 */ 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 * @return std::optional<std::string> - Private header section's JSON 225 */ 226 std::optional<std::string> getJSON() const override; 227 228 private: 229 /** 230 * @brief Fills in the object from the stream data 231 * 232 * @param[in] stream - The stream to read from 233 */ 234 void unflatten(Stream& stream); 235 236 /** 237 * @brief Validates the section contents 238 * 239 * Updates _valid (in Section) with the results. 240 */ 241 void validate() override; 242 243 /** 244 * @brief The creation time timestamp 245 */ 246 BCDTime _createTimestamp; 247 248 /** 249 * @brief The commit time timestamp 250 */ 251 BCDTime _commitTimestamp; 252 253 /** 254 * @brief The creator ID field 255 */ 256 uint8_t _creatorID; 257 258 /** 259 * @brief The log type field 260 */ 261 uint8_t _logType; 262 263 /** 264 * @brief A reserved byte. 265 */ 266 uint8_t _reservedByte; 267 268 /** 269 * @brief The section count field, which is the total number 270 * of sections in the PEL. 271 */ 272 uint8_t _sectionCount; 273 274 /** 275 * @brief The OpenBMC event log ID that corresponds to this PEL. 276 */ 277 uint32_t _obmcLogID; 278 279 /** 280 * @brief The creator subsystem version field 281 */ 282 CreatorVersion _creatorVersion; 283 284 /** 285 * @brief The platform log ID field 286 */ 287 uint32_t _plid; 288 289 /** 290 * @brief The log entry ID field 291 */ 292 uint32_t _id; 293 }; 294 295 /** 296 * @brief Stream extraction operator for the CreatorVersion 297 * 298 * @param[in] s - the stream 299 * @param[out] cv - the CreatorVersion object 300 */ 301 Stream& operator>>(Stream& s, CreatorVersion& cv); 302 303 /** 304 * @brief Stream insertion operator for the CreatorVersion 305 * 306 * @param[out] s - the stream 307 * @param[in] cv - the CreatorVersion object 308 */ 309 Stream& operator<<(Stream& s, const CreatorVersion& cv); 310 311 } // namespace pels 312 } // namespace openpower 313