summaryrefslogtreecommitdiffstats
path: root/extensions/openpower-pels/generic.hpp
blob: ff85b0363eb3e041bb7c1ac92219807e367c1822 (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
#pragma once

#include "section.hpp"
#include "stream.hpp"

namespace openpower
{
namespace pels
{

/**
 * @class Generic
 *
 * This class is used for a PEL section when there is no other class to use.
 * It just contains a vector of the raw data.  Its purpose is so that a PEL
 * can be completely unflattened even if the code doesn't have a class for
 * every section type.
 */
class Generic : public Section
{
  public:
    Generic() = delete;
    ~Generic() = default;
    Generic(const Generic&) = default;
    Generic& operator=(const Generic&) = default;
    Generic(Generic&&) = default;
    Generic& operator=(Generic&&) = default;

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

    /**
     * @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() + _data.size();
    }

    /**
     * @brief Returns the raw section data
     *
     * @return std::vector<uint8_t>&
     */
    const std::vector<uint8_t>& data() const
    {
        return _data;
    }

  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 The section data
     */
    std::vector<uint8_t> _data;
};

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