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