| #pragma once |
| |
| #include "pel_common.hpp" |
| #include "pel_section.hpp" |
| #include "stream.hpp" |
| |
| #include <array> |
| |
| namespace attn |
| { |
| namespace pel |
| { |
| |
| /** |
| * @class PrimarySrc |
| * |
| * @brief This class represents the primary SRC sections in the PEL. |
| * |
| * |--------+--------------------------------------------| |
| * | length | field | |
| * |--------+--------------------------------------------| |
| * | 1 | Version = 0x02 | |
| * |--------+--------------------------------------------| |
| * | 1 | Flags = 0x00 (no additional data sections) | |
| * |--------+--------------------------------------------| |
| * | 1 | reserved | |
| * |--------+--------------------------------------------| |
| * | 1 | Number of words of hex data + 1 = 0x09 | |
| * |--------+--------------------------------------------| |
| * | 2 | reserved | |
| * |--------+--------------------------------------------| |
| * | 2 | Total length of SRC in bytes = 0x48 | |
| * |--------+--------------------------------------------| |
| * | 4 | Hex Word 2 (word 1 intentionally skipped) | |
| * |--------+--------------------------------------------| |
| * | 4 | Hex Word 3 | |
| * |--------+--------------------------------------------| |
| * | 4 | Hex Word 4 | |
| * |--------+--------------------------------------------| |
| * | 4 | Hex Word 5 | |
| * |--------+--------------------------------------------| |
| * | 4 | Hex Word 6 | |
| * |--------+--------------------------------------------| |
| * | 4 | Hex Word 7 | |
| * |--------+--------------------------------------------| |
| * | 4 | Hex Word 8 | |
| * |--------+--------------------------------------------| |
| * | 4 | Hex Word 9 | |
| * |--------+--------------------------------------------| |
| * | 32 | ASCII String | |
| * |--------+--------------------------------------------| |
| */ |
| class PrimarySrc : public Section |
| { |
| public: |
| enum HeaderFlags |
| { |
| additionalSections = 0x01, |
| powerFaultEvent = 0x02, |
| hypDumpInit = 0x04, |
| i5OSServiceEventBit = 0x10, |
| virtualProgressSRC = 0x80 |
| }; |
| |
| PrimarySrc() = delete; |
| ~PrimarySrc() = default; |
| PrimarySrc(const PrimarySrc&) = delete; |
| PrimarySrc& operator=(const PrimarySrc&) = delete; |
| PrimarySrc(PrimarySrc&&) = delete; |
| PrimarySrc& operator=(PrimarySrc&&) = delete; |
| |
| /** |
| * @brief Constructor |
| * |
| * Fills in this class's data fields from raw data. |
| * |
| * @param[in] pel - the PEL data stream |
| */ |
| explicit PrimarySrc(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 Set the SRC words |
| * |
| * @param[in] srcWords - The SRC words |
| */ |
| void setSrcWords(std::array<uint32_t, numSrcWords> srcWords); |
| |
| /** |
| * @brief Set the ascii string field |
| * |
| * @param[in] asciiString - The ascii string |
| */ |
| void setAsciiString(std::array<char, asciiStringSize> asciiString); |
| |
| private: |
| /** |
| * @brief The SRC version field |
| */ |
| uint8_t _version = 0x02; |
| |
| /** |
| * @brief The SRC flags field |
| */ |
| uint8_t _flags = 0; |
| |
| /** |
| * @brief A byte of reserved data after the flags field |
| */ |
| uint8_t _reserved1B = 0; |
| |
| /** |
| * @brief The hex data word count. |
| */ |
| uint8_t _wordCount = numSrcWords + 1; // +1 for backward compatability |
| |
| /** |
| * @brief Two bytes of reserved data after the hex word count |
| */ |
| uint16_t _reserved2B = 0; |
| |
| /** |
| * @brief The total size of the SRC section (w/o section header) |
| */ |
| uint16_t _size = 72; // 72 (bytes) = size of basic SRC section |
| |
| /** |
| * @brief The SRC 'hex words'. |
| */ |
| std::array<uint32_t, numSrcWords> _srcWords; |
| |
| /** |
| * @brief The 32 byte ASCII character string of the SRC |
| */ |
| std::array<char, asciiStringSize> _asciiString; |
| }; |
| |
| } // namespace pel |
| } // namespace attn |