1*f5210bb6SBen Tyner #pragma once
2*f5210bb6SBen Tyner 
3*f5210bb6SBen Tyner #include "pel_common.hpp"
4*f5210bb6SBen Tyner #include "pel_section.hpp"
5*f5210bb6SBen Tyner #include "stream.hpp"
6*f5210bb6SBen Tyner 
7*f5210bb6SBen Tyner namespace attn
8*f5210bb6SBen Tyner {
9*f5210bb6SBen Tyner namespace pel
10*f5210bb6SBen Tyner {
11*f5210bb6SBen Tyner 
12*f5210bb6SBen Tyner /**
13*f5210bb6SBen Tyner  * @class UserHeader
14*f5210bb6SBen Tyner  *
15*f5210bb6SBen Tyner  * This represents the User Header section in a PEL.
16*f5210bb6SBen Tyner  *
17*f5210bb6SBen Tyner  * |--------+----------------+----------------+----------------+------------|
18*f5210bb6SBen Tyner  * | length | byte0          | byte1          | byte2          | byte3      |
19*f5210bb6SBen Tyner  * |--------+----------------+----------------+----------------+------------|
20*f5210bb6SBen Tyner  * | 8      | Section Header                                                |
21*f5210bb6SBen Tyner  * |        |                                                               |
22*f5210bb6SBen Tyner  * |--------+----------------+----------------+----------------+------------|
23*f5210bb6SBen Tyner  * | 4      | Subsystem ID   | Event Scope    | Event Severity | Event Type |
24*f5210bb6SBen Tyner  * |--------+----------------+----------------+----------------+------------|
25*f5210bb6SBen Tyner  * | 4      | reserved                                                      |
26*f5210bb6SBen Tyner  * |--------+----------------+----------------+-----------------------------|
27*f5210bb6SBen Tyner  * | 4      | Problem Domain | Problem Vector | Event Action Flags          |
28*f5210bb6SBen Tyner  * |--------+----------------+----------------+-----------------------------|
29*f5210bb6SBen Tyner  * | 4      | reserved                                                      |
30*f5210bb6SBen Tyner  * |--------+---------------------------------------------------------------|
31*f5210bb6SBen Tyner  *
32*f5210bb6SBen Tyner  */
33*f5210bb6SBen Tyner class UserHeader : public Section
34*f5210bb6SBen Tyner {
35*f5210bb6SBen Tyner   public:
36*f5210bb6SBen Tyner     UserHeader() = delete;
37*f5210bb6SBen Tyner     ~UserHeader() = default;
38*f5210bb6SBen Tyner     UserHeader(const UserHeader&) = default;
39*f5210bb6SBen Tyner     UserHeader& operator=(const UserHeader&) = default;
40*f5210bb6SBen Tyner     UserHeader(UserHeader&&) = default;
41*f5210bb6SBen Tyner     UserHeader& operator=(UserHeader&&) = default;
42*f5210bb6SBen Tyner 
43*f5210bb6SBen Tyner     /**
44*f5210bb6SBen Tyner      * @brief Constructor
45*f5210bb6SBen Tyner      *
46*f5210bb6SBen Tyner      * Fills in this class's data fields from raw data.
47*f5210bb6SBen Tyner      *
48*f5210bb6SBen Tyner      * @param[in] pel - the PEL data stream
49*f5210bb6SBen Tyner      */
50*f5210bb6SBen Tyner     explicit UserHeader(Stream& pel);
51*f5210bb6SBen Tyner 
52*f5210bb6SBen Tyner     /**
53*f5210bb6SBen Tyner      * @brief Flatten the section into the stream
54*f5210bb6SBen Tyner      *
55*f5210bb6SBen Tyner      * @param[in] stream - The stream to write to
56*f5210bb6SBen Tyner      */
57*f5210bb6SBen Tyner     void flatten(Stream& stream) const override;
58*f5210bb6SBen Tyner 
59*f5210bb6SBen Tyner     /**
60*f5210bb6SBen Tyner      * @brief Fills in the object from the stream data
61*f5210bb6SBen Tyner      *
62*f5210bb6SBen Tyner      * @param[in] stream - The stream to read from
63*f5210bb6SBen Tyner      */
64*f5210bb6SBen Tyner     void unflatten(Stream& stream);
65*f5210bb6SBen Tyner 
66*f5210bb6SBen Tyner     /**
67*f5210bb6SBen Tyner      * @brief Returns the size of this section when flattened into a PEL
68*f5210bb6SBen Tyner      *
69*f5210bb6SBen Tyner      * @return size_t - the size of the section
70*f5210bb6SBen Tyner      */
flattenedSize()71*f5210bb6SBen Tyner     static constexpr size_t flattenedSize()
72*f5210bb6SBen Tyner     {
73*f5210bb6SBen Tyner         return Section::flattenedSize() + sizeof(_eventSubsystem) +
74*f5210bb6SBen Tyner                sizeof(_eventScope) + sizeof(_eventSeverity) +
75*f5210bb6SBen Tyner                sizeof(_eventType) + sizeof(_reserved4Byte1) +
76*f5210bb6SBen Tyner                sizeof(_problemDomain) + sizeof(_problemVector) +
77*f5210bb6SBen Tyner                sizeof(_actionFlags) + sizeof(_reserved4Byte2);
78*f5210bb6SBen Tyner     }
79*f5210bb6SBen Tyner 
80*f5210bb6SBen Tyner     /**
81*f5210bb6SBen Tyner      * @brief Set the subsystem field
82*f5210bb6SBen Tyner      *
83*f5210bb6SBen Tyner      * @param[in] subsystem - The subsystem value
84*f5210bb6SBen Tyner      */
85*f5210bb6SBen Tyner     void setSubsystem(uint8_t subsystem);
86*f5210bb6SBen Tyner 
87*f5210bb6SBen Tyner     /**
88*f5210bb6SBen Tyner      * @brief Set the severity field
89*f5210bb6SBen Tyner      *
90*f5210bb6SBen Tyner      * @param[in] severity - The severity to set
91*f5210bb6SBen Tyner      */
92*f5210bb6SBen Tyner     void setSeverity(uint8_t severity);
93*f5210bb6SBen Tyner 
94*f5210bb6SBen Tyner     /**
95*f5210bb6SBen Tyner      * @brief Set the event type field
96*f5210bb6SBen Tyner      *
97*f5210bb6SBen Tyner      * @param[in] type - The event type
98*f5210bb6SBen Tyner      */
99*f5210bb6SBen Tyner     void setType(uint8_t type);
100*f5210bb6SBen Tyner 
101*f5210bb6SBen Tyner     /**
102*f5210bb6SBen Tyner      * @brief Set the action flags field
103*f5210bb6SBen Tyner      *
104*f5210bb6SBen Tyner      * @param[in] action - The action flags to set
105*f5210bb6SBen Tyner      */
106*f5210bb6SBen Tyner     void setAction(uint16_t action);
107*f5210bb6SBen Tyner 
108*f5210bb6SBen Tyner   private:
109*f5210bb6SBen Tyner     /**
110*f5210bb6SBen Tyner      * @brief The subsystem associated with the event.
111*f5210bb6SBen Tyner      */
112*f5210bb6SBen Tyner     uint8_t _eventSubsystem;
113*f5210bb6SBen Tyner 
114*f5210bb6SBen Tyner     /**
115*f5210bb6SBen Tyner      * @brief The event scope field.
116*f5210bb6SBen Tyner      */
117*f5210bb6SBen Tyner     uint8_t _eventScope = static_cast<uint8_t>(EventScope::platform);
118*f5210bb6SBen Tyner 
119*f5210bb6SBen Tyner     /**
120*f5210bb6SBen Tyner      * @brief The event severity.
121*f5210bb6SBen Tyner      */
122*f5210bb6SBen Tyner     uint8_t _eventSeverity; // set by constructor
123*f5210bb6SBen Tyner 
124*f5210bb6SBen Tyner     /**
125*f5210bb6SBen Tyner      * @brief The event type.
126*f5210bb6SBen Tyner      */
127*f5210bb6SBen Tyner     uint8_t _eventType = static_cast<uint8_t>(EventType::trace);
128*f5210bb6SBen Tyner 
129*f5210bb6SBen Tyner     /**
130*f5210bb6SBen Tyner      * @brief A reserved 4 byte placeholder
131*f5210bb6SBen Tyner      */
132*f5210bb6SBen Tyner     uint32_t _reserved4Byte1 = 0;
133*f5210bb6SBen Tyner 
134*f5210bb6SBen Tyner     /**
135*f5210bb6SBen Tyner      * @brief The problem domain field.
136*f5210bb6SBen Tyner      */
137*f5210bb6SBen Tyner     uint8_t _problemDomain = 0;
138*f5210bb6SBen Tyner 
139*f5210bb6SBen Tyner     /**
140*f5210bb6SBen Tyner      * @brief The problem vector field.
141*f5210bb6SBen Tyner      */
142*f5210bb6SBen Tyner     uint8_t _problemVector = 0;
143*f5210bb6SBen Tyner 
144*f5210bb6SBen Tyner     /**
145*f5210bb6SBen Tyner      * @brief The action flags field.
146*f5210bb6SBen Tyner      */
147*f5210bb6SBen Tyner     uint16_t _actionFlags; // set by contructor
148*f5210bb6SBen Tyner 
149*f5210bb6SBen Tyner     /**
150*f5210bb6SBen Tyner      * @brief A reserved 4 byte
151*f5210bb6SBen Tyner      * placeholder
152*f5210bb6SBen Tyner      */
153*f5210bb6SBen Tyner     uint32_t _reserved4Byte2 = 0;
154*f5210bb6SBen Tyner };
155*f5210bb6SBen Tyner 
156*f5210bb6SBen Tyner } // namespace pel
157*f5210bb6SBen Tyner } // namespace attn
158