1f5210bb6SBen Tyner #pragma once 2f5210bb6SBen Tyner 3f5210bb6SBen Tyner #include "pel_common.hpp" 4f5210bb6SBen Tyner #include "pel_section.hpp" 5f5210bb6SBen Tyner #include "stream.hpp" 6f5210bb6SBen Tyner 7*4efca280SAndrew Geissler #include <array> 8*4efca280SAndrew Geissler 9f5210bb6SBen Tyner namespace attn 10f5210bb6SBen Tyner { 11f5210bb6SBen Tyner namespace pel 12f5210bb6SBen Tyner { 13f5210bb6SBen Tyner 14f5210bb6SBen Tyner /** 15f5210bb6SBen Tyner * @class PrimarySrc 16f5210bb6SBen Tyner * 17f5210bb6SBen Tyner * @brief This class represents the primary SRC sections in the PEL. 18f5210bb6SBen Tyner * 19f5210bb6SBen Tyner * |--------+--------------------------------------------| 20f5210bb6SBen Tyner * | length | field | 21f5210bb6SBen Tyner * |--------+--------------------------------------------| 22f5210bb6SBen Tyner * | 1 | Version = 0x02 | 23f5210bb6SBen Tyner * |--------+--------------------------------------------| 24f5210bb6SBen Tyner * | 1 | Flags = 0x00 (no additional data sections) | 25f5210bb6SBen Tyner * |--------+--------------------------------------------| 26f5210bb6SBen Tyner * | 1 | reserved | 27f5210bb6SBen Tyner * |--------+--------------------------------------------| 28f5210bb6SBen Tyner * | 1 | Number of words of hex data + 1 = 0x09 | 29f5210bb6SBen Tyner * |--------+--------------------------------------------| 30f5210bb6SBen Tyner * | 2 | reserved | 31f5210bb6SBen Tyner * |--------+--------------------------------------------| 32f5210bb6SBen Tyner * | 2 | Total length of SRC in bytes = 0x48 | 33f5210bb6SBen Tyner * |--------+--------------------------------------------| 34f5210bb6SBen Tyner * | 4 | Hex Word 2 (word 1 intentionally skipped) | 35f5210bb6SBen Tyner * |--------+--------------------------------------------| 36f5210bb6SBen Tyner * | 4 | Hex Word 3 | 37f5210bb6SBen Tyner * |--------+--------------------------------------------| 38f5210bb6SBen Tyner * | 4 | Hex Word 4 | 39f5210bb6SBen Tyner * |--------+--------------------------------------------| 40f5210bb6SBen Tyner * | 4 | Hex Word 5 | 41f5210bb6SBen Tyner * |--------+--------------------------------------------| 42f5210bb6SBen Tyner * | 4 | Hex Word 6 | 43f5210bb6SBen Tyner * |--------+--------------------------------------------| 44f5210bb6SBen Tyner * | 4 | Hex Word 7 | 45f5210bb6SBen Tyner * |--------+--------------------------------------------| 46f5210bb6SBen Tyner * | 4 | Hex Word 8 | 47f5210bb6SBen Tyner * |--------+--------------------------------------------| 48f5210bb6SBen Tyner * | 4 | Hex Word 9 | 49f5210bb6SBen Tyner * |--------+--------------------------------------------| 50f5210bb6SBen Tyner * | 32 | ASCII String | 51f5210bb6SBen Tyner * |--------+--------------------------------------------| 52f5210bb6SBen Tyner */ 53f5210bb6SBen Tyner class PrimarySrc : public Section 54f5210bb6SBen Tyner { 55f5210bb6SBen Tyner public: 56f5210bb6SBen Tyner enum HeaderFlags 57f5210bb6SBen Tyner { 58f5210bb6SBen Tyner additionalSections = 0x01, 59f5210bb6SBen Tyner powerFaultEvent = 0x02, 60f5210bb6SBen Tyner hypDumpInit = 0x04, 61f5210bb6SBen Tyner i5OSServiceEventBit = 0x10, 62f5210bb6SBen Tyner virtualProgressSRC = 0x80 63f5210bb6SBen Tyner }; 64f5210bb6SBen Tyner 65f5210bb6SBen Tyner PrimarySrc() = delete; 66f5210bb6SBen Tyner ~PrimarySrc() = default; 67f5210bb6SBen Tyner PrimarySrc(const PrimarySrc&) = delete; 68f5210bb6SBen Tyner PrimarySrc& operator=(const PrimarySrc&) = delete; 69f5210bb6SBen Tyner PrimarySrc(PrimarySrc&&) = delete; 70f5210bb6SBen Tyner PrimarySrc& operator=(PrimarySrc&&) = delete; 71f5210bb6SBen Tyner 72f5210bb6SBen Tyner /** 73f5210bb6SBen Tyner * @brief Constructor 74f5210bb6SBen Tyner * 75f5210bb6SBen Tyner * Fills in this class's data fields from raw data. 76f5210bb6SBen Tyner * 77f5210bb6SBen Tyner * @param[in] pel - the PEL data stream 78f5210bb6SBen Tyner */ 79f5210bb6SBen Tyner explicit PrimarySrc(Stream& pel); 80f5210bb6SBen Tyner 81f5210bb6SBen Tyner /** 82f5210bb6SBen Tyner * @brief Flatten the section into the stream 83f5210bb6SBen Tyner * 84f5210bb6SBen Tyner * @param[in] stream - The stream to write to 85f5210bb6SBen Tyner */ 86f5210bb6SBen Tyner void flatten(Stream& stream) const override; 87f5210bb6SBen Tyner 88f5210bb6SBen Tyner /** 89f5210bb6SBen Tyner * @brief Fills in the object from the stream data 90f5210bb6SBen Tyner * 91f5210bb6SBen Tyner * @param[in] stream - The stream to read from 92f5210bb6SBen Tyner */ 93f5210bb6SBen Tyner void unflatten(Stream& stream); 94f5210bb6SBen Tyner 95f5210bb6SBen Tyner /** 96f5210bb6SBen Tyner * @brief Set the SRC words 97f5210bb6SBen Tyner * 98f5210bb6SBen Tyner * @param[in] srcWords - The SRC words 99f5210bb6SBen Tyner */ 100f5210bb6SBen Tyner void setSrcWords(std::array<uint32_t, numSrcWords> srcWords); 101f5210bb6SBen Tyner 102f5210bb6SBen Tyner /** 103f5210bb6SBen Tyner * @brief Set the ascii string field 104f5210bb6SBen Tyner * 105f5210bb6SBen Tyner * @param[in] asciiString - The ascii string 106f5210bb6SBen Tyner */ 107f5210bb6SBen Tyner void setAsciiString(std::array<char, asciiStringSize> asciiString); 108f5210bb6SBen Tyner 109f5210bb6SBen Tyner private: 110f5210bb6SBen Tyner /** 111f5210bb6SBen Tyner * @brief The SRC version field 112f5210bb6SBen Tyner */ 113f5210bb6SBen Tyner uint8_t _version = 0x02; 114f5210bb6SBen Tyner 115f5210bb6SBen Tyner /** 116f5210bb6SBen Tyner * @brief The SRC flags field 117f5210bb6SBen Tyner */ 118f5210bb6SBen Tyner uint8_t _flags = 0; 119f5210bb6SBen Tyner 120f5210bb6SBen Tyner /** 121f5210bb6SBen Tyner * @brief A byte of reserved data after the flags field 122f5210bb6SBen Tyner */ 123f5210bb6SBen Tyner uint8_t _reserved1B = 0; 124f5210bb6SBen Tyner 125f5210bb6SBen Tyner /** 126f5210bb6SBen Tyner * @brief The hex data word count. 127f5210bb6SBen Tyner */ 128f5210bb6SBen Tyner uint8_t _wordCount = numSrcWords + 1; // +1 for backward compatability 129f5210bb6SBen Tyner 130f5210bb6SBen Tyner /** 131f5210bb6SBen Tyner * @brief Two bytes of reserved data after the hex word count 132f5210bb6SBen Tyner */ 133f5210bb6SBen Tyner uint16_t _reserved2B = 0; 134f5210bb6SBen Tyner 135f5210bb6SBen Tyner /** 136f5210bb6SBen Tyner * @brief The total size of the SRC section (w/o section header) 137f5210bb6SBen Tyner */ 138f5210bb6SBen Tyner uint16_t _size = 72; // 72 (bytes) = size of basic SRC section 139f5210bb6SBen Tyner 140f5210bb6SBen Tyner /** 141f5210bb6SBen Tyner * @brief The SRC 'hex words'. 142f5210bb6SBen Tyner */ 143f5210bb6SBen Tyner std::array<uint32_t, numSrcWords> _srcWords; 144f5210bb6SBen Tyner 145f5210bb6SBen Tyner /** 146f5210bb6SBen Tyner * @brief The 32 byte ASCII character string of the SRC 147f5210bb6SBen Tyner */ 148f5210bb6SBen Tyner std::array<char, asciiStringSize> _asciiString; 149f5210bb6SBen Tyner }; 150f5210bb6SBen Tyner 151f5210bb6SBen Tyner } // namespace pel 152f5210bb6SBen Tyner } // namespace attn 153