xref: /openbmc/pldm/pldmtool/pldm_bios_cmd.cpp (revision 5c3f0d1b09bfbd206c33841b83938ef5f057a655)
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, &currentString);
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