blob: 4a8b3301e2113de8d7322be536dbd3be445cbc9e [file] [log] [blame]
Matt Spinlerd3335df2019-07-10 11:04:21 -05001#pragma once
2
3#include "bcd_time.hpp"
4#include "section.hpp"
5#include "stream.hpp"
6
7namespace openpower
8{
9namespace pels
10{
11
12struct CreatorVersion
13{
14 uint8_t version[8];
15};
16
17static constexpr uint16_t privateHeaderSectionID = 0x5048; // 'PH'
18static constexpr uint16_t privateHeaderVersion = 0x01;
19static constexpr uint8_t minSectionCount = 2;
20
21/**
22 * @class PrivateHeader
23 *
24 * This represents the Private Header section in a PEL. It is required,
25 * and it is always the first section.
26 *
27 * The Section base class handles the section header structure that every
28 * PEL section has at offset zero.
29 *
30 * The fields in this class directly correspond to the order and sizes of
31 * the fields in the section.
32 */
33class PrivateHeader : public Section
34{
35 public:
36 PrivateHeader() = delete;
37 ~PrivateHeader() = default;
38 PrivateHeader(const PrivateHeader&) = default;
39 PrivateHeader& operator=(const PrivateHeader&) = default;
40 PrivateHeader(PrivateHeader&&) = default;
41 PrivateHeader& operator=(PrivateHeader&&) = default;
42
43 /**
44 * @brief Constructor
45 *
46 * Fills in this class's data fields from the stream.
47 *
48 * @param[in] pel - the PEL data stream
49 *
50 */
51 explicit PrivateHeader(Stream& pel);
52
53 /**
Matt Spinlercf5a8d02019-09-05 12:58:53 -050054 * @brief Flatten the section into the stream
55 *
56 * @param[in] stream - The stream to write to
57 */
58 void flatten(Stream& stream) override;
59
60 /**
Matt Spinlerd3335df2019-07-10 11:04:21 -050061 * @brief Returns the creation timestamp
62 *
63 * @return BCDTime& - the timestamp
64 */
65 BCDTime& createTimestamp()
66 {
67 return _createTimestamp;
68 }
69
70 /**
71 * @brief Returns the commit time timestamp
72 *
73 * @return BCDTime& - the timestamp
74 */
75 BCDTime& commitTimestamp()
76 {
77 return _commitTimestamp;
78 }
79
80 /**
81 * @brief Returns the creator ID field
82 *
83 * @return uint8_t& - the creator ID
84 */
85 uint8_t& creatorID()
86 {
87 return _creatorID;
88 }
89
90 /**
91 * @brief Returns the log type field
92 *
93 * @return uint8_t& - the log type
94 */
95 uint8_t& logType()
96 {
97 return _logType;
98 }
99
100 /**
101 * @brief Returns the section count field
102 *
103 * @return uint8_t& - the section count
104 */
105 uint8_t& sectionCount()
106 {
107 return _sectionCount;
108 }
109
110 /**
111 * @brief Returns the OpenBMC log ID field
112 *
113 * This is the ID the OpenBMC event log that corresponds
114 * to this PEL.
115 *
116 * @return uint32_t& - the OpenBMC event log ID
117 */
118 uint32_t& obmcLogID()
119 {
120 return _obmcLogID;
121 }
122
123 /**
124 * @brief Returns the Creator Version field
125 *
126 * @return CreatorVersion& - the creator version
127 */
128 CreatorVersion& creatorVersion()
129 {
130 return _creatorVersion;
131 }
132
133 /**
134 * @brief Returns the error log ID field
135 *
136 * @return uint32_t& - the error log ID
137 */
138 uint32_t& id()
139 {
140 return _id;
141 }
142
143 /**
144 * @brief Returns the platform log ID field
145 *
146 * @return uint32_t& - the platform log ID
147 */
148 uint32_t& plid()
149 {
150 return _plid;
151 }
152
153 /**
154 * @brief Returns the size of this section when flattened into a PEL
155 *
156 * @return size_t - the size of the section
157 */
158 static constexpr size_t flattenedSize()
159 {
160 return Section::flattenedSize() + sizeof(_createTimestamp) +
161 sizeof(_commitTimestamp) + sizeof(_creatorID) +
162 sizeof(_logType) + sizeof(_reservedByte) +
163 sizeof(_sectionCount) + sizeof(_obmcLogID) +
164 sizeof(_creatorVersion) + sizeof(_plid) + sizeof(_id);
165 }
166
Matt Spinlerd3335df2019-07-10 11:04:21 -0500167 private:
168 /**
Matt Spinlercf5a8d02019-09-05 12:58:53 -0500169 * @brief Fills in the object from the stream data
170 *
171 * @param[in] stream - The stream to read from
172 */
173 void unflatten(Stream& stream);
174
175 /**
Matt Spinlerd3335df2019-07-10 11:04:21 -0500176 * @brief Validates the section contents
177 *
178 * Updates _valid (in Section) with the results.
179 */
180 void validate() override;
181
182 /**
183 * @brief The creation time timestamp
184 */
185 BCDTime _createTimestamp;
186
187 /**
188 * @brief The commit time timestamp
189 */
190 BCDTime _commitTimestamp;
191
192 /**
193 * @brief The creator ID field
194 */
195 uint8_t _creatorID;
196
197 /**
198 * @brief The log type field
199 */
200 uint8_t _logType;
201
202 /**
203 * @brief A reserved byte.
204 */
205 uint8_t _reservedByte;
206
207 /**
208 * @brief The section count field, which is the total number
209 * of sections in the PEL.
210 */
211 uint8_t _sectionCount;
212
213 /**
214 * @brief The OpenBMC event log ID that corresponds to this PEL.
215 */
216 uint32_t _obmcLogID;
217
218 /**
219 * @brief The creator subsystem version field
220 */
221 CreatorVersion _creatorVersion;
222
223 /**
224 * @brief The platform log ID field
225 */
226 uint32_t _plid;
227
228 /**
229 * @brief The log entry ID field
230 */
231 uint32_t _id;
232};
233
234/**
Matt Spinlerd3335df2019-07-10 11:04:21 -0500235 * @brief Stream extraction operator for the CreatorVersion
236 *
237 * @param[in] s - the stream
238 * @param[out] cv - the CreatorVersion object
239 */
240Stream& operator>>(Stream& s, CreatorVersion& cv);
241
242/**
243 * @brief Stream insertion operator for the CreatorVersion
244 *
245 * @param[out] s - the stream
246 * @param[in] cv - the CreatorVersion object
247 */
248Stream& operator<<(Stream& s, CreatorVersion& cv);
249
250} // namespace pels
251} // namespace openpower