1f36466f4SZane Shelley #include <attn/attn_common.hpp> 2f36466f4SZane Shelley #include <attn/attn_dbus.hpp> 3f36466f4SZane Shelley #include <attn/attn_logging.hpp> 442260bc3SBen Tyner #include <util/dbus.hpp> 5bfa831a8Saustinfcui #include <util/trace.hpp> 6188f1096SBen Tyner 7188f1096SBen Tyner #include <string> 8188f1096SBen Tyner #include <vector> 9188f1096SBen Tyner 10188f1096SBen Tyner namespace attn 11188f1096SBen Tyner { 12188f1096SBen Tyner 135c5db65aSBen Tyner /** @brief Create a dbus method */ 14188f1096SBen Tyner int dbusMethod(const std::string& i_path, const std::string& i_interface, 15*e212fb06SPatrick Williams const std::string& i_function, sdbusplus::message_t& o_method) 16188f1096SBen Tyner { 174bbcb38fSBen Tyner int rc = RC_DBUS_ERROR; // assume error 18188f1096SBen Tyner 19188f1096SBen Tyner try 20188f1096SBen Tyner { 21188f1096SBen Tyner auto bus = sdbusplus::bus::new_system(); // using system dbus 22188f1096SBen Tyner 2342260bc3SBen Tyner // we need to find the service implementing the interface 2442260bc3SBen Tyner util::dbus::DBusService service; 25188f1096SBen Tyner 2642260bc3SBen Tyner if (0 == util::dbus::findService(i_interface, i_path, service)) 27188f1096SBen Tyner { 28188f1096SBen Tyner // return the method 29188f1096SBen Tyner o_method = 30188f1096SBen Tyner bus.new_method_call(service.c_str(), i_path.c_str(), 31a098210fSBen Tyner i_interface.c_str(), i_function.c_str()); 3242260bc3SBen Tyner 334bbcb38fSBen Tyner rc = RC_SUCCESS; 34188f1096SBen Tyner } 35188f1096SBen Tyner else 36188f1096SBen Tyner { 376764d70eSBen Tyner // This trace will be picked up in event log 38bfa831a8Saustinfcui trace::inf("dbusMethod service not found"); 39bfa831a8Saustinfcui trace::inf(i_path.c_str()); 40bfa831a8Saustinfcui trace::inf(i_interface.c_str()); 41188f1096SBen Tyner } 42188f1096SBen Tyner } 43188f1096SBen Tyner catch (const sdbusplus::exception::SdBusError& e) 44188f1096SBen Tyner { 45bfa831a8Saustinfcui trace::err("dbusMethod exception"); 46bfa831a8Saustinfcui trace::err(e.what()); 47188f1096SBen Tyner } 48188f1096SBen Tyner 49188f1096SBen Tyner return rc; 50188f1096SBen Tyner } 51188f1096SBen Tyner 52188f1096SBen Tyner /** @brief Create a PEL from raw PEL data */ 53188f1096SBen Tyner void createPelRaw(const std::vector<uint8_t>& i_buffer) 54188f1096SBen Tyner { 55188f1096SBen Tyner // Create FFDC file from buffer data 56188f1096SBen Tyner util::FFDCFile pelFile{util::FFDCFormat::Text}; 57188f1096SBen Tyner auto fd = pelFile.getFileDescriptor(); 58188f1096SBen Tyner 59188f1096SBen Tyner auto filePath = pelFile.getPath(); // path to ffdc file 60188f1096SBen Tyner 61d700609cSBen Tyner size_t numBytes = write(fd, i_buffer.data(), i_buffer.size()); 62d700609cSBen Tyner if (i_buffer.size() != numBytes) 63d700609cSBen Tyner { 64bfa831a8Saustinfcui trace::err("%s only %u of %u bytes written", filePath.c_str(), numBytes, 65bfa831a8Saustinfcui i_buffer.size()); 66d700609cSBen Tyner } 67d700609cSBen Tyner 68d700609cSBen Tyner lseek(fd, 0, SEEK_SET); 69d700609cSBen Tyner 70188f1096SBen Tyner // Additional data for log 71188f1096SBen Tyner std::map<std::string, std::string> additional; 72188f1096SBen Tyner additional.emplace("RAWPEL", filePath.string()); 73188f1096SBen Tyner additional.emplace("_PID", std::to_string(getpid())); 74188f1096SBen Tyner 75188f1096SBen Tyner // dbus specifics 76188f1096SBen Tyner constexpr auto interface = "xyz.openbmc_project.Logging.Create"; 77188f1096SBen Tyner constexpr auto function = "Create"; 78188f1096SBen Tyner 79*e212fb06SPatrick Williams sdbusplus::message_t method; 80188f1096SBen Tyner 81188f1096SBen Tyner if (0 == dbusMethod(pathLogging, interface, function, method)) 82188f1096SBen Tyner { 83188f1096SBen Tyner try 84188f1096SBen Tyner { 85188f1096SBen Tyner // append additional dbus call parameters 86188f1096SBen Tyner method.append(eventPelTerminate, levelPelError, additional); 87188f1096SBen Tyner 88188f1096SBen Tyner // using system dbus, no reply 89188f1096SBen Tyner auto bus = sdbusplus::bus::new_system(); 90188f1096SBen Tyner bus.call_noreply(method); 91188f1096SBen Tyner } 92188f1096SBen Tyner catch (const sdbusplus::exception::SdBusError& e) 93188f1096SBen Tyner { 94bfa831a8Saustinfcui trace::err("createPelRaw exception"); 95bfa831a8Saustinfcui trace::err(e.what()); 96188f1096SBen Tyner } 97188f1096SBen Tyner } 98188f1096SBen Tyner } 99188f1096SBen Tyner 100188f1096SBen Tyner /** @brief Get file descriptor of exisitng PEL */ 101188f1096SBen Tyner int getPel(const uint32_t i_pelId) 102188f1096SBen Tyner { 103188f1096SBen Tyner // GetPEL returns file descriptor (int) 104188f1096SBen Tyner int fd = -1; 105188f1096SBen Tyner 106188f1096SBen Tyner // dbus specifics 107188f1096SBen Tyner constexpr auto interface = "org.open_power.Logging.PEL"; 108188f1096SBen Tyner constexpr auto function = "GetPEL"; 109188f1096SBen Tyner 110*e212fb06SPatrick Williams sdbusplus::message_t method; 111188f1096SBen Tyner 112188f1096SBen Tyner if (0 == dbusMethod(pathLogging, interface, function, method)) 113188f1096SBen Tyner { 114188f1096SBen Tyner try 115188f1096SBen Tyner { 116188f1096SBen Tyner // additional dbus call parameters 117188f1096SBen Tyner method.append(i_pelId); 118188f1096SBen Tyner 119188f1096SBen Tyner // using system dbus 120188f1096SBen Tyner auto bus = sdbusplus::bus::new_system(); 121188f1096SBen Tyner auto response = bus.call(method); 122188f1096SBen Tyner 123188f1096SBen Tyner // reply will be a unix file descriptor 124188f1096SBen Tyner sdbusplus::message::unix_fd reply; 125188f1096SBen Tyner 1264bbcb38fSBen Tyner // parse dbus response into reply 127188f1096SBen Tyner response.read(reply); 128188f1096SBen Tyner 129188f1096SBen Tyner fd = dup(reply); // need to copy (dup) the file descriptor 130188f1096SBen Tyner } 131188f1096SBen Tyner catch (const sdbusplus::exception::SdBusError& e) 132188f1096SBen Tyner { 133bfa831a8Saustinfcui trace::err("getPel exception"); 134bfa831a8Saustinfcui trace::err(e.what()); 135188f1096SBen Tyner } 136188f1096SBen Tyner } 137188f1096SBen Tyner 138188f1096SBen Tyner return fd; // file descriptor or -1 139188f1096SBen Tyner } 140188f1096SBen Tyner 141188f1096SBen Tyner } // namespace attn 142