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