blob: a033ac01bcfd3166d2e932344026fdb0642641e3 [file] [log] [blame]
Matt Spinler03c1d912019-07-10 14:12:15 -05001#pragma once
2
Matt Spinleraadccc82020-04-10 14:33:42 -05003#include "data_interface.hpp"
Matt Spinlerfdb6a202019-09-20 14:09:20 -05004#include "elog_entry.hpp"
Aatir Manzurad0e0472019-10-07 13:18:37 -05005#include "pel_values.hpp"
Matt Spinlerfdb6a202019-09-20 14:09:20 -05006#include "registry.hpp"
Matt Spinler03c1d912019-07-10 14:12:15 -05007#include "section.hpp"
8#include "stream.hpp"
9
10namespace openpower
11{
12namespace pels
13{
14
Matt Spinler1a94cc32019-09-11 13:32:12 -050015static constexpr uint8_t userHeaderVersion = 0x01;
Matt Spinler03c1d912019-07-10 14:12:15 -050016
17/**
18 * @class UserHeader
19 *
20 * This represents the User Header section in a PEL. It is required,
21 * and it is always the second section.
22 *
23 * The Section base class handles the section header structure that every
24 * PEL section has at offset zero.
25 *
26 * The fields in this class directly correspond to the order and sizes of
27 * the fields in the section.
28 */
29class UserHeader : public Section
30{
31 public:
32 UserHeader() = delete;
33 ~UserHeader() = default;
34 UserHeader(const UserHeader&) = default;
35 UserHeader& operator=(const UserHeader&) = default;
36 UserHeader(UserHeader&&) = default;
37 UserHeader& operator=(UserHeader&&) = default;
38
39 /**
40 * @brief Constructor
41 *
Matt Spinlerfdb6a202019-09-20 14:09:20 -050042 * Creates a valid UserHeader with the passed in data.
43 *
44 * @param[in] entry - The message registry entry for this error
45 * @param[in] severity - The OpenBMC event log severity for this error
Matt Spinleraadccc82020-04-10 14:33:42 -050046 * @param[in] dataIface - The DataInterface object
Matt Spinlerfdb6a202019-09-20 14:09:20 -050047 */
48 UserHeader(const message::Entry& entry,
Matt Spinleraadccc82020-04-10 14:33:42 -050049 phosphor::logging::Entry::Level severity,
50 const DataInterfaceBase& dataIface);
Matt Spinlerfdb6a202019-09-20 14:09:20 -050051
52 /**
53 * @brief Constructor
54 *
Matt Spinler03c1d912019-07-10 14:12:15 -050055 * Fills in this class's data fields from the stream.
56 *
57 * @param[in] pel - the PEL data stream
58 */
59 explicit UserHeader(Stream& pel);
60
61 /**
Matt Spinlercf5a8d02019-09-05 12:58:53 -050062 * @brief Flatten the section into the stream
63 *
64 * @param[in] stream - The stream to write to
65 */
Matt Spinler06885452019-11-06 10:35:42 -060066 void flatten(Stream& stream) const override;
Matt Spinlercf5a8d02019-09-05 12:58:53 -050067
68 /**
Matt Spinler03c1d912019-07-10 14:12:15 -050069 * @brief Returns the subsystem field.
70 *
Matt Spinler97d19b42019-10-29 11:34:03 -050071 * @return uint8_t - the subsystem
Matt Spinler03c1d912019-07-10 14:12:15 -050072 */
Matt Spinler97d19b42019-10-29 11:34:03 -050073 uint8_t subsystem() const
Matt Spinler03c1d912019-07-10 14:12:15 -050074 {
75 return _eventSubsystem;
76 }
77
78 /**
79 * @brief Returns the event scope field.
80 *
Matt Spinler97d19b42019-10-29 11:34:03 -050081 * @return uint8_t - the event scope
Matt Spinler03c1d912019-07-10 14:12:15 -050082 */
Matt Spinler97d19b42019-10-29 11:34:03 -050083 uint8_t scope() const
Matt Spinler03c1d912019-07-10 14:12:15 -050084 {
85 return _eventScope;
86 }
87
88 /**
89 * @brief Returns the severity field.
90 *
Matt Spinler97d19b42019-10-29 11:34:03 -050091 * @return uint8_t - the severity
Matt Spinler03c1d912019-07-10 14:12:15 -050092 */
Matt Spinler97d19b42019-10-29 11:34:03 -050093 uint8_t severity() const
Matt Spinler03c1d912019-07-10 14:12:15 -050094 {
95 return _eventSeverity;
96 }
97
98 /**
99 * @brief Returns the event type field.
100 *
Matt Spinler97d19b42019-10-29 11:34:03 -0500101 * @return uint8_t - the event type
Matt Spinler03c1d912019-07-10 14:12:15 -0500102 */
Matt Spinler97d19b42019-10-29 11:34:03 -0500103 uint8_t eventType() const
Matt Spinler03c1d912019-07-10 14:12:15 -0500104 {
105 return _eventType;
106 }
107
108 /**
Matt Spinlerf1e85e22019-11-01 11:31:31 -0500109 * @brief Set the event type field
110 *
111 * @param[in] type - the new event type
112 */
113 void setEventType(uint8_t type)
114 {
115 _eventType = type;
116 }
117
118 /**
Matt Spinler03c1d912019-07-10 14:12:15 -0500119 * @brief Returns the problem domain field.
120 *
Matt Spinler97d19b42019-10-29 11:34:03 -0500121 * @return uint8_t - the problem domain
Matt Spinler03c1d912019-07-10 14:12:15 -0500122 */
Matt Spinler97d19b42019-10-29 11:34:03 -0500123 uint8_t problemDomain() const
Matt Spinler03c1d912019-07-10 14:12:15 -0500124 {
125 return _problemDomain;
126 }
127
128 /**
129 * @brief Returns the problem vector field.
130 *
Matt Spinler97d19b42019-10-29 11:34:03 -0500131 * @return uint8_t - the problem vector
Matt Spinler03c1d912019-07-10 14:12:15 -0500132 */
Matt Spinler97d19b42019-10-29 11:34:03 -0500133 uint8_t problemVector() const
Matt Spinler03c1d912019-07-10 14:12:15 -0500134 {
135 return _problemVector;
136 }
137
138 /**
139 * @brief Returns the action flags field.
140 *
Matt Spinler97d19b42019-10-29 11:34:03 -0500141 * @return uint16_t - the action flags
Matt Spinler03c1d912019-07-10 14:12:15 -0500142 */
Matt Spinler97d19b42019-10-29 11:34:03 -0500143 uint16_t actionFlags() const
Matt Spinler03c1d912019-07-10 14:12:15 -0500144 {
145 return _actionFlags;
146 }
147
148 /**
Matt Spinlerf1e85e22019-11-01 11:31:31 -0500149 * @brief Sets the action flags field
150 *
151 * @param[in] flags - the new action flags
152 */
153 void setActionFlags(uint16_t flags)
154 {
155 _actionFlags = flags;
156 }
157
158 /**
Matt Spinlereb111442019-11-07 13:05:36 -0600159 * @brief Returns the host transmission state
160 *
161 * @return uint8_t - the host transmission state
162 */
163 uint8_t hostTransmissionState() const
164 {
165 return _states & 0xFF;
166 }
167
168 /**
169 * @brief Sets the host transmission state
170 *
171 * @param[in] state - the new state
172 */
173 void setHostTransmissionState(uint8_t state)
174 {
175 _states &= 0xFFFFFF00;
176 _states |= state;
177 }
178
179 /**
180 * @brief Returns the HMC transmission state
181 *
182 * (HMC = Hardware Management Console)
183 *
184 * @return uint8_t - the HMC transmission state
185 */
186 uint8_t hmcTransmissionState() const
187 {
188 return (_states & 0x0000FF00) >> 8;
189 }
190
191 /**
192 * @brief Sets the HMC transmission state
193 *
194 * @param[in] state - the new state
195 */
196 void setHMCTransmissionState(uint8_t state)
197 {
198 uint32_t newState = state << 8;
199 _states &= 0xFFFF00FF;
200 _states |= newState;
201 }
202
203 /**
Matt Spinler03c1d912019-07-10 14:12:15 -0500204 * @brief Returns the size of this section when flattened into a PEL
205 *
206 * @return size_t - the size of the section
207 */
208 static constexpr size_t flattenedSize()
209 {
210 return Section::flattenedSize() + sizeof(_eventSubsystem) +
211 sizeof(_eventScope) + sizeof(_eventSeverity) +
212 sizeof(_eventType) + sizeof(_reserved4Byte1) +
213 sizeof(_problemDomain) + sizeof(_problemVector) +
Matt Spinlereb111442019-11-07 13:05:36 -0600214 sizeof(_actionFlags) + sizeof(_states);
Matt Spinler03c1d912019-07-10 14:12:15 -0500215 }
216
Aatir Manzurad0e0472019-10-07 13:18:37 -0500217 /**
218 * @brief Get section in JSON.
Aatirc1489352019-12-09 13:13:20 -0600219 * @return std::optional<std::string> -User header section's JSON
Aatir Manzurad0e0472019-10-07 13:18:37 -0500220 */
221 std::optional<std::string> getJSON() const override;
222
Matt Spinler03c1d912019-07-10 14:12:15 -0500223 private:
224 /**
Matt Spinlercf5a8d02019-09-05 12:58:53 -0500225 * @brief Fills in the object from the stream data
226 *
227 * @param[in] stream - The stream to read from
228 */
229 void unflatten(Stream& stream);
230
231 /**
Matt Spinler03c1d912019-07-10 14:12:15 -0500232 * @brief Validates the section contents
233 *
234 * Updates _valid (in Section) with the results.
235 */
236 void validate() override;
237
238 /**
Matt Spinleraadccc82020-04-10 14:33:42 -0500239 * @brief Returns the severity value to use from the list
240 * of them passed in based on the system type.
241 *
242 * If there isn't an entry found for the current system
243 * type then std::nullopt will be returned.
244 *
245 * @param[in] severities - The array of {systype, severity}
246 * structures to find an entry in.
247 * @param[in] systemType - The system type from DataInterface.
248 */
249 std::optional<uint8_t>
250 getSeverity(const std::vector<message::RegistrySeverity>& severities,
251 const std::string& systemType) const;
252 /**
Matt Spinler03c1d912019-07-10 14:12:15 -0500253 * @brief The subsystem associated with the event.
254 */
255 uint8_t _eventSubsystem;
256
257 /**
258 * @brief The event scope field.
259 */
260 uint8_t _eventScope;
261
262 /**
263 * @brief The event severity.
264 */
265 uint8_t _eventSeverity;
266
267 /**
268 * @brief The event type.
269 */
270 uint8_t _eventType;
271
272 /**
273 * @brief A reserved word placeholder
274 */
275 uint32_t _reserved4Byte1;
276
277 /**
278 * @brief The problem domain field.
279 */
280 uint8_t _problemDomain;
281
282 /**
283 * @brief The problem vector field.
284 */
285 uint8_t _problemVector;
286
287 /**
288 * @brief The action flags field.
289 */
290 uint16_t _actionFlags;
291
292 /**
Matt Spinlereb111442019-11-07 13:05:36 -0600293 * @brief The second reserved word that we are
294 * using for storing state information.
295 *
296 * 0x0000AABB
297 * Where:
298 * 0xAA = HMC transmission state
299 * 0xBB = Host transmission state
Matt Spinler03c1d912019-07-10 14:12:15 -0500300 */
Matt Spinlereb111442019-11-07 13:05:36 -0600301 uint32_t _states;
Matt Spinler03c1d912019-07-10 14:12:15 -0500302};
303
Matt Spinler03c1d912019-07-10 14:12:15 -0500304} // namespace pels
305} // namespace openpower