1 #include <unistd.h>
2 
3 #include <attn_logging.hpp>
4 #include <phosphor-logging/log.hpp>
5 
6 namespace attn
7 {
8 
9 /** @brief journal entry of type INFO using phosphor logging */
10 template <>
11 void trace<INFO>(const char* i_message)
12 {
13     phosphor::logging::log<phosphor::logging::level::INFO>(i_message);
14 }
15 
16 /** @brief add an event to the log for PEL generation */
17 void event(EventType i_event, std::map<std::string, std::string>& i_additional)
18 {
19     bool eventValid = false; // assume no event created
20 
21     std::string eventName;
22 
23     switch (i_event)
24     {
25         case EventType::Checkstop:
26             eventName  = "org.open_power.HwDiags.Error.Checkstop";
27             eventValid = true;
28             break;
29         case EventType::Terminate:
30             eventName  = "org.open_power.Attn.Error.Terminate";
31             eventValid = true;
32             break;
33         case EventType::Vital:
34             eventName  = "org.open_power.Attn.Error.Vital";
35             eventValid = true;
36             break;
37         case EventType::HwDiagsFail:
38             eventName  = "org.open_power.HwDiags.Error.Fail";
39             eventValid = true;
40             break;
41         case EventType::AttentionFail:
42             eventName  = "org.open_power.Attn.Error.Fail";
43             eventValid = true;
44             break;
45         default:
46             eventValid = false;
47             break;
48     }
49 
50     if (true == eventValid)
51     {
52         // Get access to logging interface and method for creating log
53         auto bus = sdbusplus::bus::new_default_system();
54 
55         // using direct create method (for additional data)
56         auto method = bus.new_method_call(
57             "xyz.openbmc_project.Logging", "/xyz/openbmc_project/logging",
58             "xyz.openbmc_project.Logging.Create", "Create");
59 
60         // attach additional data
61         method.append(eventName,
62                       "xyz.openbmc_project.Logging.Entry.Level.Error",
63                       i_additional);
64 
65         // log the event
66         auto reply = bus.call(method);
67     }
68 }
69 
70 /** @brief commit checkstop event to log */
71 void eventCheckstop(std::map<std::string, std::string>& i_errors)
72 {
73     std::map<std::string, std::string> additionalData;
74 
75     // TODO need multi-error/multi-callout stuff here
76 
77     // if analyzer isolated errors
78     if (!(i_errors.empty()))
79     {
80         // FIXME TEMP CODE - begin
81 
82         std::string signature = i_errors.begin()->first;
83         std::string chip      = i_errors.begin()->second;
84 
85         additionalData["_PID"]      = std::to_string(getpid());
86         additionalData["SIGNATURE"] = signature;
87         additionalData["CHIP_ID"]   = chip;
88 
89         // FIXME TEMP CODE -end
90 
91         event(EventType::Checkstop, additionalData);
92     }
93 }
94 
95 /** @brief commit special attention TI event to log */
96 void eventTerminate()
97 {
98     std::map<std::string, std::string> additionalData;
99 
100     additionalData["_PID"] = std::to_string(getpid());
101 
102     event(EventType::Terminate, additionalData);
103 }
104 
105 /** @brief commit SBE vital event to log */
106 void eventVital()
107 {
108     std::map<std::string, std::string> additionalData;
109 
110     additionalData["_PID"] = std::to_string(getpid());
111 
112     event(EventType::Vital, additionalData);
113 }
114 
115 /** @brief commit analyzer failure event to log */
116 void eventHwDiagsFail(int i_error)
117 {
118     std::map<std::string, std::string> additionalData;
119 
120     additionalData["_PID"] = std::to_string(getpid());
121 
122     event(EventType::HwDiagsFail, additionalData);
123 }
124 
125 /** @brief commit attention handler failure event to log */
126 void eventAttentionFail(int i_error)
127 {
128     std::map<std::string, std::string> additionalData;
129 
130     additionalData["_PID"]       = std::to_string(getpid());
131     additionalData["ERROR_CODE"] = std::to_string(i_error);
132 
133     event(EventType::AttentionFail, additionalData);
134 }
135 
136 } // namespace attn
137