1f7f5da97SDeepak Kodihalli #include "pldm_bios_cmd.hpp"
2f7f5da97SDeepak Kodihalli
3f7f5da97SDeepak Kodihalli #include "common/bios_utils.hpp"
4f7f5da97SDeepak Kodihalli #include "common/utils.hpp"
5f7f5da97SDeepak Kodihalli #include "pldm_cmd_helper.hpp"
6f7f5da97SDeepak Kodihalli
7c453e164SGeorge Liu #include <libpldm/bios_table.h>
8c453e164SGeorge Liu #include <libpldm/utils.h>
9c453e164SGeorge Liu
10f7f5da97SDeepak Kodihalli #include <map>
11f7f5da97SDeepak Kodihalli #include <optional>
12f7f5da97SDeepak Kodihalli
13f7f5da97SDeepak Kodihalli namespace pldmtool
14f7f5da97SDeepak Kodihalli {
15f7f5da97SDeepak Kodihalli
16f7f5da97SDeepak Kodihalli namespace bios
17f7f5da97SDeepak Kodihalli {
18f7f5da97SDeepak Kodihalli
19f7f5da97SDeepak Kodihalli namespace
20f7f5da97SDeepak Kodihalli {
21f7f5da97SDeepak Kodihalli
22f7f5da97SDeepak Kodihalli using namespace pldmtool::helper;
23f7f5da97SDeepak Kodihalli using namespace pldm::bios::utils;
245079ac4aSBrad Bishop using namespace pldm::utils;
25f7f5da97SDeepak Kodihalli
26f7f5da97SDeepak Kodihalli std::vector<std::unique_ptr<CommandInterface>> commands;
27f7f5da97SDeepak Kodihalli
28f7f5da97SDeepak Kodihalli const std::map<const char*, pldm_bios_table_types> pldmBIOSTableTypes{
29f7f5da97SDeepak Kodihalli {"StringTable", PLDM_BIOS_STRING_TABLE},
30f7f5da97SDeepak Kodihalli {"AttributeTable", PLDM_BIOS_ATTR_TABLE},
31f7f5da97SDeepak Kodihalli {"AttributeValueTable", PLDM_BIOS_ATTR_VAL_TABLE},
32f7f5da97SDeepak Kodihalli };
33f7f5da97SDeepak Kodihalli
34f7f5da97SDeepak Kodihalli } // namespace
35f7f5da97SDeepak Kodihalli
36f7f5da97SDeepak Kodihalli class GetDateTime : public CommandInterface
37f7f5da97SDeepak Kodihalli {
38f7f5da97SDeepak Kodihalli public:
39f7f5da97SDeepak Kodihalli ~GetDateTime() = default;
40f7f5da97SDeepak Kodihalli GetDateTime() = delete;
41f7f5da97SDeepak Kodihalli GetDateTime(const GetDateTime&) = delete;
42f7f5da97SDeepak Kodihalli GetDateTime(GetDateTime&&) = default;
43f7f5da97SDeepak Kodihalli GetDateTime& operator=(const GetDateTime&) = delete;
44a7dbca53SPavithra Barithaya GetDateTime& operator=(GetDateTime&&) = delete;
45f7f5da97SDeepak Kodihalli
46f7f5da97SDeepak Kodihalli using CommandInterface::CommandInterface;
47f7f5da97SDeepak Kodihalli
createRequestMsg()48f7f5da97SDeepak Kodihalli std::pair<int, std::vector<uint8_t>> createRequestMsg() override
49f7f5da97SDeepak Kodihalli {
50f7f5da97SDeepak Kodihalli std::vector<uint8_t> requestMsg(sizeof(pldm_msg_hdr));
51*5c3f0d1bSPavithra Barithaya auto request = new (requestMsg.data()) pldm_msg;
52f7f5da97SDeepak Kodihalli
53f7f5da97SDeepak Kodihalli auto rc = encode_get_date_time_req(instanceId, request);
54f7f5da97SDeepak Kodihalli return {rc, requestMsg};
55f7f5da97SDeepak Kodihalli }
56f7f5da97SDeepak Kodihalli
parseResponseMsg(pldm_msg * responsePtr,size_t payloadLength)57f7f5da97SDeepak Kodihalli void parseResponseMsg(pldm_msg* responsePtr, size_t payloadLength) override
58f7f5da97SDeepak Kodihalli {
59f7f5da97SDeepak Kodihalli uint8_t cc = 0;
60f7f5da97SDeepak Kodihalli
61f7f5da97SDeepak Kodihalli uint8_t seconds, minutes, hours, day, month;
62f7f5da97SDeepak Kodihalli uint16_t year;
6316c2a0a0SPatrick Williams auto rc =
6416c2a0a0SPatrick Williams decode_get_date_time_resp(responsePtr, payloadLength, &cc, &seconds,
6516c2a0a0SPatrick Williams &minutes, &hours, &day, &month, &year);
66f7f5da97SDeepak Kodihalli if (rc != PLDM_SUCCESS || cc != PLDM_SUCCESS)
67f7f5da97SDeepak Kodihalli {
68f7f5da97SDeepak Kodihalli std::cerr << "Response Message Error: "
69f7f5da97SDeepak Kodihalli << "rc=" << rc << ",cc=" << (int)cc << std::endl;
70f7f5da97SDeepak Kodihalli return;
71f7f5da97SDeepak Kodihalli }
72ca4a815bSSridevi Ramesh
73ca4a815bSSridevi Ramesh std::stringstream dt;
74ca4a815bSSridevi Ramesh ordered_json data;
75ca4a815bSSridevi Ramesh dt << bcd2dec16(year) << "-" << setWidth(month) << "-" << setWidth(day)
76ca4a815bSSridevi Ramesh << " " << setWidth(hours) << ":" << setWidth(minutes) << ":"
77ca4a815bSSridevi Ramesh << setWidth(seconds);
78ca4a815bSSridevi Ramesh data["Response"] = dt.str();
79ca4a815bSSridevi Ramesh pldmtool::helper::DisplayInJson(data);
80f7f5da97SDeepak Kodihalli }
81f7f5da97SDeepak Kodihalli
82f7f5da97SDeepak Kodihalli private:
setWidth(uint8_t data)83ca4a815bSSridevi Ramesh static std::string setWidth(uint8_t data)
84f7f5da97SDeepak Kodihalli {
85ca4a815bSSridevi Ramesh std::stringstream s;
86ca4a815bSSridevi Ramesh s << std::setfill('0') << std::setw(2)
87f7f5da97SDeepak Kodihalli << static_cast<uint32_t>(bcd2dec8(data));
88ca4a815bSSridevi Ramesh return s.str();
89f7f5da97SDeepak Kodihalli }
90f7f5da97SDeepak Kodihalli };
91f7f5da97SDeepak Kodihalli
92f7f5da97SDeepak Kodihalli class SetDateTime : public CommandInterface
93f7f5da97SDeepak Kodihalli {
94f7f5da97SDeepak Kodihalli public:
95f7f5da97SDeepak Kodihalli ~SetDateTime() = default;
96f7f5da97SDeepak Kodihalli SetDateTime() = delete;
97f7f5da97SDeepak Kodihalli SetDateTime(const SetDateTime&) = delete;
98f7f5da97SDeepak Kodihalli SetDateTime(SetDateTime&&) = default;
99f7f5da97SDeepak Kodihalli SetDateTime& operator=(const SetDateTime&) = delete;
100a7dbca53SPavithra Barithaya SetDateTime& operator=(SetDateTime&&) = delete;
101f7f5da97SDeepak Kodihalli
SetDateTime(const char * type,const char * name,CLI::App * app)102f7f5da97SDeepak Kodihalli explicit SetDateTime(const char* type, const char* name, CLI::App* app) :
103f7f5da97SDeepak Kodihalli CommandInterface(type, name, app)
104f7f5da97SDeepak Kodihalli {
105f7f5da97SDeepak Kodihalli app->add_option("-d,--data", tmData,
106f7f5da97SDeepak Kodihalli "set date time data\n"
107f7f5da97SDeepak Kodihalli "eg: YYYYMMDDHHMMSS")
108f7f5da97SDeepak Kodihalli ->required();
109f7f5da97SDeepak Kodihalli }
110f7f5da97SDeepak Kodihalli
createRequestMsg()111f7f5da97SDeepak Kodihalli std::pair<int, std::vector<uint8_t>> createRequestMsg() override
112f7f5da97SDeepak Kodihalli {
11316c2a0a0SPatrick Williams std::vector<uint8_t> requestMsg(
11416c2a0a0SPatrick Williams sizeof(pldm_msg_hdr) + sizeof(struct pldm_set_date_time_req));
115*5c3f0d1bSPavithra Barithaya auto request = new (requestMsg.data()) pldm_msg;
116f7f5da97SDeepak Kodihalli uint16_t year = 0;
117f7f5da97SDeepak Kodihalli uint8_t month = 0;
118f7f5da97SDeepak Kodihalli uint8_t day = 0;
119f7f5da97SDeepak Kodihalli uint8_t hours = 0;
120f7f5da97SDeepak Kodihalli uint8_t minutes = 0;
121f7f5da97SDeepak Kodihalli uint8_t seconds = 0;
122f7f5da97SDeepak Kodihalli
123f7f5da97SDeepak Kodihalli if (!uintToDate(tmData, &year, &month, &day, &hours, &minutes,
124f7f5da97SDeepak Kodihalli &seconds))
125f7f5da97SDeepak Kodihalli {
126f7f5da97SDeepak Kodihalli std::cerr << "decode date Error: "
127f7f5da97SDeepak Kodihalli << "tmData=" << tmData << std::endl;
128f7f5da97SDeepak Kodihalli
129f7f5da97SDeepak Kodihalli return {PLDM_ERROR_INVALID_DATA, requestMsg};
130f7f5da97SDeepak Kodihalli }
131f7f5da97SDeepak Kodihalli
132f7f5da97SDeepak Kodihalli auto rc = encode_set_date_time_req(
133f7f5da97SDeepak Kodihalli instanceId, seconds, minutes, hours, day, month, year, request,
134f7f5da97SDeepak Kodihalli sizeof(struct pldm_set_date_time_req));
135f7f5da97SDeepak Kodihalli
136f7f5da97SDeepak Kodihalli return {rc, requestMsg};
137f7f5da97SDeepak Kodihalli }
138f7f5da97SDeepak Kodihalli
parseResponseMsg(pldm_msg * responsePtr,size_t payloadLength)139f7f5da97SDeepak Kodihalli void parseResponseMsg(pldm_msg* responsePtr, size_t payloadLength) override
140f7f5da97SDeepak Kodihalli {
141f7f5da97SDeepak Kodihalli uint8_t completionCode = 0;
142f7f5da97SDeepak Kodihalli auto rc = decode_set_date_time_resp(responsePtr, payloadLength,
143f7f5da97SDeepak Kodihalli &completionCode);
144f7f5da97SDeepak Kodihalli
145f7f5da97SDeepak Kodihalli if (rc != PLDM_SUCCESS || completionCode != PLDM_SUCCESS)
146f7f5da97SDeepak Kodihalli {
147f7f5da97SDeepak Kodihalli std::cerr << "Response Message Error: "
148f7f5da97SDeepak Kodihalli << "rc=" << rc << ",cc=" << (int)completionCode
149f7f5da97SDeepak Kodihalli << std::endl;
150f7f5da97SDeepak Kodihalli return;
151f7f5da97SDeepak Kodihalli }
152f7f5da97SDeepak Kodihalli
153ca4a815bSSridevi Ramesh ordered_json data;
154ca4a815bSSridevi Ramesh data["Response"] = "SUCCESS";
155ca4a815bSSridevi Ramesh pldmtool::helper::DisplayInJson(data);
156f7f5da97SDeepak Kodihalli }
157f7f5da97SDeepak Kodihalli
158f7f5da97SDeepak Kodihalli private:
159f7f5da97SDeepak Kodihalli uint64_t tmData;
160f7f5da97SDeepak Kodihalli };
161f7f5da97SDeepak Kodihalli
162f7f5da97SDeepak Kodihalli class GetBIOSTableHandler : public CommandInterface
163f7f5da97SDeepak Kodihalli {
164f7f5da97SDeepak Kodihalli public:
165f7f5da97SDeepak Kodihalli ~GetBIOSTableHandler() = default;
166f7f5da97SDeepak Kodihalli GetBIOSTableHandler() = delete;
167f7f5da97SDeepak Kodihalli GetBIOSTableHandler(const GetBIOSTableHandler&) = delete;
168f7f5da97SDeepak Kodihalli GetBIOSTableHandler(GetBIOSTableHandler&&) = delete;
169f7f5da97SDeepak Kodihalli GetBIOSTableHandler& operator=(const GetBIOSTableHandler&) = delete;
170f7f5da97SDeepak Kodihalli GetBIOSTableHandler& operator=(GetBIOSTableHandler&&) = delete;
171f7f5da97SDeepak Kodihalli
172f7f5da97SDeepak Kodihalli using Table = std::vector<uint8_t>;
173f7f5da97SDeepak Kodihalli
174f7f5da97SDeepak Kodihalli using CommandInterface::CommandInterface;
175f7f5da97SDeepak Kodihalli
176f7f5da97SDeepak Kodihalli static inline const std::map<pldm_bios_attribute_type, const char*>
177f7f5da97SDeepak Kodihalli attrTypeMap = {
178f7f5da97SDeepak Kodihalli {PLDM_BIOS_ENUMERATION, "BIOSEnumeration"},
179f7f5da97SDeepak Kodihalli {PLDM_BIOS_ENUMERATION_READ_ONLY, "BIOSEnumerationReadOnly"},
180f7f5da97SDeepak Kodihalli {PLDM_BIOS_STRING, "BIOSString"},
181f7f5da97SDeepak Kodihalli {PLDM_BIOS_STRING_READ_ONLY, "BIOSStringReadOnly"},
182f7f5da97SDeepak Kodihalli {PLDM_BIOS_PASSWORD, "BIOSPassword"},
183f7f5da97SDeepak Kodihalli {PLDM_BIOS_PASSWORD_READ_ONLY, "BIOSPasswordReadOnly"},
184f7f5da97SDeepak Kodihalli {PLDM_BIOS_INTEGER, "BIOSInteger"},
185f7f5da97SDeepak Kodihalli {PLDM_BIOS_INTEGER_READ_ONLY, "BIOSIntegerReadOnly"},
186f7f5da97SDeepak Kodihalli
187f7f5da97SDeepak Kodihalli };
188f7f5da97SDeepak Kodihalli
createRequestMsg()189f7f5da97SDeepak Kodihalli std::pair<int, std::vector<uint8_t>> createRequestMsg() override
190f7f5da97SDeepak Kodihalli {
191f7f5da97SDeepak Kodihalli return {PLDM_ERROR, {}};
192f7f5da97SDeepak Kodihalli }
193f7f5da97SDeepak Kodihalli
parseResponseMsg(pldm_msg *,size_t)1946da4f91bSPatrick Williams void parseResponseMsg(pldm_msg*, size_t) override {}
195f7f5da97SDeepak Kodihalli
getBIOSTable(pldm_bios_table_types tableType)196f7f5da97SDeepak Kodihalli std::optional<Table> getBIOSTable(pldm_bios_table_types tableType)
197f7f5da97SDeepak Kodihalli {
19816c2a0a0SPatrick Williams std::vector<uint8_t> requestMsg(
19916c2a0a0SPatrick Williams sizeof(pldm_msg_hdr) + PLDM_GET_BIOS_TABLE_REQ_BYTES);
200*5c3f0d1bSPavithra Barithaya auto request = new (requestMsg.data()) pldm_msg;
201f7f5da97SDeepak Kodihalli
202f7f5da97SDeepak Kodihalli auto rc = encode_get_bios_table_req(instanceId, 0, PLDM_GET_FIRSTPART,
203f7f5da97SDeepak Kodihalli tableType, request);
204f7f5da97SDeepak Kodihalli if (rc != PLDM_SUCCESS)
205f7f5da97SDeepak Kodihalli {
206f7f5da97SDeepak Kodihalli std::cerr << "Encode GetBIOSTable Error, tableType=," << tableType
207f7f5da97SDeepak Kodihalli << " ,rc=" << rc << std::endl;
208f7f5da97SDeepak Kodihalli return std::nullopt;
209f7f5da97SDeepak Kodihalli }
210f7f5da97SDeepak Kodihalli std::vector<uint8_t> responseMsg;
211f7f5da97SDeepak Kodihalli rc = pldmSendRecv(requestMsg, responseMsg);
212f7f5da97SDeepak Kodihalli if (rc != PLDM_SUCCESS)
213f7f5da97SDeepak Kodihalli {
214f7f5da97SDeepak Kodihalli std::cerr << "PLDM: Communication Error, rc =" << rc << std::endl;
215f7f5da97SDeepak Kodihalli return std::nullopt;
216f7f5da97SDeepak Kodihalli }
217f7f5da97SDeepak Kodihalli
218f7f5da97SDeepak Kodihalli uint8_t cc = 0, transferFlag = 0;
219f7f5da97SDeepak Kodihalli uint32_t nextTransferHandle = 0;
220f7f5da97SDeepak Kodihalli size_t bios_table_offset;
221*5c3f0d1bSPavithra Barithaya auto responsePtr = new (responseMsg.data()) pldm_msg;
222f7f5da97SDeepak Kodihalli auto payloadLength = responseMsg.size() - sizeof(pldm_msg_hdr);
223f7f5da97SDeepak Kodihalli
224f7f5da97SDeepak Kodihalli rc = decode_get_bios_table_resp(responsePtr, payloadLength, &cc,
225f7f5da97SDeepak Kodihalli &nextTransferHandle, &transferFlag,
226f7f5da97SDeepak Kodihalli &bios_table_offset);
227f7f5da97SDeepak Kodihalli
228f7f5da97SDeepak Kodihalli if (rc != PLDM_SUCCESS || cc != PLDM_SUCCESS)
229f7f5da97SDeepak Kodihalli {
230f7f5da97SDeepak Kodihalli std::cerr << "GetBIOSTable Response Error: tableType=" << tableType
231f7f5da97SDeepak Kodihalli << ", rc=" << rc << ", cc=" << (int)cc << std::endl;
232f7f5da97SDeepak Kodihalli return std::nullopt;
233f7f5da97SDeepak Kodihalli }
234f7f5da97SDeepak Kodihalli auto tableData =
235f7f5da97SDeepak Kodihalli reinterpret_cast<char*>((responsePtr->payload) + bios_table_offset);
236f7f5da97SDeepak Kodihalli auto tableSize = payloadLength - sizeof(nextTransferHandle) -
237f7f5da97SDeepak Kodihalli sizeof(transferFlag) - sizeof(cc);
238f7f5da97SDeepak Kodihalli return std::make_optional<Table>(tableData, tableData + tableSize);
239f7f5da97SDeepak Kodihalli }
240f7f5da97SDeepak Kodihalli
findAttrEntryByName(const std::string & name,const Table & attrTable,const Table & stringTable)241366507c8SPatrick Williams const pldm_bios_attr_table_entry* findAttrEntryByName(
242366507c8SPatrick Williams const std::string& name, const Table& attrTable,
243f7f5da97SDeepak Kodihalli const Table& stringTable)
244f7f5da97SDeepak Kodihalli {
245f7f5da97SDeepak Kodihalli auto stringEntry = pldm_bios_table_string_find_by_string(
246f7f5da97SDeepak Kodihalli stringTable.data(), stringTable.size(), name.c_str());
247f7f5da97SDeepak Kodihalli if (stringEntry == nullptr)
248f7f5da97SDeepak Kodihalli {
249f7f5da97SDeepak Kodihalli return nullptr;
250f7f5da97SDeepak Kodihalli }
251f7f5da97SDeepak Kodihalli
252f7f5da97SDeepak Kodihalli auto nameHandle =
253f7f5da97SDeepak Kodihalli pldm_bios_table_string_entry_decode_handle(stringEntry);
254f7f5da97SDeepak Kodihalli
255f7f5da97SDeepak Kodihalli for (auto attr : BIOSTableIter<PLDM_BIOS_ATTR_TABLE>(attrTable.data(),
256f7f5da97SDeepak Kodihalli attrTable.size()))
257f7f5da97SDeepak Kodihalli {
258f7f5da97SDeepak Kodihalli auto attrNameHandle =
259f7f5da97SDeepak Kodihalli pldm_bios_table_attr_entry_decode_string_handle(attr);
260f7f5da97SDeepak Kodihalli if (attrNameHandle == nameHandle)
261f7f5da97SDeepak Kodihalli {
262f7f5da97SDeepak Kodihalli return attr;
263f7f5da97SDeepak Kodihalli }
264f7f5da97SDeepak Kodihalli }
265f7f5da97SDeepak Kodihalli return nullptr;
266f7f5da97SDeepak Kodihalli }
267f7f5da97SDeepak Kodihalli
findAttrHandleByName(const std::string & name,const Table & attrTable,const Table & stringTable)268366507c8SPatrick Williams std::optional<uint16_t> findAttrHandleByName(const std::string& name,
269366507c8SPatrick Williams const Table& attrTable,
270f7f5da97SDeepak Kodihalli const Table& stringTable)
271f7f5da97SDeepak Kodihalli {
272f7f5da97SDeepak Kodihalli auto attribute = findAttrEntryByName(name, attrTable, stringTable);
273f7f5da97SDeepak Kodihalli if (attribute == nullptr)
274f7f5da97SDeepak Kodihalli {
275f7f5da97SDeepak Kodihalli return std::nullopt;
276f7f5da97SDeepak Kodihalli }
277f7f5da97SDeepak Kodihalli
278f7f5da97SDeepak Kodihalli return pldm_bios_table_attr_entry_decode_attribute_handle(attribute);
279f7f5da97SDeepak Kodihalli }
280f7f5da97SDeepak Kodihalli
decodeStringFromStringEntry(const pldm_bios_string_table_entry * stringEntry)281f7f5da97SDeepak Kodihalli std::string decodeStringFromStringEntry(
282f7f5da97SDeepak Kodihalli const pldm_bios_string_table_entry* stringEntry)
283f7f5da97SDeepak Kodihalli {
284f7f5da97SDeepak Kodihalli auto strLength =
285f7f5da97SDeepak Kodihalli pldm_bios_table_string_entry_decode_string_length(stringEntry);
286f7f5da97SDeepak Kodihalli std::vector<char> buffer(strLength + 1 /* sizeof '\0' */);
287488f19d0SAndrew Jeffery // Preconditions are upheld therefore no error check necessary
288fe1189c1SAndrew Jeffery pldm_bios_table_string_entry_decode_string(stringEntry, buffer.data(),
289fe1189c1SAndrew Jeffery buffer.size());
290f7f5da97SDeepak Kodihalli
291f7f5da97SDeepak Kodihalli return std::string(buffer.data(), buffer.data() + strLength);
292f7f5da97SDeepak Kodihalli }
293f7f5da97SDeepak Kodihalli
displayStringHandle(uint16_t handle,const std::optional<Table> & stringTable,bool displayHandle=true)294f7f5da97SDeepak Kodihalli std::string displayStringHandle(uint16_t handle,
295f7f5da97SDeepak Kodihalli const std::optional<Table>& stringTable,
296f7f5da97SDeepak Kodihalli bool displayHandle = true)
297f7f5da97SDeepak Kodihalli {
298f7f5da97SDeepak Kodihalli std::string displayString = std::to_string(handle);
299f7f5da97SDeepak Kodihalli if (!stringTable)
300f7f5da97SDeepak Kodihalli {
301f7f5da97SDeepak Kodihalli return displayString;
302f7f5da97SDeepak Kodihalli }
303f7f5da97SDeepak Kodihalli auto stringEntry = pldm_bios_table_string_find_by_handle(
304f7f5da97SDeepak Kodihalli stringTable->data(), stringTable->size(), handle);
305f7f5da97SDeepak Kodihalli if (stringEntry == nullptr)
306f7f5da97SDeepak Kodihalli {
307f7f5da97SDeepak Kodihalli return displayString;
308f7f5da97SDeepak Kodihalli }
309f7f5da97SDeepak Kodihalli
310f7f5da97SDeepak Kodihalli auto decodedStr = decodeStringFromStringEntry(stringEntry);
311f7f5da97SDeepak Kodihalli if (!displayHandle)
312f7f5da97SDeepak Kodihalli {
313f7f5da97SDeepak Kodihalli return decodedStr;
314f7f5da97SDeepak Kodihalli }
315f7f5da97SDeepak Kodihalli
316f7f5da97SDeepak Kodihalli return displayString + "(" + decodedStr + ")";
317f7f5da97SDeepak Kodihalli }
318f7f5da97SDeepak Kodihalli
displayEnumValueByIndex(uint16_t attrHandle,uint8_t index,const std::optional<Table> & attrTable,const std::optional<Table> & stringTable)319f7f5da97SDeepak Kodihalli std::string displayEnumValueByIndex(uint16_t attrHandle, uint8_t index,
320f7f5da97SDeepak Kodihalli const std::optional<Table>& attrTable,
321f7f5da97SDeepak Kodihalli const std::optional<Table>& stringTable)
322f7f5da97SDeepak Kodihalli {
323f7f5da97SDeepak Kodihalli std::string displayString;
324f7f5da97SDeepak Kodihalli if (!attrTable)
325f7f5da97SDeepak Kodihalli {
326f7f5da97SDeepak Kodihalli return displayString;
327f7f5da97SDeepak Kodihalli }
328f7f5da97SDeepak Kodihalli
329f7f5da97SDeepak Kodihalli auto attrEntry = pldm_bios_table_attr_find_by_handle(
330f7f5da97SDeepak Kodihalli attrTable->data(), attrTable->size(), attrHandle);
331f7f5da97SDeepak Kodihalli if (attrEntry == nullptr)
332f7f5da97SDeepak Kodihalli {
333f7f5da97SDeepak Kodihalli return displayString;
334f7f5da97SDeepak Kodihalli }
335488f19d0SAndrew Jeffery uint8_t pvNum;
33616c2a0a0SPatrick Williams int rc =
33716c2a0a0SPatrick Williams pldm_bios_table_attr_entry_enum_decode_pv_num(attrEntry, &pvNum);
338488f19d0SAndrew Jeffery if (rc != PLDM_SUCCESS)
339488f19d0SAndrew Jeffery {
340488f19d0SAndrew Jeffery return displayString;
341488f19d0SAndrew Jeffery }
342f7f5da97SDeepak Kodihalli std::vector<uint16_t> pvHandls(pvNum);
343488f19d0SAndrew Jeffery // Preconditions are upheld therefore no error check necessary
3442461105eSAndrew Jeffery pldm_bios_table_attr_entry_enum_decode_pv_hdls(
345f7f5da97SDeepak Kodihalli attrEntry, pvHandls.data(), pvHandls.size());
346f7f5da97SDeepak Kodihalli return displayStringHandle(pvHandls[index], stringTable, false);
347f7f5da97SDeepak Kodihalli }
348f7f5da97SDeepak Kodihalli
displayAttributeValueEntry(const pldm_bios_attr_val_table_entry * tableEntry,const std::optional<Table> & attrTable,const std::optional<Table> & stringTable,bool verbose,ordered_json & output)349f7f5da97SDeepak Kodihalli void displayAttributeValueEntry(
350f7f5da97SDeepak Kodihalli const pldm_bios_attr_val_table_entry* tableEntry,
351f7f5da97SDeepak Kodihalli const std::optional<Table>& attrTable,
352ca4a815bSSridevi Ramesh const std::optional<Table>& stringTable, bool verbose,
353ca4a815bSSridevi Ramesh ordered_json& output)
354f7f5da97SDeepak Kodihalli {
355f7f5da97SDeepak Kodihalli auto attrHandle =
356f7f5da97SDeepak Kodihalli pldm_bios_table_attr_value_entry_decode_attribute_handle(
357f7f5da97SDeepak Kodihalli tableEntry);
358f7f5da97SDeepak Kodihalli auto attrType = static_cast<pldm_bios_attribute_type>(
359f7f5da97SDeepak Kodihalli pldm_bios_table_attr_value_entry_decode_attribute_type(tableEntry));
360ca4a815bSSridevi Ramesh
361f7f5da97SDeepak Kodihalli if (verbose)
362f7f5da97SDeepak Kodihalli {
363ca4a815bSSridevi Ramesh output["AttributeHandle"] = attrHandle;
364bd5e2eaaSGeorge Liu if (attrTypeMap.contains(attrType))
365bd5e2eaaSGeorge Liu {
366ca4a815bSSridevi Ramesh output["AttributeType"] = attrTypeMap.at(attrType);
367f7f5da97SDeepak Kodihalli }
368bd5e2eaaSGeorge Liu else
369bd5e2eaaSGeorge Liu {
370bd5e2eaaSGeorge Liu std::cout << "Get AttributeType failed.\n";
371bd5e2eaaSGeorge Liu }
372bd5e2eaaSGeorge Liu }
373f7f5da97SDeepak Kodihalli switch (attrType)
374f7f5da97SDeepak Kodihalli {
375f7f5da97SDeepak Kodihalli case PLDM_BIOS_ENUMERATION:
376f7f5da97SDeepak Kodihalli case PLDM_BIOS_ENUMERATION_READ_ONLY:
377f7f5da97SDeepak Kodihalli {
378f7f5da97SDeepak Kodihalli auto count =
379f7f5da97SDeepak Kodihalli pldm_bios_table_attr_value_entry_enum_decode_number(
380f7f5da97SDeepak Kodihalli tableEntry);
381f7f5da97SDeepak Kodihalli std::vector<uint8_t> handles(count);
382f7f5da97SDeepak Kodihalli pldm_bios_table_attr_value_entry_enum_decode_handles(
383f7f5da97SDeepak Kodihalli tableEntry, handles.data(), handles.size());
384f7f5da97SDeepak Kodihalli if (verbose)
385f7f5da97SDeepak Kodihalli {
386ca4a815bSSridevi Ramesh output["NumberOfCurrentValues"] = (int)count;
387f7f5da97SDeepak Kodihalli }
388f7f5da97SDeepak Kodihalli for (size_t i = 0; i < handles.size(); i++)
389f7f5da97SDeepak Kodihalli {
390f7f5da97SDeepak Kodihalli if (verbose)
391f7f5da97SDeepak Kodihalli {
392ca4a815bSSridevi Ramesh output["CurrentValueStringHandleIndex[" +
393ca4a815bSSridevi Ramesh std::to_string(i) + "]"] =
394ca4a815bSSridevi Ramesh displayEnumValueByIndex(attrHandle, handles[i],
395ca4a815bSSridevi Ramesh attrTable, stringTable);
396f7f5da97SDeepak Kodihalli }
397f7f5da97SDeepak Kodihalli else
398f7f5da97SDeepak Kodihalli {
399ca4a815bSSridevi Ramesh output["CurrentValue"] = displayEnumValueByIndex(
400ca4a815bSSridevi Ramesh attrHandle, handles[i], attrTable, stringTable);
401f7f5da97SDeepak Kodihalli }
402f7f5da97SDeepak Kodihalli }
403f7f5da97SDeepak Kodihalli break;
404f7f5da97SDeepak Kodihalli }
405f7f5da97SDeepak Kodihalli case PLDM_BIOS_INTEGER:
406f7f5da97SDeepak Kodihalli case PLDM_BIOS_INTEGER_READ_ONLY:
407f7f5da97SDeepak Kodihalli {
408f7f5da97SDeepak Kodihalli auto cv = pldm_bios_table_attr_value_entry_integer_decode_cv(
409f7f5da97SDeepak Kodihalli tableEntry);
410ca4a815bSSridevi Ramesh output["CurrentValue"] = cv;
411f7f5da97SDeepak Kodihalli break;
412f7f5da97SDeepak Kodihalli }
413f7f5da97SDeepak Kodihalli case PLDM_BIOS_STRING:
414f7f5da97SDeepak Kodihalli case PLDM_BIOS_STRING_READ_ONLY:
415f7f5da97SDeepak Kodihalli {
416f7f5da97SDeepak Kodihalli variable_field currentString;
417f7f5da97SDeepak Kodihalli pldm_bios_table_attr_value_entry_string_decode_string(
418f7f5da97SDeepak Kodihalli tableEntry, ¤tString);
419f7f5da97SDeepak Kodihalli if (verbose)
420f7f5da97SDeepak Kodihalli {
421ca4a815bSSridevi Ramesh output["CurrentStringLength"] = currentString.length;
422ca4a815bSSridevi Ramesh output["CurrentString"] = std::string(
423f7f5da97SDeepak Kodihalli reinterpret_cast<const char*>(currentString.ptr),
424ca4a815bSSridevi Ramesh currentString.length);
425f7f5da97SDeepak Kodihalli }
426f7f5da97SDeepak Kodihalli else
427f7f5da97SDeepak Kodihalli {
428ca4a815bSSridevi Ramesh output["CurrentValue"] = std::string(
429ca4a815bSSridevi Ramesh reinterpret_cast<const char*>(currentString.ptr),
430ca4a815bSSridevi Ramesh currentString.length);
431f7f5da97SDeepak Kodihalli }
432f7f5da97SDeepak Kodihalli
433f7f5da97SDeepak Kodihalli break;
434f7f5da97SDeepak Kodihalli }
435f7f5da97SDeepak Kodihalli case PLDM_BIOS_PASSWORD:
436f7f5da97SDeepak Kodihalli case PLDM_BIOS_PASSWORD_READ_ONLY:
437f7f5da97SDeepak Kodihalli {
438f7f5da97SDeepak Kodihalli std::cout << "Password attribute: Not Supported" << std::endl;
439f7f5da97SDeepak Kodihalli break;
440f7f5da97SDeepak Kodihalli }
441f7f5da97SDeepak Kodihalli }
442f7f5da97SDeepak Kodihalli }
443f7f5da97SDeepak Kodihalli };
444f7f5da97SDeepak Kodihalli
445f7f5da97SDeepak Kodihalli class GetBIOSTable : public GetBIOSTableHandler
446f7f5da97SDeepak Kodihalli {
447f7f5da97SDeepak Kodihalli public:
448f7f5da97SDeepak Kodihalli ~GetBIOSTable() = default;
449f7f5da97SDeepak Kodihalli GetBIOSTable() = delete;
450f7f5da97SDeepak Kodihalli GetBIOSTable(const GetBIOSTable&) = delete;
451a7dbca53SPavithra Barithaya GetBIOSTable(GetBIOSTable&&) = delete;
452f7f5da97SDeepak Kodihalli GetBIOSTable& operator=(const GetBIOSTable&) = delete;
453a7dbca53SPavithra Barithaya GetBIOSTable& operator=(GetBIOSTable&&) = delete;
454f7f5da97SDeepak Kodihalli
455f7f5da97SDeepak Kodihalli using Table = std::vector<uint8_t>;
456f7f5da97SDeepak Kodihalli
GetBIOSTable(const char * type,const char * name,CLI::App * app)457f7f5da97SDeepak Kodihalli explicit GetBIOSTable(const char* type, const char* name, CLI::App* app) :
458f7f5da97SDeepak Kodihalli GetBIOSTableHandler(type, name, app)
459f7f5da97SDeepak Kodihalli {
460f7f5da97SDeepak Kodihalli app->add_option("-t,--type", pldmBIOSTableType, "pldm bios table type")
461f7f5da97SDeepak Kodihalli ->required()
462f7f5da97SDeepak Kodihalli ->transform(
463f7f5da97SDeepak Kodihalli CLI::CheckedTransformer(pldmBIOSTableTypes, CLI::ignore_case));
464f7f5da97SDeepak Kodihalli }
465f7f5da97SDeepak Kodihalli
exec()466f7f5da97SDeepak Kodihalli void exec() override
467f7f5da97SDeepak Kodihalli {
468f7f5da97SDeepak Kodihalli switch (pldmBIOSTableType)
469f7f5da97SDeepak Kodihalli {
470f7f5da97SDeepak Kodihalli case PLDM_BIOS_STRING_TABLE:
471f7f5da97SDeepak Kodihalli {
472f7f5da97SDeepak Kodihalli auto stringTable = getBIOSTable(PLDM_BIOS_STRING_TABLE);
473f7f5da97SDeepak Kodihalli decodeStringTable(stringTable);
474f7f5da97SDeepak Kodihalli break;
475f7f5da97SDeepak Kodihalli }
476f7f5da97SDeepak Kodihalli case PLDM_BIOS_ATTR_TABLE:
477f7f5da97SDeepak Kodihalli {
478f7f5da97SDeepak Kodihalli auto stringTable = getBIOSTable(PLDM_BIOS_STRING_TABLE);
479f7f5da97SDeepak Kodihalli auto attrTable = getBIOSTable(PLDM_BIOS_ATTR_TABLE);
480f7f5da97SDeepak Kodihalli
481f7f5da97SDeepak Kodihalli decodeAttributeTable(attrTable, stringTable);
482f7f5da97SDeepak Kodihalli break;
483f7f5da97SDeepak Kodihalli }
484f7f5da97SDeepak Kodihalli case PLDM_BIOS_ATTR_VAL_TABLE:
485f7f5da97SDeepak Kodihalli {
486f7f5da97SDeepak Kodihalli auto stringTable = getBIOSTable(PLDM_BIOS_STRING_TABLE);
487f7f5da97SDeepak Kodihalli auto attrTable = getBIOSTable(PLDM_BIOS_ATTR_TABLE);
488f7f5da97SDeepak Kodihalli auto attrValTable = getBIOSTable(PLDM_BIOS_ATTR_VAL_TABLE);
489f7f5da97SDeepak Kodihalli
490f7f5da97SDeepak Kodihalli decodeAttributeValueTable(attrValTable, attrTable, stringTable);
491f7f5da97SDeepak Kodihalli break;
492f7f5da97SDeepak Kodihalli }
493f7f5da97SDeepak Kodihalli }
494f7f5da97SDeepak Kodihalli }
495f7f5da97SDeepak Kodihalli
496f7f5da97SDeepak Kodihalli private:
497f7f5da97SDeepak Kodihalli pldm_bios_table_types pldmBIOSTableType;
498f7f5da97SDeepak Kodihalli
decodeStringTable(const std::optional<Table> & stringTable)499f7f5da97SDeepak Kodihalli void decodeStringTable(const std::optional<Table>& stringTable)
500f7f5da97SDeepak Kodihalli {
501f7f5da97SDeepak Kodihalli if (!stringTable)
502f7f5da97SDeepak Kodihalli {
503f7f5da97SDeepak Kodihalli std::cerr << "GetBIOSStringTable Error" << std::endl;
504f7f5da97SDeepak Kodihalli return;
505f7f5da97SDeepak Kodihalli }
506ca4a815bSSridevi Ramesh ordered_json stringdata;
507f7f5da97SDeepak Kodihalli
508f7f5da97SDeepak Kodihalli for (auto tableEntry : BIOSTableIter<PLDM_BIOS_STRING_TABLE>(
509f7f5da97SDeepak Kodihalli stringTable->data(), stringTable->size()))
510f7f5da97SDeepak Kodihalli {
511f7f5da97SDeepak Kodihalli auto strHandle =
512f7f5da97SDeepak Kodihalli pldm_bios_table_string_entry_decode_handle(tableEntry);
513f7f5da97SDeepak Kodihalli auto strTableData = decodeStringFromStringEntry(tableEntry);
514ca4a815bSSridevi Ramesh stringdata[std::to_string(strHandle)] = strTableData;
515f7f5da97SDeepak Kodihalli }
516ca4a815bSSridevi Ramesh pldmtool::helper::DisplayInJson(stringdata);
517f7f5da97SDeepak Kodihalli }
decodeAttributeTable(const std::optional<Table> & attrTable,const std::optional<Table> & stringTable)518f7f5da97SDeepak Kodihalli void decodeAttributeTable(const std::optional<Table>& attrTable,
519f7f5da97SDeepak Kodihalli const std::optional<Table>& stringTable)
520f7f5da97SDeepak Kodihalli {
521f7f5da97SDeepak Kodihalli if (!stringTable)
522f7f5da97SDeepak Kodihalli {
523f7f5da97SDeepak Kodihalli std::cerr << "GetBIOSAttributeTable Error" << std::endl;
524f7f5da97SDeepak Kodihalli return;
525f7f5da97SDeepak Kodihalli }
526ca4a815bSSridevi Ramesh ordered_json output;
527ca4a815bSSridevi Ramesh
528f7f5da97SDeepak Kodihalli for (auto entry : BIOSTableIter<PLDM_BIOS_ATTR_TABLE>(
529f7f5da97SDeepak Kodihalli attrTable->data(), attrTable->size()))
530f7f5da97SDeepak Kodihalli {
531ca4a815bSSridevi Ramesh ordered_json attrdata;
532ca4a815bSSridevi Ramesh
533f7f5da97SDeepak Kodihalli auto attrHandle =
534f7f5da97SDeepak Kodihalli pldm_bios_table_attr_entry_decode_attribute_handle(entry);
535f7f5da97SDeepak Kodihalli auto attrNameHandle =
536f7f5da97SDeepak Kodihalli pldm_bios_table_attr_entry_decode_string_handle(entry);
537f7f5da97SDeepak Kodihalli auto attrType = static_cast<pldm_bios_attribute_type>(
538f7f5da97SDeepak Kodihalli pldm_bios_table_attr_entry_decode_attribute_type(entry));
539ca4a815bSSridevi Ramesh
540ca4a815bSSridevi Ramesh attrdata["AttributeHandle"] = attrHandle;
541ca4a815bSSridevi Ramesh attrdata["AttributeNameHandle"] =
542ca4a815bSSridevi Ramesh displayStringHandle(attrNameHandle, stringTable);
543bd5e2eaaSGeorge Liu if (attrTypeMap.contains(attrType))
544bd5e2eaaSGeorge Liu {
545ca4a815bSSridevi Ramesh attrdata["AttributeType"] = attrTypeMap.at(attrType);
546bd5e2eaaSGeorge Liu }
547bd5e2eaaSGeorge Liu else
548bd5e2eaaSGeorge Liu {
549bd5e2eaaSGeorge Liu std::cout << "Get AttributeType failed.\n";
550bd5e2eaaSGeorge Liu }
551ca4a815bSSridevi Ramesh
552f7f5da97SDeepak Kodihalli switch (attrType)
553f7f5da97SDeepak Kodihalli {
554f7f5da97SDeepak Kodihalli case PLDM_BIOS_ENUMERATION:
555f7f5da97SDeepak Kodihalli case PLDM_BIOS_ENUMERATION_READ_ONLY:
556f7f5da97SDeepak Kodihalli {
557488f19d0SAndrew Jeffery uint8_t pvNum;
558488f19d0SAndrew Jeffery // Preconditions are upheld therefore no error check
559488f19d0SAndrew Jeffery // necessary
5608c05ca20SAndrew Jeffery pldm_bios_table_attr_entry_enum_decode_pv_num(entry,
561488f19d0SAndrew Jeffery &pvNum);
562f7f5da97SDeepak Kodihalli std::vector<uint16_t> pvHandls(pvNum);
563488f19d0SAndrew Jeffery // Preconditions are upheld therefore no error check
564488f19d0SAndrew Jeffery // necessary
5652461105eSAndrew Jeffery pldm_bios_table_attr_entry_enum_decode_pv_hdls(
566f7f5da97SDeepak Kodihalli entry, pvHandls.data(), pvHandls.size());
567488f19d0SAndrew Jeffery uint8_t defNum;
568488f19d0SAndrew Jeffery // Preconditions are upheld therefore no error check
569488f19d0SAndrew Jeffery // necessary
570ff3fb9ecSAndrew Jeffery pldm_bios_table_attr_entry_enum_decode_def_num(entry,
571ff3fb9ecSAndrew Jeffery &defNum);
572f7f5da97SDeepak Kodihalli std::vector<uint8_t> defIndices(defNum);
573f7f5da97SDeepak Kodihalli pldm_bios_table_attr_entry_enum_decode_def_indices(
574f7f5da97SDeepak Kodihalli entry, defIndices.data(), defIndices.size());
575ca4a815bSSridevi Ramesh
576ca4a815bSSridevi Ramesh attrdata["NumberOfPossibleValues"] = (int)pvNum;
577f7f5da97SDeepak Kodihalli
578f7f5da97SDeepak Kodihalli for (size_t i = 0; i < pvHandls.size(); i++)
579f7f5da97SDeepak Kodihalli {
580ca4a815bSSridevi Ramesh attrdata["PossibleValueStringHandle[" +
581ca4a815bSSridevi Ramesh std::to_string(i) + "]"] =
582ca4a815bSSridevi Ramesh displayStringHandle(pvHandls[i], stringTable);
583f7f5da97SDeepak Kodihalli }
584ca4a815bSSridevi Ramesh attrdata["NumberOfDefaultValues"] = (int)defNum;
585f7f5da97SDeepak Kodihalli for (size_t i = 0; i < defIndices.size(); i++)
586f7f5da97SDeepak Kodihalli {
587ca4a815bSSridevi Ramesh attrdata["DefaultValueStringHandleIndex[" +
588ca4a815bSSridevi Ramesh std::to_string(i) + "]"] = (int)defIndices[i];
589a6daacb5SGeorge Liu attrdata["DefaultValueStringHandle"] =
590a6daacb5SGeorge Liu displayStringHandle(pvHandls[defIndices[i]],
591a6daacb5SGeorge Liu stringTable);
592f7f5da97SDeepak Kodihalli }
593f7f5da97SDeepak Kodihalli break;
594f7f5da97SDeepak Kodihalli }
595f7f5da97SDeepak Kodihalli case PLDM_BIOS_INTEGER:
596f7f5da97SDeepak Kodihalli case PLDM_BIOS_INTEGER_READ_ONLY:
597f7f5da97SDeepak Kodihalli {
598f7f5da97SDeepak Kodihalli uint64_t lower, upper, def;
599f7f5da97SDeepak Kodihalli uint32_t scalar;
600f7f5da97SDeepak Kodihalli pldm_bios_table_attr_entry_integer_decode(
601f7f5da97SDeepak Kodihalli entry, &lower, &upper, &scalar, &def);
602ca4a815bSSridevi Ramesh attrdata["LowerBound"] = lower;
603ca4a815bSSridevi Ramesh attrdata["UpperBound"] = upper;
604ca4a815bSSridevi Ramesh attrdata["ScalarIncrement"] = scalar;
605ca4a815bSSridevi Ramesh attrdata["DefaultValue"] = def;
606f7f5da97SDeepak Kodihalli break;
607f7f5da97SDeepak Kodihalli }
608f7f5da97SDeepak Kodihalli case PLDM_BIOS_STRING:
609f7f5da97SDeepak Kodihalli case PLDM_BIOS_STRING_READ_ONLY:
610f7f5da97SDeepak Kodihalli {
611f7f5da97SDeepak Kodihalli auto strType =
612f7f5da97SDeepak Kodihalli pldm_bios_table_attr_entry_string_decode_string_type(
613f7f5da97SDeepak Kodihalli entry);
614f7f5da97SDeepak Kodihalli auto min =
615f7f5da97SDeepak Kodihalli pldm_bios_table_attr_entry_string_decode_min_length(
616f7f5da97SDeepak Kodihalli entry);
617f7f5da97SDeepak Kodihalli auto max =
618f7f5da97SDeepak Kodihalli pldm_bios_table_attr_entry_string_decode_max_length(
619f7f5da97SDeepak Kodihalli entry);
620488f19d0SAndrew Jeffery uint16_t def;
621488f19d0SAndrew Jeffery // Preconditions are upheld therefore no error check
622488f19d0SAndrew Jeffery // necessary
62353e342a2SAndrew Jeffery pldm_bios_table_attr_entry_string_decode_def_string_length(
624488f19d0SAndrew Jeffery entry, &def);
625f7f5da97SDeepak Kodihalli std::vector<char> defString(def + 1);
626f7f5da97SDeepak Kodihalli pldm_bios_table_attr_entry_string_decode_def_string(
627f7f5da97SDeepak Kodihalli entry, defString.data(), defString.size());
628ca4a815bSSridevi Ramesh
629ca4a815bSSridevi Ramesh std::stringstream stringtype;
63016c2a0a0SPatrick Williams stringtype
63116c2a0a0SPatrick Williams << "0x" << std::hex << std::setw(2) << std::setfill('0')
63216c2a0a0SPatrick Williams << (int)strType << std::dec << std::setw(0);
633ca4a815bSSridevi Ramesh attrdata["StringType"] = stringtype.str();
634ca4a815bSSridevi Ramesh attrdata["MinimumStringLength"] = (int)min;
635ca4a815bSSridevi Ramesh attrdata["MaximumStringLength"] = (int)max;
636ca4a815bSSridevi Ramesh attrdata["DefaultStringLength"] = (int)def;
637ca4a815bSSridevi Ramesh attrdata["DefaultString"] = defString.data();
638f7f5da97SDeepak Kodihalli break;
639f7f5da97SDeepak Kodihalli }
640f7f5da97SDeepak Kodihalli case PLDM_BIOS_PASSWORD:
641f7f5da97SDeepak Kodihalli case PLDM_BIOS_PASSWORD_READ_ONLY:
64216c2a0a0SPatrick Williams std::cout
64316c2a0a0SPatrick Williams << "Password attribute: Not Supported" << std::endl;
644f7f5da97SDeepak Kodihalli }
645ca4a815bSSridevi Ramesh output.emplace_back(std::move(attrdata));
646f7f5da97SDeepak Kodihalli }
647ca4a815bSSridevi Ramesh pldmtool::helper::DisplayInJson(output);
648f7f5da97SDeepak Kodihalli }
decodeAttributeValueTable(const std::optional<Table> & attrValTable,const std::optional<Table> & attrTable,const std::optional<Table> & stringTable)649f7f5da97SDeepak Kodihalli void decodeAttributeValueTable(const std::optional<Table>& attrValTable,
650f7f5da97SDeepak Kodihalli const std::optional<Table>& attrTable,
651f7f5da97SDeepak Kodihalli const std::optional<Table>& stringTable)
652f7f5da97SDeepak Kodihalli {
653f7f5da97SDeepak Kodihalli if (!attrValTable)
654f7f5da97SDeepak Kodihalli {
655f7f5da97SDeepak Kodihalli std::cerr << "GetBIOSAttributeValueTable Error" << std::endl;
656f7f5da97SDeepak Kodihalli return;
657f7f5da97SDeepak Kodihalli }
658ca4a815bSSridevi Ramesh ordered_json output;
659f7f5da97SDeepak Kodihalli for (auto tableEntry : BIOSTableIter<PLDM_BIOS_ATTR_VAL_TABLE>(
660f7f5da97SDeepak Kodihalli attrValTable->data(), attrValTable->size()))
661f7f5da97SDeepak Kodihalli {
662ca4a815bSSridevi Ramesh ordered_json attrValueData;
663ca4a815bSSridevi Ramesh displayAttributeValueEntry(tableEntry, attrTable, stringTable, true,
664ca4a815bSSridevi Ramesh attrValueData);
665ca4a815bSSridevi Ramesh output.emplace_back(attrValueData);
666f7f5da97SDeepak Kodihalli }
667ca4a815bSSridevi Ramesh pldmtool::helper::DisplayInJson(output);
668f7f5da97SDeepak Kodihalli }
669f7f5da97SDeepak Kodihalli };
670f7f5da97SDeepak Kodihalli
671f7f5da97SDeepak Kodihalli class GetBIOSAttributeCurrentValueByHandle : public GetBIOSTableHandler
672f7f5da97SDeepak Kodihalli {
673f7f5da97SDeepak Kodihalli public:
674f7f5da97SDeepak Kodihalli ~GetBIOSAttributeCurrentValueByHandle() = default;
675f7f5da97SDeepak Kodihalli GetBIOSAttributeCurrentValueByHandle(
676f7f5da97SDeepak Kodihalli const GetBIOSAttributeCurrentValueByHandle&) = delete;
677f7f5da97SDeepak Kodihalli GetBIOSAttributeCurrentValueByHandle(
678f7f5da97SDeepak Kodihalli GetBIOSAttributeCurrentValueByHandle&&) = delete;
679366507c8SPatrick Williams GetBIOSAttributeCurrentValueByHandle& operator=(
680366507c8SPatrick Williams const GetBIOSAttributeCurrentValueByHandle&) = delete;
681366507c8SPatrick Williams GetBIOSAttributeCurrentValueByHandle& operator=(
682366507c8SPatrick Williams GetBIOSAttributeCurrentValueByHandle&&) = delete;
683f7f5da97SDeepak Kodihalli
GetBIOSAttributeCurrentValueByHandle(const char * type,const char * name,CLI::App * app)68416c2a0a0SPatrick Williams explicit GetBIOSAttributeCurrentValueByHandle(
68516c2a0a0SPatrick Williams const char* type, const char* name, CLI::App* app) :
686f7f5da97SDeepak Kodihalli GetBIOSTableHandler(type, name, app)
687f7f5da97SDeepak Kodihalli {
688ca4a815bSSridevi Ramesh app->add_option("-a, --attribute", attrName, "pldm BIOS attribute name")
689f7f5da97SDeepak Kodihalli ->required();
690f7f5da97SDeepak Kodihalli }
691f7f5da97SDeepak Kodihalli
exec()692f7f5da97SDeepak Kodihalli void exec()
693f7f5da97SDeepak Kodihalli {
694f7f5da97SDeepak Kodihalli auto stringTable = getBIOSTable(PLDM_BIOS_STRING_TABLE);
695f7f5da97SDeepak Kodihalli auto attrTable = getBIOSTable(PLDM_BIOS_ATTR_TABLE);
696f7f5da97SDeepak Kodihalli
697f7f5da97SDeepak Kodihalli if (!stringTable || !attrTable)
698f7f5da97SDeepak Kodihalli {
6992576aecdSManojkiran Eda std::cout << "StringTable/AttrTable Unavailable" << std::endl;
700f7f5da97SDeepak Kodihalli return;
701f7f5da97SDeepak Kodihalli }
702f7f5da97SDeepak Kodihalli
703f7f5da97SDeepak Kodihalli auto handle = findAttrHandleByName(attrName, *attrTable, *stringTable);
704f7f5da97SDeepak Kodihalli if (!handle)
705f7f5da97SDeepak Kodihalli {
706f7f5da97SDeepak Kodihalli std::cerr << "Can not find the attribute " << attrName << std::endl;
707f7f5da97SDeepak Kodihalli return;
708f7f5da97SDeepak Kodihalli }
709f7f5da97SDeepak Kodihalli
710f7f5da97SDeepak Kodihalli std::vector<uint8_t> requestMsg(
711f7f5da97SDeepak Kodihalli sizeof(pldm_msg_hdr) +
712f7f5da97SDeepak Kodihalli PLDM_GET_BIOS_ATTR_CURR_VAL_BY_HANDLE_REQ_BYTES);
713*5c3f0d1bSPavithra Barithaya auto request = new (requestMsg.data()) pldm_msg;
714f7f5da97SDeepak Kodihalli
715f7f5da97SDeepak Kodihalli auto rc = encode_get_bios_attribute_current_value_by_handle_req(
716f7f5da97SDeepak Kodihalli instanceId, 0, PLDM_GET_FIRSTPART, *handle, request);
717f7f5da97SDeepak Kodihalli if (rc != PLDM_SUCCESS)
718f7f5da97SDeepak Kodihalli {
719f7f5da97SDeepak Kodihalli std::cerr << "PLDM: Request Message Error, rc =" << rc << std::endl;
720f7f5da97SDeepak Kodihalli return;
721f7f5da97SDeepak Kodihalli }
722f7f5da97SDeepak Kodihalli
723f7f5da97SDeepak Kodihalli std::vector<uint8_t> responseMsg;
724f7f5da97SDeepak Kodihalli rc = pldmSendRecv(requestMsg, responseMsg);
725f7f5da97SDeepak Kodihalli if (rc != PLDM_SUCCESS)
726f7f5da97SDeepak Kodihalli {
727f7f5da97SDeepak Kodihalli std::cerr << "PLDM: Communication Error, rc =" << rc << std::endl;
728f7f5da97SDeepak Kodihalli return;
729f7f5da97SDeepak Kodihalli }
730f7f5da97SDeepak Kodihalli
731f7f5da97SDeepak Kodihalli uint8_t cc = 0, transferFlag = 0;
732f7f5da97SDeepak Kodihalli uint32_t nextTransferHandle = 0;
733f7f5da97SDeepak Kodihalli struct variable_field attributeData;
734*5c3f0d1bSPavithra Barithaya auto responsePtr = new (responseMsg.data()) pldm_msg;
735f7f5da97SDeepak Kodihalli auto payloadLength = responseMsg.size() - sizeof(pldm_msg_hdr);
736f7f5da97SDeepak Kodihalli
737f7f5da97SDeepak Kodihalli rc = decode_get_bios_attribute_current_value_by_handle_resp(
738f7f5da97SDeepak Kodihalli responsePtr, payloadLength, &cc, &nextTransferHandle, &transferFlag,
739f7f5da97SDeepak Kodihalli &attributeData);
740f7f5da97SDeepak Kodihalli if (rc != PLDM_SUCCESS || cc != PLDM_SUCCESS)
741f7f5da97SDeepak Kodihalli {
742f7f5da97SDeepak Kodihalli std::cerr << "Response Message Error: "
743f7f5da97SDeepak Kodihalli << "rc=" << rc << ",cc=" << (int)cc << std::endl;
744f7f5da97SDeepak Kodihalli return;
745f7f5da97SDeepak Kodihalli }
746f7f5da97SDeepak Kodihalli
747f7f5da97SDeepak Kodihalli auto tableEntry =
748f7f5da97SDeepak Kodihalli reinterpret_cast<const struct pldm_bios_attr_val_table_entry*>(
749f7f5da97SDeepak Kodihalli attributeData.ptr);
750f7f5da97SDeepak Kodihalli
751ca4a815bSSridevi Ramesh ordered_json avdata;
752ca4a815bSSridevi Ramesh displayAttributeValueEntry(tableEntry, attrTable, stringTable, false,
753ca4a815bSSridevi Ramesh avdata);
754ca4a815bSSridevi Ramesh pldmtool::helper::DisplayInJson(avdata);
755f7f5da97SDeepak Kodihalli }
756f7f5da97SDeepak Kodihalli
757f7f5da97SDeepak Kodihalli private:
758f7f5da97SDeepak Kodihalli std::string attrName;
759f7f5da97SDeepak Kodihalli };
760f7f5da97SDeepak Kodihalli
761f7f5da97SDeepak Kodihalli class SetBIOSAttributeCurrentValue : public GetBIOSTableHandler
762f7f5da97SDeepak Kodihalli {
763f7f5da97SDeepak Kodihalli public:
764f7f5da97SDeepak Kodihalli ~SetBIOSAttributeCurrentValue() = default;
765f7f5da97SDeepak Kodihalli SetBIOSAttributeCurrentValue() = delete;
766f7f5da97SDeepak Kodihalli SetBIOSAttributeCurrentValue(const SetBIOSAttributeCurrentValue&) = delete;
767a7dbca53SPavithra Barithaya SetBIOSAttributeCurrentValue(SetBIOSAttributeCurrentValue&&) = delete;
768366507c8SPatrick Williams SetBIOSAttributeCurrentValue& operator=(
769366507c8SPatrick Williams const SetBIOSAttributeCurrentValue&) = delete;
770366507c8SPatrick Williams SetBIOSAttributeCurrentValue& operator=(SetBIOSAttributeCurrentValue&&) =
771366507c8SPatrick Williams delete;
772f7f5da97SDeepak Kodihalli
SetBIOSAttributeCurrentValue(const char * type,const char * name,CLI::App * app)773f7f5da97SDeepak Kodihalli explicit SetBIOSAttributeCurrentValue(const char* type, const char* name,
774f7f5da97SDeepak Kodihalli CLI::App* app) :
775f7f5da97SDeepak Kodihalli GetBIOSTableHandler(type, name, app)
776f7f5da97SDeepak Kodihalli {
777f7f5da97SDeepak Kodihalli app->add_option("-a, --attribute", attrName, "pldm attribute name")
778f7f5da97SDeepak Kodihalli ->required();
779f7f5da97SDeepak Kodihalli app->add_option("-d, --data", attrValue, "pldm attribute value")
780f7f5da97SDeepak Kodihalli ->required();
781f7f5da97SDeepak Kodihalli // -v is conflict with --verbose in class CommandInterface, so used -d
782f7f5da97SDeepak Kodihalli }
783f7f5da97SDeepak Kodihalli
exec()784f7f5da97SDeepak Kodihalli void exec()
785f7f5da97SDeepak Kodihalli {
786f7f5da97SDeepak Kodihalli auto stringTable = getBIOSTable(PLDM_BIOS_STRING_TABLE);
787f7f5da97SDeepak Kodihalli auto attrTable = getBIOSTable(PLDM_BIOS_ATTR_TABLE);
788f7f5da97SDeepak Kodihalli auto attrValueTable = getBIOSTable(PLDM_BIOS_ATTR_VAL_TABLE);
789f7f5da97SDeepak Kodihalli
790f7f5da97SDeepak Kodihalli if (!stringTable || !attrTable)
791f7f5da97SDeepak Kodihalli {
7922576aecdSManojkiran Eda std::cout << "StringTable/AttrTable Unavailable" << std::endl;
793f7f5da97SDeepak Kodihalli return;
794f7f5da97SDeepak Kodihalli }
795f7f5da97SDeepak Kodihalli
79616c2a0a0SPatrick Williams auto attrEntry =
79716c2a0a0SPatrick Williams findAttrEntryByName(attrName, *attrTable, *stringTable);
798f7f5da97SDeepak Kodihalli if (attrEntry == nullptr)
799f7f5da97SDeepak Kodihalli {
800f7f5da97SDeepak Kodihalli std::cout << "Could not find attribute :" << attrName << std::endl;
801f7f5da97SDeepak Kodihalli return;
802f7f5da97SDeepak Kodihalli }
803f7f5da97SDeepak Kodihalli
804f7f5da97SDeepak Kodihalli std::vector<uint8_t> requestMsg;
805f7f5da97SDeepak Kodihalli
806f7f5da97SDeepak Kodihalli int rc = 0;
807f7f5da97SDeepak Kodihalli auto attrType = attrEntry->attr_type;
808f7f5da97SDeepak Kodihalli size_t entryLength = 1;
809f7f5da97SDeepak Kodihalli std::vector<uint8_t> attrValueEntry(entryLength, 0);
810f7f5da97SDeepak Kodihalli
811f7f5da97SDeepak Kodihalli switch (attrType)
812f7f5da97SDeepak Kodihalli {
813f7f5da97SDeepak Kodihalli case PLDM_BIOS_ENUMERATION:
8145bb9edb9SGeorge Liu case PLDM_BIOS_ENUMERATION_READ_ONLY:
815f7f5da97SDeepak Kodihalli {
816f7f5da97SDeepak Kodihalli entryLength =
817f7f5da97SDeepak Kodihalli pldm_bios_table_attr_value_entry_encode_enum_length(1);
818488f19d0SAndrew Jeffery uint8_t pvNum;
819488f19d0SAndrew Jeffery // Preconditions are upheld therefore no error check necessary
8208c05ca20SAndrew Jeffery pldm_bios_table_attr_entry_enum_decode_pv_num(attrEntry,
821488f19d0SAndrew Jeffery &pvNum);
822f7f5da97SDeepak Kodihalli std::vector<uint16_t> pvHdls(pvNum, 0);
823488f19d0SAndrew Jeffery // Preconditions are upheld therefore no error check necessary
8242461105eSAndrew Jeffery pldm_bios_table_attr_entry_enum_decode_pv_hdls(
825f7f5da97SDeepak Kodihalli attrEntry, pvHdls.data(), pvNum);
826f7f5da97SDeepak Kodihalli auto stringEntry = pldm_bios_table_string_find_by_string(
827f7f5da97SDeepak Kodihalli stringTable->data(), stringTable->size(),
828f7f5da97SDeepak Kodihalli attrValue.c_str());
829f7f5da97SDeepak Kodihalli if (stringEntry == nullptr)
830f7f5da97SDeepak Kodihalli {
831f7f5da97SDeepak Kodihalli std::cout
832f7f5da97SDeepak Kodihalli << "Set Attribute Error: It's not a possible value"
833f7f5da97SDeepak Kodihalli << std::endl;
834f7f5da97SDeepak Kodihalli return;
835f7f5da97SDeepak Kodihalli }
836f7f5da97SDeepak Kodihalli auto valueHandle =
837f7f5da97SDeepak Kodihalli pldm_bios_table_string_entry_decode_handle(stringEntry);
838f7f5da97SDeepak Kodihalli
839f7f5da97SDeepak Kodihalli uint8_t i;
840f7f5da97SDeepak Kodihalli for (i = 0; i < pvNum; i++)
841f7f5da97SDeepak Kodihalli {
842f7f5da97SDeepak Kodihalli if (valueHandle == pvHdls[i])
843f7f5da97SDeepak Kodihalli break;
844f7f5da97SDeepak Kodihalli }
845f7f5da97SDeepak Kodihalli if (i == pvNum)
846f7f5da97SDeepak Kodihalli {
847f7f5da97SDeepak Kodihalli std::cout
848f7f5da97SDeepak Kodihalli << "Set Attribute Error: It's not a possible value"
849f7f5da97SDeepak Kodihalli << std::endl;
850f7f5da97SDeepak Kodihalli return;
851f7f5da97SDeepak Kodihalli }
852f7f5da97SDeepak Kodihalli
853f7f5da97SDeepak Kodihalli attrValueEntry.resize(entryLength);
854f7f5da97SDeepak Kodihalli std::vector<uint8_t> handles = {i};
8554663aaedSAndrew Jeffery int rc = pldm_bios_table_attr_value_entry_encode_enum(
856f7f5da97SDeepak Kodihalli attrValueEntry.data(), attrValueEntry.size(),
857f7f5da97SDeepak Kodihalli attrEntry->attr_handle, attrType, 1, handles.data());
858d15ecf92SAndrew Jeffery if (rc != PLDM_SUCCESS)
859d15ecf92SAndrew Jeffery {
860d15ecf92SAndrew Jeffery std::cout
861d15ecf92SAndrew Jeffery << "Failed to encode BIOS table attribute enum: " << rc
862d15ecf92SAndrew Jeffery << std::endl;
863d15ecf92SAndrew Jeffery return;
864d15ecf92SAndrew Jeffery }
865f7f5da97SDeepak Kodihalli break;
866f7f5da97SDeepak Kodihalli }
867f7f5da97SDeepak Kodihalli case PLDM_BIOS_STRING:
8685bb9edb9SGeorge Liu case PLDM_BIOS_STRING_READ_ONLY:
869f7f5da97SDeepak Kodihalli {
870f7f5da97SDeepak Kodihalli entryLength =
871f7f5da97SDeepak Kodihalli pldm_bios_table_attr_value_entry_encode_string_length(
872f7f5da97SDeepak Kodihalli attrValue.size());
873f7f5da97SDeepak Kodihalli
874f7f5da97SDeepak Kodihalli attrValueEntry.resize(entryLength);
875f7f5da97SDeepak Kodihalli
87625d38789SAndrew Jeffery int rc = pldm_bios_table_attr_value_entry_encode_string(
877f7f5da97SDeepak Kodihalli attrValueEntry.data(), entryLength, attrEntry->attr_handle,
878f7f5da97SDeepak Kodihalli attrType, attrValue.size(), attrValue.c_str());
879d15ecf92SAndrew Jeffery if (rc != PLDM_SUCCESS)
880d15ecf92SAndrew Jeffery {
881d15ecf92SAndrew Jeffery std::cout
882d15ecf92SAndrew Jeffery << "Failed to encode BIOS table attribute string: "
883d15ecf92SAndrew Jeffery << rc << std::endl;
884d15ecf92SAndrew Jeffery return;
885d15ecf92SAndrew Jeffery }
886f7f5da97SDeepak Kodihalli break;
887f7f5da97SDeepak Kodihalli }
888f7f5da97SDeepak Kodihalli case PLDM_BIOS_INTEGER:
8895bb9edb9SGeorge Liu case PLDM_BIOS_INTEGER_READ_ONLY:
890f7f5da97SDeepak Kodihalli {
891f7f5da97SDeepak Kodihalli uint64_t value = std::stoll(attrValue);
892f7f5da97SDeepak Kodihalli entryLength =
893f7f5da97SDeepak Kodihalli pldm_bios_table_attr_value_entry_encode_integer_length();
894f7f5da97SDeepak Kodihalli attrValueEntry.resize(entryLength);
895a5f2fcdbSAndrew Jeffery int rc = pldm_bios_table_attr_value_entry_encode_integer(
896f7f5da97SDeepak Kodihalli attrValueEntry.data(), entryLength, attrEntry->attr_handle,
897f7f5da97SDeepak Kodihalli attrType, value);
898c727fb40SAndrew Jeffery if (rc != PLDM_SUCCESS)
899c727fb40SAndrew Jeffery {
900c727fb40SAndrew Jeffery std::cout
901c727fb40SAndrew Jeffery << "Failed to encode BIOS table attribute integer: "
902c727fb40SAndrew Jeffery << rc << std::endl;
903c727fb40SAndrew Jeffery return;
904c727fb40SAndrew Jeffery }
905f7f5da97SDeepak Kodihalli break;
906f7f5da97SDeepak Kodihalli }
907f7f5da97SDeepak Kodihalli }
908f7f5da97SDeepak Kodihalli
909f7f5da97SDeepak Kodihalli requestMsg.resize(entryLength + sizeof(pldm_msg_hdr) +
910f7f5da97SDeepak Kodihalli PLDM_SET_BIOS_ATTR_CURR_VAL_MIN_REQ_BYTES);
911f7f5da97SDeepak Kodihalli
912f7f5da97SDeepak Kodihalli rc = encode_set_bios_attribute_current_value_req(
913f7f5da97SDeepak Kodihalli instanceId, 0, PLDM_START_AND_END, attrValueEntry.data(),
914*5c3f0d1bSPavithra Barithaya attrValueEntry.size(), new (requestMsg.data()) pldm_msg,
915f7f5da97SDeepak Kodihalli requestMsg.size() - sizeof(pldm_msg_hdr));
916f7f5da97SDeepak Kodihalli
917f7f5da97SDeepak Kodihalli if (rc != PLDM_SUCCESS)
918f7f5da97SDeepak Kodihalli {
919f7f5da97SDeepak Kodihalli std::cerr << "PLDM: Request Message Error, rc =" << rc << std::endl;
920f7f5da97SDeepak Kodihalli return;
921f7f5da97SDeepak Kodihalli }
922f7f5da97SDeepak Kodihalli std::vector<uint8_t> responseMsg;
923f7f5da97SDeepak Kodihalli rc = pldmSendRecv(requestMsg, responseMsg);
924f7f5da97SDeepak Kodihalli if (rc != PLDM_SUCCESS)
925f7f5da97SDeepak Kodihalli {
926f7f5da97SDeepak Kodihalli std::cerr << "PLDM: Communication Error, rc =" << rc << std::endl;
927f7f5da97SDeepak Kodihalli return;
928f7f5da97SDeepak Kodihalli }
929f7f5da97SDeepak Kodihalli uint8_t cc = 0;
930f7f5da97SDeepak Kodihalli uint32_t nextTransferHandle = 0;
931*5c3f0d1bSPavithra Barithaya auto responsePtr = new (responseMsg.data()) pldm_msg;
932f7f5da97SDeepak Kodihalli auto payloadLength = responseMsg.size() - sizeof(pldm_msg_hdr);
933f7f5da97SDeepak Kodihalli
934f7f5da97SDeepak Kodihalli rc = decode_set_bios_attribute_current_value_resp(
935f7f5da97SDeepak Kodihalli responsePtr, payloadLength, &cc, &nextTransferHandle);
936f7f5da97SDeepak Kodihalli if (rc != PLDM_SUCCESS || cc != PLDM_SUCCESS)
937f7f5da97SDeepak Kodihalli {
938f7f5da97SDeepak Kodihalli std::cerr << "Response Message Error: "
939f7f5da97SDeepak Kodihalli << "rc=" << rc << ",cc=" << (int)cc << std::endl;
940f7f5da97SDeepak Kodihalli return;
941f7f5da97SDeepak Kodihalli }
942f7f5da97SDeepak Kodihalli
943ca4a815bSSridevi Ramesh ordered_json data;
944ca4a815bSSridevi Ramesh data["Response"] = "SUCCESS";
945ca4a815bSSridevi Ramesh pldmtool::helper::DisplayInJson(data);
946f7f5da97SDeepak Kodihalli }
947f7f5da97SDeepak Kodihalli
948f7f5da97SDeepak Kodihalli private:
949f7f5da97SDeepak Kodihalli std::string attrName;
950f7f5da97SDeepak Kodihalli std::string attrValue;
951f7f5da97SDeepak Kodihalli };
952f7f5da97SDeepak Kodihalli
registerCommand(CLI::App & app)953f7f5da97SDeepak Kodihalli void registerCommand(CLI::App& app)
954f7f5da97SDeepak Kodihalli {
955f7f5da97SDeepak Kodihalli auto bios = app.add_subcommand("bios", "bios type command");
956f7f5da97SDeepak Kodihalli bios->require_subcommand(1);
957f7f5da97SDeepak Kodihalli auto getDateTime = bios->add_subcommand("GetDateTime", "get date time");
958f7f5da97SDeepak Kodihalli commands.push_back(
959f7f5da97SDeepak Kodihalli std::make_unique<GetDateTime>("bios", "GetDateTime", getDateTime));
960f7f5da97SDeepak Kodihalli
96116c2a0a0SPatrick Williams auto setDateTime =
96216c2a0a0SPatrick Williams bios->add_subcommand("SetDateTime", "set host date time");
963f7f5da97SDeepak Kodihalli commands.push_back(
964f7f5da97SDeepak Kodihalli std::make_unique<SetDateTime>("bios", "setDateTime", setDateTime));
965f7f5da97SDeepak Kodihalli
966f7f5da97SDeepak Kodihalli auto getBIOSTable = bios->add_subcommand("GetBIOSTable", "get bios table");
967f7f5da97SDeepak Kodihalli commands.push_back(
968f7f5da97SDeepak Kodihalli std::make_unique<GetBIOSTable>("bios", "GetBIOSTable", getBIOSTable));
969f7f5da97SDeepak Kodihalli
970f7f5da97SDeepak Kodihalli auto getBIOSAttributeCurrentValueByHandle =
971f7f5da97SDeepak Kodihalli bios->add_subcommand("GetBIOSAttributeCurrentValueByHandle",
972f7f5da97SDeepak Kodihalli "get bios attribute current value by handle");
973f7f5da97SDeepak Kodihalli commands.push_back(std::make_unique<GetBIOSAttributeCurrentValueByHandle>(
974f7f5da97SDeepak Kodihalli "bios", "GetBIOSAttributeCurrentValueByHandle",
975f7f5da97SDeepak Kodihalli getBIOSAttributeCurrentValueByHandle));
976f7f5da97SDeepak Kodihalli
977f7f5da97SDeepak Kodihalli auto setBIOSAttributeCurrentValue = bios->add_subcommand(
978f7f5da97SDeepak Kodihalli "SetBIOSAttributeCurrentValue", "set bios attribute current value");
979f7f5da97SDeepak Kodihalli commands.push_back(std::make_unique<SetBIOSAttributeCurrentValue>(
980f7f5da97SDeepak Kodihalli "bios", "SetBIOSAttributeCurrentValue", setBIOSAttributeCurrentValue));
981f7f5da97SDeepak Kodihalli }
982f7f5da97SDeepak Kodihalli
983f7f5da97SDeepak Kodihalli } // namespace bios
984f7f5da97SDeepak Kodihalli
985f7f5da97SDeepak Kodihalli } // namespace pldmtool
986