1 #include "config.h" 2 3 #include "dump_manager_system.hpp" 4 5 #include "dump_utils.hpp" 6 #include "op_dump_consts.hpp" 7 #include "system_dump_entry.hpp" 8 #include "xyz/openbmc_project/Common/error.hpp" 9 10 #include <fmt/core.h> 11 12 #include <phosphor-logging/elog-errors.hpp> 13 #include <phosphor-logging/elog.hpp> 14 15 namespace openpower 16 { 17 namespace dump 18 { 19 namespace system 20 { 21 22 using namespace phosphor::logging; 23 using namespace sdbusplus::xyz::openbmc_project::Common::Error; 24 25 void Manager::notify(uint32_t dumpId, uint64_t size) 26 { 27 28 // Get the timestamp 29 uint64_t timeStamp = 30 std::chrono::duration_cast<std::chrono::microseconds>( 31 std::chrono::system_clock::now().time_since_epoch()) 32 .count(); 33 34 // System dump can get created due to a fault in server 35 // or by request from user. A system dump by fault is 36 // first reported here, but for a user requested dump an 37 // entry will be created first with invalid source id. 38 // Since there can be only one system dump creation at a time, 39 // if there is an entry with invalid sourceId update that. 40 for (auto& entry : entries) 41 { 42 openpower::dump::system::Entry* sysEntry = 43 dynamic_cast<openpower::dump::system::Entry*>(entry.second.get()); 44 if (sysEntry->sourceDumpId() == INVALID_SOURCE_ID) 45 { 46 sysEntry->update(timeStamp, size, dumpId); 47 return; 48 } 49 } 50 51 // Get the id 52 auto id = lastEntryId + 1; 53 auto idString = std::to_string(id); 54 auto objPath = std::filesystem::path(baseEntryPath) / idString; 55 56 try 57 { 58 entries.insert(std::make_pair( 59 id, std::make_unique<system::Entry>( 60 bus, objPath.c_str(), id, timeStamp, size, dumpId, 61 phosphor::dump::OperationStatus::Completed, *this))); 62 } 63 catch (const std::invalid_argument& e) 64 { 65 log<level::ERR>( 66 fmt::format( 67 "Error in creating system dump entry, errormsg({}), " 68 "OBJECTPATH({}), ID({}), TIMESTAMP({}),SIZE({}), SOURCEID({})", 69 e.what(), objPath.c_str(), id, timeStamp, size, dumpId) 70 .c_str()); 71 report<InternalFailure>(); 72 return; 73 } 74 lastEntryId++; 75 return; 76 } 77 78 sdbusplus::message::object_path 79 Manager::createDump(phosphor::dump::DumpCreateParams params) 80 { 81 constexpr auto SYSTEMD_SERVICE = "org.freedesktop.systemd1"; 82 constexpr auto SYSTEMD_OBJ_PATH = "/org/freedesktop/systemd1"; 83 constexpr auto SYSTEMD_INTERFACE = "org.freedesktop.systemd1.Manager"; 84 constexpr auto DIAG_MOD_TARGET = "obmc-host-crash@0.target"; 85 86 if (!params.empty()) 87 { 88 log<level::WARNING>("System dump accepts no additional parameters"); 89 } 90 91 using NotAllowed = 92 sdbusplus::xyz::openbmc_project::Common::Error::NotAllowed; 93 using Reason = xyz::openbmc_project::Common::NotAllowed::REASON; 94 95 // Allow creating system dump only when the host is up. 96 if (!phosphor::dump::isHostRunning()) 97 { 98 elog<NotAllowed>( 99 Reason("System dump can be initiated only when the host is up")); 100 return std::string(); 101 } 102 103 auto b = sdbusplus::bus::new_default(); 104 auto method = bus.new_method_call(SYSTEMD_SERVICE, SYSTEMD_OBJ_PATH, 105 SYSTEMD_INTERFACE, "StartUnit"); 106 method.append(DIAG_MOD_TARGET); // unit to activate 107 method.append("replace"); 108 bus.call_noreply(method); 109 110 auto id = lastEntryId + 1; 111 auto idString = std::to_string(id); 112 auto objPath = std::filesystem::path(baseEntryPath) / idString; 113 uint64_t timeStamp = 114 std::chrono::duration_cast<std::chrono::microseconds>( 115 std::chrono::system_clock::now().time_since_epoch()) 116 .count(); 117 118 try 119 { 120 entries.insert(std::make_pair( 121 id, std::make_unique<system::Entry>( 122 bus, objPath.c_str(), id, timeStamp, 0, INVALID_SOURCE_ID, 123 phosphor::dump::OperationStatus::InProgress, *this))); 124 } 125 catch (const std::invalid_argument& e) 126 { 127 log<level::ERR>( 128 fmt::format("Error in creating system dump entry, errormsg({}), " 129 "OBJECTPATH({}), ID({})", 130 e.what(), objPath.c_str(), id) 131 .c_str()); 132 elog<InternalFailure>(); 133 return std::string(); 134 } 135 lastEntryId++; 136 return objPath.string(); 137 } 138 139 } // namespace system 140 } // namespace dump 141 } // namespace openpower 142