blob: 75f1828f70603a39f9f8c996dc2569cc5cf644b2 [file] [log] [blame]
Jayanth Othayothcf2da1b2021-07-29 03:15:20 -05001#include "config.h"
2
3#include "extensions/phal/create_pel.hpp"
4#include "extensions/phal/pdbg_utils.hpp"
5#include "registration.hpp"
6
7#include <fmt/format.h>
8#include <sys/wait.h>
9#include <unistd.h>
10
11#include <phosphor-logging/elog-errors.hpp>
12#include <phosphor-logging/elog.hpp>
13#include <phosphor-logging/log.hpp>
14#include <xyz/openbmc_project/Common/error.hpp>
15
16#include <filesystem>
17
18namespace openpower
19{
20namespace phal
21{
22
23using namespace phosphor::logging;
24
25void importDevtree()
26{
27 namespace fs = std::filesystem;
28
29 // check import data file is present
30 auto path = fs::path(DEVTREE_EXP_FILE);
31 if (!fs::exists(path))
32 {
33 // No import data file skip devtree import
34 return;
35 }
36
37 // Update PDBG_DTB value
38 openpower::phal::setDevtreeEnv();
39
40 int status = 0;
41 pid_t pid = fork();
42 if (pid == 0)
43 {
44 std::string cmd("/usr/bin/attributes ");
45 cmd += "import ";
46 cmd += DEVTREE_EXP_FILE;
47 execl("/bin/sh", "sh", "-c", cmd.c_str(), 0);
48
49 auto error = errno;
50 log<level::ERR>(fmt::format("Error occurred during attributes import "
51 "execution, errno({})",
52 error)
53 .c_str());
54 }
55 else if (pid > 0)
56 {
57 waitpid(pid, &status, 0);
58 if (WEXITSTATUS(status))
59 {
60 log<level::ERR>("Failed to import attribute data");
61 openpower::pel::createPEL("org.open_power.PHAL.Error.devtreeSync");
62 return;
63 }
64 }
65 else
66 {
67 log<level::ERR>("fork() failed.");
68 throw std::runtime_error("importDevtree: fork() failed.");
69 }
70
71 try
72 {
73 // Delete attribute data file once updated.
74 if (fs::exists(path))
75 {
76 // delete export data file
77 fs::remove_all(path);
78 }
79 }
80 catch (fs::filesystem_error& e)
81 { // Log message and continue. Data already applied successfully.
82 log<level::ERR>(fmt::format("File({}) delete failed Error:({})",
83 DEVTREE_EXP_FILE, e.what())
84 .c_str());
85 }
86
87 log<level::INFO>("Successfully imported devtree attribute data");
88}
89
90REGISTER_PROCEDURE("importDevtree", importDevtree)
91
92} // namespace phal
93} // namespace openpower