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