blob: 7310dece035374f5b2253ecf9c49a2cd19580aad [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{
27
Dhruvaraj Subhashchandranfef66a92020-09-06 13:10:59 -050028 // Get the timestamp
Claire Weinanc0ab9d42022-08-17 23:01:07 -070029 uint64_t timeStamp =
30 std::chrono::duration_cast<std::chrono::microseconds>(
31 std::chrono::system_clock::now().time_since_epoch())
32 .count();
Dhruvaraj Subhashchandran6ccb50e2020-10-29 09:33:18 -050033
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 {
Dhruvaraj Subhashchandran341d6832021-01-15 06:28:04 -060042 openpower::dump::system::Entry* sysEntry =
43 dynamic_cast<openpower::dump::system::Entry*>(entry.second.get());
Dhruvaraj Subhashchandran6ccb50e2020-10-29 09:33:18 -050044 if (sysEntry->sourceDumpId() == INVALID_SOURCE_ID)
45 {
Dhruvaraj Subhashchandrana6ab8062020-10-29 15:29:10 -050046 sysEntry->update(timeStamp, size, dumpId);
Dhruvaraj Subhashchandran6ccb50e2020-10-29 09:33:18 -050047 return;
48 }
49 }
50
Dhruvaraj Subhashchandranfef66a92020-09-06 13:10:59 -050051 // Get the id
52 auto id = lastEntryId + 1;
53 auto idString = std::to_string(id);
Jayanth Othayoth3fc6df42021-04-08 03:45:24 -050054 auto objPath = std::filesystem::path(baseEntryPath) / idString;
Dhruvaraj Subhashchandran6ccb50e2020-10-29 09:33:18 -050055
56 try
57 {
58 entries.insert(std::make_pair(
Dhruvaraj Subhashchandrana6ab8062020-10-29 15:29:10 -050059 id, std::make_unique<system::Entry>(
60 bus, objPath.c_str(), id, timeStamp, size, dumpId,
61 phosphor::dump::OperationStatus::Completed, *this)));
Dhruvaraj Subhashchandran6ccb50e2020-10-29 09:33:18 -050062 }
63 catch (const std::invalid_argument& e)
64 {
George Liu858fbb22021-07-01 12:25:44 +080065 log<level::ERR>(
66 fmt::format(
67 "Error in creating system dump entry, errormsg({}), "
68 "OBJECTPATH({}), ID({}), TIMESTAMP({}),SIZE({}), SOURCEID({})",
George Liu363af242021-07-16 17:52:36 +080069 e.what(), objPath.c_str(), id, timeStamp, size, dumpId)
George Liu858fbb22021-07-01 12:25:44 +080070 .c_str());
Dhruvaraj Subhashchandran6ccb50e2020-10-29 09:33:18 -050071 report<InternalFailure>();
72 return;
73 }
Dhruvaraj Subhashchandranfef66a92020-09-06 13:10:59 -050074 lastEntryId++;
Dhruvaraj Subhashchandran6ccb50e2020-10-29 09:33:18 -050075 return;
Dhruvaraj Subhashchandranfef66a92020-09-06 13:10:59 -050076}
77
Dhruvaraj Subhashchandran969f9a52020-10-30 01:42:39 -050078sdbusplus::message::object_path
Dhruvaraj Subhashchandranddc33662021-07-19 09:28:42 -050079 Manager::createDump(phosphor::dump::DumpCreateParams params)
Dhruvaraj Subhashchandran7040bce2020-09-16 00:50:19 -050080{
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";
Andrew Geissler24e0c592021-01-19 16:47:27 -060084 constexpr auto DIAG_MOD_TARGET = "obmc-host-crash@0.target";
Dhruvaraj Subhashchandran969f9a52020-10-30 01:42:39 -050085
86 if (!params.empty())
87 {
88 log<level::WARNING>("System dump accepts no additional parameters");
89 }
90
Dhruvaraj Subhashchandran6a54d9a2020-12-17 22:24:37 -060091 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
Dhruvaraj Subhashchandran7040bce2020-09-16 00:50:19 -0500103 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);
Dhruvaraj Subhashchandran6ccb50e2020-10-29 09:33:18 -0500109
110 auto id = lastEntryId + 1;
111 auto idString = std::to_string(id);
Jayanth Othayoth3fc6df42021-04-08 03:45:24 -0500112 auto objPath = std::filesystem::path(baseEntryPath) / idString;
Claire Weinanc0ab9d42022-08-17 23:01:07 -0700113 uint64_t timeStamp =
114 std::chrono::duration_cast<std::chrono::microseconds>(
115 std::chrono::system_clock::now().time_since_epoch())
116 .count();
Dhruvaraj Subhashchandran6ccb50e2020-10-29 09:33:18 -0500117
118 try
119 {
120 entries.insert(std::make_pair(
Dhruvaraj Subhashchandrana6ab8062020-10-29 15:29:10 -0500121 id, std::make_unique<system::Entry>(
122 bus, objPath.c_str(), id, timeStamp, 0, INVALID_SOURCE_ID,
123 phosphor::dump::OperationStatus::InProgress, *this)));
Dhruvaraj Subhashchandran6ccb50e2020-10-29 09:33:18 -0500124 }
125 catch (const std::invalid_argument& e)
126 {
George Liu858fbb22021-07-01 12:25:44 +0800127 log<level::ERR>(
128 fmt::format("Error in creating system dump entry, errormsg({}), "
129 "OBJECTPATH({}), ID({})",
George Liu363af242021-07-16 17:52:36 +0800130 e.what(), objPath.c_str(), id)
George Liu858fbb22021-07-01 12:25:44 +0800131 .c_str());
Dhruvaraj Subhashchandran6ccb50e2020-10-29 09:33:18 -0500132 elog<InternalFailure>();
133 return std::string();
134 }
135 lastEntryId++;
136 return objPath.string();
Dhruvaraj Subhashchandran7040bce2020-09-16 00:50:19 -0500137}
138
Dhruvaraj Subhashchandranfef66a92020-09-06 13:10:59 -0500139} // namespace system
140} // namespace dump
Dhruvaraj Subhashchandran341d6832021-01-15 06:28:04 -0600141} // namespace openpower