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