xref: /openbmc/phosphor-debug-collector/dump-extensions/openpower-dumps/op_dump_util.cpp (revision 973b291eb264ae8de4119c8d62fd16230926d257)
19e905375SDhruvaraj Subhashchandran #include "op_dump_util.hpp"
29e905375SDhruvaraj Subhashchandran 
31ddb006bSDhruvaraj Subhashchandran #include "dump_utils.hpp"
49e905375SDhruvaraj Subhashchandran #include "xyz/openbmc_project/Common/error.hpp"
59e905375SDhruvaraj Subhashchandran #include "xyz/openbmc_project/Dump/Create/error.hpp"
69e905375SDhruvaraj Subhashchandran 
79e905375SDhruvaraj Subhashchandran #include <unistd.h>
89e905375SDhruvaraj Subhashchandran 
99e905375SDhruvaraj Subhashchandran #include <phosphor-logging/elog-errors.hpp>
109e905375SDhruvaraj Subhashchandran #include <phosphor-logging/elog.hpp>
119e905375SDhruvaraj Subhashchandran #include <phosphor-logging/lg2.hpp>
129e905375SDhruvaraj Subhashchandran 
139e905375SDhruvaraj Subhashchandran #include <filesystem>
149e905375SDhruvaraj Subhashchandran 
159e905375SDhruvaraj Subhashchandran namespace openpower
169e905375SDhruvaraj Subhashchandran {
179e905375SDhruvaraj Subhashchandran namespace dump
189e905375SDhruvaraj Subhashchandran {
199e905375SDhruvaraj Subhashchandran namespace util
209e905375SDhruvaraj Subhashchandran {
219e905375SDhruvaraj Subhashchandran 
isOPDumpsEnabled(sdbusplus::bus_t & bus)228098ca6aSPatrick Williams bool isOPDumpsEnabled(sdbusplus::bus_t& bus)
239e905375SDhruvaraj Subhashchandran {
249e905375SDhruvaraj Subhashchandran     // Set isEnabled as true by default. In a field deployment, the system dump
259e905375SDhruvaraj Subhashchandran     // feature is usually enabled to facilitate effective debugging in the event
269e905375SDhruvaraj Subhashchandran     // of a failure. If due to some error, the settings service couldn't provide
279e905375SDhruvaraj Subhashchandran     // the actual value, the system assumes that the dump is enabled.
289e905375SDhruvaraj Subhashchandran     // This approach aligns with the principle of collecting as much data as
299e905375SDhruvaraj Subhashchandran     // possible for debugging in case of a system failure.
309e905375SDhruvaraj Subhashchandran     auto isEnabled = true;
319e905375SDhruvaraj Subhashchandran 
329e905375SDhruvaraj Subhashchandran     constexpr auto enable = "xyz.openbmc_project.Object.Enable";
339e905375SDhruvaraj Subhashchandran     constexpr auto policy = "/xyz/openbmc_project/dump/system_dump_policy";
349e905375SDhruvaraj Subhashchandran     constexpr auto property = "org.freedesktop.DBus.Properties";
359e905375SDhruvaraj Subhashchandran 
369e905375SDhruvaraj Subhashchandran     try
379e905375SDhruvaraj Subhashchandran     {
389e905375SDhruvaraj Subhashchandran         auto service = phosphor::dump::getService(bus, policy, enable);
399e905375SDhruvaraj Subhashchandran 
40*973b291eSPatrick Williams         auto method =
41*973b291eSPatrick Williams             bus.new_method_call(service.c_str(), policy, property, "Get");
429e905375SDhruvaraj Subhashchandran         method.append(enable, "Enabled");
439e905375SDhruvaraj Subhashchandran         auto reply = bus.call(method);
449e905375SDhruvaraj Subhashchandran         std::variant<bool> v;
459e905375SDhruvaraj Subhashchandran         reply.read(v);
469e905375SDhruvaraj Subhashchandran         isEnabled = std::get<bool>(v);
479e905375SDhruvaraj Subhashchandran     }
489e905375SDhruvaraj Subhashchandran     catch (const sdbusplus::exception::SdBusError& e)
499e905375SDhruvaraj Subhashchandran     {
509e905375SDhruvaraj Subhashchandran         lg2::error("Error: {ERROR} in getting dump policy, default is enabled",
519e905375SDhruvaraj Subhashchandran                    "ERROR", e);
529e905375SDhruvaraj Subhashchandran     }
539e905375SDhruvaraj Subhashchandran     return isEnabled;
549e905375SDhruvaraj Subhashchandran }
559e905375SDhruvaraj Subhashchandran 
readBIOSAttribute(const std::string & attrName,sdbusplus::bus_t & bus)561ddb006bSDhruvaraj Subhashchandran BIOSAttrValueType readBIOSAttribute(const std::string& attrName,
578098ca6aSPatrick Williams                                     sdbusplus::bus_t& bus)
581ddb006bSDhruvaraj Subhashchandran {
591ddb006bSDhruvaraj Subhashchandran     std::tuple<std::string, BIOSAttrValueType, BIOSAttrValueType> attrVal;
601ddb006bSDhruvaraj Subhashchandran     auto method = bus.new_method_call(
611ddb006bSDhruvaraj Subhashchandran         "xyz.openbmc_project.BIOSConfigManager",
621ddb006bSDhruvaraj Subhashchandran         "/xyz/openbmc_project/bios_config/manager",
631ddb006bSDhruvaraj Subhashchandran         "xyz.openbmc_project.BIOSConfig.Manager", "GetAttribute");
641ddb006bSDhruvaraj Subhashchandran     method.append(attrName);
651ddb006bSDhruvaraj Subhashchandran     try
661ddb006bSDhruvaraj Subhashchandran     {
671ddb006bSDhruvaraj Subhashchandran         auto result = bus.call(method);
681ddb006bSDhruvaraj Subhashchandran         result.read(std::get<0>(attrVal), std::get<1>(attrVal),
691ddb006bSDhruvaraj Subhashchandran                     std::get<2>(attrVal));
701ddb006bSDhruvaraj Subhashchandran     }
711ddb006bSDhruvaraj Subhashchandran     catch (const sdbusplus::exception::SdBusError& e)
721ddb006bSDhruvaraj Subhashchandran     {
731ddb006bSDhruvaraj Subhashchandran         lg2::error("Failed to read BIOS Attribute: {ATTRIBUTE_NAME}",
741ddb006bSDhruvaraj Subhashchandran                    "ATTRIBUTE_NAME", attrName);
751ddb006bSDhruvaraj Subhashchandran         throw;
761ddb006bSDhruvaraj Subhashchandran     }
771ddb006bSDhruvaraj Subhashchandran     return std::get<1>(attrVal);
781ddb006bSDhruvaraj Subhashchandran }
791ddb006bSDhruvaraj Subhashchandran 
isSystemDumpInProgress(sdbusplus::bus_t & bus)808098ca6aSPatrick Williams bool isSystemDumpInProgress(sdbusplus::bus_t& bus)
811ddb006bSDhruvaraj Subhashchandran {
821ddb006bSDhruvaraj Subhashchandran     try
831ddb006bSDhruvaraj Subhashchandran     {
841ddb006bSDhruvaraj Subhashchandran         auto dumpInProgress = std::get<std::string>(
85a72daf5cSDhruvaraj Subhashchandran             readBIOSAttribute("pvm_sys_dump_active", bus));
861ddb006bSDhruvaraj Subhashchandran         if (dumpInProgress == "Enabled")
871ddb006bSDhruvaraj Subhashchandran         {
881ddb006bSDhruvaraj Subhashchandran             lg2::info("A system dump is already in progress");
891ddb006bSDhruvaraj Subhashchandran             return true;
901ddb006bSDhruvaraj Subhashchandran         }
911ddb006bSDhruvaraj Subhashchandran     }
921ddb006bSDhruvaraj Subhashchandran     catch (const std::bad_variant_access& ex)
931ddb006bSDhruvaraj Subhashchandran     {
941ddb006bSDhruvaraj Subhashchandran         lg2::error("Failed to read pvm_sys_dump_active property value due "
951ddb006bSDhruvaraj Subhashchandran                    "to bad variant access error:{ERROR}",
961ddb006bSDhruvaraj Subhashchandran                    "ERROR", ex);
971ddb006bSDhruvaraj Subhashchandran         return false;
981ddb006bSDhruvaraj Subhashchandran     }
991ddb006bSDhruvaraj Subhashchandran     catch (const std::exception& ex)
1001ddb006bSDhruvaraj Subhashchandran     {
1011ddb006bSDhruvaraj Subhashchandran         lg2::error("Failed to read pvm_sys_dump_active error:{ERROR}", "ERROR",
1021ddb006bSDhruvaraj Subhashchandran                    ex);
1031ddb006bSDhruvaraj Subhashchandran         return false;
1041ddb006bSDhruvaraj Subhashchandran     }
1051ddb006bSDhruvaraj Subhashchandran 
1061ddb006bSDhruvaraj Subhashchandran     lg2::info("Another system dump is not in progress");
1071ddb006bSDhruvaraj Subhashchandran     return false;
1081ddb006bSDhruvaraj Subhashchandran }
1091ddb006bSDhruvaraj Subhashchandran 
1109e905375SDhruvaraj Subhashchandran } // namespace util
1119e905375SDhruvaraj Subhashchandran } // namespace dump
1129e905375SDhruvaraj Subhashchandran } // namespace openpower
113