summaryrefslogtreecommitdiffstats
path: root/extensions/openpower-pels/private_header.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'extensions/openpower-pels/private_header.cpp')
-rw-r--r--extensions/openpower-pels/private_header.cpp194
1 files changed, 194 insertions, 0 deletions
diff --git a/extensions/openpower-pels/private_header.cpp b/extensions/openpower-pels/private_header.cpp
new file mode 100644
index 0000000..1bf54ca
--- /dev/null
+++ b/extensions/openpower-pels/private_header.cpp
@@ -0,0 +1,194 @@
+/**
+ * Copyright © 2019 IBM Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "private_header.hpp"
+
+#include "json_utils.hpp"
+#include "log_id.hpp"
+#include "pel_types.hpp"
+#include "pel_values.hpp"
+
+#include <phosphor-logging/log.hpp>
+
+namespace openpower
+{
+namespace pels
+{
+
+namespace pv = openpower::pels::pel_values;
+using namespace phosphor::logging;
+
+PrivateHeader::PrivateHeader(uint16_t componentID, uint32_t obmcLogID,
+ uint64_t timestamp)
+{
+ _header.id = static_cast<uint16_t>(SectionID::privateHeader);
+ _header.size = PrivateHeader::flattenedSize();
+ _header.version = privateHeaderVersion;
+ _header.subType = 0;
+ _header.componentID = componentID;
+
+ _createTimestamp = getBCDTime(timestamp);
+
+ auto now = std::chrono::system_clock::now();
+ _commitTimestamp = getBCDTime(now);
+
+ _creatorID = static_cast<uint8_t>(CreatorID::openBMC);
+
+ // Add support for reminder and telemetry log types here if
+ // ever necessary.
+ _logType = 0;
+
+ _reservedByte = 0;
+
+ // the final section count will be updated later
+ _sectionCount = 1;
+
+ _obmcLogID = obmcLogID;
+
+ _id = generatePELID();
+
+ _plid = _id;
+
+ // Leave _creatorVersion at 0
+
+ _valid = true;
+}
+
+PrivateHeader::PrivateHeader(Stream& pel) :
+ _creatorID(0), _logType(0), _reservedByte(0), _sectionCount(0),
+ _obmcLogID(0), _plid(0), _id(0)
+{
+ try
+ {
+ unflatten(pel);
+ validate();
+ }
+ catch (const std::exception& e)
+ {
+ log<level::ERR>("Cannot unflatten private header",
+ entry("ERROR=%s", e.what()));
+ _valid = false;
+ }
+}
+std::optional<std::string> PrivateHeader::getJSON() const
+{
+ char tmpPhVal[50];
+ sprintf(tmpPhVal, "%02X/%02X/%02X%02X %02X:%02X:%02X",
+ _createTimestamp.month, _createTimestamp.day,
+ _createTimestamp.yearMSB, _createTimestamp.yearLSB,
+ _createTimestamp.hour, _createTimestamp.minutes,
+ _createTimestamp.seconds);
+ std::string phCreateTStr(tmpPhVal);
+ sprintf(tmpPhVal, "%02X/%02X/%02X%02X %02X:%02X:%02X",
+ _commitTimestamp.month, _commitTimestamp.day,
+ _createTimestamp.yearMSB, _commitTimestamp.yearLSB,
+ _commitTimestamp.hour, _commitTimestamp.minutes,
+ _commitTimestamp.seconds);
+ std::string phCommitTStr(tmpPhVal);
+ sprintf(tmpPhVal, "%c", _creatorID);
+ std::string creator(tmpPhVal);
+ creator = pv::creatorIDs.count(creator) ? pv::creatorIDs.at(creator)
+ : "Unknown CreatorID";
+ std::string phCreatorVersionStr =
+ std::string(reinterpret_cast<const char*>(_creatorVersion.version));
+
+ sprintf(tmpPhVal, "0x%X", _header.componentID);
+ std::string phCbStr(tmpPhVal);
+ sprintf(tmpPhVal, "%d", _header.subType);
+ std::string phStStr(tmpPhVal);
+ sprintf(tmpPhVal, "%d", privateHeaderVersion);
+ std::string phVerStr(tmpPhVal);
+ sprintf(tmpPhVal, "0x%X", _plid);
+ std::string phPlatformIDStr(tmpPhVal);
+ sprintf(tmpPhVal, "0x%X", _id);
+ std::string phLogEntryIDStr(tmpPhVal);
+ std::string phObmcIDStr = std::to_string(_obmcLogID);
+ std::string ph;
+ jsonInsert(ph, "Section Version", phVerStr, 1);
+ jsonInsert(ph, "Sub-section type", phStStr, 1);
+ jsonInsert(ph, "Created by", phCbStr, 1);
+ jsonInsert(ph, "Created at", phCreateTStr, 1);
+ jsonInsert(ph, "Committed at", phCommitTStr, 1);
+ jsonInsert(ph, "Creator Subsystem", creator, 1);
+ jsonInsert(ph, "CSSVER", phCreatorVersionStr, 1);
+ jsonInsert(ph, "Platform Log Id", phPlatformIDStr, 1);
+ jsonInsert(ph, "Entry Id", phLogEntryIDStr, 1);
+ jsonInsert(ph, "BMC Event Log Id", phObmcIDStr, 1);
+ ph.erase(ph.size() - 2);
+
+ return ph;
+}
+void PrivateHeader::validate()
+{
+ bool failed = false;
+
+ if (header().id != static_cast<uint16_t>(SectionID::privateHeader))
+ {
+ log<level::ERR>("Invalid private header section ID",
+ entry("ID=0x%X", header().id));
+ failed = true;
+ }
+
+ if (header().version != privateHeaderVersion)
+ {
+ log<level::ERR>("Invalid private header version",
+ entry("VERSION=0x%X", header().version));
+ failed = true;
+ }
+
+ if (_sectionCount < minSectionCount)
+ {
+ log<level::ERR>("Invalid section count in private header",
+ entry("SECTION_COUNT=0x%X", _sectionCount));
+ failed = true;
+ }
+
+ _valid = (failed) ? false : true;
+}
+
+void PrivateHeader::unflatten(Stream& stream)
+{
+ stream >> _header >> _createTimestamp >> _commitTimestamp >> _creatorID >>
+ _logType >> _reservedByte >> _sectionCount >> _obmcLogID >>
+ _creatorVersion >> _plid >> _id;
+}
+
+void PrivateHeader::flatten(Stream& stream) const
+{
+ stream << _header << _createTimestamp << _commitTimestamp << _creatorID
+ << _logType << _reservedByte << _sectionCount << _obmcLogID
+ << _creatorVersion << _plid << _id;
+}
+
+Stream& operator>>(Stream& s, CreatorVersion& cv)
+{
+ for (size_t i = 0; i < sizeof(CreatorVersion); i++)
+ {
+ s >> cv.version[i];
+ }
+ return s;
+}
+
+Stream& operator<<(Stream& s, const CreatorVersion& cv)
+{
+ for (size_t i = 0; i < sizeof(CreatorVersion); i++)
+ {
+ s << cv.version[i];
+ }
+ return s;
+}
+
+} // namespace pels
+} // namespace openpower
OpenPOWER on IntegriCloud