1 #pragma once
2
3 #include "stream.hpp"
4
5 #include <cstdint>
6
7 namespace openpower
8 {
9 namespace pels
10 {
11
12 /**
13 * @class SectionHeader
14 *
15 * This header is at the start of every PEL section. It has a size
16 * of 8 bytes.
17 */
18 struct SectionHeader
19 {
20 public:
21 /**
22 * @brief Constructor
23 */
SectionHeaderopenpower::pels::SectionHeader24 SectionHeader() : id(0), size(0), version(0), subType(0), componentID(0) {}
25
26 /**
27 * @brief Constructor
28 *
29 * @param[in] id - the ID field
30 * @param[in] size - the size field
31 * @param[in] version - the version field
32 * @param[in] subType - the sub-type field
33 * @param[in] componentID - the component ID field
34 */
SectionHeaderopenpower::pels::SectionHeader35 SectionHeader(uint16_t id, uint16_t size, uint8_t version, uint8_t subType,
36 uint16_t componentID) :
37 id(id), size(size), version(version), subType(subType),
38 componentID(componentID)
39 {}
40
41 /**
42 * @brief A two character ASCII field which identifies the section type.
43 */
44 uint16_t id;
45
46 /**
47 * @brief The size of the section in bytes, including this section header.
48 */
49 uint16_t size;
50
51 /**
52 * @brief The section format version.
53 */
54 uint8_t version;
55
56 /**
57 * @brief The section sub-type.
58 */
59 uint8_t subType;
60
61 /**
62 * @brief The component ID, which has various meanings depending on the
63 * section.
64 */
65 uint16_t componentID;
66
67 /**
68 * @brief Returns the size of header when flattened into a PEL.
69 *
70 * @return size_t - the size of the header
71 */
flattenedSizeopenpower::pels::SectionHeader72 static constexpr size_t flattenedSize()
73 {
74 return sizeof(id) + sizeof(size) + sizeof(version) + sizeof(subType) +
75 sizeof(componentID);
76 }
77 };
78
79 /**
80 * @brief Stream extraction operator for the SectionHeader
81 *
82 * @param[in] s - the stream
83 * @param[out] header - the SectionHeader object
84 */
operator >>(Stream & s,SectionHeader & header)85 inline Stream& operator>>(Stream& s, SectionHeader& header)
86 {
87 s >> header.id >> header.size >> header.version >> header.subType >>
88 header.componentID;
89 return s;
90 }
91
92 /**
93 * @brief Stream insertion operator for the section header
94 *
95 * @param[out] s - the stream
96 * @param[in] header - the SectionHeader object
97 */
operator <<(Stream & s,const SectionHeader & header)98 inline Stream& operator<<(Stream& s, const SectionHeader& header)
99 {
100 s << header.id << header.size << header.version << header.subType
101 << header.componentID;
102 return s;
103 }
104
105 } // namespace pels
106 } // namespace openpower
107