103c1d915SMatt Spinler #pragma once 203c1d915SMatt Spinler 303c1d915SMatt Spinler #include "section.hpp" 403c1d915SMatt Spinler #include "stream.hpp" 503c1d915SMatt Spinler 603c1d915SMatt Spinler namespace openpower 703c1d915SMatt Spinler { 803c1d915SMatt Spinler namespace pels 903c1d915SMatt Spinler { 1003c1d915SMatt Spinler 1103c1d915SMatt Spinler static constexpr uint16_t userHeaderSectionID = 0x5548; // 'UH' 1203c1d915SMatt Spinler static constexpr uint16_t userHeaderVersion = 0x01; 1303c1d915SMatt Spinler 1403c1d915SMatt Spinler /** 1503c1d915SMatt Spinler * @class UserHeader 1603c1d915SMatt Spinler * 1703c1d915SMatt Spinler * This represents the User Header section in a PEL. It is required, 1803c1d915SMatt Spinler * and it is always the second section. 1903c1d915SMatt Spinler * 2003c1d915SMatt Spinler * The Section base class handles the section header structure that every 2103c1d915SMatt Spinler * PEL section has at offset zero. 2203c1d915SMatt Spinler * 2303c1d915SMatt Spinler * The fields in this class directly correspond to the order and sizes of 2403c1d915SMatt Spinler * the fields in the section. 2503c1d915SMatt Spinler */ 2603c1d915SMatt Spinler class UserHeader : public Section 2703c1d915SMatt Spinler { 2803c1d915SMatt Spinler public: 2903c1d915SMatt Spinler UserHeader() = delete; 3003c1d915SMatt Spinler ~UserHeader() = default; 3103c1d915SMatt Spinler UserHeader(const UserHeader&) = default; 3203c1d915SMatt Spinler UserHeader& operator=(const UserHeader&) = default; 3303c1d915SMatt Spinler UserHeader(UserHeader&&) = default; 3403c1d915SMatt Spinler UserHeader& operator=(UserHeader&&) = default; 3503c1d915SMatt Spinler 3603c1d915SMatt Spinler /** 3703c1d915SMatt Spinler * @brief Constructor 3803c1d915SMatt Spinler * 3903c1d915SMatt Spinler * Fills in this class's data fields from the stream. 4003c1d915SMatt Spinler * 4103c1d915SMatt Spinler * @param[in] pel - the PEL data stream 4203c1d915SMatt Spinler */ 4303c1d915SMatt Spinler explicit UserHeader(Stream& pel); 4403c1d915SMatt Spinler 4503c1d915SMatt Spinler /** 46*cf5a8d0fSMatt Spinler * @brief Flatten the section into the stream 47*cf5a8d0fSMatt Spinler * 48*cf5a8d0fSMatt Spinler * @param[in] stream - The stream to write to 49*cf5a8d0fSMatt Spinler */ 50*cf5a8d0fSMatt Spinler void flatten(Stream& stream) override; 51*cf5a8d0fSMatt Spinler 52*cf5a8d0fSMatt Spinler /** 5303c1d915SMatt Spinler * @brief Returns the subsystem field. 5403c1d915SMatt Spinler * 5503c1d915SMatt Spinler * @return uint8_t& - the subsystem 5603c1d915SMatt Spinler */ 5703c1d915SMatt Spinler uint8_t& subsystem() 5803c1d915SMatt Spinler { 5903c1d915SMatt Spinler return _eventSubsystem; 6003c1d915SMatt Spinler } 6103c1d915SMatt Spinler 6203c1d915SMatt Spinler /** 6303c1d915SMatt Spinler * @brief Returns the event scope field. 6403c1d915SMatt Spinler * 6503c1d915SMatt Spinler * @return uint8_t& - the event scope 6603c1d915SMatt Spinler */ 6703c1d915SMatt Spinler uint8_t& scope() 6803c1d915SMatt Spinler { 6903c1d915SMatt Spinler return _eventScope; 7003c1d915SMatt Spinler } 7103c1d915SMatt Spinler 7203c1d915SMatt Spinler /** 7303c1d915SMatt Spinler * @brief Returns the severity field. 7403c1d915SMatt Spinler * 7503c1d915SMatt Spinler * @return uint8_t& - the severity 7603c1d915SMatt Spinler */ 7703c1d915SMatt Spinler uint8_t& severity() 7803c1d915SMatt Spinler { 7903c1d915SMatt Spinler return _eventSeverity; 8003c1d915SMatt Spinler } 8103c1d915SMatt Spinler 8203c1d915SMatt Spinler /** 8303c1d915SMatt Spinler * @brief Returns the event type field. 8403c1d915SMatt Spinler * 8503c1d915SMatt Spinler * @return uint8_t& - the event type 8603c1d915SMatt Spinler */ 8703c1d915SMatt Spinler uint8_t& eventType() 8803c1d915SMatt Spinler { 8903c1d915SMatt Spinler return _eventType; 9003c1d915SMatt Spinler } 9103c1d915SMatt Spinler 9203c1d915SMatt Spinler /** 9303c1d915SMatt Spinler * @brief Returns the problem domain field. 9403c1d915SMatt Spinler * 9503c1d915SMatt Spinler * @return uint8_t& - the problem domain 9603c1d915SMatt Spinler */ 9703c1d915SMatt Spinler uint8_t& problemDomain() 9803c1d915SMatt Spinler { 9903c1d915SMatt Spinler return _problemDomain; 10003c1d915SMatt Spinler } 10103c1d915SMatt Spinler 10203c1d915SMatt Spinler /** 10303c1d915SMatt Spinler * @brief Returns the problem vector field. 10403c1d915SMatt Spinler * 10503c1d915SMatt Spinler * @return uint8_t& - the problem vector 10603c1d915SMatt Spinler */ 10703c1d915SMatt Spinler uint8_t& problemVector() 10803c1d915SMatt Spinler { 10903c1d915SMatt Spinler return _problemVector; 11003c1d915SMatt Spinler } 11103c1d915SMatt Spinler 11203c1d915SMatt Spinler /** 11303c1d915SMatt Spinler * @brief Returns the action flags field. 11403c1d915SMatt Spinler * 11503c1d915SMatt Spinler * @return uint16_t& - the action flags 11603c1d915SMatt Spinler */ 11703c1d915SMatt Spinler uint16_t& actionFlags() 11803c1d915SMatt Spinler { 11903c1d915SMatt Spinler return _actionFlags; 12003c1d915SMatt Spinler } 12103c1d915SMatt Spinler 12203c1d915SMatt Spinler /** 12303c1d915SMatt Spinler * @brief Returns the size of this section when flattened into a PEL 12403c1d915SMatt Spinler * 12503c1d915SMatt Spinler * @return size_t - the size of the section 12603c1d915SMatt Spinler */ 12703c1d915SMatt Spinler static constexpr size_t flattenedSize() 12803c1d915SMatt Spinler { 12903c1d915SMatt Spinler return Section::flattenedSize() + sizeof(_eventSubsystem) + 13003c1d915SMatt Spinler sizeof(_eventScope) + sizeof(_eventSeverity) + 13103c1d915SMatt Spinler sizeof(_eventType) + sizeof(_reserved4Byte1) + 13203c1d915SMatt Spinler sizeof(_problemDomain) + sizeof(_problemVector) + 13303c1d915SMatt Spinler sizeof(_actionFlags) + sizeof(_reserved4Byte2); 13403c1d915SMatt Spinler } 13503c1d915SMatt Spinler 13603c1d915SMatt Spinler private: 13703c1d915SMatt Spinler /** 138*cf5a8d0fSMatt Spinler * @brief Fills in the object from the stream data 139*cf5a8d0fSMatt Spinler * 140*cf5a8d0fSMatt Spinler * @param[in] stream - The stream to read from 141*cf5a8d0fSMatt Spinler */ 142*cf5a8d0fSMatt Spinler void unflatten(Stream& stream); 143*cf5a8d0fSMatt Spinler 144*cf5a8d0fSMatt Spinler /** 14503c1d915SMatt Spinler * @brief Validates the section contents 14603c1d915SMatt Spinler * 14703c1d915SMatt Spinler * Updates _valid (in Section) with the results. 14803c1d915SMatt Spinler */ 14903c1d915SMatt Spinler void validate() override; 15003c1d915SMatt Spinler 15103c1d915SMatt Spinler /** 15203c1d915SMatt Spinler * @brief The subsystem associated with the event. 15303c1d915SMatt Spinler */ 15403c1d915SMatt Spinler uint8_t _eventSubsystem; 15503c1d915SMatt Spinler 15603c1d915SMatt Spinler /** 15703c1d915SMatt Spinler * @brief The event scope field. 15803c1d915SMatt Spinler */ 15903c1d915SMatt Spinler uint8_t _eventScope; 16003c1d915SMatt Spinler 16103c1d915SMatt Spinler /** 16203c1d915SMatt Spinler * @brief The event severity. 16303c1d915SMatt Spinler */ 16403c1d915SMatt Spinler uint8_t _eventSeverity; 16503c1d915SMatt Spinler 16603c1d915SMatt Spinler /** 16703c1d915SMatt Spinler * @brief The event type. 16803c1d915SMatt Spinler */ 16903c1d915SMatt Spinler uint8_t _eventType; 17003c1d915SMatt Spinler 17103c1d915SMatt Spinler /** 17203c1d915SMatt Spinler * @brief A reserved word placeholder 17303c1d915SMatt Spinler */ 17403c1d915SMatt Spinler uint32_t _reserved4Byte1; 17503c1d915SMatt Spinler 17603c1d915SMatt Spinler /** 17703c1d915SMatt Spinler * @brief The problem domain field. 17803c1d915SMatt Spinler */ 17903c1d915SMatt Spinler uint8_t _problemDomain; 18003c1d915SMatt Spinler 18103c1d915SMatt Spinler /** 18203c1d915SMatt Spinler * @brief The problem vector field. 18303c1d915SMatt Spinler */ 18403c1d915SMatt Spinler uint8_t _problemVector; 18503c1d915SMatt Spinler 18603c1d915SMatt Spinler /** 18703c1d915SMatt Spinler * @brief The action flags field. 18803c1d915SMatt Spinler */ 18903c1d915SMatt Spinler uint16_t _actionFlags; 19003c1d915SMatt Spinler 19103c1d915SMatt Spinler /** 19203c1d915SMatt Spinler * @brief The second reserved word placeholder. 19303c1d915SMatt Spinler */ 19403c1d915SMatt Spinler uint32_t _reserved4Byte2; 19503c1d915SMatt Spinler }; 19603c1d915SMatt Spinler 19703c1d915SMatt Spinler } // namespace pels 19803c1d915SMatt Spinler } // namespace openpower 199