blob: 8b183339a8a03b940d74d558bc1346b1fdae6770 [file] [log] [blame]
Sampa Misra032bd502019-03-06 05:03:22 -06001#include "bios.hpp"
2
George Liu83409572019-12-24 18:42:54 +08003#include "utils.hpp"
Sampa Misra032bd502019-03-06 05:03:22 -06004#include "xyz/openbmc_project/Common/error.hpp"
5
6#include <array>
Sampa Misrab37be312019-07-03 02:26:41 -05007#include <boost/crc.hpp>
Sampa Misra032bd502019-03-06 05:03:22 -06008#include <chrono>
9#include <ctime>
Deepak Kodihallid9fb1522019-11-28 10:06:34 -060010#include <filesystem>
Sampa Misraaa8ae722019-12-12 03:20:40 -060011#include <iostream>
John Wang02700402019-10-06 16:34:29 +080012#include <memory>
Sampa Misrab37be312019-07-03 02:26:41 -050013#include <numeric>
Sampa Misra032bd502019-03-06 05:03:22 -060014#include <stdexcept>
15#include <string>
16#include <variant>
17#include <vector>
18
Deepak Kodihallid9fb1522019-11-28 10:06:34 -060019namespace fs = std::filesystem;
Sampa Misrab37be312019-07-03 02:26:41 -050020using namespace pldm::responder::bios;
21using namespace bios_parser;
Sampa Misrab37be312019-07-03 02:26:41 -050022
Deepak Kodihallid9fb1522019-11-28 10:06:34 -060023constexpr auto stringTableFile = "stringTable";
24constexpr auto attrTableFile = "attributeTable";
25constexpr auto attrValTableFile = "attributeValueTable";
26
Sampa Misra032bd502019-03-06 05:03:22 -060027namespace pldm
28{
29
Sampa Misrab37be312019-07-03 02:26:41 -050030using namespace sdbusplus::xyz::openbmc_project::Common::Error;
Sampa Misra032bd502019-03-06 05:03:22 -060031using EpochTimeUS = uint64_t;
Sampa Misrab37be312019-07-03 02:26:41 -050032using BIOSTableRow = std::vector<uint8_t>;
Carol Wangdc220c82019-08-26 13:31:31 +080033using BIOSJsonName = std::string;
Sampa Misra032bd502019-03-06 05:03:22 -060034
35constexpr auto dbusProperties = "org.freedesktop.DBus.Properties";
Sampa Misrab37be312019-07-03 02:26:41 -050036constexpr auto padChksumMax = 7;
Sampa Misra032bd502019-03-06 05:03:22 -060037
38namespace responder
39{
40
41namespace utils
42{
43
44void epochToBCDTime(uint64_t timeSec, uint8_t& seconds, uint8_t& minutes,
45 uint8_t& hours, uint8_t& day, uint8_t& month,
46 uint16_t& year)
47{
48 auto t = time_t(timeSec);
49 auto time = localtime(&t);
50
George Liu83409572019-12-24 18:42:54 +080051 seconds = pldm::utils::decimalToBcd(time->tm_sec);
52 minutes = pldm::utils::decimalToBcd(time->tm_min);
53 hours = pldm::utils::decimalToBcd(time->tm_hour);
54 day = pldm::utils::decimalToBcd(time->tm_mday);
55 month = pldm::utils::decimalToBcd(time->tm_mon +
56 1); // The number of months in the range
57 // 0 to 11.PLDM expects range 1 to 12
58 year = pldm::utils::decimalToBcd(time->tm_year +
59 1900); // The number of years since 1900
Sampa Misra032bd502019-03-06 05:03:22 -060060}
61
John Wangc2938352019-09-30 13:58:41 +080062size_t getTableTotalsize(size_t sizeWithoutPad)
63{
John Wang79c37f12019-10-31 15:46:31 +080064 return sizeWithoutPad + pldm_bios_table_pad_checksum_size(sizeWithoutPad);
John Wangc2938352019-09-30 13:58:41 +080065}
66
67void padAndChecksum(Table& table)
68{
John Wang79c37f12019-10-31 15:46:31 +080069 auto sizeWithoutPad = table.size();
70 auto padAndChecksumSize = pldm_bios_table_pad_checksum_size(sizeWithoutPad);
71 table.resize(table.size() + padAndChecksumSize);
John Wangc2938352019-09-30 13:58:41 +080072
John Wang79c37f12019-10-31 15:46:31 +080073 pldm_bios_table_append_pad_checksum(table.data(), table.size(),
74 sizeWithoutPad);
John Wangc2938352019-09-30 13:58:41 +080075}
76
Sampa Misra032bd502019-03-06 05:03:22 -060077} // namespace utils
78
Deepak Kodihallibc669f12019-11-28 08:52:07 -060079namespace bios
80{
81
Deepak Kodihallid9fb1522019-11-28 10:06:34 -060082Handler::Handler()
83{
84 try
85 {
86 fs::remove(
87 fs::path(std::string(BIOS_TABLES_DIR) + "/" + stringTableFile));
88 fs::remove(
89 fs::path(std::string(BIOS_TABLES_DIR) + "/" + attrTableFile));
90 fs::remove(
91 fs::path(std::string(BIOS_TABLES_DIR) + "/" + attrValTableFile));
92 }
93 catch (const std::exception& e)
94 {
95 }
96
97 handlers.emplace(PLDM_GET_DATE_TIME,
98 [this](const pldm_msg* request, size_t payloadLength) {
99 return this->getDateTime(request, payloadLength);
100 });
101 handlers.emplace(PLDM_GET_BIOS_TABLE,
102 [this](const pldm_msg* request, size_t payloadLength) {
103 return this->getBIOSTable(request, payloadLength);
104 });
John Wang8721ed62019-12-05 14:44:43 +0800105 handlers.emplace(PLDM_GET_BIOS_ATTRIBUTE_CURRENT_VALUE_BY_HANDLE,
106 [this](const pldm_msg* request, size_t payloadLength) {
107 return this->getBIOSAttributeCurrentValueByHandle(
108 request, payloadLength);
109 });
Deepak Kodihallid9fb1522019-11-28 10:06:34 -0600110}
111
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600112Response Handler::getDateTime(const pldm_msg* request, size_t /*payloadLength*/)
Sampa Misra032bd502019-03-06 05:03:22 -0600113{
114 uint8_t seconds = 0;
115 uint8_t minutes = 0;
116 uint8_t hours = 0;
117 uint8_t day = 0;
118 uint8_t month = 0;
119 uint16_t year = 0;
120
121 constexpr auto timeInterface = "xyz.openbmc_project.Time.EpochTime";
George Liu408c3c42019-10-16 16:49:15 +0800122 constexpr auto hostTimePath = "/xyz/openbmc_project/time/host";
vkaverapa6575b82019-04-03 05:33:52 -0500123 Response response(sizeof(pldm_msg_hdr) + PLDM_GET_DATE_TIME_RESP_BYTES, 0);
124 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
Sampa Misra032bd502019-03-06 05:03:22 -0600125 std::variant<EpochTimeUS> value;
126
Sampa Misra032bd502019-03-06 05:03:22 -0600127 try
128 {
George Liu0e02c322020-01-01 09:41:51 +0800129 value = pldm::utils::DBusHandler()
130 .getDbusProperty<std::variant<EpochTimeUS>>(
131 hostTimePath, "Elapsed", timeInterface);
Sampa Misra032bd502019-03-06 05:03:22 -0600132 }
George Liu0e02c322020-01-01 09:41:51 +0800133 catch (const sdbusplus::exception::SdBusError& e)
Sampa Misra032bd502019-03-06 05:03:22 -0600134 {
Sampa Misraaa8ae722019-12-12 03:20:40 -0600135 std::cerr << "Error getting time, PATH=" << hostTimePath
136 << " TIME INTERACE=" << timeInterface << "\n";
Sampa Misra032bd502019-03-06 05:03:22 -0600137
Jinu Joy Thomas33705fd2019-07-02 16:03:05 +0530138 encode_get_date_time_resp(request->hdr.instance_id, PLDM_ERROR, seconds,
139 minutes, hours, day, month, year,
140 responsePtr);
vkaverapa6575b82019-04-03 05:33:52 -0500141 return response;
Sampa Misra032bd502019-03-06 05:03:22 -0600142 }
143
144 uint64_t timeUsec = std::get<EpochTimeUS>(value);
145
146 uint64_t timeSec = std::chrono::duration_cast<std::chrono::seconds>(
147 std::chrono::microseconds(timeUsec))
148 .count();
149
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600150 pldm::responder::utils::epochToBCDTime(timeSec, seconds, minutes, hours,
151 day, month, year);
Sampa Misra032bd502019-03-06 05:03:22 -0600152
Jinu Joy Thomas33705fd2019-07-02 16:03:05 +0530153 encode_get_date_time_resp(request->hdr.instance_id, PLDM_SUCCESS, seconds,
154 minutes, hours, day, month, year, responsePtr);
vkaverapa6575b82019-04-03 05:33:52 -0500155 return response;
Sampa Misra032bd502019-03-06 05:03:22 -0600156}
157
Sampa Misrab37be312019-07-03 02:26:41 -0500158/** @brief Construct the BIOS string table
159 *
160 * @param[in] BIOSStringTable - the string table
161 * @param[in] transferHandle - transfer handle to identify part of transfer
162 * @param[in] transferOpFlag - flag to indicate which part of data being
163 * transferred
164 * @param[in] instanceID - instance ID to identify the command
Sampa Misrab37be312019-07-03 02:26:41 -0500165 */
Deepak Kodihalli3c275e12019-09-21 06:39:39 -0500166Response getBIOSStringTable(BIOSTable& BIOSStringTable,
167 uint32_t /*transferHandle*/,
John Wange96e7e52019-10-05 17:47:30 +0800168 uint8_t /*transferOpFlag*/, uint8_t instanceID)
169
Sampa Misrab37be312019-07-03 02:26:41 -0500170{
171 Response response(sizeof(pldm_msg_hdr) + PLDM_GET_BIOS_TABLE_MIN_RESP_BYTES,
172 0);
173 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
John Wangdd9a6282019-10-11 18:52:46 +0800174 if (!BIOSStringTable.isEmpty())
175 {
176 encode_get_bios_table_resp(instanceID, PLDM_SUCCESS,
177 0, /* next transfer handle */
178 PLDM_START_AND_END, nullptr, response.size(),
Sampa Misrab37be312019-07-03 02:26:41 -0500179 responsePtr); // filling up the header here
180 BIOSStringTable.load(response);
John Wangdd9a6282019-10-11 18:52:46 +0800181 return response;
182 }
183 auto biosStrings = bios_parser::getStrings();
184 std::sort(biosStrings.begin(), biosStrings.end());
185 // remove all duplicate strings received from bios json
186 biosStrings.erase(std::unique(biosStrings.begin(), biosStrings.end()),
187 biosStrings.end());
188
189 size_t sizeWithoutPad = std::accumulate(
190 biosStrings.begin(), biosStrings.end(), 0,
191 [](size_t sum, const std::string& elem) {
192 return sum +
193 pldm_bios_table_string_entry_encode_length(elem.length());
194 });
195
196 Table stringTable;
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600197 stringTable.reserve(
198 pldm::responder::utils::getTableTotalsize(sizeWithoutPad));
John Wangdd9a6282019-10-11 18:52:46 +0800199
200 stringTable.resize(sizeWithoutPad);
201 auto tablePtr = stringTable.data();
202 for (const auto& elem : biosStrings)
203 {
204 auto entry_length =
205 pldm_bios_table_string_entry_encode_length(elem.length());
206 pldm_bios_table_string_entry_encode(tablePtr, sizeWithoutPad,
207 elem.c_str(), elem.length());
208 tablePtr += entry_length;
209 sizeWithoutPad -= entry_length;
Sampa Misrab37be312019-07-03 02:26:41 -0500210 }
211
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600212 pldm::responder::utils::padAndChecksum(stringTable);
John Wangdd9a6282019-10-11 18:52:46 +0800213 BIOSStringTable.store(stringTable);
214 response.resize(sizeof(pldm_msg_hdr) + PLDM_GET_BIOS_TABLE_MIN_RESP_BYTES +
215 stringTable.size(),
216 0);
217 responsePtr = reinterpret_cast<pldm_msg*>(response.data());
218 encode_get_bios_table_resp(
219 instanceID, PLDM_SUCCESS, 0 /* nxtTransferHandle */, PLDM_START_AND_END,
220 stringTable.data(), response.size(), responsePtr);
Sampa Misrab37be312019-07-03 02:26:41 -0500221 return response;
222}
223
224/** @brief Find the string handle from the BIOS string table given the name
225 *
226 * @param[in] name - name of the BIOS string
227 * @param[in] BIOSStringTable - the string table
228 * @return - uint16_t - handle of the string
229 */
230StringHandle findStringHandle(const std::string& name,
231 const BIOSTable& BIOSStringTable)
232{
John Wangdd9a6282019-10-11 18:52:46 +0800233 Table table;
234 BIOSStringTable.load(table);
235 auto stringEntry = pldm_bios_table_string_find_by_string(
236 table.data(), table.size(), name.c_str());
237 if (stringEntry == nullptr)
Sampa Misrab37be312019-07-03 02:26:41 -0500238 {
Sampa Misraaa8ae722019-12-12 03:20:40 -0600239 std::cerr << "Reached end of BIOS string table,did not find the "
240 << "handle for the string, STRING=" << name.c_str() << "\n";
241 throw InternalFailure();
Sampa Misrab37be312019-07-03 02:26:41 -0500242 }
John Wangdd9a6282019-10-11 18:52:46 +0800243
244 return pldm_bios_table_string_entry_decode_handle(stringEntry);
Sampa Misrab37be312019-07-03 02:26:41 -0500245}
246
247/** @brief Find the string name from the BIOS string table for a string handle
248 *
249 * @param[in] stringHdl - string handle
250 * @param[in] BIOSStringTable - the string table
251 *
252 * @return - std::string - name of the corresponding BIOS string
253 */
254std::string findStringName(StringHandle stringHdl,
255 const BIOSTable& BIOSStringTable)
256{
John Wangdd9a6282019-10-11 18:52:46 +0800257 Table table;
258 BIOSStringTable.load(table);
259 auto stringEntry = pldm_bios_table_string_find_by_handle(
260 table.data(), table.size(), stringHdl);
Sampa Misrab37be312019-07-03 02:26:41 -0500261 std::string name;
John Wangdd9a6282019-10-11 18:52:46 +0800262 if (stringEntry == nullptr)
Sampa Misrab37be312019-07-03 02:26:41 -0500263 {
Sampa Misraaa8ae722019-12-12 03:20:40 -0600264 std::cerr << "Reached end of BIOS string table,did not find "
265 << "string name for handle, STRING_HANDLE=" << stringHdl
266 << "\n";
Sampa Misrab37be312019-07-03 02:26:41 -0500267 }
John Wangdd9a6282019-10-11 18:52:46 +0800268 auto strLength =
269 pldm_bios_table_string_entry_decode_string_length(stringEntry);
270 name.resize(strLength);
271 pldm_bios_table_string_entry_decode_string(stringEntry, name.data(),
272 name.size());
Sampa Misrab37be312019-07-03 02:26:41 -0500273 return name;
274}
275
276namespace bios_type_enum
277{
278
Carol Wangdc220c82019-08-26 13:31:31 +0800279using namespace bios_parser::bios_enum;
280
Sampa Misrab37be312019-07-03 02:26:41 -0500281/** @brief Find the indices into the array of the possible values of string
282 * handles for the current values.This is used in attribute value table
283 *
284 * @param[in] possiVals - vector of string handles comprising all the possible
285 * values for an attribute
286 * @param[in] currVals - vector of strings comprising all current values
287 * for an attribute
288 * @param[in] BIOSStringTable - the string table
289 *
290 * @return - std::vector<uint8_t> - indices into the array of the possible
291 * values of string handles
292 */
293std::vector<uint8_t> findStrIndices(PossibleValuesByHandle possiVals,
294 CurrentValues currVals,
295 const BIOSTable& BIOSStringTable)
296{
297 std::vector<uint8_t> stringIndices;
298
299 for (const auto& currVal : currVals)
300 {
301 StringHandle curHdl;
302 try
303 {
304 curHdl = findStringHandle(currVal, BIOSStringTable);
305 }
306 catch (InternalFailure& e)
307 {
Sampa Misraaa8ae722019-12-12 03:20:40 -0600308 std::cerr << "Exception fetching handle for the string, STRING="
309 << currVal.c_str() << "\n";
Sampa Misrab37be312019-07-03 02:26:41 -0500310 continue;
311 }
312
313 uint8_t i = 0;
314 for (auto possiHdl : possiVals)
315 {
316 if (possiHdl == curHdl)
317 {
318 stringIndices.push_back(i);
319 break;
320 }
321 i++;
322 }
323 }
324 return stringIndices;
325}
326
327/** @brief Find the indices into the array of the possible values of string
328 * handles for the default values. This is used in attribute table
329 *
330 * @param[in] possiVals - vector of strings comprising all the possible values
331 * for an attribute
332 * @param[in] defVals - vector of strings comprising all the default values
333 * for an attribute
334 * @return - std::vector<uint8_t> - indices into the array of the possible
335 * values of string
336 */
337std::vector<uint8_t> findDefaultValHandle(const PossibleValues& possiVals,
338 const DefaultValues& defVals)
339{
340 std::vector<uint8_t> defHdls;
341 for (const auto& defs : defVals)
342 {
343 auto index = std::lower_bound(possiVals.begin(), possiVals.end(), defs);
344 if (index != possiVals.end())
345 {
346 defHdls.push_back(index - possiVals.begin());
347 }
348 }
349
350 return defHdls;
351}
352
353/** @brief Construct the attibute table for BIOS type Enumeration and
354 * Enumeration ReadOnly
355 * @param[in] BIOSStringTable - the string table
356 * @param[in] biosJsonDir - path where the BIOS json files are present
Carol Wangdc220c82019-08-26 13:31:31 +0800357 * @param[in,out] attributeTable - the attribute table
Sampa Misrab37be312019-07-03 02:26:41 -0500358 *
Sampa Misrab37be312019-07-03 02:26:41 -0500359 */
John Wange96e7e52019-10-05 17:47:30 +0800360void constructAttrTable(const BIOSTable& BIOSStringTable, Table& attributeTable)
Sampa Misrab37be312019-07-03 02:26:41 -0500361{
Sampa Misrab37be312019-07-03 02:26:41 -0500362 const auto& attributeMap = getValues();
Sampa Misrab37be312019-07-03 02:26:41 -0500363 StringHandle strHandle;
364
365 for (const auto& [key, value] : attributeMap)
366 {
367 try
368 {
369 strHandle = findStringHandle(key, BIOSStringTable);
370 }
371 catch (InternalFailure& e)
372 {
Sampa Misraaa8ae722019-12-12 03:20:40 -0600373 std::cerr << "Could not find handle for BIOS string, ATTRIBUTE="
374 << key.c_str() << "\n";
Sampa Misrab37be312019-07-03 02:26:41 -0500375 continue;
376 }
John Wangccc04552019-10-14 14:28:25 +0800377 bool readOnly = (std::get<0>(value));
Sampa Misrab37be312019-07-03 02:26:41 -0500378 PossibleValues possiVals = std::get<1>(value);
379 DefaultValues defVals = std::get<2>(value);
380 // both the possible and default values are stored in sorted manner to
381 // ease in fetching back/comparison
382 std::sort(possiVals.begin(), possiVals.end());
383 std::sort(defVals.begin(), defVals.end());
384
385 std::vector<StringHandle> possiValsByHdl;
386 for (const auto& elem : possiVals)
387 {
388 try
389 {
390 auto hdl = findStringHandle(elem, BIOSStringTable);
391 possiValsByHdl.push_back(std::move(hdl));
392 }
393 catch (InternalFailure& e)
394 {
Sampa Misraaa8ae722019-12-12 03:20:40 -0600395 std::cerr << "Could not find handle for BIOS string, STRING="
396 << elem.c_str() << "\n";
Sampa Misrab37be312019-07-03 02:26:41 -0500397 continue;
398 }
399 }
400 auto defValsByHdl = findDefaultValHandle(possiVals, defVals);
John Wangccc04552019-10-14 14:28:25 +0800401 auto entryLength = pldm_bios_table_attr_entry_enum_encode_length(
402 possiValsByHdl.size(), defValsByHdl.size());
Sampa Misrab37be312019-07-03 02:26:41 -0500403
John Wangccc04552019-10-14 14:28:25 +0800404 auto attrTableSize = attributeTable.size();
405 attributeTable.resize(attrTableSize + entryLength, 0);
406 struct pldm_bios_table_attr_entry_enum_info info = {
407 strHandle,
408 readOnly,
409 (uint8_t)possiValsByHdl.size(),
410 possiValsByHdl.data(),
411 (uint8_t)defValsByHdl.size(),
412 defValsByHdl.data(),
413 };
414 pldm_bios_table_attr_entry_enum_encode(
415 attributeTable.data() + attrTableSize, entryLength, &info);
Sampa Misrab37be312019-07-03 02:26:41 -0500416 }
Sampa Misrab37be312019-07-03 02:26:41 -0500417}
418
John Wang3ad21752019-10-06 16:42:21 +0800419void constructAttrValueEntry(
420 const struct pldm_bios_attr_table_entry* attrTableEntry,
421 const std::string& attrName, const BIOSTable& BIOSStringTable,
422 Table& attrValueTable)
Sampa Misrab37be312019-07-03 02:26:41 -0500423{
John Wang3ad21752019-10-06 16:42:21 +0800424 CurrentValues currVals;
425 try
Sampa Misrab37be312019-07-03 02:26:41 -0500426 {
John Wang3ad21752019-10-06 16:42:21 +0800427 currVals = getAttrValue(attrName);
Sampa Misrab37be312019-07-03 02:26:41 -0500428 }
John Wang3ad21752019-10-06 16:42:21 +0800429 catch (const std::exception& e)
430 {
Sampa Misraaa8ae722019-12-12 03:20:40 -0600431 std::cerr << "getAttrValue returned error for attribute, NAME="
432 << attrName.c_str() << " ERROR=" << e.what() << "\n";
John Wang3ad21752019-10-06 16:42:21 +0800433 return;
434 }
435 uint8_t pv_num =
436 pldm_bios_table_attr_entry_enum_decode_pv_num(attrTableEntry);
437 PossibleValuesByHandle pvHdls(pv_num, 0);
438 pldm_bios_table_attr_entry_enum_decode_pv_hdls(attrTableEntry,
439 pvHdls.data(), pv_num);
440 std::sort(currVals.begin(), currVals.end());
441
442 auto currValStrIndices = findStrIndices(pvHdls, currVals, BIOSStringTable);
443
444 auto entryLength = pldm_bios_table_attr_value_entry_encode_enum_length(
445 currValStrIndices.size());
446 auto tableSize = attrValueTable.size();
447 attrValueTable.resize(tableSize + entryLength);
448 pldm_bios_table_attr_value_entry_encode_enum(
449 attrValueTable.data() + tableSize, entryLength,
450 attrTableEntry->attr_handle, attrTableEntry->attr_type,
451 currValStrIndices.size(), currValStrIndices.data());
Sampa Misrab37be312019-07-03 02:26:41 -0500452}
453
454} // end namespace bios_type_enum
455
Carol Wangdc220c82019-08-26 13:31:31 +0800456namespace bios_type_string
457{
Carol Wang612f35b2019-08-26 17:14:26 +0800458
459using namespace bios_parser::bios_string;
460
Carol Wangdc220c82019-08-26 13:31:31 +0800461/** @brief Construct the attibute table for BIOS type String and
462 * String ReadOnly
463 * @param[in] BIOSStringTable - the string table
464 * @param[in] biosJsonDir - path where the BIOS json files are present
465 * @param[in,out] attributeTable - the attribute table
466 *
467 */
John Wange96e7e52019-10-05 17:47:30 +0800468void constructAttrTable(const BIOSTable& BIOSStringTable, Table& attributeTable)
Carol Wangdc220c82019-08-26 13:31:31 +0800469{
Carol Wang612f35b2019-08-26 17:14:26 +0800470 const auto& attributeMap = getValues();
471 StringHandle strHandle;
Carol Wang612f35b2019-08-26 17:14:26 +0800472 for (const auto& [key, value] : attributeMap)
473 {
474 try
475 {
476 strHandle = findStringHandle(key, BIOSStringTable);
477 }
478 catch (InternalFailure& e)
479 {
Sampa Misraaa8ae722019-12-12 03:20:40 -0600480 std::cerr << "Could not find handle for BIOS string, ATTRIBUTE="
481 << key.c_str() << "\n";
Carol Wang612f35b2019-08-26 17:14:26 +0800482 continue;
483 }
484
John Wangccc04552019-10-14 14:28:25 +0800485 const auto& [readOnly, strType, minStrLen, maxStrLen, defaultStrLen,
Carol Wang612f35b2019-08-26 17:14:26 +0800486 defaultStr] = value;
John Wangccc04552019-10-14 14:28:25 +0800487 auto entryLength =
488 pldm_bios_table_attr_entry_string_encode_length(defaultStrLen);
Carol Wang612f35b2019-08-26 17:14:26 +0800489
John Wangccc04552019-10-14 14:28:25 +0800490 struct pldm_bios_table_attr_entry_string_info info = {
491 strHandle, readOnly, strType, minStrLen,
492 maxStrLen, defaultStrLen, defaultStr.data(),
493 };
494 auto attrTableSize = attributeTable.size();
495 attributeTable.resize(attrTableSize + entryLength, 0);
496 pldm_bios_table_attr_entry_string_encode(
497 attributeTable.data() + attrTableSize, entryLength, &info);
Carol Wang612f35b2019-08-26 17:14:26 +0800498 }
Carol Wangdc220c82019-08-26 13:31:31 +0800499}
Carol Wangb503f9e2019-09-02 16:34:10 +0800500
John Wang3ad21752019-10-06 16:42:21 +0800501void constructAttrValueEntry(const pldm_bios_attr_table_entry* attrTableEntry,
502 const std::string& attrName,
Carol Wangb503f9e2019-09-02 16:34:10 +0800503 const BIOSTable& BIOSStringTable,
John Wang3ad21752019-10-06 16:42:21 +0800504 Table& attrValueTable)
Carol Wangb503f9e2019-09-02 16:34:10 +0800505{
John Wang3ad21752019-10-06 16:42:21 +0800506 std::ignore = BIOSStringTable;
507 std::string currStr;
508 uint16_t currStrLen = 0;
509 try
Carol Wangb503f9e2019-09-02 16:34:10 +0800510 {
John Wang3ad21752019-10-06 16:42:21 +0800511 currStr = getAttrValue(attrName);
512 currStrLen = currStr.size();
Carol Wangb503f9e2019-09-02 16:34:10 +0800513 }
John Wang3ad21752019-10-06 16:42:21 +0800514 catch (const std::exception& e)
515 {
Sampa Misraaa8ae722019-12-12 03:20:40 -0600516 std::cerr << "getAttrValue returned error for attribute, NAME="
517 << attrName.c_str() << " ERROR=" << e.what() << "\n";
John Wang3ad21752019-10-06 16:42:21 +0800518 return;
519 }
520 auto entryLength =
521 pldm_bios_table_attr_value_entry_encode_string_length(currStrLen);
522 auto tableSize = attrValueTable.size();
523 attrValueTable.resize(tableSize + entryLength);
524 pldm_bios_table_attr_value_entry_encode_string(
525 attrValueTable.data() + tableSize, entryLength,
526 attrTableEntry->attr_handle, attrTableEntry->attr_type, currStrLen,
527 currStr.c_str());
Carol Wangb503f9e2019-09-02 16:34:10 +0800528}
529
Carol Wangdc220c82019-08-26 13:31:31 +0800530} // end namespace bios_type_string
531
John Wangdbbc9ff2019-10-25 13:53:46 +0800532namespace bios_type_integer
533{
534
535using namespace bios_parser::bios_integer;
536
537/** @brief Construct the attibute table for BIOS type Integer and
538 * Integer ReadOnly
539 * @param[in] BIOSStringTable - the string table
540 * @param[in,out] attributeTable - the attribute table
541 *
542 */
543void constructAttrTable(const BIOSTable& BIOSStringTable, Table& attributeTable)
544{
545 const auto& attributeMap = getValues();
546 StringHandle strHandle;
547 for (const auto& [key, value] : attributeMap)
548 {
549 try
550 {
551 strHandle = findStringHandle(key, BIOSStringTable);
552 }
553 catch (InternalFailure& e)
554 {
Sampa Misraaa8ae722019-12-12 03:20:40 -0600555 std::cerr << "Could not find handle for BIOS string, ATTRIBUTE="
556 << key.c_str() << "\n";
John Wangdbbc9ff2019-10-25 13:53:46 +0800557 continue;
558 }
559
560 const auto& [readOnly, lowerBound, upperBound, scalarIncrement,
561 defaultValue] = value;
562 auto entryLength = pldm_bios_table_attr_entry_integer_encode_length();
563
564 struct pldm_bios_table_attr_entry_integer_info info = {
565 strHandle, readOnly, lowerBound,
566 upperBound, scalarIncrement, defaultValue,
567 };
568 auto attrTableSize = attributeTable.size();
569 attributeTable.resize(attrTableSize + entryLength, 0);
570 pldm_bios_table_attr_entry_integer_encode(
571 attributeTable.data() + attrTableSize, entryLength, &info);
572 }
573}
574
575void constructAttrValueEntry(const pldm_bios_attr_table_entry* attrTableEntry,
576 const std::string& attrName,
577 const BIOSTable& BIOSStringTable,
578 Table& attrValueTable)
579{
580 std::ignore = BIOSStringTable;
581 uint64_t currentValue;
582 try
583 {
584 currentValue = getAttrValue(attrName);
585 }
586 catch (const std::exception& e)
587 {
Sampa Misraaa8ae722019-12-12 03:20:40 -0600588 std::cerr << "Failed to get attribute value, NAME=" << attrName.c_str()
589 << " ERROR=" << e.what() << "\n";
John Wangdbbc9ff2019-10-25 13:53:46 +0800590 return;
591 }
592 auto entryLength = pldm_bios_table_attr_value_entry_encode_integer_length();
593 auto tableSize = attrValueTable.size();
594 attrValueTable.resize(tableSize + entryLength);
595 pldm_bios_table_attr_value_entry_encode_integer(
596 attrValueTable.data() + tableSize, entryLength,
597 attrTableEntry->attr_handle, attrTableEntry->attr_type, currentValue);
598}
599
600} // namespace bios_type_integer
601
John Wang02700402019-10-06 16:34:29 +0800602void traverseBIOSAttrTable(const Table& biosAttrTable,
603 AttrTableEntryHandler handler)
604{
605 std::unique_ptr<pldm_bios_table_iter, decltype(&pldm_bios_table_iter_free)>
606 iter(pldm_bios_table_iter_create(biosAttrTable.data(),
607 biosAttrTable.size(),
608 PLDM_BIOS_ATTR_TABLE),
609 pldm_bios_table_iter_free);
610 while (!pldm_bios_table_iter_is_end(iter.get()))
611 {
612 auto table_entry = pldm_bios_table_iter_attr_entry_value(iter.get());
613 try
614 {
615 handler(table_entry);
616 }
617 catch (const std::exception& e)
618 {
Sampa Misraaa8ae722019-12-12 03:20:40 -0600619 std::cerr << "handler fails when traversing BIOSAttrTable, ERROR="
620 << e.what() << "\n";
John Wang02700402019-10-06 16:34:29 +0800621 }
622 pldm_bios_table_iter_next(iter.get());
623 }
624}
625
John Wange96e7e52019-10-05 17:47:30 +0800626using typeHandler = std::function<void(const BIOSTable& BIOSStringTable,
627 Table& attributeTable)>;
Carol Wangdc220c82019-08-26 13:31:31 +0800628std::map<BIOSJsonName, typeHandler> attrTypeHandlers{
629 {bios_parser::bIOSEnumJson, bios_type_enum::constructAttrTable},
John Wangdbbc9ff2019-10-25 13:53:46 +0800630 {bios_parser::bIOSStrJson, bios_type_string::constructAttrTable},
631 {bios_parser::bIOSIntegerJson, bios_type_integer::constructAttrTable},
632};
Carol Wangdc220c82019-08-26 13:31:31 +0800633
Sampa Misrab37be312019-07-03 02:26:41 -0500634/** @brief Construct the BIOS attribute table
635 *
636 * @param[in] BIOSAttributeTable - the attribute table
637 * @param[in] BIOSStringTable - the string table
638 * @param[in] transferHandle - transfer handle to identify part of transfer
639 * @param[in] transferOpFlag - flag to indicate which part of data being
640 * transferred
641 * @param[in] instanceID - instance ID to identify the command
642 * @param[in] biosJsonDir - path where the BIOS json files are present
643 */
644Response getBIOSAttributeTable(BIOSTable& BIOSAttributeTable,
645 const BIOSTable& BIOSStringTable,
Deepak Kodihalli3c275e12019-09-21 06:39:39 -0500646 uint32_t /*transferHandle*/,
647 uint8_t /*transferOpFlag*/, uint8_t instanceID,
648 const char* biosJsonDir)
Sampa Misrab37be312019-07-03 02:26:41 -0500649{
650 Response response(sizeof(pldm_msg_hdr) + PLDM_GET_BIOS_TABLE_MIN_RESP_BYTES,
651 0);
652 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
653 uint32_t nxtTransferHandle = 0;
654 uint8_t transferFlag = PLDM_START_AND_END;
Sampa Misrab37be312019-07-03 02:26:41 -0500655
656 if (BIOSAttributeTable.isEmpty())
657 { // no persisted table, constructing fresh table and response
Carol Wangdc220c82019-08-26 13:31:31 +0800658 Table attributeTable;
659 fs::path dir(biosJsonDir);
660
661 for (auto it = attrTypeHandlers.begin(); it != attrTypeHandlers.end();
662 it++)
663 {
664 fs::path file = dir / it->first;
665 if (fs::exists(file))
666 {
John Wange96e7e52019-10-05 17:47:30 +0800667 it->second(BIOSStringTable, attributeTable);
Carol Wangdc220c82019-08-26 13:31:31 +0800668 }
669 }
670
671 if (attributeTable.empty())
672 { // no available json file is found
673 encode_get_bios_table_resp(instanceID, PLDM_BIOS_TABLE_UNAVAILABLE,
674 nxtTransferHandle, transferFlag, nullptr,
675 response.size(), responsePtr);
676 return response;
677 }
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600678 pldm::responder::utils::padAndChecksum(attributeTable);
John Wangc2938352019-09-30 13:58:41 +0800679 BIOSAttributeTable.store(attributeTable);
Sampa Misrab37be312019-07-03 02:26:41 -0500680 response.resize(sizeof(pldm_msg_hdr) +
681 PLDM_GET_BIOS_TABLE_MIN_RESP_BYTES +
682 attributeTable.size());
683 responsePtr = reinterpret_cast<pldm_msg*>(response.data());
Sampa Misrab37be312019-07-03 02:26:41 -0500684 encode_get_bios_table_resp(instanceID, PLDM_SUCCESS, nxtTransferHandle,
685 transferFlag, attributeTable.data(),
Carol Wangdc220c82019-08-26 13:31:31 +0800686 response.size(), responsePtr);
Sampa Misrab37be312019-07-03 02:26:41 -0500687 }
688 else
689 { // persisted table present, constructing response
Sampa Misrab37be312019-07-03 02:26:41 -0500690 encode_get_bios_table_resp(instanceID, PLDM_SUCCESS, nxtTransferHandle,
Carol Wangdc220c82019-08-26 13:31:31 +0800691 transferFlag, nullptr, response.size(),
Sampa Misrab37be312019-07-03 02:26:41 -0500692 responsePtr); // filling up the header here
693 BIOSAttributeTable.load(response);
694 }
695
696 return response;
697}
698
John Wang3ad21752019-10-06 16:42:21 +0800699using AttrValTableEntryConstructHandler =
700 std::function<void(const struct pldm_bios_attr_table_entry* tableEntry,
701 const std::string& attrName,
702 const BIOSTable& BIOSStringTable, Table& table)>;
703
704using AttrType = uint8_t;
705const std::map<AttrType, AttrValTableEntryConstructHandler>
706 AttrValTableConstructMap{
707 {PLDM_BIOS_STRING, bios_type_string::constructAttrValueEntry},
708 {PLDM_BIOS_STRING_READ_ONLY, bios_type_string::constructAttrValueEntry},
709 {PLDM_BIOS_ENUMERATION, bios_type_enum::constructAttrValueEntry},
710 {PLDM_BIOS_ENUMERATION_READ_ONLY,
711 bios_type_enum::constructAttrValueEntry},
John Wangdbbc9ff2019-10-25 13:53:46 +0800712 {PLDM_BIOS_INTEGER, bios_type_integer::constructAttrValueEntry},
713 {PLDM_BIOS_INTEGER_READ_ONLY,
714 bios_type_integer::constructAttrValueEntry},
John Wang3ad21752019-10-06 16:42:21 +0800715 };
716
717void constructAttrValueTableEntry(
718 const struct pldm_bios_attr_table_entry* attrEntry,
719 const BIOSTable& BIOSStringTable, Table& attributeValueTable)
720{
721 auto attrName = findStringName(attrEntry->string_handle, BIOSStringTable);
722 if (attrName.empty())
723 {
Sampa Misraaa8ae722019-12-12 03:20:40 -0600724 std::cerr << "invalid string handle, STRING_HANDLE="
725 << attrEntry->string_handle << "\n";
John Wang3ad21752019-10-06 16:42:21 +0800726 return;
727 }
728
729 AttrValTableConstructMap.at(attrEntry->attr_type)(
730 attrEntry, attrName, BIOSStringTable, attributeValueTable);
731}
732
Sampa Misrab37be312019-07-03 02:26:41 -0500733/** @brief Construct the BIOS attribute value table
734 *
735 * @param[in] BIOSAttributeValueTable - the attribute value table
736 * @param[in] BIOSAttributeTable - the attribute table
737 * @param[in] BIOSStringTable - the string table
738 * @param[in] transferHandle - transfer handle to identify part of transfer
739 * @param[in] transferOpFlag - flag to indicate which part of data being
740 * transferred
741 * @param[in] instanceID - instance ID to identify the command
Sampa Misrab37be312019-07-03 02:26:41 -0500742 */
743Response getBIOSAttributeValueTable(BIOSTable& BIOSAttributeValueTable,
744 const BIOSTable& BIOSAttributeTable,
745 const BIOSTable& BIOSStringTable,
Deepak Kodihalli3c275e12019-09-21 06:39:39 -0500746 uint32_t& /*transferHandle*/,
747 uint8_t& /*transferOpFlag*/,
John Wang3ad21752019-10-06 16:42:21 +0800748 uint8_t instanceID)
Sampa Misrab37be312019-07-03 02:26:41 -0500749{
750 Response response(sizeof(pldm_msg_hdr) + PLDM_GET_BIOS_TABLE_MIN_RESP_BYTES,
751 0);
752 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
753 uint32_t nxtTransferHandle = 0;
754 uint8_t transferFlag = PLDM_START_AND_END;
Sampa Misrab37be312019-07-03 02:26:41 -0500755
John Wang3ad21752019-10-06 16:42:21 +0800756 if (!BIOSAttributeValueTable.isEmpty())
757 {
Sampa Misrab37be312019-07-03 02:26:41 -0500758 encode_get_bios_table_resp(instanceID, PLDM_SUCCESS, nxtTransferHandle,
John Wang3ad21752019-10-06 16:42:21 +0800759 transferFlag, nullptr, response.size(),
Sampa Misrab37be312019-07-03 02:26:41 -0500760 responsePtr); // filling up the header here
761 BIOSAttributeValueTable.load(response);
John Wang3ad21752019-10-06 16:42:21 +0800762 return response;
Sampa Misrab37be312019-07-03 02:26:41 -0500763 }
764
John Wang3ad21752019-10-06 16:42:21 +0800765 Table attributeValueTable;
766 Table attributeTable;
767 BIOSAttributeTable.load(attributeTable);
768 traverseBIOSAttrTable(
769 attributeTable,
770 [&BIOSStringTable, &attributeValueTable](
771 const struct pldm_bios_attr_table_entry* tableEntry) {
772 constructAttrValueTableEntry(tableEntry, BIOSStringTable,
773 attributeValueTable);
774 });
775 if (attributeValueTable.empty())
776 {
777 encode_get_bios_table_resp(instanceID, PLDM_BIOS_TABLE_UNAVAILABLE,
778 nxtTransferHandle, transferFlag, nullptr,
779 response.size(), responsePtr);
780 return response;
781 }
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600782 pldm::responder::utils::padAndChecksum(attributeValueTable);
John Wang3ad21752019-10-06 16:42:21 +0800783 BIOSAttributeValueTable.store(attributeValueTable);
784
785 response.resize(sizeof(pldm_msg_hdr) + PLDM_GET_BIOS_TABLE_MIN_RESP_BYTES +
786 attributeValueTable.size());
787 responsePtr = reinterpret_cast<pldm_msg*>(response.data());
788 encode_get_bios_table_resp(instanceID, PLDM_SUCCESS, nxtTransferHandle,
789 transferFlag, attributeValueTable.data(),
790 response.size(), responsePtr);
791
Sampa Misrab37be312019-07-03 02:26:41 -0500792 return response;
793}
794
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600795Response Handler::getBIOSTable(const pldm_msg* request, size_t payloadLength)
Sampa Misrab37be312019-07-03 02:26:41 -0500796{
Deepak Kodihallic3d20892019-08-01 05:38:31 -0500797 fs::create_directory(BIOS_TABLES_DIR);
Sampa Misrab37be312019-07-03 02:26:41 -0500798 auto response = internal::buildBIOSTables(request, payloadLength,
799 BIOS_JSONS_DIR, BIOS_TABLES_DIR);
800
801 return response;
802}
803
John Wang8721ed62019-12-05 14:44:43 +0800804Response Handler::getBIOSAttributeCurrentValueByHandle(const pldm_msg* request,
805 size_t payloadLength)
806{
807 uint32_t transferHandle;
808 uint8_t transferOpFlag;
809 uint16_t attributeHandle;
810
811 auto rc = decode_get_bios_attribute_current_value_by_handle_req(
812 request, payloadLength, &transferHandle, &transferOpFlag,
813 &attributeHandle);
814 if (rc != PLDM_SUCCESS)
815 {
816 return ccOnlyResponse(request, rc);
817 }
818
Deepak Kodihalli4976a682020-01-07 05:48:29 -0600819 fs::path tablesPath(BIOS_TABLES_DIR);
820 auto stringTablePath = tablesPath / stringTableFile;
821 BIOSTable BIOSStringTable(stringTablePath.c_str());
822 auto attrTablePath = tablesPath / attrTableFile;
823 BIOSTable BIOSAttributeTable(attrTablePath.c_str());
824 if (BIOSAttributeTable.isEmpty() || BIOSStringTable.isEmpty())
825 {
826 return ccOnlyResponse(request, PLDM_BIOS_TABLE_UNAVAILABLE);
827 }
828
829 auto attrValueTablePath = tablesPath / attrValTableFile;
830 BIOSTable BIOSAttributeValueTable(attrValueTablePath.c_str());
831
832 if (BIOSAttributeValueTable.isEmpty())
833 {
834 Table attributeValueTable;
835 Table attributeTable;
836 BIOSAttributeTable.load(attributeTable);
837 traverseBIOSAttrTable(
838 attributeTable,
839 [&BIOSStringTable, &attributeValueTable](
840 const struct pldm_bios_attr_table_entry* tableEntry) {
841 constructAttrValueTableEntry(tableEntry, BIOSStringTable,
842 attributeValueTable);
843 });
844 if (attributeValueTable.empty())
845 {
846 return ccOnlyResponse(request, PLDM_BIOS_TABLE_UNAVAILABLE);
847 }
848 pldm::responder::utils::padAndChecksum(attributeValueTable);
849 BIOSAttributeValueTable.store(attributeValueTable);
850 }
John Wang8721ed62019-12-05 14:44:43 +0800851
852 Response table;
Deepak Kodihalli4976a682020-01-07 05:48:29 -0600853 BIOSAttributeValueTable.load(table);
John Wang8721ed62019-12-05 14:44:43 +0800854
855 auto entry = pldm_bios_table_attr_value_find_by_handle(
856 table.data(), table.size(), attributeHandle);
857 if (entry == nullptr)
858 {
859 return ccOnlyResponse(request, PLDM_INVALID_BIOS_ATTR_HANDLE);
860 }
861
862 auto valueLength = pldm_bios_table_attr_value_entry_value_length(entry);
863 auto valuePtr = pldm_bios_table_attr_value_entry_value(entry);
864 Response response(sizeof(pldm_msg_hdr) +
865 PLDM_GET_BIOS_ATTR_CURR_VAL_BY_HANDLE_MIN_RESP_BYTES +
866 valueLength,
867 0);
868 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
869 encode_get_bios_current_value_by_handle_resp(
870 request->hdr.instance_id, PLDM_SUCCESS, 0, PLDM_START_AND_END, valuePtr,
871 valueLength, responsePtr);
872
873 return response;
874}
875
Sampa Misrab37be312019-07-03 02:26:41 -0500876namespace internal
877{
878
879Response buildBIOSTables(const pldm_msg* request, size_t payloadLength,
880 const char* biosJsonDir, const char* biosTablePath)
881{
882 Response response(sizeof(pldm_msg_hdr) + PLDM_GET_BIOS_TABLE_MIN_RESP_BYTES,
883 0);
884 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
885
John Wange96e7e52019-10-05 17:47:30 +0800886 if (setupConfig(biosJsonDir) != 0)
887 {
888 encode_get_bios_table_resp(
889 request->hdr.instance_id, PLDM_BIOS_TABLE_UNAVAILABLE,
890 0 /* nxtTransferHandle */, PLDM_START_AND_END, nullptr,
891 response.size(), responsePtr);
892 return response;
893 }
894
Sampa Misrab37be312019-07-03 02:26:41 -0500895 uint32_t transferHandle{};
896 uint8_t transferOpFlag{};
897 uint8_t tableType{};
898
899 auto rc = decode_get_bios_table_req(request, payloadLength, &transferHandle,
900 &transferOpFlag, &tableType);
901 if (rc == PLDM_SUCCESS)
902 {
903 BIOSTable BIOSStringTable(
Deepak Kodihallid9fb1522019-11-28 10:06:34 -0600904 (std::string(biosTablePath) + "/" + stringTableFile).c_str());
Sampa Misrab37be312019-07-03 02:26:41 -0500905 BIOSTable BIOSAttributeTable(
Deepak Kodihallid9fb1522019-11-28 10:06:34 -0600906 (std::string(biosTablePath) + "/" + attrTableFile).c_str());
Sampa Misrab37be312019-07-03 02:26:41 -0500907 BIOSTable BIOSAttributeValueTable(
Deepak Kodihallid9fb1522019-11-28 10:06:34 -0600908 (std::string(biosTablePath) + "/" + attrValTableFile).c_str());
Sampa Misrab37be312019-07-03 02:26:41 -0500909 switch (tableType)
910 {
911 case PLDM_BIOS_STRING_TABLE:
912
John Wange96e7e52019-10-05 17:47:30 +0800913 response = getBIOSStringTable(BIOSStringTable, transferHandle,
914 transferOpFlag,
915 request->hdr.instance_id);
Sampa Misrab37be312019-07-03 02:26:41 -0500916 break;
917 case PLDM_BIOS_ATTR_TABLE:
918
919 if (BIOSStringTable.isEmpty())
920 {
921 rc = PLDM_BIOS_TABLE_UNAVAILABLE;
922 }
923 else
924 {
925 response = getBIOSAttributeTable(
926 BIOSAttributeTable, BIOSStringTable, transferHandle,
927 transferOpFlag, request->hdr.instance_id, biosJsonDir);
928 }
929 break;
930 case PLDM_BIOS_ATTR_VAL_TABLE:
Carol Wangf7d1a362019-11-18 15:34:14 +0800931 if (BIOSAttributeTable.isEmpty() || BIOSStringTable.isEmpty())
Sampa Misrab37be312019-07-03 02:26:41 -0500932 {
933 rc = PLDM_BIOS_TABLE_UNAVAILABLE;
934 }
935 else
936 {
937 response = getBIOSAttributeValueTable(
938 BIOSAttributeValueTable, BIOSAttributeTable,
939 BIOSStringTable, transferHandle, transferOpFlag,
John Wang3ad21752019-10-06 16:42:21 +0800940 request->hdr.instance_id);
Sampa Misrab37be312019-07-03 02:26:41 -0500941 }
942 break;
943 default:
944 rc = PLDM_INVALID_BIOS_TABLE_TYPE;
945 break;
946 }
947 }
948
949 if (rc != PLDM_SUCCESS)
950 {
951 uint32_t nxtTransferHandle{};
952 uint8_t transferFlag{};
953 size_t respPayloadLength{};
954
955 encode_get_bios_table_resp(request->hdr.instance_id, rc,
956 nxtTransferHandle, transferFlag, nullptr,
957 respPayloadLength, responsePtr);
958 }
959
960 return response;
961}
962
963} // end namespace internal
964} // namespace bios
965
Sampa Misra032bd502019-03-06 05:03:22 -0600966} // namespace responder
967} // namespace pldm