xref: /openbmc/openpower-hw-diags/attn/attn_dbus.cpp (revision a0c724d3d425032213dbd48247d93cc76d61a331)
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 */
dbusMethod(const std::string & i_path,const std::string & i_interface,const std::string & i_function,sdbusplus::message_t & o_method)14188f1096SBen Tyner int dbusMethod(const std::string& i_path, const std::string& i_interface,
15e212fb06SPatrick 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
29*a0c724d3SPatrick Williams             o_method =
30*a0c724d3SPatrick Williams                 bus.new_method_call(service.c_str(), i_path.c_str(),
31*a0c724d3SPatrick Williams                                     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 */
createPelRaw(const std::vector<uint8_t> & i_buffer)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 
79e212fb06SPatrick 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 */
getPel(const uint32_t i_pelId)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 
110e212fb06SPatrick 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