xref: /openbmc/phosphor-logging/extensions/openpower-pels/user_header.hpp (revision 03c1d91559b3e9625d21ad96f93e2d8376cfa1d4)
1*03c1d915SMatt Spinler #pragma once
2*03c1d915SMatt Spinler 
3*03c1d915SMatt Spinler #include "section.hpp"
4*03c1d915SMatt Spinler #include "stream.hpp"
5*03c1d915SMatt Spinler 
6*03c1d915SMatt Spinler namespace openpower
7*03c1d915SMatt Spinler {
8*03c1d915SMatt Spinler namespace pels
9*03c1d915SMatt Spinler {
10*03c1d915SMatt Spinler 
11*03c1d915SMatt Spinler static constexpr uint16_t userHeaderSectionID = 0x5548; // 'UH'
12*03c1d915SMatt Spinler static constexpr uint16_t userHeaderVersion = 0x01;
13*03c1d915SMatt Spinler 
14*03c1d915SMatt Spinler /**
15*03c1d915SMatt Spinler  * @class UserHeader
16*03c1d915SMatt Spinler  *
17*03c1d915SMatt Spinler  * This represents the User Header section in a PEL.  It is required,
18*03c1d915SMatt Spinler  * and it is always the second section.
19*03c1d915SMatt Spinler  *
20*03c1d915SMatt Spinler  * The Section base class handles the section header structure that every
21*03c1d915SMatt Spinler  * PEL section has at offset zero.
22*03c1d915SMatt Spinler  *
23*03c1d915SMatt Spinler  * The fields in this class directly correspond to the order and sizes of
24*03c1d915SMatt Spinler  * the fields in the section.
25*03c1d915SMatt Spinler  */
26*03c1d915SMatt Spinler class UserHeader : public Section
27*03c1d915SMatt Spinler {
28*03c1d915SMatt Spinler   public:
29*03c1d915SMatt Spinler     UserHeader() = delete;
30*03c1d915SMatt Spinler     ~UserHeader() = default;
31*03c1d915SMatt Spinler     UserHeader(const UserHeader&) = default;
32*03c1d915SMatt Spinler     UserHeader& operator=(const UserHeader&) = default;
33*03c1d915SMatt Spinler     UserHeader(UserHeader&&) = default;
34*03c1d915SMatt Spinler     UserHeader& operator=(UserHeader&&) = default;
35*03c1d915SMatt Spinler 
36*03c1d915SMatt Spinler     /**
37*03c1d915SMatt Spinler      * @brief Constructor
38*03c1d915SMatt Spinler      *
39*03c1d915SMatt Spinler      * Fills in this class's data fields from the stream.
40*03c1d915SMatt Spinler      *
41*03c1d915SMatt Spinler      * @param[in] pel - the PEL data stream
42*03c1d915SMatt Spinler      */
43*03c1d915SMatt Spinler     explicit UserHeader(Stream& pel);
44*03c1d915SMatt Spinler 
45*03c1d915SMatt Spinler     /**
46*03c1d915SMatt Spinler      * @brief Returns the subsystem field.
47*03c1d915SMatt Spinler      *
48*03c1d915SMatt Spinler      * @return uint8_t& - the subsystem
49*03c1d915SMatt Spinler      */
50*03c1d915SMatt Spinler     uint8_t& subsystem()
51*03c1d915SMatt Spinler     {
52*03c1d915SMatt Spinler         return _eventSubsystem;
53*03c1d915SMatt Spinler     }
54*03c1d915SMatt Spinler 
55*03c1d915SMatt Spinler     /**
56*03c1d915SMatt Spinler      * @brief Returns the event scope field.
57*03c1d915SMatt Spinler      *
58*03c1d915SMatt Spinler      * @return uint8_t& - the event scope
59*03c1d915SMatt Spinler      */
60*03c1d915SMatt Spinler     uint8_t& scope()
61*03c1d915SMatt Spinler     {
62*03c1d915SMatt Spinler         return _eventScope;
63*03c1d915SMatt Spinler     }
64*03c1d915SMatt Spinler 
65*03c1d915SMatt Spinler     /**
66*03c1d915SMatt Spinler      * @brief Returns the severity field.
67*03c1d915SMatt Spinler      *
68*03c1d915SMatt Spinler      * @return uint8_t& - the severity
69*03c1d915SMatt Spinler      */
70*03c1d915SMatt Spinler     uint8_t& severity()
71*03c1d915SMatt Spinler     {
72*03c1d915SMatt Spinler         return _eventSeverity;
73*03c1d915SMatt Spinler     }
74*03c1d915SMatt Spinler 
75*03c1d915SMatt Spinler     /**
76*03c1d915SMatt Spinler      * @brief Returns the event type field.
77*03c1d915SMatt Spinler      *
78*03c1d915SMatt Spinler      * @return uint8_t& - the event type
79*03c1d915SMatt Spinler      */
80*03c1d915SMatt Spinler     uint8_t& eventType()
81*03c1d915SMatt Spinler     {
82*03c1d915SMatt Spinler         return _eventType;
83*03c1d915SMatt Spinler     }
84*03c1d915SMatt Spinler 
85*03c1d915SMatt Spinler     /**
86*03c1d915SMatt Spinler      * @brief Returns the problem domain field.
87*03c1d915SMatt Spinler      *
88*03c1d915SMatt Spinler      * @return uint8_t& - the problem domain
89*03c1d915SMatt Spinler      */
90*03c1d915SMatt Spinler     uint8_t& problemDomain()
91*03c1d915SMatt Spinler     {
92*03c1d915SMatt Spinler         return _problemDomain;
93*03c1d915SMatt Spinler     }
94*03c1d915SMatt Spinler 
95*03c1d915SMatt Spinler     /**
96*03c1d915SMatt Spinler      * @brief Returns the problem vector field.
97*03c1d915SMatt Spinler      *
98*03c1d915SMatt Spinler      * @return uint8_t& - the problem vector
99*03c1d915SMatt Spinler      */
100*03c1d915SMatt Spinler     uint8_t& problemVector()
101*03c1d915SMatt Spinler     {
102*03c1d915SMatt Spinler         return _problemVector;
103*03c1d915SMatt Spinler     }
104*03c1d915SMatt Spinler 
105*03c1d915SMatt Spinler     /**
106*03c1d915SMatt Spinler      * @brief Returns the action flags field.
107*03c1d915SMatt Spinler      *
108*03c1d915SMatt Spinler      * @return uint16_t& - the action flags
109*03c1d915SMatt Spinler      */
110*03c1d915SMatt Spinler     uint16_t& actionFlags()
111*03c1d915SMatt Spinler     {
112*03c1d915SMatt Spinler         return _actionFlags;
113*03c1d915SMatt Spinler     }
114*03c1d915SMatt Spinler 
115*03c1d915SMatt Spinler     /**
116*03c1d915SMatt Spinler      * @brief Returns the size of this section when flattened into a PEL
117*03c1d915SMatt Spinler      *
118*03c1d915SMatt Spinler      * @return size_t - the size of the section
119*03c1d915SMatt Spinler      */
120*03c1d915SMatt Spinler     static constexpr size_t flattenedSize()
121*03c1d915SMatt Spinler     {
122*03c1d915SMatt Spinler         return Section::flattenedSize() + sizeof(_eventSubsystem) +
123*03c1d915SMatt Spinler                sizeof(_eventScope) + sizeof(_eventSeverity) +
124*03c1d915SMatt Spinler                sizeof(_eventType) + sizeof(_reserved4Byte1) +
125*03c1d915SMatt Spinler                sizeof(_problemDomain) + sizeof(_problemVector) +
126*03c1d915SMatt Spinler                sizeof(_actionFlags) + sizeof(_reserved4Byte2);
127*03c1d915SMatt Spinler     }
128*03c1d915SMatt Spinler 
129*03c1d915SMatt Spinler     friend Stream& operator>>(Stream& s, UserHeader& ph);
130*03c1d915SMatt Spinler     friend Stream& operator<<(Stream& s, UserHeader& ph);
131*03c1d915SMatt Spinler 
132*03c1d915SMatt Spinler   private:
133*03c1d915SMatt Spinler     /**
134*03c1d915SMatt Spinler      * @brief Validates the section contents
135*03c1d915SMatt Spinler      *
136*03c1d915SMatt Spinler      * Updates _valid (in Section) with the results.
137*03c1d915SMatt Spinler      */
138*03c1d915SMatt Spinler     void validate() override;
139*03c1d915SMatt Spinler 
140*03c1d915SMatt Spinler     /**
141*03c1d915SMatt Spinler      * @brief The subsystem associated with the event.
142*03c1d915SMatt Spinler      */
143*03c1d915SMatt Spinler     uint8_t _eventSubsystem;
144*03c1d915SMatt Spinler 
145*03c1d915SMatt Spinler     /**
146*03c1d915SMatt Spinler      * @brief The event scope field.
147*03c1d915SMatt Spinler      */
148*03c1d915SMatt Spinler     uint8_t _eventScope;
149*03c1d915SMatt Spinler 
150*03c1d915SMatt Spinler     /**
151*03c1d915SMatt Spinler      * @brief The event severity.
152*03c1d915SMatt Spinler      */
153*03c1d915SMatt Spinler     uint8_t _eventSeverity;
154*03c1d915SMatt Spinler 
155*03c1d915SMatt Spinler     /**
156*03c1d915SMatt Spinler      * @brief The event type.
157*03c1d915SMatt Spinler      */
158*03c1d915SMatt Spinler     uint8_t _eventType;
159*03c1d915SMatt Spinler 
160*03c1d915SMatt Spinler     /**
161*03c1d915SMatt Spinler      * @brief A reserved word placeholder
162*03c1d915SMatt Spinler      */
163*03c1d915SMatt Spinler     uint32_t _reserved4Byte1;
164*03c1d915SMatt Spinler 
165*03c1d915SMatt Spinler     /**
166*03c1d915SMatt Spinler      * @brief The problem domain field.
167*03c1d915SMatt Spinler      */
168*03c1d915SMatt Spinler     uint8_t _problemDomain;
169*03c1d915SMatt Spinler 
170*03c1d915SMatt Spinler     /**
171*03c1d915SMatt Spinler      * @brief The problem vector field.
172*03c1d915SMatt Spinler      */
173*03c1d915SMatt Spinler     uint8_t _problemVector;
174*03c1d915SMatt Spinler 
175*03c1d915SMatt Spinler     /**
176*03c1d915SMatt Spinler      * @brief The action flags field.
177*03c1d915SMatt Spinler      */
178*03c1d915SMatt Spinler     uint16_t _actionFlags;
179*03c1d915SMatt Spinler 
180*03c1d915SMatt Spinler     /**
181*03c1d915SMatt Spinler      * @brief The second reserved word placeholder.
182*03c1d915SMatt Spinler      */
183*03c1d915SMatt Spinler     uint32_t _reserved4Byte2;
184*03c1d915SMatt Spinler };
185*03c1d915SMatt Spinler 
186*03c1d915SMatt Spinler /**
187*03c1d915SMatt Spinler  * @brief Stream extraction operator for the UserHeader
188*03c1d915SMatt Spinler  *
189*03c1d915SMatt Spinler  * @param[in] s - the stream
190*03c1d915SMatt Spinler  * @param[out] uh - the UserHeader object
191*03c1d915SMatt Spinler  */
192*03c1d915SMatt Spinler Stream& operator>>(Stream& s, UserHeader& uh);
193*03c1d915SMatt Spinler 
194*03c1d915SMatt Spinler /**
195*03c1d915SMatt Spinler  * @brief Stream insertion operator for the UserHeader
196*03c1d915SMatt Spinler  *
197*03c1d915SMatt Spinler  * @param[out] s - the stream
198*03c1d915SMatt Spinler  * @param[in] uh - the UserHeader object
199*03c1d915SMatt Spinler  */
200*03c1d915SMatt Spinler Stream& operator<<(Stream& s, UserHeader& uh);
201*03c1d915SMatt Spinler 
202*03c1d915SMatt Spinler } // namespace pels
203*03c1d915SMatt Spinler } // namespace openpower
204