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