103c1d915SMatt Spinler #pragma once 203c1d915SMatt Spinler 3*fdb6a202SMatt Spinler #include "elog_entry.hpp" 4*fdb6a202SMatt Spinler #include "registry.hpp" 503c1d915SMatt Spinler #include "section.hpp" 603c1d915SMatt Spinler #include "stream.hpp" 703c1d915SMatt Spinler 803c1d915SMatt Spinler namespace openpower 903c1d915SMatt Spinler { 1003c1d915SMatt Spinler namespace pels 1103c1d915SMatt Spinler { 1203c1d915SMatt Spinler 131a94cc38SMatt Spinler static constexpr uint8_t userHeaderVersion = 0x01; 1403c1d915SMatt Spinler 1503c1d915SMatt Spinler /** 1603c1d915SMatt Spinler * @class UserHeader 1703c1d915SMatt Spinler * 1803c1d915SMatt Spinler * This represents the User Header section in a PEL. It is required, 1903c1d915SMatt Spinler * and it is always the second section. 2003c1d915SMatt Spinler * 2103c1d915SMatt Spinler * The Section base class handles the section header structure that every 2203c1d915SMatt Spinler * PEL section has at offset zero. 2303c1d915SMatt Spinler * 2403c1d915SMatt Spinler * The fields in this class directly correspond to the order and sizes of 2503c1d915SMatt Spinler * the fields in the section. 2603c1d915SMatt Spinler */ 2703c1d915SMatt Spinler class UserHeader : public Section 2803c1d915SMatt Spinler { 2903c1d915SMatt Spinler public: 3003c1d915SMatt Spinler UserHeader() = delete; 3103c1d915SMatt Spinler ~UserHeader() = default; 3203c1d915SMatt Spinler UserHeader(const UserHeader&) = default; 3303c1d915SMatt Spinler UserHeader& operator=(const UserHeader&) = default; 3403c1d915SMatt Spinler UserHeader(UserHeader&&) = default; 3503c1d915SMatt Spinler UserHeader& operator=(UserHeader&&) = default; 3603c1d915SMatt Spinler 3703c1d915SMatt Spinler /** 3803c1d915SMatt Spinler * @brief Constructor 3903c1d915SMatt Spinler * 40*fdb6a202SMatt Spinler * Creates a valid UserHeader with the passed in data. 41*fdb6a202SMatt Spinler * 42*fdb6a202SMatt Spinler * @param[in] entry - The message registry entry for this error 43*fdb6a202SMatt Spinler * @param[in] severity - The OpenBMC event log severity for this error 44*fdb6a202SMatt Spinler */ 45*fdb6a202SMatt Spinler UserHeader(const message::Entry& entry, 46*fdb6a202SMatt Spinler phosphor::logging::Entry::Level severity); 47*fdb6a202SMatt Spinler 48*fdb6a202SMatt Spinler /** 49*fdb6a202SMatt Spinler * @brief Constructor 50*fdb6a202SMatt Spinler * 5103c1d915SMatt Spinler * Fills in this class's data fields from the stream. 5203c1d915SMatt Spinler * 5303c1d915SMatt Spinler * @param[in] pel - the PEL data stream 5403c1d915SMatt Spinler */ 5503c1d915SMatt Spinler explicit UserHeader(Stream& pel); 5603c1d915SMatt Spinler 5703c1d915SMatt Spinler /** 58cf5a8d0fSMatt Spinler * @brief Flatten the section into the stream 59cf5a8d0fSMatt Spinler * 60cf5a8d0fSMatt Spinler * @param[in] stream - The stream to write to 61cf5a8d0fSMatt Spinler */ 62cf5a8d0fSMatt Spinler void flatten(Stream& stream) override; 63cf5a8d0fSMatt Spinler 64cf5a8d0fSMatt Spinler /** 6503c1d915SMatt Spinler * @brief Returns the subsystem field. 6603c1d915SMatt Spinler * 6703c1d915SMatt Spinler * @return uint8_t& - the subsystem 6803c1d915SMatt Spinler */ 6903c1d915SMatt Spinler uint8_t& subsystem() 7003c1d915SMatt Spinler { 7103c1d915SMatt Spinler return _eventSubsystem; 7203c1d915SMatt Spinler } 7303c1d915SMatt Spinler 7403c1d915SMatt Spinler /** 7503c1d915SMatt Spinler * @brief Returns the event scope field. 7603c1d915SMatt Spinler * 7703c1d915SMatt Spinler * @return uint8_t& - the event scope 7803c1d915SMatt Spinler */ 7903c1d915SMatt Spinler uint8_t& scope() 8003c1d915SMatt Spinler { 8103c1d915SMatt Spinler return _eventScope; 8203c1d915SMatt Spinler } 8303c1d915SMatt Spinler 8403c1d915SMatt Spinler /** 8503c1d915SMatt Spinler * @brief Returns the severity field. 8603c1d915SMatt Spinler * 8703c1d915SMatt Spinler * @return uint8_t& - the severity 8803c1d915SMatt Spinler */ 8903c1d915SMatt Spinler uint8_t& severity() 9003c1d915SMatt Spinler { 9103c1d915SMatt Spinler return _eventSeverity; 9203c1d915SMatt Spinler } 9303c1d915SMatt Spinler 9403c1d915SMatt Spinler /** 9503c1d915SMatt Spinler * @brief Returns the event type field. 9603c1d915SMatt Spinler * 9703c1d915SMatt Spinler * @return uint8_t& - the event type 9803c1d915SMatt Spinler */ 9903c1d915SMatt Spinler uint8_t& eventType() 10003c1d915SMatt Spinler { 10103c1d915SMatt Spinler return _eventType; 10203c1d915SMatt Spinler } 10303c1d915SMatt Spinler 10403c1d915SMatt Spinler /** 10503c1d915SMatt Spinler * @brief Returns the problem domain field. 10603c1d915SMatt Spinler * 10703c1d915SMatt Spinler * @return uint8_t& - the problem domain 10803c1d915SMatt Spinler */ 10903c1d915SMatt Spinler uint8_t& problemDomain() 11003c1d915SMatt Spinler { 11103c1d915SMatt Spinler return _problemDomain; 11203c1d915SMatt Spinler } 11303c1d915SMatt Spinler 11403c1d915SMatt Spinler /** 11503c1d915SMatt Spinler * @brief Returns the problem vector field. 11603c1d915SMatt Spinler * 11703c1d915SMatt Spinler * @return uint8_t& - the problem vector 11803c1d915SMatt Spinler */ 11903c1d915SMatt Spinler uint8_t& problemVector() 12003c1d915SMatt Spinler { 12103c1d915SMatt Spinler return _problemVector; 12203c1d915SMatt Spinler } 12303c1d915SMatt Spinler 12403c1d915SMatt Spinler /** 12503c1d915SMatt Spinler * @brief Returns the action flags field. 12603c1d915SMatt Spinler * 12703c1d915SMatt Spinler * @return uint16_t& - the action flags 12803c1d915SMatt Spinler */ 12903c1d915SMatt Spinler uint16_t& actionFlags() 13003c1d915SMatt Spinler { 13103c1d915SMatt Spinler return _actionFlags; 13203c1d915SMatt Spinler } 13303c1d915SMatt Spinler 13403c1d915SMatt Spinler /** 13503c1d915SMatt Spinler * @brief Returns the size of this section when flattened into a PEL 13603c1d915SMatt Spinler * 13703c1d915SMatt Spinler * @return size_t - the size of the section 13803c1d915SMatt Spinler */ 13903c1d915SMatt Spinler static constexpr size_t flattenedSize() 14003c1d915SMatt Spinler { 14103c1d915SMatt Spinler return Section::flattenedSize() + sizeof(_eventSubsystem) + 14203c1d915SMatt Spinler sizeof(_eventScope) + sizeof(_eventSeverity) + 14303c1d915SMatt Spinler sizeof(_eventType) + sizeof(_reserved4Byte1) + 14403c1d915SMatt Spinler sizeof(_problemDomain) + sizeof(_problemVector) + 14503c1d915SMatt Spinler sizeof(_actionFlags) + sizeof(_reserved4Byte2); 14603c1d915SMatt Spinler } 14703c1d915SMatt Spinler 14803c1d915SMatt Spinler private: 14903c1d915SMatt Spinler /** 150cf5a8d0fSMatt Spinler * @brief Fills in the object from the stream data 151cf5a8d0fSMatt Spinler * 152cf5a8d0fSMatt Spinler * @param[in] stream - The stream to read from 153cf5a8d0fSMatt Spinler */ 154cf5a8d0fSMatt Spinler void unflatten(Stream& stream); 155cf5a8d0fSMatt Spinler 156cf5a8d0fSMatt Spinler /** 15703c1d915SMatt Spinler * @brief Validates the section contents 15803c1d915SMatt Spinler * 15903c1d915SMatt Spinler * Updates _valid (in Section) with the results. 16003c1d915SMatt Spinler */ 16103c1d915SMatt Spinler void validate() override; 16203c1d915SMatt Spinler 16303c1d915SMatt Spinler /** 16403c1d915SMatt Spinler * @brief The subsystem associated with the event. 16503c1d915SMatt Spinler */ 16603c1d915SMatt Spinler uint8_t _eventSubsystem; 16703c1d915SMatt Spinler 16803c1d915SMatt Spinler /** 16903c1d915SMatt Spinler * @brief The event scope field. 17003c1d915SMatt Spinler */ 17103c1d915SMatt Spinler uint8_t _eventScope; 17203c1d915SMatt Spinler 17303c1d915SMatt Spinler /** 17403c1d915SMatt Spinler * @brief The event severity. 17503c1d915SMatt Spinler */ 17603c1d915SMatt Spinler uint8_t _eventSeverity; 17703c1d915SMatt Spinler 17803c1d915SMatt Spinler /** 17903c1d915SMatt Spinler * @brief The event type. 18003c1d915SMatt Spinler */ 18103c1d915SMatt Spinler uint8_t _eventType; 18203c1d915SMatt Spinler 18303c1d915SMatt Spinler /** 18403c1d915SMatt Spinler * @brief A reserved word placeholder 18503c1d915SMatt Spinler */ 18603c1d915SMatt Spinler uint32_t _reserved4Byte1; 18703c1d915SMatt Spinler 18803c1d915SMatt Spinler /** 18903c1d915SMatt Spinler * @brief The problem domain field. 19003c1d915SMatt Spinler */ 19103c1d915SMatt Spinler uint8_t _problemDomain; 19203c1d915SMatt Spinler 19303c1d915SMatt Spinler /** 19403c1d915SMatt Spinler * @brief The problem vector field. 19503c1d915SMatt Spinler */ 19603c1d915SMatt Spinler uint8_t _problemVector; 19703c1d915SMatt Spinler 19803c1d915SMatt Spinler /** 19903c1d915SMatt Spinler * @brief The action flags field. 20003c1d915SMatt Spinler */ 20103c1d915SMatt Spinler uint16_t _actionFlags; 20203c1d915SMatt Spinler 20303c1d915SMatt Spinler /** 20403c1d915SMatt Spinler * @brief The second reserved word placeholder. 20503c1d915SMatt Spinler */ 20603c1d915SMatt Spinler uint32_t _reserved4Byte2; 20703c1d915SMatt Spinler }; 20803c1d915SMatt Spinler 20903c1d915SMatt Spinler } // namespace pels 21003c1d915SMatt Spinler } // namespace openpower 211