1 #pragma once 2 3 #include "pel_common.hpp" 4 #include "pel_section.hpp" 5 #include "stream.hpp" 6 7 namespace attn 8 { 9 namespace pel 10 { 11 12 constexpr uint8_t extendedUserHeaderVersion = 0x01; 13 constexpr size_t firmwareVersionSize = 16; 14 15 /** 16 * @class ExtendedUserHeader 17 * 18 * This represents the Extended User Header section in a PEL 19 * 20 * |----------+---------------------------+-------+-------+-------------------| 21 * | length | byte0 | byte1 | byte2 | byte3 | 22 * |----------+---------------------------+-------+-------+-------------------| 23 * | 8 | Section Header | 24 * |----------+---------------------------------------------------------------| 25 * | 20 | Machine Type/Model/Serial | 26 * |----------+---------------------------------------------------------------| 27 * | 16 | FW Released Version | 28 * |----------+---------------------------------------------------------------| 29 * | 16 | FW Sub-system driver ver. | 30 * |----------+---------------------------+-------+-------+-------------------| 31 * | 4 | Reserved | rsvd | rsvd | Symptom ID length | 32 * |----------+---------------------------+-------+-------+-------------------| 33 * | 8 | Event Common Reference Time | 34 * |----------+---------------------------------------------------------------| 35 * | 4 | Reserved | 36 * |----------+---------------------------------------------------------------| 37 * | variable | Symptom ID | 38 * |----------+---------------------------------------------------------------| 39 * 40 */ 41 class ExtendedUserHeader : public Section 42 { 43 public: 44 ExtendedUserHeader() = delete; 45 ~ExtendedUserHeader() = default; 46 ExtendedUserHeader(const ExtendedUserHeader&) = default; 47 ExtendedUserHeader& operator=(const ExtendedUserHeader&) = default; 48 ExtendedUserHeader(ExtendedUserHeader&&) = default; 49 ExtendedUserHeader& operator=(ExtendedUserHeader&&) = default; 50 51 /** 52 * @brief Constructor 53 * 54 * Fills in this class's data fields from raw data. 55 * 56 * @param[in] pel - the PEL data stream 57 */ 58 explicit ExtendedUserHeader(Stream& pel); 59 60 /** 61 * @brief Flatten the section into the stream 62 * 63 * @param[in] stream - The stream to write to 64 */ 65 void flatten(Stream& stream) const override; 66 67 /** 68 * @brief Fills in the object from the stream data 69 * 70 * @param[in] stream - The stream to read from 71 */ 72 void unflatten(Stream& stream); 73 74 /** 75 * @brief Returns the size of this section when flattened into a PEL 76 * 77 * @return size_t - the size of the section 78 */ 79 size_t flattenedSize() 80 { 81 return Section::flattenedSize() + mtmsSize + _serverFWVersion.size() + 82 _subsystemFWVersion.size() + sizeof(_reserved4B) + 83 sizeof(_refTime) + sizeof(_reserved1B1) + sizeof(_reserved1B2) + 84 sizeof(_reserved1B3) + sizeof(_symptomIdSize) + _symptomIdSize; 85 } 86 87 /** 88 * @brief Set the symptom id field in extended user header 89 * 90 * @param[in] symptomId - The symptom ID to set 91 */ 92 void setSymptomId(const std::string& symptomId); 93 94 private: 95 /** 96 * @brief The structure that holds the machine TM and SN fields. 97 */ 98 uint8_t _mtms[mtmsSize]; 99 100 /** 101 * @brief The server firmware version 102 * 103 * NULL terminated. 104 * 105 * The release version of the full firmware image. 106 */ 107 std::array<uint8_t, firmwareVersionSize> _serverFWVersion; 108 109 /** 110 * @brief The subsystem firmware version 111 * 112 * NULL terminated. 113 * 114 * On PELs created on the BMC, this will be the BMC code version. 115 */ 116 std::array<uint8_t, firmwareVersionSize> _subsystemFWVersion; 117 118 /** 119 * @brief Reserved 120 */ 121 uint32_t _reserved4B = 0; 122 123 /** 124 * @brief Event Common Reference Time 125 * 126 * This is not used by PELs created on the BMC. 127 */ 128 uint64_t _refTime; 129 130 /** 131 * @brief Reserved 132 */ 133 uint8_t _reserved1B1 = 0; 134 135 /** 136 * @brief Reserved 137 */ 138 uint8_t _reserved1B2 = 0; 139 140 /** 141 * @brief Reserved 142 */ 143 uint8_t _reserved1B3 = 0; 144 145 /** 146 * @brief The size of the symptom ID field 147 */ 148 uint8_t _symptomIdSize; 149 150 /** 151 * @brief The symptom ID field 152 * 153 * Describes a unique event signature for the log. 154 * Required for serviceable events, otherwise optional. 155 * When present, must start with the first 8 characters 156 * of the ASCII string field from the SRC. 157 * 158 * NULL terminated. 159 */ 160 std::vector<uint8_t> _symptomId; 161 }; 162 163 } // namespace pel 164 } // namespace attn 165