blob: 558b0e3783d4569332073185659cd310e2688077 [file] [log] [blame]
Dhruvaraj Subhashchandranfef66a92020-09-06 13:10:59 -05001#include "config.h"
2
3#include "dump_manager_system.hpp"
4
Dhruvaraj Subhashchandran6a54d9a2020-12-17 22:24:37 -06005#include "dump_utils.hpp"
Dhruvaraj Subhashchandranad50d422022-01-18 05:54:02 -06006#include "op_dump_consts.hpp"
Dhruvaraj Subhashchandranfef66a92020-09-06 13:10:59 -05007#include "system_dump_entry.hpp"
Dhruvaraj Subhashchandran6ccb50e2020-10-29 09:33:18 -05008#include "xyz/openbmc_project/Common/error.hpp"
Dhruvaraj Subhashchandranfef66a92020-09-06 13:10:59 -05009
George Liu858fbb22021-07-01 12:25:44 +080010#include <fmt/core.h>
11
Dhruvaraj Subhashchandran6ccb50e2020-10-29 09:33:18 -050012#include <phosphor-logging/elog-errors.hpp>
Dhruvaraj Subhashchandranfef66a92020-09-06 13:10:59 -050013#include <phosphor-logging/elog.hpp>
14
Dhruvaraj Subhashchandran341d6832021-01-15 06:28:04 -060015namespace openpower
Dhruvaraj Subhashchandranfef66a92020-09-06 13:10:59 -050016{
17namespace dump
18{
19namespace system
20{
21
22using namespace phosphor::logging;
Dhruvaraj Subhashchandran6ccb50e2020-10-29 09:33:18 -050023using namespace sdbusplus::xyz::openbmc_project::Common::Error;
Dhruvaraj Subhashchandranfef66a92020-09-06 13:10:59 -050024
Dhruvaraj Subhashchandranf37c5c32020-12-17 22:08:19 -060025void Manager::notify(uint32_t dumpId, uint64_t size)
Dhruvaraj Subhashchandranfef66a92020-09-06 13:10:59 -050026{
Dhruvaraj Subhashchandranfef66a92020-09-06 13:10:59 -050027 // Get the timestamp
Claire Weinanc0ab9d42022-08-17 23:01:07 -070028 uint64_t timeStamp =
29 std::chrono::duration_cast<std::chrono::microseconds>(
30 std::chrono::system_clock::now().time_since_epoch())
31 .count();
Dhruvaraj Subhashchandran6ccb50e2020-10-29 09:33:18 -050032
33 // System dump can get created due to a fault in server
34 // or by request from user. A system dump by fault is
35 // first reported here, but for a user requested dump an
36 // entry will be created first with invalid source id.
37 // Since there can be only one system dump creation at a time,
38 // if there is an entry with invalid sourceId update that.
39 for (auto& entry : entries)
40 {
Dhruvaraj Subhashchandran341d6832021-01-15 06:28:04 -060041 openpower::dump::system::Entry* sysEntry =
42 dynamic_cast<openpower::dump::system::Entry*>(entry.second.get());
Dhruvaraj Subhashchandran6ccb50e2020-10-29 09:33:18 -050043 if (sysEntry->sourceDumpId() == INVALID_SOURCE_ID)
44 {
Dhruvaraj Subhashchandrana6ab8062020-10-29 15:29:10 -050045 sysEntry->update(timeStamp, size, dumpId);
Dhruvaraj Subhashchandran6ccb50e2020-10-29 09:33:18 -050046 return;
47 }
48 }
49
Dhruvaraj Subhashchandranfef66a92020-09-06 13:10:59 -050050 // Get the id
51 auto id = lastEntryId + 1;
52 auto idString = std::to_string(id);
Jayanth Othayoth3fc6df42021-04-08 03:45:24 -050053 auto objPath = std::filesystem::path(baseEntryPath) / idString;
Dhruvaraj Subhashchandran6ccb50e2020-10-29 09:33:18 -050054
Asmitha Karunanithi74a1f392021-10-27 03:23:59 -050055 // TODO: Get the originator Id, Type from the persisted file.
56 // For now replacing it with null
Dhruvaraj Subhashchandran6ccb50e2020-10-29 09:33:18 -050057 try
58 {
59 entries.insert(std::make_pair(
Dhruvaraj Subhashchandrana6ab8062020-10-29 15:29:10 -050060 id, std::make_unique<system::Entry>(
61 bus, objPath.c_str(), id, timeStamp, size, dumpId,
Asmitha Karunanithi74a1f392021-10-27 03:23:59 -050062 phosphor::dump::OperationStatus::Completed, std::string(),
63 originatorTypes::Internal, *this)));
Dhruvaraj Subhashchandran6ccb50e2020-10-29 09:33:18 -050064 }
65 catch (const std::invalid_argument& e)
66 {
George Liu858fbb22021-07-01 12:25:44 +080067 log<level::ERR>(
68 fmt::format(
69 "Error in creating system dump entry, errormsg({}), "
70 "OBJECTPATH({}), ID({}), TIMESTAMP({}),SIZE({}), SOURCEID({})",
George Liu363af242021-07-16 17:52:36 +080071 e.what(), objPath.c_str(), id, timeStamp, size, dumpId)
George Liu858fbb22021-07-01 12:25:44 +080072 .c_str());
Dhruvaraj Subhashchandran6ccb50e2020-10-29 09:33:18 -050073 report<InternalFailure>();
74 return;
75 }
Dhruvaraj Subhashchandranfef66a92020-09-06 13:10:59 -050076 lastEntryId++;
Dhruvaraj Subhashchandran6ccb50e2020-10-29 09:33:18 -050077 return;
Dhruvaraj Subhashchandranfef66a92020-09-06 13:10:59 -050078}
79
Dhruvaraj Subhashchandran969f9a52020-10-30 01:42:39 -050080sdbusplus::message::object_path
Dhruvaraj Subhashchandranddc33662021-07-19 09:28:42 -050081 Manager::createDump(phosphor::dump::DumpCreateParams params)
Dhruvaraj Subhashchandran7040bce2020-09-16 00:50:19 -050082{
83 constexpr auto SYSTEMD_SERVICE = "org.freedesktop.systemd1";
84 constexpr auto SYSTEMD_OBJ_PATH = "/org/freedesktop/systemd1";
85 constexpr auto SYSTEMD_INTERFACE = "org.freedesktop.systemd1.Manager";
Andrew Geissler24e0c592021-01-19 16:47:27 -060086 constexpr auto DIAG_MOD_TARGET = "obmc-host-crash@0.target";
Dhruvaraj Subhashchandran969f9a52020-10-30 01:42:39 -050087
Asmitha Karunanithi74a1f392021-10-27 03:23:59 -050088 if (params.size() > CREATE_DUMP_MAX_PARAMS)
Dhruvaraj Subhashchandran969f9a52020-10-30 01:42:39 -050089 {
Asmitha Karunanithi74a1f392021-10-27 03:23:59 -050090 log<level::WARNING>(
91 "System dump accepts not more than 2 additional parameters");
Dhruvaraj Subhashchandran969f9a52020-10-30 01:42:39 -050092 }
93
Dhruvaraj Subhashchandran6a54d9a2020-12-17 22:24:37 -060094 using NotAllowed =
95 sdbusplus::xyz::openbmc_project::Common::Error::NotAllowed;
96 using Reason = xyz::openbmc_project::Common::NotAllowed::REASON;
97
98 // Allow creating system dump only when the host is up.
99 if (!phosphor::dump::isHostRunning())
100 {
101 elog<NotAllowed>(
102 Reason("System dump can be initiated only when the host is up"));
103 return std::string();
104 }
105
Asmitha Karunanithi74a1f392021-10-27 03:23:59 -0500106 // Get the originator id and type from params
107 std::string originatorId;
108 originatorTypes originatorType;
109
110 phosphor::dump::extractOriginatorProperties(params, originatorId,
111 originatorType);
112
Dhruvaraj Subhashchandran7040bce2020-09-16 00:50:19 -0500113 auto b = sdbusplus::bus::new_default();
114 auto method = bus.new_method_call(SYSTEMD_SERVICE, SYSTEMD_OBJ_PATH,
115 SYSTEMD_INTERFACE, "StartUnit");
116 method.append(DIAG_MOD_TARGET); // unit to activate
117 method.append("replace");
118 bus.call_noreply(method);
Dhruvaraj Subhashchandran6ccb50e2020-10-29 09:33:18 -0500119
120 auto id = lastEntryId + 1;
121 auto idString = std::to_string(id);
Jayanth Othayoth3fc6df42021-04-08 03:45:24 -0500122 auto objPath = std::filesystem::path(baseEntryPath) / idString;
Claire Weinanc0ab9d42022-08-17 23:01:07 -0700123 uint64_t timeStamp =
124 std::chrono::duration_cast<std::chrono::microseconds>(
125 std::chrono::system_clock::now().time_since_epoch())
126 .count();
Dhruvaraj Subhashchandran6ccb50e2020-10-29 09:33:18 -0500127
128 try
129 {
130 entries.insert(std::make_pair(
Dhruvaraj Subhashchandrana6ab8062020-10-29 15:29:10 -0500131 id, std::make_unique<system::Entry>(
132 bus, objPath.c_str(), id, timeStamp, 0, INVALID_SOURCE_ID,
Asmitha Karunanithi74a1f392021-10-27 03:23:59 -0500133 phosphor::dump::OperationStatus::InProgress, originatorId,
134 originatorType, *this)));
Dhruvaraj Subhashchandran6ccb50e2020-10-29 09:33:18 -0500135 }
136 catch (const std::invalid_argument& e)
137 {
George Liu858fbb22021-07-01 12:25:44 +0800138 log<level::ERR>(
139 fmt::format("Error in creating system dump entry, errormsg({}), "
140 "OBJECTPATH({}), ID({})",
George Liu363af242021-07-16 17:52:36 +0800141 e.what(), objPath.c_str(), id)
George Liu858fbb22021-07-01 12:25:44 +0800142 .c_str());
Dhruvaraj Subhashchandran6ccb50e2020-10-29 09:33:18 -0500143 elog<InternalFailure>();
144 return std::string();
145 }
146 lastEntryId++;
147 return objPath.string();
Dhruvaraj Subhashchandran7040bce2020-09-16 00:50:19 -0500148}
149
Dhruvaraj Subhashchandranfef66a92020-09-06 13:10:59 -0500150} // namespace system
151} // namespace dump
Dhruvaraj Subhashchandran341d6832021-01-15 06:28:04 -0600152} // namespace openpower