diff options
Diffstat (limited to 'extensions/openpower-pels/ascii_string.cpp')
-rw-r--r-- | extensions/openpower-pels/ascii_string.cpp | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/extensions/openpower-pels/ascii_string.cpp b/extensions/openpower-pels/ascii_string.cpp new file mode 100644 index 0000000..6d4711e --- /dev/null +++ b/extensions/openpower-pels/ascii_string.cpp @@ -0,0 +1,83 @@ +#include "ascii_string.hpp" + +#include "pel_types.hpp" + +#include <phosphor-logging/log.hpp> + +namespace openpower +{ +namespace pels +{ +namespace src +{ + +using namespace phosphor::logging; + +AsciiString::AsciiString(Stream& stream) +{ + unflatten(stream); +} + +AsciiString::AsciiString(const message::Entry& entry) +{ + // Power Error: 1100RRRR + // BMC Error: BDSSRRRR + // where: + // RRRR = reason code + // SS = subsystem ID + + // First is type, like 'BD' + setByte(0, entry.src.type); + + // Next is '00', or subsystem ID + if (entry.src.type == static_cast<uint8_t>(SRCType::powerError)) + { + setByte(2, 0x00); + } + else // BMC Error + { + setByte(2, entry.subsystem); + } + + // Then the reason code + setByte(4, entry.src.reasonCode >> 8); + setByte(6, entry.src.reasonCode & 0xFF); + + // Padded with spaces + for (size_t offset = 8; offset < asciiStringSize; offset++) + { + _string[offset] = ' '; + } +} + +void AsciiString::flatten(Stream& stream) +{ + stream.write(_string.data(), _string.size()); +} + +void AsciiString::unflatten(Stream& stream) +{ + stream.read(_string.data(), _string.size()); +} + +std::string AsciiString::get() const +{ + std::string string{_string.begin(), _string.begin() + _string.size()}; + return string; +} + +void AsciiString::setByte(size_t byteOffset, uint8_t value) +{ + assert(byteOffset < asciiStringSize); + + char characters[3]; + sprintf(characters, "%02X", value); + + auto writeOffset = byteOffset; + _string[writeOffset++] = characters[0]; + _string[writeOffset] = characters[1]; +} + +} // namespace src +} // namespace pels +} // namespace openpower |