summaryrefslogtreecommitdiffstats
path: root/extensions/openpower-pels/extended_user_header.hpp
blob: 422b3f569cbc20fc7eb9a797ac1f5fa3980e952f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
#pragma once

#include "bcd_time.hpp"
#include "data_interface.hpp"
#include "elog_entry.hpp"
#include "mtms.hpp"
#include "registry.hpp"
#include "section.hpp"
#include "src.hpp"
#include "stream.hpp"

namespace openpower
{
namespace pels
{

constexpr uint8_t extendedUserHeaderVersion = 0x01;
constexpr size_t firmwareVersionSize = 16;

/**
 * @class ExtendedUserHeader
 *
 * This represents the Extended User Header section in a PEL.  It is  a required
 * section.  It contains code versions, an MTMS subsection, and a string called
 * a symptom ID.
 *
 * The Section base class handles the section header structure that every
 * PEL section has at offset zero.
 */
class ExtendedUserHeader : public Section
{
  public:
    ExtendedUserHeader() = delete;
    ~ExtendedUserHeader() = default;
    ExtendedUserHeader(const ExtendedUserHeader&) = default;
    ExtendedUserHeader& operator=(const ExtendedUserHeader&) = default;
    ExtendedUserHeader(ExtendedUserHeader&&) = default;
    ExtendedUserHeader& operator=(ExtendedUserHeader&&) = default;

    /**
     * @brief Constructor
     *
     * Fills in this class's data fields from the stream.
     *
     * @param[in] pel - the PEL data stream
     */
    explicit ExtendedUserHeader(Stream& pel);

    /**
     * @brief Constructor
     *
     * @param[in] dataIface - The DataInterface object
     * @param[in] regEntry - The message registry entry for this event
     * @param[in] src - The SRC section object for this event
     */
    ExtendedUserHeader(const DataInterfaceBase& dataIface,
                       const message::Entry& regEntry, const SRC& src);

    /**
     * @brief Flatten the section into the stream
     *
     * @param[in] stream - The stream to write to
     */
    void flatten(Stream& stream) const override;

    /**
     * @brief Returns the size of this section when flattened into a PEL
     *
     * @return size_t - the size of the section
     */
    size_t flattenedSize()
    {
        return Section::flattenedSize() + _mtms.flattenedSize() +
               _serverFWVersion.size() + _subsystemFWVersion.size() +
               sizeof(_reserved4B) + sizeof(_refTime) + sizeof(_reserved1B1) +
               sizeof(_reserved1B2) + sizeof(_reserved1B3) +
               sizeof(_symptomIDSize) + _symptomIDSize;
    }

    /**
     * @brief Returns the server firmware version
     *
     * @return std::string - The version
     */
    std::string serverFWVersion() const
    {
        std::string version;
        for (size_t i = 0;
             i < _serverFWVersion.size() && _serverFWVersion[i] != '\0'; i++)
        {
            version.push_back(_serverFWVersion[i]);
        }
        return version;
    }

    /**
     * @brief Returns the subsystem firmware version
     *
     * @return std::string - The version
     */
    std::string subsystemFWVersion() const
    {
        std::string version;
        for (size_t i = 0;
             i < _subsystemFWVersion.size() && _subsystemFWVersion[i] != '\0';
             i++)
        {
            version.push_back(_subsystemFWVersion[i]);
        }
        return version;
    }

    /**
     * @brief Returns the machine type+model
     *
     * @return std::string - The MTM
     */
    std::string machineTypeModel() const
    {
        return _mtms.machineTypeAndModel();
    }

    /**
     * @brief Returns the machine serial number
     *
     * @return std::string - The serial number
     */
    std::string machineSerialNumber() const
    {
        return _mtms.machineSerialNumber();
    }

    /**
     * @brief Returns the Event Common Reference Time field
     *
     * @return BCDTime - The time value
     */
    const BCDTime& refTime() const
    {
        return _refTime;
    }

    /**
     * @brief Returns the symptom ID
     *
     * @return std::string - The symptom ID
     */
    std::string symptomID() const
    {
        std::string symptom;
        for (size_t i = 0; i < _symptomID.size() && _symptomID[i] != '\0'; i++)
        {
            symptom.push_back(_symptomID[i]);
        }
        return symptom;
    }

  private:
    /**
     * @brief Fills in the object from the stream data
     *
     * @param[in] stream - The stream to read from
     */
    void unflatten(Stream& stream);

    /**
     * @brief Validates the section contents
     *
     * Updates _valid (in Section) with the results.
     */
    void validate() override;

    /**
     * @brief Builds the symptom ID
     *
     * Uses the message registry to say which SRC fields to add
     * to the SRC's ASCII string to make the ID, and uses a smart
     * default if not specified in the registry.
     *
     * @param[in] regEntry - The message registry entry for this event
     * @param[in] src - The SRC section object for this event
     */
    void createSymptomID(const message::Entry& regEntry, const SRC& src);

    /**
     * @brief The structure that holds the machine TM and SN fields.
     */
    MTMS _mtms;

    /**
     * @brief The server firmware version
     *
     * NULL terminated.
     *
     * The release version of the full firmware image.
     */
    std::array<uint8_t, firmwareVersionSize> _serverFWVersion;

    /**
     * @brief The subsystem firmware version
     *
     * NULL terminated.
     *
     * On PELs created on the BMC, this will be the BMC code version.
     */
    std::array<uint8_t, firmwareVersionSize> _subsystemFWVersion;

    /**
     * @brief Reserved
     */
    uint32_t _reserved4B = 0;

    /**
     * @brief Event Common Reference Time
     *
     * This is not used by PELs created on the BMC.
     */
    BCDTime _refTime;

    /**
     * @brief Reserved
     */
    uint8_t _reserved1B1 = 0;

    /**
     * @brief Reserved
     */
    uint8_t _reserved1B2 = 0;

    /**
     * @brief Reserved
     */
    uint8_t _reserved1B3 = 0;

    /**
     * @brief The size of the symptom ID field
     */
    uint8_t _symptomIDSize;

    /**
     * @brief The symptom ID field
     *
     * Describes a unique event signature for the log.
     * Required for serviceable events, otherwise optional.
     * When present, must start with the first 8 characters
     * of the ASCII string field from the SRC.
     *
     * NULL terminated.
     */
    std::vector<uint8_t> _symptomID;
};

} // namespace pels
} // namespace openpower
OpenPOWER on IntegriCloud