Patrick Venture | 0b02be9 | 2018-08-31 11:55:55 -0700 | [diff] [blame] | 1 | #include "error-HostEvent.hpp" |
Patrick Venture | 46470a3 | 2018-09-07 19:26:25 -0700 | [diff] [blame] | 2 | #include "sensorhandler.hpp" |
| 3 | #include "storagehandler.hpp" |
Patrick Venture | 0b02be9 | 2018-08-31 11:55:55 -0700 | [diff] [blame] | 4 | |
Patrick Venture | 0b02be9 | 2018-08-31 11:55:55 -0700 | [diff] [blame] | 5 | #include <systemd/sd-bus.h> |
| 6 | |
Patrick Williams | fbc6c9d | 2023-05-10 07:50:16 -0500 | [diff] [blame] | 7 | #include <ipmid/api.hpp> |
| 8 | #include <ipmid/types.hpp> |
Patrick Williams | 6856f1b | 2023-09-01 16:10:07 -0500 | [diff] [blame] | 9 | #include <phosphor-logging/elog-errors.hpp> |
Patrick Williams | fbc6c9d | 2023-05-10 07:50:16 -0500 | [diff] [blame] | 10 | #include <phosphor-logging/elog.hpp> |
George Liu | 9ceeafb | 2024-07-19 09:22:15 +0800 | [diff] [blame] | 11 | #include <phosphor-logging/lg2.hpp> |
Patrick Williams | fbc6c9d | 2023-05-10 07:50:16 -0500 | [diff] [blame] | 12 | #include <xyz/openbmc_project/Logging/Entry/server.hpp> |
| 13 | |
Patrick Venture | 0b02be9 | 2018-08-31 11:55:55 -0700 | [diff] [blame] | 14 | #include <algorithm> |
Chris Austen | 41a4b31 | 2015-10-25 03:45:42 -0500 | [diff] [blame] | 15 | #include <cstdlib> |
| 16 | #include <cstring> |
| 17 | #include <fstream> |
| 18 | #include <iostream> |
Chris Austen | 41a4b31 | 2015-10-25 03:45:42 -0500 | [diff] [blame] | 19 | #include <memory> |
Patrick Venture | 0b02be9 | 2018-08-31 11:55:55 -0700 | [diff] [blame] | 20 | #include <vector> |
Patrick Venture | 0b02be9 | 2018-08-31 11:55:55 -0700 | [diff] [blame] | 21 | |
Chris Austen | 41a4b31 | 2015-10-25 03:45:42 -0500 | [diff] [blame] | 22 | using namespace std; |
Adriana Kobylak | 2efb3e7 | 2017-02-06 21:43:59 -0600 | [diff] [blame] | 23 | using namespace phosphor::logging; |
Willy Tu | 523e2d1 | 2023-09-05 11:36:48 -0700 | [diff] [blame] | 24 | using namespace sdbusplus::server::xyz::openbmc_project::logging; |
Tom Joseph | e19540e | 2019-02-04 14:06:58 +0530 | [diff] [blame] | 25 | |
Tom Joseph | b647d5b | 2017-10-31 17:25:33 +0530 | [diff] [blame] | 26 | std::string readESEL(const char* fileName) |
| 27 | { |
| 28 | std::string content; |
| 29 | std::ifstream handle(fileName); |
| 30 | |
| 31 | if (handle.fail()) |
| 32 | { |
George Liu | 9ceeafb | 2024-07-19 09:22:15 +0800 | [diff] [blame] | 33 | lg2::error("Failed to open eSEL, file name: {FILENAME}", "FILENAME", |
| 34 | fileName); |
Tom Joseph | b647d5b | 2017-10-31 17:25:33 +0530 | [diff] [blame] | 35 | return content; |
| 36 | } |
| 37 | |
| 38 | handle.seekg(0, std::ios::end); |
| 39 | content.resize(handle.tellg()); |
| 40 | handle.seekg(0, std::ios::beg); |
| 41 | handle.read(&content[0], content.size()); |
| 42 | handle.close(); |
| 43 | |
| 44 | return content; |
| 45 | } |
| 46 | |
| 47 | void createProcedureLogEntry(uint8_t procedureNum) |
| 48 | { |
| 49 | // Read the eSEL data from the file. |
| 50 | static constexpr auto eSELFile = "/tmp/esel"; |
| 51 | auto eSELData = readESEL(eSELFile); |
| 52 | |
| 53 | // Each byte in eSEL is formatted as %02x with a space between bytes and |
| 54 | // insert '/0' at the end of the character array. |
| 55 | static constexpr auto byteSeparator = 3; |
Patrick Venture | 0b02be9 | 2018-08-31 11:55:55 -0700 | [diff] [blame] | 56 | std::unique_ptr<char[]> data( |
| 57 | new char[(eSELData.size() * byteSeparator) + 1]()); |
Tom Joseph | b647d5b | 2017-10-31 17:25:33 +0530 | [diff] [blame] | 58 | |
| 59 | for (size_t i = 0; i < eSELData.size(); i++) |
| 60 | { |
| 61 | sprintf(&data[i * byteSeparator], "%02x ", eSELData[i]); |
| 62 | } |
| 63 | data[eSELData.size() * byteSeparator] = '\0'; |
| 64 | |
Willy Tu | 523e2d1 | 2023-09-05 11:36:48 -0700 | [diff] [blame] | 65 | using error = sdbusplus::error::org::open_power::host::MaintenanceProcedure; |
| 66 | using metadata = org::open_power::host::MaintenanceProcedure; |
Tom Joseph | b647d5b | 2017-10-31 17:25:33 +0530 | [diff] [blame] | 67 | |
| 68 | report<error>(metadata::ESEL(data.get()), |
| 69 | metadata::PROCEDURE(static_cast<uint32_t>(procedureNum))); |
| 70 | } |