blob: 15a9503202db00e5769d82f16adee7c70544233b [file] [log] [blame]
Deepak Kodihallie08fcad2016-11-22 02:10:08 -06001#pragma once
2
3#include "store.hpp"
4
Patrick Venturec83c4dc2018-11-01 16:29:18 -07005#include <cstddef>
6
Deepak Kodihallie08fcad2016-11-22 02:10:08 -06007namespace openpower
8{
9namespace vpd
10{
11namespace parser
12{
Deepak Kodihalli4a475bd2016-11-24 07:08:20 -060013namespace keyword
14{
15
16/** @brief Encoding scheme of a VPD keyword's data */
17enum class Encoding
18{
19 ASCII, /**< data encoded in ascii */
20 RAW, /**< raw data */
21 // Keywords needing custom decoding
Patrick Venturec83c4dc2018-11-01 16:29:18 -070022 B1, /**< The keyword B1 needs to be decoded specially */
23 UD /**< Special decoding of UD meant for UUID */
Deepak Kodihalli4a475bd2016-11-24 07:08:20 -060024};
25
26} // namespace keyword
Deepak Kodihallie08fcad2016-11-22 02:10:08 -060027
Deepak Kodihalli023112f2016-11-22 22:02:14 -060028namespace internal
29{
30
Deepak Kodihalli4a475bd2016-11-24 07:08:20 -060031using KeywordInfo = std::tuple<record::Keyword, keyword::Encoding>;
Deepak Kodihalli023112f2016-11-22 22:02:14 -060032using OffsetList = std::vector<uint32_t>;
Deepak Kodihalli683bf722016-11-24 06:50:43 -060033using KeywordMap = Parsed::mapped_type;
Deepak Kodihalli023112f2016-11-22 22:02:14 -060034
Patrick Venturec83c4dc2018-11-01 16:29:18 -070035} // namespace internal
Deepak Kodihalli023112f2016-11-22 22:02:14 -060036
Deepak Kodihallie08fcad2016-11-22 02:10:08 -060037/** @class Impl
38 * @brief Implements parser for OpenPOWER VPD
39 *
40 * An Impl object must be constructed by passing in OpenPOWER VPD in
41 * binary format. To parse the VPD, call the run() method. The run()
42 * method returns an openpower::vpd::Store object, which contains
43 * parsed VPD, and provides access methods for the VPD.
44 *
45 * Following is the algorithm used to parse OpenPOWER VPD:
46 * 1) Validate that the first record is VHDR, the header record.
47 * 2) From the VHDR record, get the offset of the VTOC record,
48 * which is the table of contents record.
49 * 3) Process the VTOC record - note offsets of supported records.
50 * 4) For each supported record :
51 * 4.1) Jump to record via offset. Add record name to parser output.
52 * 4.2) Process record - for each contained and supported keyword:
53 * 4.2.1) Note keyword name and value, associate this information to
54 * to the record noted in step 4.1).
55 */
56class Impl
57{
Patrick Venturec83c4dc2018-11-01 16:29:18 -070058 public:
59 Impl() = delete;
60 Impl(const Impl&) = delete;
61 Impl& operator=(const Impl&) = delete;
62 Impl(Impl&&) = delete;
63 Impl& operator=(Impl&&) = delete;
64 ~Impl() = default;
Deepak Kodihallie08fcad2016-11-22 02:10:08 -060065
Patrick Venturec83c4dc2018-11-01 16:29:18 -070066 /** @brief Construct an Impl
67 *
68 * @param[in] vpdBuffer - Binary OpenPOWER VPD
69 */
70 explicit Impl(Binary&& vpdBuffer) : vpd(std::move(vpdBuffer)), out{}
71 {
72 }
Deepak Kodihallie08fcad2016-11-22 02:10:08 -060073
Patrick Venturec83c4dc2018-11-01 16:29:18 -070074 /** @brief Run the parser on binary OpenPOWER VPD
75 *
76 * @returns openpower::vpd::Store object
77 */
78 Store run();
Deepak Kodihallie08fcad2016-11-22 02:10:08 -060079
Patrick Venturec83c4dc2018-11-01 16:29:18 -070080 private:
81 /** @brief Process the table of contents record, VHDR
82 *
83 * @returns List of offsets to records in VPD
84 */
85 internal::OffsetList readTOC() const;
Deepak Kodihalli023112f2016-11-22 22:02:14 -060086
Patrick Venturec83c4dc2018-11-01 16:29:18 -070087 /** @brief Read the PT keyword contained in the VHDR record,
88 * to obtain offsets to other records in the VPD.
89 *
90 * @param[in] iterator - iterator to buffer containing VPD
91 * @param[in] ptLength - Length of PT keyword data
92 *
93 * @returns List of offsets to records in VPD
94 */
95 internal::OffsetList readPT(Binary::const_iterator iterator,
96 std::size_t ptLen) const;
Deepak Kodihalli023112f2016-11-22 22:02:14 -060097
Patrick Venturec83c4dc2018-11-01 16:29:18 -070098 /** @brief Read VPD information contained within a record
99 *
100 * @param[in] recordOffset - offset to a record location
101 * within the binary OpenPOWER VPD
102 */
103 void processRecord(std::size_t recordOffset);
Deepak Kodihallia1143462016-11-24 06:28:45 -0600104
Patrick Venturec83c4dc2018-11-01 16:29:18 -0700105 /** @brief Read keyword data
106 *
107 * @param[in] keyword - OpenPOWER VPD keyword
108 * @param[in] dataLength - Length of data to be read
109 * @param[in] iterator - iterator pointing to a Keyword's data in
110 * the VPD
111 *
112 * @returns keyword data as a string
113 */
114 std::string readKwData(const internal::KeywordInfo& keyword,
115 std::size_t dataLength,
116 Binary::const_iterator iterator);
Deepak Kodihallia1143462016-11-24 06:28:45 -0600117
Patrick Venturec83c4dc2018-11-01 16:29:18 -0700118 /** @brief While we're pointing at the keyword section of
119 * a record in the VPD, this will read all contained
120 * keywords and their values.
121 *
122 * @param[in] iterator - iterator pointing to a Keyword in the VPD
123 *
124 * @returns map of keyword:data
125 */
126 internal::KeywordMap readKeywords(Binary::const_iterator iterator);
Deepak Kodihalli683bf722016-11-24 06:50:43 -0600127
Patrick Venturec83c4dc2018-11-01 16:29:18 -0700128 /** @brief Checks if the VHDR record is present in the VPD */
129 void checkHeader() const;
Deepak Kodihalli810c9de2016-11-22 11:42:51 -0600130
Patrick Venturec83c4dc2018-11-01 16:29:18 -0700131 /** @brief OpenPOWER VPD in binary format */
132 Binary vpd;
Deepak Kodihallie08fcad2016-11-22 02:10:08 -0600133
Patrick Venturec83c4dc2018-11-01 16:29:18 -0700134 /** @brief parser output */
135 Parsed out;
Deepak Kodihallie08fcad2016-11-22 02:10:08 -0600136};
137
138} // namespace parser
139} // namespace vpd
140} // namespace openpower