blob: fc546c434c711ebacc579501f4d1e25807fbce5f [file] [log] [blame]
Ben Tynerbcf65a82020-12-01 08:46:36 -06001#include <attn/attn_common.hpp>
Ben Tynerb797b3e2020-06-29 10:12:05 -05002#include <attn/attn_handler.hpp>
3#include <attn/attn_logging.hpp>
Ben Tynerf5210bb2021-01-05 12:58:10 -06004#include <attn/pel/pel_common.hpp>
Ben Tynerb797b3e2020-06-29 10:12:05 -05005#include <attn/ti_handler.hpp>
Ben Tyner9ae5ca42020-02-28 13:13:50 -06006#include <sdbusplus/bus.hpp>
Ben Tynerff17f962020-09-23 08:21:19 -05007#include <sdbusplus/exception.hpp>
Ben Tyner9ae5ca42020-02-28 13:13:50 -06008
Ben Tyner40717722020-09-23 09:43:20 -05009#include <iomanip>
10#include <iostream>
11
Ben Tyner9ae5ca42020-02-28 13:13:50 -060012namespace attn
13{
14
Ben Tyner8c5e4f42020-10-28 11:11:55 -050015/**
16 * @brief Determine if this is a HB or PHYP TI event
17 *
18 * Use the TI info data area to determine if this is either a HB or a PHYP
19 * TI event then handle the event.
20 *
Ben Tynerf5210bb2021-01-05 12:58:10 -060021 * @param i_tiDataArea pointer to the TI info data
Ben Tyner8c5e4f42020-10-28 11:11:55 -050022 */
Ben Tyner792f32f2020-06-02 08:50:47 -050023int tiHandler(TiDataArea* i_tiDataArea)
Ben Tyner9ae5ca42020-02-28 13:13:50 -060024{
Ben Tynere4f5dbe2020-10-19 07:19:33 -050025 int rc = RC_SUCCESS;
Ben Tyner9ae5ca42020-02-28 13:13:50 -060026
Ben Tyner8c5e4f42020-10-28 11:11:55 -050027 // check TI data area if it is available
Ben Tynere4f5dbe2020-10-19 07:19:33 -050028 if (nullptr != i_tiDataArea)
Ben Tyner792f32f2020-06-02 08:50:47 -050029 {
Ben Tyner8c5e4f42020-10-28 11:11:55 -050030 // HB v. PHYP TI logic: Only hosboot will fill in hbTerminateType
Ben Tyner8882c322021-02-05 12:13:21 -060031 // and it will be non-zero. Only hostboot will fill out source and
32 // it it will be non-zero. Only PHYP will fill in srcFormat and it
33 // will be non-zero.
Ben Tyner8c5e4f42020-10-28 11:11:55 -050034 if ((0 == i_tiDataArea->hbTerminateType) &&
35 (0 == i_tiDataArea->source) && (0 != i_tiDataArea->srcFormat))
Ben Tynere4f5dbe2020-10-19 07:19:33 -050036 {
Ben Tyner8c5e4f42020-10-28 11:11:55 -050037 handlePhypTi(i_tiDataArea);
Ben Tynere4f5dbe2020-10-19 07:19:33 -050038 }
39 else
40 {
Ben Tyner8c5e4f42020-10-28 11:11:55 -050041 handleHbTi(i_tiDataArea);
Ben Tynere4f5dbe2020-10-19 07:19:33 -050042 }
Ben Tyner8c5e4f42020-10-28 11:11:55 -050043 }
44 else
45 {
Ben Tyner29651ef2021-02-08 10:51:03 -060046 // TI data was not available This should not happen since we provide
47 // a default TI info in the case where get TI info was not successful.
Ben Tyner7a0dd542021-02-12 09:33:44 -060048 eventAttentionFail((int)AttnSection::tiHandler | ATTN_INFO_NULL);
Ben Tyner29651ef2021-02-08 10:51:03 -060049 rc = RC_NOT_HANDLED;
Ben Tynere4f5dbe2020-10-19 07:19:33 -050050 }
Ben Tyner40717722020-09-23 09:43:20 -050051
Ben Tyner8c5e4f42020-10-28 11:11:55 -050052 return rc;
53}
Ben Tynere4f5dbe2020-10-19 07:19:33 -050054
Ben Tyner8c5e4f42020-10-28 11:11:55 -050055/**
Ben Tyner8c5e4f42020-10-28 11:11:55 -050056 * @brief Handle a PHYP terminate immediate special attention
57 *
58 * The TI info data area will contain information pertaining to the TI
59 * condition. We will wither quiesce the host or initiate a MPIPL depending
60 * depending on the auto reboot configuration. We will also create a PEL which
61 * will contain the TI info data and FFDC data captured in the system journal.
62 *
63 * @param i_tiDataArea pointer to TI information filled in by hostboot
64 */
65void handlePhypTi(TiDataArea* i_tiDataArea)
66{
67 trace<level::INFO>("PHYP TI");
68
Ben Tyner8c5e4f42020-10-28 11:11:55 -050069 // gather additional data for PEL
70 std::map<std::string, std::string> tiAdditionalData;
Ben Tynere4f5dbe2020-10-19 07:19:33 -050071
Ben Tyner8c5e4f42020-10-28 11:11:55 -050072 if (nullptr != i_tiDataArea)
73 {
74 parsePhypOpalTiInfo(tiAdditionalData, i_tiDataArea);
Ben Tyner29651ef2021-02-08 10:51:03 -060075
76 tiAdditionalData["Subsystem"] =
77 std::to_string(static_cast<uint8_t>(pel::SubsystemID::hypervisor));
78
Ben Tyner9d4f91c2021-02-09 08:27:58 -060079 // Copy all ascii src chars to additional data
80 char srcChar[33]; // 32 ascii chars + null term
81 memcpy(srcChar, &(i_tiDataArea->asciiData0), 32);
82 srcChar[32] = 0;
Ben Tyner29651ef2021-02-08 10:51:03 -060083 tiAdditionalData["SrcAscii"] = std::string{srcChar};
84
85 // TI event
86 eventTerminate(tiAdditionalData, (char*)i_tiDataArea);
Ben Tyner8c5e4f42020-10-28 11:11:55 -050087 }
Ben Tyner29651ef2021-02-08 10:51:03 -060088 else
89 {
90 // TI data was not available This should not happen since we provide
91 // a default TI info in the case where get TI info was not successful.
Ben Tyner7a0dd542021-02-12 09:33:44 -060092 eventAttentionFail((int)AttnSection::handlePhypTi | ATTN_INFO_NULL);
Ben Tyner29651ef2021-02-08 10:51:03 -060093 }
Ben Tyner063f6bd2021-03-26 07:45:56 -050094
95 // We are finished creating the event log entries so transition host to
96 // the required state.
97 if (autoRebootEnabled())
98 {
99 // If autoreboot is enabled we will start crash (mpipl) mode target
100 transitionHost(HostState::Crash);
101 }
102 else
103 {
104 // If autoreboot is disabled we will quiesce the host
105 transitionHost(HostState::Quiesce);
106 }
Ben Tyner8c5e4f42020-10-28 11:11:55 -0500107}
108
109/**
110 * @brief Handle a hostboot terminate immediate special attention
111 *
112 * The TI info data area will contain information pertaining to the TI
113 * condition. The course of action to take regarding the host state will
114 * depend on the contents of the TI info data area. We will also create a
115 * PEL containing the TI info data and FFDC data captured in the system
116 * journal.
117 *
118 * @param i_tiDataArea pointer to TI information filled in by hostboot
119 */
120void handleHbTi(TiDataArea* i_tiDataArea)
121{
122 trace<level::INFO>("HB TI");
123
124 bool hbDumpRequested = true; // HB dump is common case
125 bool generatePel = true; // assume PEL will be created
126 bool terminateHost = true; // transition host state
127
128 // handle specific hostboot reason codes
129 if (nullptr != i_tiDataArea)
130 {
Ben Tyner8882c322021-02-05 12:13:21 -0600131 std::stringstream ss; // stream object for tracing
132 std::string strobj; // string object for tracing
Ben Tyner8c5e4f42020-10-28 11:11:55 -0500133
134 switch (i_tiDataArea->hbTerminateType)
135 {
136 case TI_WITH_PLID:
137 case TI_WITH_EID:
Ben Tyner8882c322021-02-05 12:13:21 -0600138
139 // trace this value
140 ss.str(std::string()); // empty the stream
141 ss.clear(); // clear the stream
142 ss << "TI with PLID/EID: " << std::hex << std::showbase
143 << std::setw(8) << std::setfill('0')
144 << be32toh(i_tiDataArea->asciiData1);
145 strobj = ss.str();
146 trace<level::INFO>(strobj.c_str());
147
148 // see if HB dump is requested
Ben Tyner8c5e4f42020-10-28 11:11:55 -0500149 if (0 == i_tiDataArea->hbDumpFlag)
150 {
151 hbDumpRequested = false; // no HB dump requested
152 }
153 break;
154 case TI_WITH_SRC:
Ben Tyner8882c322021-02-05 12:13:21 -0600155 // Reason code is byte 2 and 3 of 4 byte srcWord12HbWord0
156 uint16_t reasonCode = be32toh(i_tiDataArea->srcWord12HbWord0);
Ben Tyner8c5e4f42020-10-28 11:11:55 -0500157
Ben Tyner8882c322021-02-05 12:13:21 -0600158 // trace this value
159 ss.str(std::string()); // empty the stream
160 ss.clear(); // clear the stream
161 ss << "TI with SRC: " << std::hex << std::showbase
162 << std::setw(4) << std::setfill('0') << (int)reasonCode;
163 strobj = ss.str();
164 trace<level::INFO>(strobj.c_str());
Ben Tyner8c5e4f42020-10-28 11:11:55 -0500165
Ben Tyner8882c322021-02-05 12:13:21 -0600166 switch (reasonCode)
Ben Tyner8c5e4f42020-10-28 11:11:55 -0500167 {
168 case HB_SRC_SHUTDOWN_REQUEST:
169 trace<level::INFO>("shutdown request");
Ben Tyner8882c322021-02-05 12:13:21 -0600170 generatePel = false;
171 hbDumpRequested = false;
Ben Tyner8c5e4f42020-10-28 11:11:55 -0500172 break;
173 case HB_SRC_KEY_TRANSITION:
Ben Tyner8882c322021-02-05 12:13:21 -0600174 // Note: Should never see this so lets leave
175 // hbDumpRequested == true so we can figure out why
176 // we are here.
Ben Tyner8c5e4f42020-10-28 11:11:55 -0500177 trace<level::INFO>("key transition");
178 terminateHost = false;
179 break;
180 case HB_SRC_INSUFFICIENT_HW:
181 trace<level::INFO>("insufficient hardware");
182 break;
183 case HB_SRC_TPM_FAIL:
184 trace<level::INFO>("TPM fail");
185 break;
186 case HB_SRC_ROM_VERIFY:
187 trace<level::INFO>("ROM verify");
188 break;
189 case HB_SRC_EXT_MISMATCH:
190 trace<level::INFO>("EXT mismatch");
191 break;
192 case HB_SRC_ECC_UE:
193 trace<level::INFO>("ECC UE");
194 break;
195 case HB_SRC_UNSUPPORTED_MODE:
196 trace<level::INFO>("unsupported mode");
197 break;
198 case HB_SRC_UNSUPPORTED_SFCRANGE:
199 trace<level::INFO>("unsupported SFC range");
200 break;
201 case HB_SRC_PARTITION_TABLE:
202 trace<level::INFO>("partition table invalid");
203 break;
204 case HB_SRC_UNSUPPORTED_HARDWARE:
205 trace<level::INFO>("unsupported hardware");
206 break;
207 case HB_SRC_PNOR_CORRUPTION:
208 trace<level::INFO>("PNOR corruption");
209 break;
210 default:
211 trace<level::INFO>("reason: other");
212 }
213
214 break;
215 }
216 }
217
Ben Tyner8c5e4f42020-10-28 11:11:55 -0500218 // gather additional data for PEL
219 std::map<std::string, std::string> tiAdditionalData;
220
221 if (nullptr != i_tiDataArea)
222 {
223 parseHbTiInfo(tiAdditionalData, i_tiDataArea);
Ben Tyner29651ef2021-02-08 10:51:03 -0600224
225 if (true == generatePel)
226 {
227 tiAdditionalData["Subsystem"] = std::to_string(
228 static_cast<uint8_t>(pel::SubsystemID::hostboot));
229
Ben Tyner9d4f91c2021-02-09 08:27:58 -0600230 // Translate hex src value to ascii. This results in an 8 character
231 // SRC (hostboot SRC is 32 bits)
232 std::stringstream src;
Ben Tyner4bbcb382021-02-22 09:29:00 -0600233 src << std::setw(8) << std::setfill('0') << std::uppercase
234 << std::hex << be32toh(i_tiDataArea->srcWord12HbWord0);
Ben Tyner9d4f91c2021-02-09 08:27:58 -0600235 tiAdditionalData["SrcAscii"] = src.str();
Ben Tyner29651ef2021-02-08 10:51:03 -0600236
237 eventTerminate(tiAdditionalData, (char*)i_tiDataArea);
238 }
Ben Tyner8c5e4f42020-10-28 11:11:55 -0500239 }
Ben Tyner29651ef2021-02-08 10:51:03 -0600240 else
Ben Tyner8c5e4f42020-10-28 11:11:55 -0500241 {
Ben Tyner29651ef2021-02-08 10:51:03 -0600242 // TI data was not available This should not happen since we provide
243 // a default TI info in the case where get TI info was not successful.
Ben Tyner7a0dd542021-02-12 09:33:44 -0600244 eventAttentionFail((int)AttnSection::handleHbTi | ATTN_INFO_NULL);
Ben Tyner40717722020-09-23 09:43:20 -0500245 }
Ben Tyner063f6bd2021-03-26 07:45:56 -0500246
247 if (true == terminateHost)
248 {
249 // if hostboot dump is requested initiate dump
250 if (hbDumpRequested)
251 {
252 // Until HB dump support available just quiesce the host - once
253 // dump support is available the dump component will transition
254 // (ipl/halt) the host.
255 transitionHost(HostState::Quiesce);
256 }
257 else
258 {
259 // Quiese the host - when the host is quiesced it will either
260 // "halt" or IPL depending on autoreboot setting.
261 transitionHost(HostState::Quiesce);
262 }
263 }
Ben Tyner40717722020-09-23 09:43:20 -0500264}
265
266/** @brief Parse the TI info data area into map as PHYP/OPAL data */
267void parsePhypOpalTiInfo(std::map<std::string, std::string>& i_map,
268 TiDataArea* i_tiDataArea)
269{
Ben Tyner1c4b02e2020-11-09 14:00:29 -0600270 if (nullptr == i_tiDataArea)
271 {
272 return;
273 }
274
Ben Tyner40717722020-09-23 09:43:20 -0500275 std::stringstream ss;
276
Ben Tynerfeeea832021-04-06 10:08:11 -0500277 ss << "0x00 TI Area Valid:" << std::setw(2) << std::setfill('0') << std::hex
278 << (int)i_tiDataArea->tiAreaValid << ":";
279 ss << "0x01 Command:" << std::setw(2) << std::setfill('0') << std::hex
280 << (int)i_tiDataArea->command << ":";
281 ss << "0x02 Num. Data Bytes:" << std::setw(4) << std::setfill('0')
282 << std::hex << be16toh(i_tiDataArea->numDataBytes) << ":";
283 ss << "0x04 Reserved:" << std::setw(2) << std::setfill('0') << std::hex
284 << (int)i_tiDataArea->reserved1 << ":";
285 ss << "0x06 HWDump Type:" << std::setw(4) << std::setfill('0') << std::hex
286 << be16toh(i_tiDataArea->hardwareDumpType) << ":";
287 ss << "0x08 SRC Format:" << std::setw(2) << std::setfill('0') << std::hex
288 << (int)i_tiDataArea->srcFormat << ":";
289 ss << "0x09 SRC Flags:" << std::setw(2) << std::setfill('0') << std::hex
290 << (int)i_tiDataArea->srcFlags << ":";
291 ss << "0x0a Num. ASCII Words:" << std::setw(2) << std::setfill('0')
292 << std::hex << (int)i_tiDataArea->numAsciiWords << ":";
293 ss << "0x0b Num. Hex Words:" << std::setw(2) << std::setfill('0')
294 << std::hex << (int)i_tiDataArea->numHexWords << ":";
295 ss << "0x0e Length of SRC:" << std::setw(4) << std::setfill('0') << std::hex
296 << be16toh(i_tiDataArea->lenSrc) << ":";
297 ss << "0x10 SRC Word 12:" << std::setw(8) << std::setfill('0') << std::hex
298 << be32toh(i_tiDataArea->srcWord12HbWord0) << ":";
299 ss << "0x14 SRC Word 13:" << std::setw(8) << std::setfill('0') << std::hex
300 << be32toh(i_tiDataArea->srcWord13HbWord2) << ":";
301 ss << "0x18 SRC Word 14:" << std::setw(8) << std::setfill('0') << std::hex
302 << be32toh(i_tiDataArea->srcWord14HbWord3) << ":";
303 ss << "0x1c SRC Word 15:" << std::setw(8) << std::setfill('0') << std::hex
304 << be32toh(i_tiDataArea->srcWord15HbWord4) << ":";
305 ss << "0x20 SRC Word 16:" << std::setw(8) << std::setfill('0') << std::hex
306 << be32toh(i_tiDataArea->srcWord16HbWord5) << ":";
307 ss << "0x24 SRC Word 17:" << std::setw(8) << std::setfill('0') << std::hex
308 << be32toh(i_tiDataArea->srcWord17HbWord6) << ":";
309 ss << "0x28 SRC Word 18:" << std::setw(8) << std::setfill('0') << std::hex
310 << be32toh(i_tiDataArea->srcWord18HbWord7) << ":";
311 ss << "0x2c SRC Word 19:" << std::setw(8) << std::setfill('0') << std::hex
312 << be32toh(i_tiDataArea->srcWord19HbWord8) << ":";
313 ss << "0x30 ASCII Data:" << std::setw(8) << std::setfill('0') << std::hex
314 << be32toh(i_tiDataArea->asciiData0) << ":";
315 ss << "0x34 ASCII Data:" << std::setw(8) << std::setfill('0') << std::hex
316 << be32toh(i_tiDataArea->asciiData1) << ":";
317 ss << "0x38 ASCII Data:" << std::setw(8) << std::setfill('0') << std::hex
318 << be32toh(i_tiDataArea->asciiData2) << ":";
319 ss << "0x3c ASCII Data:" << std::setw(8) << std::setfill('0') << std::hex
320 << be32toh(i_tiDataArea->asciiData3) << ":";
321 ss << "0x40 ASCII Data:" << std::setw(8) << std::setfill('0') << std::hex
322 << be32toh(i_tiDataArea->asciiData4) << ":";
323 ss << "0x44 ASCII Data:" << std::setw(8) << std::setfill('0') << std::hex
324 << be32toh(i_tiDataArea->asciiData5) << ":";
325 ss << "0x48 ASCII Data:" << std::setw(8) << std::setfill('0') << std::hex
326 << be32toh(i_tiDataArea->asciiData6) << ":";
327 ss << "0x4c ASCII Data:" << std::setw(8) << std::setfill('0') << std::hex
328 << be32toh(i_tiDataArea->asciiData7) << ":";
329 ss << "0x50 Location:" << std::setw(2) << std::setfill('0') << std::hex
330 << (int)i_tiDataArea->location << ":";
331 ss << "0x51 Code Sections:" << std::setw(2) << std::setfill('0') << std::hex
332 << (int)i_tiDataArea->codeSection << ":";
333 ss << "0x52 Additional Size:" << std::setw(2) << std::setfill('0')
334 << std::hex << (int)i_tiDataArea->additionalSize << ":";
335 ss << "0x53 Additional Data:" << std::setw(2) << std::setfill('0')
336 << std::hex << (int)i_tiDataArea->andData;
Ben Tyner40717722020-09-23 09:43:20 -0500337
338 std::string key, value;
339 char delim = ':';
340
341 while (std::getline(ss, key, delim))
342 {
343 std::getline(ss, value, delim);
344 i_map[key] = value;
345 }
346}
347
348/** @brief Parse the TI info data area into map as hostboot data */
349void parseHbTiInfo(std::map<std::string, std::string>& i_map,
350 TiDataArea* i_tiDataArea)
351{
Ben Tyner1c4b02e2020-11-09 14:00:29 -0600352 if (nullptr == i_tiDataArea)
353 {
354 return;
355 }
356
Ben Tyner40717722020-09-23 09:43:20 -0500357 std::stringstream ss;
358
Ben Tynerfeeea832021-04-06 10:08:11 -0500359 ss << "0x00 TI Area Valid:" << std::setw(2) << std::setfill('0') << std::hex
360 << (int)i_tiDataArea->tiAreaValid << ":";
361 ss << "0x04 Reserved:" << std::setw(2) << std::setfill('0') << std::hex
362 << (int)i_tiDataArea->reserved1 << ":";
363 ss << "0x05 HB_Term. Type:" << std::setw(2) << std::setfill('0') << std::hex
364 << (int)i_tiDataArea->hbTerminateType << ":";
365 ss << "0x0c HB Dump Flag:" << std::setw(2) << std::setfill('0') << std::hex
366 << (int)i_tiDataArea->hbDumpFlag << ":";
367 ss << "0x0d Source:" << std::setw(2) << std::setfill('0') << std::hex
368 << (int)i_tiDataArea->source << ":";
369 ss << "0x10 HB Word 0:" << std::setw(8) << std::setfill('0') << std::hex
370 << be32toh(i_tiDataArea->srcWord12HbWord0) << ":";
371 ss << "0x14 HB Word 2:" << std::setw(8) << std::setfill('0') << std::hex
372 << be32toh(i_tiDataArea->srcWord13HbWord2) << ":";
373 ss << "0x18 HB Word 3:" << std::setw(8) << std::setfill('0') << std::hex
374 << be32toh(i_tiDataArea->srcWord14HbWord3) << ":";
375 ss << "0x1c HB Word 4:" << std::setw(8) << std::setfill('0') << std::hex
376 << be32toh(i_tiDataArea->srcWord15HbWord4) << ":";
377 ss << "0x20 HB Word 5:" << std::setw(8) << std::setfill('0') << std::hex
378 << be32toh(i_tiDataArea->srcWord16HbWord5) << ":";
379 ss << "0x24 HB Word 6:" << std::setw(8) << std::setfill('0') << std::hex
380 << be32toh(i_tiDataArea->srcWord17HbWord6) << ":";
381 ss << "0x28 HB Word 7:" << std::setw(8) << std::setfill('0') << std::hex
382 << be32toh(i_tiDataArea->srcWord18HbWord7) << ":";
383 ss << "0x2c HB Word 8:" << std::setw(8) << std::setfill('0') << std::hex
384 << be32toh(i_tiDataArea->srcWord19HbWord8) << ":";
385 ss << "0x30 error_data:" << std::setw(8) << std::setfill('0') << std::hex
386 << be32toh(i_tiDataArea->asciiData0) << ":";
387 ss << "0x34 EID:" << std::setw(8) << std::setfill('0') << std::hex
388 << be32toh(i_tiDataArea->asciiData1);
Ben Tyner40717722020-09-23 09:43:20 -0500389
390 std::string key, value;
391 char delim = ':';
392
393 while (std::getline(ss, key, delim))
394 {
395 std::getline(ss, value, delim);
396 i_map[key] = value;
397 }
398}
399
400/** @brief Read state of autoreboot propertyi via dbus */
Ben Tynerff17f962020-09-23 08:21:19 -0500401bool autoRebootEnabled()
402{
403 // Use dbus get-property interface to read the autoreboot property
404 auto bus = sdbusplus::bus::new_system();
405 auto method =
406 bus.new_method_call("xyz.openbmc_project.Settings",
407 "/xyz/openbmc_project/control/host0/auto_reboot",
408 "org.freedesktop.DBus.Properties", "Get");
Ben Tyner40717722020-09-23 09:43:20 -0500409
Ben Tynerff17f962020-09-23 08:21:19 -0500410 method.append("xyz.openbmc_project.Control.Boot.RebootPolicy",
411 "AutoReboot");
Ben Tyner40717722020-09-23 09:43:20 -0500412
Ben Tyner8c5e4f42020-10-28 11:11:55 -0500413 bool autoReboot = false; // assume autoreboot attribute not available
414
Ben Tynerff17f962020-09-23 08:21:19 -0500415 try
416 {
417 auto reply = bus.call(method);
Ben Tyner40717722020-09-23 09:43:20 -0500418
Ben Tynerff17f962020-09-23 08:21:19 -0500419 std::variant<bool> result;
420 reply.read(result);
Ben Tyner8c5e4f42020-10-28 11:11:55 -0500421 autoReboot = std::get<bool>(result);
Ben Tynerff17f962020-09-23 08:21:19 -0500422 }
Ben Tyner6764d702021-02-12 09:17:23 -0600423 catch (const sdbusplus::exception::SdBusError& e)
Ben Tynerff17f962020-09-23 08:21:19 -0500424 {
Ben Tyner6764d702021-02-12 09:17:23 -0600425 trace<level::INFO>("autoRebootEnbabled exception");
426 std::string traceMsg = std::string(e.what(), maxTraceLen);
427 trace<level::ERROR>(traceMsg.c_str());
Ben Tynerff17f962020-09-23 08:21:19 -0500428 }
Ben Tyner8c5e4f42020-10-28 11:11:55 -0500429
430 return autoReboot;
Ben Tynerff17f962020-09-23 08:21:19 -0500431}
Ben Tyner40717722020-09-23 09:43:20 -0500432
Ben Tyner9ae5ca42020-02-28 13:13:50 -0600433} // namespace attn