103c1d915SMatt Spinler #include "user_header.hpp"
203c1d915SMatt Spinler 
31a94cc38SMatt Spinler #include "pel_types.hpp"
4fdb6a202SMatt Spinler #include "severity.hpp"
51a94cc38SMatt Spinler 
603c1d915SMatt Spinler #include <phosphor-logging/log.hpp>
703c1d915SMatt Spinler 
803c1d915SMatt Spinler namespace openpower
903c1d915SMatt Spinler {
1003c1d915SMatt Spinler namespace pels
1103c1d915SMatt Spinler {
1203c1d915SMatt Spinler 
1303c1d915SMatt Spinler using namespace phosphor::logging;
1403c1d915SMatt Spinler 
15cf5a8d0fSMatt Spinler void UserHeader::unflatten(Stream& stream)
1603c1d915SMatt Spinler {
17cf5a8d0fSMatt Spinler     stream >> _header >> _eventSubsystem >> _eventScope >> _eventSeverity >>
18cf5a8d0fSMatt Spinler         _eventType >> _reserved4Byte1 >> _problemDomain >> _problemVector >>
19cf5a8d0fSMatt Spinler         _actionFlags >> _reserved4Byte2;
2003c1d915SMatt Spinler }
2103c1d915SMatt Spinler 
22cf5a8d0fSMatt Spinler void UserHeader::flatten(Stream& stream)
2303c1d915SMatt Spinler {
24cf5a8d0fSMatt Spinler     stream << _header << _eventSubsystem << _eventScope << _eventSeverity
25cf5a8d0fSMatt Spinler            << _eventType << _reserved4Byte1 << _problemDomain << _problemVector
26cf5a8d0fSMatt Spinler            << _actionFlags << _reserved4Byte2;
2703c1d915SMatt Spinler }
2803c1d915SMatt Spinler 
29fdb6a202SMatt Spinler UserHeader::UserHeader(const message::Entry& entry,
30fdb6a202SMatt Spinler                        phosphor::logging::Entry::Level severity)
31fdb6a202SMatt Spinler {
32fdb6a202SMatt Spinler     _header.id = static_cast<uint16_t>(SectionID::userHeader);
33fdb6a202SMatt Spinler     _header.size = UserHeader::flattenedSize();
34fdb6a202SMatt Spinler     _header.version = userHeaderVersion;
35fdb6a202SMatt Spinler     _header.subType = 0;
36fdb6a202SMatt Spinler     _header.componentID = static_cast<uint16_t>(ComponentID::phosphorLogging);
37fdb6a202SMatt Spinler 
38fdb6a202SMatt Spinler     _eventSubsystem = entry.subsystem;
39fdb6a202SMatt Spinler 
40fdb6a202SMatt Spinler     _eventScope = entry.eventScope.value_or(
41fdb6a202SMatt Spinler         static_cast<uint8_t>(EventScope::entirePlatform));
42fdb6a202SMatt Spinler 
43fdb6a202SMatt Spinler     // Get the severity from the registry if it's there, otherwise get it
44fdb6a202SMatt Spinler     // from the OpenBMC event log severity value.
45fdb6a202SMatt Spinler     _eventSeverity =
46fdb6a202SMatt Spinler         entry.severity.value_or(convertOBMCSeverityToPEL(severity));
47fdb6a202SMatt Spinler 
48fdb6a202SMatt Spinler     // TODO: ibm-dev/dev/#1144 Handle manufacturing sev & action flags
49fdb6a202SMatt Spinler 
50fdb6a202SMatt Spinler     _eventType = entry.eventType.value_or(
51fdb6a202SMatt Spinler         static_cast<uint8_t>(EventType::notApplicable));
52fdb6a202SMatt Spinler 
53fdb6a202SMatt Spinler     _reserved4Byte1 = 0;
54fdb6a202SMatt Spinler 
55fdb6a202SMatt Spinler     // No uses for problem domain or vector
56fdb6a202SMatt Spinler     _problemDomain = 0;
57fdb6a202SMatt Spinler     _problemVector = 0;
58fdb6a202SMatt Spinler 
59*e07f915bSMatt Spinler     _actionFlags = entry.actionFlags.value_or(0);
60fdb6a202SMatt Spinler 
61fdb6a202SMatt Spinler     _reserved4Byte2 = 0;
62fdb6a202SMatt Spinler 
63fdb6a202SMatt Spinler     _valid = true;
64fdb6a202SMatt Spinler }
65fdb6a202SMatt Spinler 
6603c1d915SMatt Spinler UserHeader::UserHeader(Stream& pel)
6703c1d915SMatt Spinler {
6803c1d915SMatt Spinler     try
6903c1d915SMatt Spinler     {
70cf5a8d0fSMatt Spinler         unflatten(pel);
7103c1d915SMatt Spinler         validate();
7203c1d915SMatt Spinler     }
7303c1d915SMatt Spinler     catch (const std::exception& e)
7403c1d915SMatt Spinler     {
7503c1d915SMatt Spinler         log<level::ERR>("Cannot unflatten user header",
7603c1d915SMatt Spinler                         entry("ERROR=%s", e.what()));
7703c1d915SMatt Spinler         _valid = false;
7803c1d915SMatt Spinler     }
7903c1d915SMatt Spinler }
8003c1d915SMatt Spinler 
8103c1d915SMatt Spinler void UserHeader::validate()
8203c1d915SMatt Spinler {
8303c1d915SMatt Spinler     bool failed = false;
841a94cc38SMatt Spinler     if (header().id != static_cast<uint16_t>(SectionID::userHeader))
8503c1d915SMatt Spinler     {
8603c1d915SMatt Spinler         log<level::ERR>("Invalid user header section ID",
8703c1d915SMatt Spinler                         entry("ID=0x%X", header().id));
8803c1d915SMatt Spinler         failed = true;
8903c1d915SMatt Spinler     }
9003c1d915SMatt Spinler 
9103c1d915SMatt Spinler     if (header().version != userHeaderVersion)
9203c1d915SMatt Spinler     {
9303c1d915SMatt Spinler         log<level::ERR>("Invalid user header version",
9403c1d915SMatt Spinler                         entry("VERSION=0x%X", header().version));
9503c1d915SMatt Spinler         failed = true;
9603c1d915SMatt Spinler     }
9703c1d915SMatt Spinler 
9803c1d915SMatt Spinler     _valid = (failed) ? false : true;
9903c1d915SMatt Spinler }
10003c1d915SMatt Spinler 
10103c1d915SMatt Spinler } // namespace pels
10203c1d915SMatt Spinler } // namespace openpower
103