blob: 3be6e66306484eb529354d6809cf037590466efe [file] [log] [blame]
#pragma once
#include "pel_common.hpp"
#include "pel_section.hpp"
#include "stream.hpp"
namespace attn
{
namespace pel
{
/**
* @class UserHeader
*
* This represents the User Header section in a PEL.
*
* |--------+----------------+----------------+----------------+------------|
* | length | byte0 | byte1 | byte2 | byte3 |
* |--------+----------------+----------------+----------------+------------|
* | 8 | Section Header |
* | | |
* |--------+----------------+----------------+----------------+------------|
* | 4 | Subsystem ID | Event Scope | Event Severity | Event Type |
* |--------+----------------+----------------+----------------+------------|
* | 4 | reserved |
* |--------+----------------+----------------+-----------------------------|
* | 4 | Problem Domain | Problem Vector | Event Action Flags |
* |--------+----------------+----------------+-----------------------------|
* | 4 | reserved |
* |--------+---------------------------------------------------------------|
*
*/
class UserHeader : public Section
{
public:
UserHeader() = delete;
~UserHeader() = default;
UserHeader(const UserHeader&) = default;
UserHeader& operator=(const UserHeader&) = default;
UserHeader(UserHeader&&) = default;
UserHeader& operator=(UserHeader&&) = default;
/**
* @brief Constructor
*
* Fills in this class's data fields from raw data.
*
* @param[in] pel - the PEL data stream
*/
explicit UserHeader(Stream& pel);
/**
* @brief Flatten the section into the stream
*
* @param[in] stream - The stream to write to
*/
void flatten(Stream& stream) const override;
/**
* @brief Fills in the object from the stream data
*
* @param[in] stream - The stream to read from
*/
void unflatten(Stream& stream);
/**
* @brief Returns the size of this section when flattened into a PEL
*
* @return size_t - the size of the section
*/
static constexpr size_t flattenedSize()
{
return Section::flattenedSize() + sizeof(_eventSubsystem) +
sizeof(_eventScope) + sizeof(_eventSeverity) +
sizeof(_eventType) + sizeof(_reserved4Byte1) +
sizeof(_problemDomain) + sizeof(_problemVector) +
sizeof(_actionFlags) + sizeof(_reserved4Byte2);
}
/**
* @brief Set the subsystem field
*
* @param[in] subsystem - The subsystem value
*/
void setSubsystem(uint8_t subsystem);
/**
* @brief Set the severity field
*
* @param[in] severity - The severity to set
*/
void setSeverity(uint8_t severity);
/**
* @brief Set the event type field
*
* @param[in] type - The event type
*/
void setType(uint8_t type);
/**
* @brief Set the action flags field
*
* @param[in] action - The action flags to set
*/
void setAction(uint16_t action);
private:
/**
* @brief The subsystem associated with the event.
*/
uint8_t _eventSubsystem;
/**
* @brief The event scope field.
*/
uint8_t _eventScope = static_cast<uint8_t>(EventScope::platform);
/**
* @brief The event severity.
*/
uint8_t _eventSeverity; // set by constructor
/**
* @brief The event type.
*/
uint8_t _eventType = static_cast<uint8_t>(EventType::trace);
/**
* @brief A reserved 4 byte placeholder
*/
uint32_t _reserved4Byte1 = 0;
/**
* @brief The problem domain field.
*/
uint8_t _problemDomain = 0;
/**
* @brief The problem vector field.
*/
uint8_t _problemVector = 0;
/**
* @brief The action flags field.
*/
uint16_t _actionFlags; // set by contructor
/**
* @brief A reserved 4 byte
* placeholder
*/
uint32_t _reserved4Byte2 = 0;
};
} // namespace pel
} // namespace attn