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