#pragma once #include "pel_common.hpp" #include "pel_section.hpp" #include "stream.hpp" namespace attn { namespace pel { /** * @class UserHeader * * This represents the User Header section in a PEL. * * |--------+----------------+----------------+----------------+------------| * | length | byte0 | byte1 | byte2 | byte3 | * |--------+----------------+----------------+----------------+------------| * | 8 | Section Header | * | | | * |--------+----------------+----------------+----------------+------------| * | 4 | Subsystem ID | Event Scope | Event Severity | Event Type | * |--------+----------------+----------------+----------------+------------| * | 4 | reserved | * |--------+----------------+----------------+-----------------------------| * | 4 | Problem Domain | Problem Vector | Event Action Flags | * |--------+----------------+----------------+-----------------------------| * | 4 | reserved | * |--------+---------------------------------------------------------------| * */ class UserHeader : public Section { public: UserHeader() = delete; ~UserHeader() = default; UserHeader(const UserHeader&) = default; UserHeader& operator=(const UserHeader&) = default; UserHeader(UserHeader&&) = default; UserHeader& operator=(UserHeader&&) = default; /** * @brief Constructor * * Fills in this class's data fields from raw data. * * @param[in] pel - the PEL data stream */ explicit UserHeader(Stream& pel); /** * @brief Flatten the section into the stream * * @param[in] stream - The stream to write to */ void flatten(Stream& stream) const override; /** * @brief Fills in the object from the stream data * * @param[in] stream - The stream to read from */ void unflatten(Stream& stream); /** * @brief Returns the size of this section when flattened into a PEL * * @return size_t - the size of the section */ static constexpr size_t flattenedSize() { return Section::flattenedSize() + sizeof(_eventSubsystem) + sizeof(_eventScope) + sizeof(_eventSeverity) + sizeof(_eventType) + sizeof(_reserved4Byte1) + sizeof(_problemDomain) + sizeof(_problemVector) + sizeof(_actionFlags) + sizeof(_reserved4Byte2); } /** * @brief Set the subsystem field * * @param[in] subsystem - The subsystem value */ void setSubsystem(uint8_t subsystem); /** * @brief Set the severity field * * @param[in] severity - The severity to set */ void setSeverity(uint8_t severity); /** * @brief Set the event type field * * @param[in] type - The event type */ void setType(uint8_t type); /** * @brief Set the action flags field * * @param[in] action - The action flags to set */ void setAction(uint16_t action); private: /** * @brief The subsystem associated with the event. */ uint8_t _eventSubsystem; /** * @brief The event scope field. */ uint8_t _eventScope = static_cast(EventScope::platform); /** * @brief The event severity. */ uint8_t _eventSeverity; // set by constructor /** * @brief The event type. */ uint8_t _eventType = static_cast(EventType::trace); /** * @brief A reserved 4 byte placeholder */ uint32_t _reserved4Byte1 = 0; /** * @brief The problem domain field. */ uint8_t _problemDomain = 0; /** * @brief The problem vector field. */ uint8_t _problemVector = 0; /** * @brief The action flags field. */ uint16_t _actionFlags; // set by contructor /** * @brief A reserved 4 byte * placeholder */ uint32_t _reserved4Byte2 = 0; }; } // namespace pel } // namespace attn