1 #pragma once
2 
3 #include "extended_user_header.hpp"
4 #include "pel_common.hpp"
5 #include "primary_src.hpp"
6 #include "private_header.hpp"
7 #include "user_header.hpp"
8 
9 #include <vector>
10 
11 namespace attn
12 {
13 namespace pel
14 {
15 
16 /** @class PelMinimal
17  *
18  * @brief Class for a minimal platform event log (PEL)
19  *
20  * This class can be used to create form a PEL and create a raw PEL file. The
21  * implementation based on "Platform Event Log and SRC PLDD v1.1"
22  *
23  * This PEL consists of the following position dependent sections:
24  *
25  * |----------+------------------------------|
26  * | length   | section                      |
27  * |----------+------------------------------|
28  * | 48       | Private Header Section       |
29  * |----------+------------------------------|
30  * | 24       | User Header Section          |
31  * |----------+------------------------------|
32  * | 72       | Primary SRC Section          |
33  * |----------+------------------------------|
34  * | 20       | Extended User Header         |
35  * |----------+------------------------------|
36  */
37 class PelMinimal
38 {
39   public:
40     PelMinimal() = delete;
41     ~PelMinimal() = default;
42     PelMinimal(const PelMinimal&) = delete;
43     PelMinimal& operator=(const PelMinimal&) = delete;
44     PelMinimal(PelMinimal&&) = delete;
45     PelMinimal& operator=(PelMinimal&&) = delete;
46 
47     /**
48      * @brief Create a minimal PEL object from raw data
49      *
50      * @param[in] pelBuffer - buffer containing a raw PEL
51      */
52     explicit PelMinimal(std::vector<uint8_t>& data);
53 
54     /**
55      * @brief Initialize the object's data members
56      *
57      * @param[in] data - reference to the vector
58      */
59     void initialize(std::vector<uint8_t>& data);
60 
61     /**
62      * @brief Stream raw PEL data to buffer
63      *
64      * @param[out] pelBuffer - What the data will be written to
65      */
66     void raw(std::vector<uint8_t>& pelBuffer) const;
67 
68     /**
69      * @brief Set the User Header subsystem field
70      *
71      * @param[in] subsystem - The subsystem value
72      */
73     void setSubsystem(uint8_t subsystem);
74 
75     /**
76      * @brief Set the User Header severity field
77      *
78      * @param[in] severity - The severity to set
79      */
80     void setSeverity(uint8_t severity);
81 
82     /**
83      * @brief Set the User Header event type field
84      *
85      * @param[in] type - The event type
86      */
87     void setType(uint8_t type);
88 
89     /**
90      * @brief Set the User Header action flags field
91      *
92      * @param[in] action - The action flags to set
93      */
94     void setAction(uint16_t action);
95 
96     /**
97      * @brief Set the Primary SRC section SRC words
98      *
99      * @param[in] srcWords - The SRC words
100      */
101     void setSrcWords(std::array<uint32_t, numSrcWords> srcWords);
102 
103     /**
104      * @brief Set the Primary SRC section ascii string field
105      *
106      * @param[in]  asciiString - The ascii string
107      */
108     void setAsciiString(std::array<char, asciiStringSize> asciiString);
109 
110     /**
111      * @brief Get section count from the private header
112      *
113      * @return Number of sections
114      */
115     uint8_t getSectionCount();
116 
117     /**
118      * @brief Set section count in private heasder
119      *
120      * @param[in] sectionCount - Number of sections
121      */
122     void setSectionCount(uint8_t sectionCount);
123 
124     /**
125      * @brief Set the symptom id field in extended user header
126      *
127      * @param[in] symptomId - The symptom ID to set
128      */
129     void setSymptomId(const std::string& symptomId);
130 
131     /**
132      * @brief Update the PLID
133      */
134     void setPlid(uint32_t plid);
135 
136   private:
137     /**
138      * @brief Maximum PEL size
139      */
140     static constexpr size_t _maxPELSize = 16384;
141 
142     /**
143      * @brief Returns the size of the PEL
144      *
145      * @return size_t The PEL size in bytes
146      */
147     size_t size() const;
148 
149     /**
150      * @brief PEL Private Header
151      */
152     std::unique_ptr<PrivateHeader> _ph;
153 
154     /**
155      * @brief PEL User Header
156      */
157     std::unique_ptr<UserHeader> _uh;
158 
159     /**
160      * @brief PEL Primary SRC
161      */
162     std::unique_ptr<PrimarySrc> _ps;
163 
164     /**
165      * @brief PEL Extended User Header
166      */
167     std::unique_ptr<ExtendedUserHeader> _eh;
168 };
169 
170 } // namespace pel
171 } // namespace attn
172