blob: 68226f16b7efc3a59311cac7c77e76592964a1e3 [file] [log] [blame]
Tom Joseph6b7a1432017-05-19 10:43:36 +05301#include <chrono>
2#include <vector>
3#include <phosphor-logging/elog-errors.hpp>
4#include "host-ipmid/ipmid-api.h"
5#include "xyz/openbmc_project/Common/error.hpp"
6#include "selutility.hpp"
7#include "types.hpp"
8#include "utils.hpp"
9
10extern const ipmi::sensor::InvObjectIDMap invSensors;
11using namespace phosphor::logging;
12using InternalFailure =
13 sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure;
14
15namespace ipmi
16{
17
18namespace sel
19{
20
21namespace internal
22{
23
24GetSELEntryResponse prepareSELEntry(
25 const std::string& objPath,
26 ipmi::sensor::InvObjectIDMap::const_iterator iter)
27{
28 ipmi::sel::GetSELEntryResponse record {};
29
30 sdbusplus::bus::bus bus{ipmid_get_sd_bus_connection()};
31 auto service = ipmi::getService(bus, logEntryIntf, objPath);
32
33 // Read all the log entry properties.
34 auto methodCall = bus.new_method_call(service.c_str(),
35 objPath.c_str(),
36 propIntf,
37 "GetAll");
38 methodCall.append(logEntryIntf);
39
40 auto reply = bus.call(methodCall);
41 if (reply.is_method_error())
42 {
43 log<level::ERR>("Error in reading logging property entries");
44 elog<InternalFailure>();
45 }
46
47 std::map<std::string, PropertyType> entryData;
48 reply.read(entryData);
49
50 // Read Id from the log entry.
51 static constexpr auto propId = "Id";
52 auto iterId = entryData.find(propId);
53 if (iterId == entryData.end())
54 {
55 log<level::ERR>("Error in reading Id of logging entry");
56 elog<InternalFailure>();
57 }
58
59 record.recordID = static_cast<uint16_t>(
60 sdbusplus::message::variant_ns::get<uint32_t>(iterId->second));
61
62 // Read Timestamp from the log entry.
63 static constexpr auto propTimeStamp = "Timestamp";
64 auto iterTimeStamp = entryData.find(propTimeStamp);
65 if (iterTimeStamp == entryData.end())
66 {
67 log<level::ERR>("Error in reading Timestamp of logging entry");
68 elog<InternalFailure>();
69 }
70
71 std::chrono::milliseconds chronoTimeStamp(
72 sdbusplus::message::variant_ns::get<uint64_t>
73 (iterTimeStamp->second));
74 record.timeStamp = static_cast<uint32_t>(std::chrono::duration_cast<
75 std::chrono::seconds>(chronoTimeStamp).count());
76
77 static constexpr auto systemEventRecord = 0x02;
78 static constexpr auto generatorID = 0x2000;
79 static constexpr auto eventMsgRevision = 0x04;
80
81 record.recordType = systemEventRecord;
82 record.generatorID = generatorID;
83 record.eventMsgRevision = eventMsgRevision;
84
85 record.sensorType = iter->second.sensorType;
86 record.sensorNum = iter->second.sensorID;
87 record.eventData1 = iter->second.eventOffset;
88
89 // Read Resolved from the log entry.
90 static constexpr auto propResolved = "Resolved";
91 auto iterResolved = entryData.find(propResolved);
92 if (iterResolved == entryData.end())
93 {
94 log<level::ERR>("Error in reading Resolved field of logging entry");
95 elog<InternalFailure>();
96 }
97
98 static constexpr auto deassertEvent = 0x80;
99
100 // Evaluate if the event is assertion or deassertion event
101 if (sdbusplus::message::variant_ns::get<bool>(iterResolved->second))
102 {
103 record.eventType = deassertEvent | iter->second.eventReadingType;
104 }
105 else
106 {
107 record.eventType = iter->second.eventReadingType;
108 }
109
110 return record;
111}
112
113} // namespace internal
114
115} // namespace sel
116
117} // namespace ipmi