1 #include "file_io_type_progress_src.hpp" 2 3 #include "common/utils.hpp" 4 5 namespace pldm 6 { 7 8 namespace responder 9 { 10 11 int ProgressCodeHandler::setRawBootProperty( 12 const std::tuple<uint64_t, std::vector<uint8_t>>& progressCodeBuffer) 13 { 14 static constexpr auto RawObjectPath = 15 "/xyz/openbmc_project/state/boot/raw0"; 16 static constexpr auto RawInterface = "xyz.openbmc_project.State.Boot.Raw"; 17 static constexpr auto FreedesktopInterface = 18 "org.freedesktop.DBus.Properties"; 19 static constexpr auto RawProperty = "Value"; 20 static constexpr auto SetMethod = "Set"; 21 22 auto& bus = pldm::utils::DBusHandler::getBus(); 23 24 try 25 { 26 auto service = 27 pldm::utils::DBusHandler().getService(RawObjectPath, RawInterface); 28 auto method = bus.new_method_call(service.c_str(), RawObjectPath, 29 FreedesktopInterface, SetMethod); 30 method.append(RawInterface, RawProperty, 31 std::variant<std::tuple<uint64_t, std::vector<uint8_t>>>( 32 progressCodeBuffer)); 33 34 bus.call_noreply(method); 35 } 36 catch (const std::exception& e) 37 { 38 std::cerr << "failed to make a d-bus call to host-postd daemon, ERROR=" 39 << e.what() << "\n"; 40 return PLDM_ERROR; 41 } 42 43 return PLDM_SUCCESS; 44 } 45 46 int ProgressCodeHandler::write(const char* buffer, uint32_t /*offset*/, 47 uint32_t& length, 48 oem_platform::Handler* /*oemPlatformHandler*/) 49 { 50 static constexpr auto StartOffset = 40; 51 static constexpr auto EndOffset = 48; 52 if (buffer != nullptr) 53 { 54 // read the data from the pointed location 55 std::vector<uint8_t> secondaryCode(buffer, buffer + length); 56 57 // Get the primary code from the offset 40 bytes in the received buffer 58 59 std::vector<uint8_t> primaryCodeArray( 60 secondaryCode.begin() + StartOffset, 61 secondaryCode.begin() + EndOffset); 62 uint64_t primaryCode = 0; 63 64 // form a uint64_t using uint8_t[8] 65 for (int i = 0; i < 8; i++) 66 primaryCode |= (uint64_t)primaryCodeArray[i] << 8 * i; 67 68 return setRawBootProperty(std::make_tuple(primaryCode, secondaryCode)); 69 } 70 return PLDM_ERROR; 71 } 72 73 } // namespace responder 74 } // namespace pldm 75