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