blob: b0c0e88d8c4d826b5dae47b0245342756890dd50 [file] [log] [blame]
Matt Spinler386a61e2020-08-13 15:51:12 -05001#pragma once
2
3#include "section.hpp"
4#include "stream.hpp"
5
6namespace openpower::pels
7{
8
9/**
10 * @class ExtendedUserData
11 *
12 * This represents the Extended User Data section in a PEL. It is free form
13 * data that the creator knows the contents of. The component ID, version, and
14 * sub-type fields in the section header are used to identify the format.
15 *
16 * This section is used for one subsystem to add FFDC data to a PEL created
17 * by another subsystem. It is basically the same as a UserData section,
18 * except it has the creator ID of the section creator stored in the section.
19 *
20 * The Section base class handles the section header structure that every
21 * PEL section has at offset zero.
22 */
23class ExtendedUserData : public Section
24{
25 public:
26 ExtendedUserData() = delete;
27 ~ExtendedUserData() = default;
28 ExtendedUserData(const ExtendedUserData&) = default;
29 ExtendedUserData& operator=(const ExtendedUserData&) = default;
30 ExtendedUserData(ExtendedUserData&&) = default;
31 ExtendedUserData& operator=(ExtendedUserData&&) = default;
32
33 /**
34 * @brief Constructor
35 *
36 * Fills in this class's data fields from the stream.
37 *
38 * @param[in] pel - the PEL data stream
39 */
40 explicit ExtendedUserData(Stream& pel);
41
42 /**
43 * @brief Constructor
44 *
45 * Create a valid ExtendedUserData object with the passed in data.
46 *
47 * The component ID, subtype, and version are used to identify
48 * the data to know which parser to call.
49 *
50 * @param[in] componentID - Component ID of the creator
51 * @param[in] subType - The type of user data
52 * @param[in] version - The version of the data
53 */
54 ExtendedUserData(uint16_t componentID, uint8_t subType, uint8_t version,
55 uint8_t creatorID, const std::vector<uint8_t>& data);
56
57 /**
58 * @brief Flatten the section into the stream
59 *
60 * @param[in] stream - The stream to write to
61 */
62 void flatten(Stream& stream) const override;
63
64 /**
65 * @brief Returns the size of this section when flattened into a PEL
66 *
67 * @return size_t - the size of the section
68 */
69 size_t flattenedSize()
70 {
71 return Section::flattenedSize() + sizeof(_creatorID) +
72 sizeof(_reserved1B) + sizeof(_reserved2B) + _data.size();
73 }
74
75 /**
76 * @brief Returns the section creator ID field.
77 *
78 * @return uint8_t - The creator ID
79 */
80 const uint8_t creatorID() const
81 {
82 return _creatorID;
83 }
84
85 /**
86 * @brief Returns the raw section data
87 *
88 * This doesn't include the creator ID.
89 *
90 * @return std::vector<uint8_t>&
91 */
92 const std::vector<uint8_t>& data() const
93 {
94 return _data;
95 }
96
97 /**
98 * @brief Get the section contents in JSON
99 *
100 * @param[in] creatorID - Creator Subsystem ID - unused (see the .cpp)
101 * @param[in] plugins - Vector of strings of plugins found in filesystem
102 *
103 * @return The JSON as a string if a parser was found,
104 * otherwise std::nullopt.
105 */
106 std::optional<std::string>
107 getJSON(uint8_t creatorID,
108 const std::vector<std::string>& plugins) const override;
109
110 /**
111 * @brief Shrink the section
112 *
113 * The new size must be between the current size and the minimum
114 * size, which is 12 bytes. If it isn't a 4 byte aligned value
115 * the code will do the aligning before the resize takes place.
116 *
117 * @param[in] newSize - The new size in bytes
118 *
119 * @return bool - true if successful, false else.
120 */
121 bool shrink(size_t newSize) override;
122
123 private:
124 /**
125 * @brief Fills in the object from the stream data
126 *
127 * @param[in] stream - The stream to read from
128 */
129 void unflatten(Stream& stream);
130
131 /**
132 * @brief Validates the section contents
133 *
134 * Updates _valid (in Section) with the results.
135 */
136 void validate() override;
137
138 /**
139 * @brief The subsystem creator ID of the code that
140 * created this section.
141 */
142 uint8_t _creatorID;
143
144 /**
145 * @brief Reserved
146 */
147 uint8_t _reserved1B;
148
149 /**
150 * @brief Reserved
151 */
152 uint16_t _reserved2B;
153
154 /**
155 * @brief The section data
156 */
157 std::vector<uint8_t> _data;
158};
159
160} // namespace openpower::pels