blob: 40da0b61245d06eaecf6b4b820d57adf454082b5 [file] [log] [blame]
#pragma once
#include "bcd_time.hpp"
#include "data_interface.hpp"
#include "elog_entry.hpp"
#include "mtms.hpp"
#include "registry.hpp"
#include "section.hpp"
#include "src.hpp"
#include "stream.hpp"
namespace openpower
{
namespace pels
{
constexpr uint8_t extendedUserHeaderVersion = 0x01;
constexpr size_t firmwareVersionSize = 16;
/**
* @class ExtendedUserHeader
*
* This represents the Extended User Header section in a PEL. It is a required
* section. It contains code versions, an MTMS subsection, and a string called
* a symptom ID.
*
* The Section base class handles the section header structure that every
* PEL section has at offset zero.
*/
class ExtendedUserHeader : public Section
{
public:
ExtendedUserHeader() = delete;
~ExtendedUserHeader() = default;
ExtendedUserHeader(const ExtendedUserHeader&) = default;
ExtendedUserHeader& operator=(const ExtendedUserHeader&) = default;
ExtendedUserHeader(ExtendedUserHeader&&) = default;
ExtendedUserHeader& operator=(ExtendedUserHeader&&) = default;
/**
* @brief Constructor
*
* Fills in this class's data fields from the stream.
*
* @param[in] pel - the PEL data stream
*/
explicit ExtendedUserHeader(Stream& pel);
/**
* @brief Constructor
*
* @param[in] dataIface - The DataInterface object
* @param[in] regEntry - The message registry entry for this event
* @param[in] src - The SRC section object for this event
*/
ExtendedUserHeader(const DataInterfaceBase& dataIface,
const message::Entry& regEntry, const SRC& src);
/**
* @brief Flatten the section into the stream
*
* @param[in] stream - The stream to write to
*/
void flatten(Stream& stream) const override;
/**
* @brief Returns the size of this section when flattened into a PEL
*
* @return size_t - the size of the section
*/
size_t flattenedSize()
{
return Section::flattenedSize() + _mtms.flattenedSize() +
_serverFWVersion.size() + _subsystemFWVersion.size() +
sizeof(_reserved4B) + sizeof(_refTime) + sizeof(_reserved1B1) +
sizeof(_reserved1B2) + sizeof(_reserved1B3) +
sizeof(_symptomIDSize) + _symptomIDSize;
}
/**
* @brief Returns the server firmware version
*
* @return std::string - The version
*/
std::string serverFWVersion() const
{
std::string version;
for (size_t i = 0;
i < _serverFWVersion.size() && _serverFWVersion[i] != '\0'; i++)
{
version.push_back(_serverFWVersion[i]);
}
return version;
}
/**
* @brief Returns the subsystem firmware version
*
* @return std::string - The version
*/
std::string subsystemFWVersion() const
{
std::string version;
for (size_t i = 0;
i < _subsystemFWVersion.size() && _subsystemFWVersion[i] != '\0';
i++)
{
version.push_back(_subsystemFWVersion[i]);
}
return version;
}
/**
* @brief Returns the machine type+model
*
* @return std::string - The MTM
*/
std::string machineTypeModel() const
{
return _mtms.machineTypeAndModel();
}
/**
* @brief Returns the machine serial number
*
* @return std::string - The serial number
*/
std::string machineSerialNumber() const
{
return _mtms.machineSerialNumber();
}
/**
* @brief Returns the Event Common Reference Time field
*
* @return BCDTime - The time value
*/
const BCDTime& refTime() const
{
return _refTime;
}
/**
* @brief Returns the symptom ID
*
* @return std::string - The symptom ID
*/
std::string symptomID() const
{
std::string symptom;
for (size_t i = 0; i < _symptomID.size() && _symptomID[i] != '\0'; i++)
{
symptom.push_back(_symptomID[i]);
}
return symptom;
}
/**
* @brief Get section in JSON.
*
* @param[in] creatorID - The creator ID for the PEL
*
* @return std::optional<std::string> - ExtendedUserHeader section's JSON
*/
std::optional<std::string> getJSON(uint8_t creatorID) const override;
private:
/**
* @brief Fills in the object from the stream data
*
* @param[in] stream - The stream to read from
*/
void unflatten(Stream& stream);
/**
* @brief Validates the section contents
*
* Updates _valid (in Section) with the results.
*/
void validate() override;
/**
* @brief Builds the symptom ID
*
* Uses the message registry to say which SRC fields to add
* to the SRC's ASCII string to make the ID, and uses a smart
* default if not specified in the registry.
*
* @param[in] regEntry - The message registry entry for this event
* @param[in] src - The SRC section object for this event
*/
void createSymptomID(const message::Entry& regEntry, const SRC& src);
/**
* @brief The structure that holds the machine TM and SN fields.
*/
MTMS _mtms;
/**
* @brief The server firmware version
*
* NULL terminated.
*
* The release version of the full firmware image.
*/
std::array<uint8_t, firmwareVersionSize> _serverFWVersion;
/**
* @brief The subsystem firmware version
*
* NULL terminated.
*
* On PELs created on the BMC, this will be the BMC code version.
*/
std::array<uint8_t, firmwareVersionSize> _subsystemFWVersion;
/**
* @brief Reserved
*/
uint32_t _reserved4B = 0;
/**
* @brief Event Common Reference Time
*
* This is not used by PELs created on the BMC.
*/
BCDTime _refTime;
/**
* @brief Reserved
*/
uint8_t _reserved1B1 = 0;
/**
* @brief Reserved
*/
uint8_t _reserved1B2 = 0;
/**
* @brief Reserved
*/
uint8_t _reserved1B3 = 0;
/**
* @brief The size of the symptom ID field
*/
uint8_t _symptomIDSize;
/**
* @brief The symptom ID field
*
* Describes a unique event signature for the log.
* Required for serviceable events, otherwise optional.
* When present, must start with the first 8 characters
* of the ASCII string field from the SRC.
*
* NULL terminated.
*/
std::vector<uint8_t> _symptomID;
};
} // namespace pels
} // namespace openpower