#include "config.h" #include "extensions/phal/create_pel.hpp" #include "extensions/phal/pdbg_utils.hpp" #include "registration.hpp" #include #include #include #include #include #include #include #include namespace openpower { namespace phal { using namespace phosphor::logging; void importDevtree() { namespace fs = std::filesystem; // check import data file is present auto path = fs::path(DEVTREE_EXP_FILE); if (!fs::exists(path)) { // No import data file skip devtree import return; } // Update PDBG_DTB value openpower::phal::setDevtreeEnv(); // Update PDATA_INFODB value openpower::phal::setPdataInfoDBEnv(); int status = 0; pid_t pid = fork(); if (pid == 0) { std::string cmd("/usr/bin/attributes "); cmd += "import "; cmd += DEVTREE_EXP_FILE; cmd += " 2>"; cmd += " /dev/null"; execl("/bin/sh", "sh", "-c", cmd.c_str(), 0); auto error = errno; log(std::format("Error occurred during attributes import " "execution, errno({})", error) .c_str()); } else if (pid > 0) { waitpid(pid, &status, 0); if (WEXITSTATUS(status)) { log("Failed to import attribute data"); openpower::pel::createPEL("org.open_power.PHAL.Error.devtreeSync"); return; } } else { log("fork() failed."); throw std::runtime_error("importDevtree: fork() failed."); } try { // Delete attribute data file once updated. if (fs::exists(path)) { // delete export data file fs::remove_all(path); } } catch (const fs::filesystem_error& e) { // Log message and continue. Data already applied successfully. log(std::format("File({}) delete failed Error:({})", DEVTREE_EXP_FILE, e.what()) .c_str()); } log("Successfully imported devtree attribute data"); } REGISTER_PROCEDURE("importDevtree", importDevtree) } // namespace phal } // namespace openpower