blob: 3b8096833d76e919798cf870fb98e3527785370f [file] [log] [blame]
Ben Tynerf5210bb2021-01-05 12:58:10 -06001#pragma once
2
3//#include "bcd_time.hpp"
4#include "pel_common.hpp"
5#include "pel_section.hpp"
6#include "stream.hpp"
7
8namespace attn
9{
10namespace pel
11{
12
13// creator version field type, init to null terminated
14// struct CreatorVersion
15//{
16// uint8_t version[8];
17
18// CreatorVersion()
19// {
20// memset(version, '\0', sizeof(version));
21// }
22//};
23
24/**
25 * @class PrivateHeader
26 *
27 * This represents the Private Header section in a PEL. It is required,
28 * and it is always the first section.
29 *
30 * The Section base class handles the SectionHeader structure that every
31 * PEL section has at offset zero.
32 *
33 * |--------+----------------------+----------+----------+---------------|
34 * | length | byte0 | byte1 | byte2 | byte3 |
35 * |--------+----------------------+----------+----------+---------------|
36 * | 8 | Section Header |
37 * | | |
38 * |--------+------------------------------------------------------------|
39 * | 8 | Timestamp - Creation |
40 * | | |
41 * |--------+------------------------------------------------------------|
42 * | 8 | Timestamp - Commit |
43 * | | |
44 * |--------+----------------------+----------+----------+---------------|
45 * | 4 | Creator ID | reserved | reserved | section count |
46 * |--------+----------------------+----------+----------+---------------|
47 * | 4 | OpenBMC Event Log ID |
48 * |--------+------------------------------------------------------------|
49 * | 8 | Creator Implementation |
50 * | | |
51 * |--------+------------------------------------------------------------|
52 * | 4 | Platform Log ID |
53 * |--------+------------------------------------------------------------|
54 * | 4 | Log Entry ID |
55 * |--------+------------------------------------------------------------|
56 */
57class PrivateHeader : public Section
58{
59 public:
60 PrivateHeader() = delete;
61 ~PrivateHeader() = default;
62 PrivateHeader(const PrivateHeader&) = default;
63 PrivateHeader& operator=(const PrivateHeader&) = default;
64 PrivateHeader(PrivateHeader&&) = default;
65 PrivateHeader& operator=(PrivateHeader&&) = default;
66
67 /**
68 * @brief Constructor
69 *
70 * Fills in this class's data fields from raw data.
71 *
72 * @param[in] pel - the PEL data stream
73 *
74 */
75 explicit PrivateHeader(Stream& pel);
76
77 /**
78 * @brief Flatten the section into the stream
79 *
80 * @param[in] stream - The stream to write to
81 */
82 void flatten(Stream& stream) const override;
83
84 /**
85 * @brief Fills in the object from the stream data
86 *
87 * @param[in] stream - The stream to read from
88 */
89 void unflatten(Stream& stream);
90
91 /**
92 * @brief Returns the size of this section when flattened into a PEL
93 *
94 * @return size_t - the size of the section
95 */
96 static constexpr size_t flattenedSize()
97 {
98 return Section::flattenedSize() + sizeof(_createTimestamp) +
99 sizeof(_commitTimestamp) + sizeof(_creatorID) +
100 sizeof(_reservedByte1) + sizeof(_reservedByte2) +
101 sizeof(_sectionCount) + sizeof(_obmcLogID) +
102 sizeof(_creatorVersion) + sizeof(_plid) + sizeof(_id);
103 }
104
105 /**
106 * @brief Get the total number of sections in this PEL
107 *
108 * @return Number of sections
109 */
110 uint8_t getSectionCount();
111
112 /**
113 * @brief Set the total number of sections in this PEL
114 *
115 * @param[in] sectionCount - Number of sections
116 */
117 void setSectionCount(uint8_t sectionCount);
118
119 private:
120 /**
121 * @brief The creation time timestamp
122 */
123 uint64_t _createTimestamp;
124 // BCDTime _createTimestamp;
125
126 /**
127 * @brief The commit time timestamp
128 */
129 uint64_t _commitTimestamp;
130 // BCDTime _commitTimestamp;
131
132 /**
133 * @brief The creator ID field
134 */
135 uint8_t _creatorID;
136
137 /**
138 * @brief A reserved byte.
139 */
140 uint8_t _reservedByte1 = 0;
141
142 /**
143 * @brief A reserved byte.
144 */
145 uint8_t _reservedByte2 = 0;
146
147 /**
148 * @brief Total number of sections in the PEL
149 */
150 uint8_t _sectionCount = 3; // private header, user header, primary src = 3
151
152 /**
153 * @brief The OpenBMC event log ID that corresponds to this PEL.
154 */
155 uint32_t _obmcLogID = 0;
156
157 /**
158 * @brief The creator subsystem version field
159 */
160 uint64_t _creatorVersion;
161 // CreatorVersion _creatorVersion;
162
163 /**
164 * @brief The platform log ID field
165 */
166 uint32_t _plid;
167
168 /**
169 * @brief The log entry ID field
170 */
171 uint32_t _id = 0;
172};
173
174/**
175 * @brief Stream insertion operator for the CreatorVersion
176 *
177 * @param[out] s - the stream
178 * @param[in] cv - the CreatorVersion object
179 */
180// Stream& operator<<(Stream& s, const CreatorVersion& cv);
181
182/**
183 * @brief Stream extraction operator for the CreatorVersion
184 *
185 * @param[in] s - the stream
186 * @param[out] cv - the CreatorVersion object
187 */
188// Stream& operator>>(Stream& s, CreatorVersion& cv);
189
190} // namespace pel
191} // namespace attn