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