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