blob: b2cfe1742d9fd8cc6c3e88e4bc7bc87171f7bdea [file] [log] [blame]
Jayanth Othayothe8bdeea2021-06-03 03:01:16 -05001#pragma once
2
3#include "additional_data.hpp"
4#include "pel.hpp"
5
Jayanth Othayothc74c2202021-06-04 06:42:43 -05006#include <libekb.H>
7
Matt Spinler8c7bb862023-08-31 14:32:22 -05008#include <filesystem>
9
Jayanth Othayothe8bdeea2021-06-03 03:01:16 -050010namespace openpower
11{
12namespace pels
13{
14namespace sbe
15{
16
17// SBE FFDC sub type.
18constexpr uint8_t sbeFFDCSubType = 0xCB;
19
Jayanth Othayoth0866c3f2021-06-07 07:06:20 -050020/**
21 * @brief FFDC Package structure and definitions based on SBE chip-op spec.
22 *
23 * SBE FFDC Starts with a header word (Word 0) that has an unique magic
24 * identifier code of 0xFFDC followed by the length of the FFDC package
25 * including the header itself. Word 1 contains a sequence id ,
26 * command-class and command fields.
27 * The sequence id field is ignored on the BMC side.
28 * Word 2 contains a 32 bit Return Code which acts like the key to the
29 * contents of subsequent FFDC Data Words (0-N).
30 *
31 * A FFDC package can typically contain debug data from either:
32 * 1. A failed hardware procedure (e.g. local variable values
33 * at point of failure) or
34 * 2. SBE firmware (e.g. traces, attributes and other information).
devenraoda876612024-02-16 18:48:27 +053035 *
36 * -------------------P10 proc-----------------------
Jayanth Othayoth0866c3f2021-06-07 07:06:20 -050037 * | | Byte 0 | Byte 1 | Byte 2 | Byte 3 |
38 * |----------------------------------------------------------|
39 * | Word 0 | Magic Bytes : 0xFFDC | Length in words (N+4) |
40 * | Word 1 | [Sequence ID] | Command-Class | Command |
41 * | Word 2 | Return Code 0..31 |
42 * | Word 3 | FFDC Data – Word 0 |
43 * | ... |
44 * | Word N+3 | FFDC Data – Word N |
45 * -----------------------------------------------------------
devenraoda876612024-02-16 18:48:27 +053046 *
47 * --------------POZ - PowerOdysseyZEE-----------------------
48 * First FFDC packet structure
49 * --------------------------------------------------------------
50 * | | Byte 0 | Byte 1 | Byte 2 | Byte 3 |
51 * |------------------------------------------------------------|
52 * | Word 0 | Magic Bytes : 0xFBAD | Length in words (N+4) |
53 * | Word 1 | [Sequence ID] | Command-Class | Command |
54 * | Word 2 | SLID | Severity | Chip ID |
55 * | Word 3 | FAPI RC (HWP) |
56 * | Word 4 | HWP FFDC Dump Fields (Local FFDC | HW Register) |
57 * | Word 6 | Field ID 0(Local FFDC) | Field ID 0 Length |
58 * | Word 7 | Filed Data 0(Size1, data2) |
59 * | ... |
60 * | Word N | Filed Data N(Size1, data2) |
61 * | Word N+1 | Field ID 1(HW Register) | Field ID 1 Length |
62 * | Word N+2 | Filed Data 0) |
63 * | ... |
64 * | Word Y | Filed Data M) |
65 * -------------------------------------------------------------
66 * Second FFDC packet structure
67 * --------------------------------------------------------------
68 * | | Byte 0 | Byte 1 | Byte 2 | Byte 3 |
69 * |------------------------------------------------------------|
70 * | Word 0 | Magic Bytes : 0xFBAD | Length in words (N+4) |
71 * | Word 1 | [Sequence ID] | Command-Class | Command |
72 * | Word 2 | SLID | Severity | Chip ID |
73 * | Word 3 | FAPI RC (PLAT ERR SEE DATA) |
74 * | Word 4 | Primary Status | Secondary Status |
75 * | Word 5 | FW commit ID |
76 * | Word 5 | Reserve | DD Major | DD Minor | Thread ID|
77 * | Word 4 | SBE FFDC Dump Fields (Bitmaped) |
78 * | Word 6 | Field ID 0 | Field ID 0 Length |
79 * | Word 7 | Filed Data 0 |
80 * | ... |
81 * | Word N | Filed Data N |
82 * | Word N+1 | Field ID 1 | Field ID 1 Length |
83 * | Word N+2 | Filed Data 0) |
84 * | ... |
85 * | Word Y | Filed Data M) |
86 * | Word Y+1 | 0xCODE | 0xA8 | 0x1 |
87 * | Word Y+2 | Primary Status | Secondary Status |
88 * | Word Y+3 | Distance to Header |
89 * -------------------------------------------------------------
90 *
Jayanth Othayoth0866c3f2021-06-07 07:06:20 -050091 **/
92
Jayanth Othayoth742b00b2022-06-30 05:16:57 -050093using LogSeverity = phosphor::logging::Entry::Level;
94
Jayanth Othayothe8bdeea2021-06-03 03:01:16 -050095/** @class SbeFFDC
96 *
97 * @brief This class provides higher level interface to process SBE ffdc
98 * for PEL based error logging infrastructure.
99 * Key Functionalities included here
100 * - Process the SBE FFDC data with the help of FAPI infrastructure and
101 * and create PEL required format Callout and user data for hardware
102 * procedure failures specific reason code
103 * - Add the user data section with SBE FFDC data to support SBE provided
104 * parser tool usage.
105 * - Any SBE FFDC processing will result additional log message in journal
106 * and will continue to create Error log with available data. This is to
107 * help user to analyse the failure.
108 */
109class SbeFFDC
110{
111 public:
112 SbeFFDC() = delete;
113 SbeFFDC(const SbeFFDC&) = delete;
114 SbeFFDC& operator=(const SbeFFDC&) = delete;
115 SbeFFDC(SbeFFDC&&) = delete;
116 SbeFFDC& operator=(SbeFFDC&&) = delete;
117
118 /**
119 * @brief Constructor
120 *
121 * Create PEL required format data from SBE provided FFDC data.
122 *
123 * @param[in] data - The AdditionalData properties in this PEL event
124 * @param[in] files - FFDC files that go into UserData sections
125 */
126 SbeFFDC(const AdditionalData& data, const PelFFDC& files);
127
128 /**
129 * @brief Destructor
130 *
131 * Deletes the temporary files
132 */
133 ~SbeFFDC()
134 {
Jayanth Othayothe8bdeea2021-06-03 03:01:16 -0500135 try
136 {
Matt Spinler8c7bb862023-08-31 14:32:22 -0500137 for (const auto& [path, fd] : paths)
Jayanth Othayothe8bdeea2021-06-03 03:01:16 -0500138 {
139 if (!path.empty())
140 {
141 // Delete temporary file from file system
142 std::error_code ec;
143 std::filesystem::remove(path, ec);
Matt Spinler8c7bb862023-08-31 14:32:22 -0500144 }
145
146 if (fd != -1)
147 {
148 close(fd);
Jayanth Othayothe8bdeea2021-06-03 03:01:16 -0500149 }
150 }
Matt Spinler8c7bb862023-08-31 14:32:22 -0500151 paths.clear();
Jayanth Othayothe8bdeea2021-06-03 03:01:16 -0500152 }
153 catch (...)
154 {
155 // Destructors should not throw exceptions
156 }
157 }
158
159 /**
160 * @brief Helper function to return FFDC files information, which
161 * includes SBE FFDC specific callout information.
162 *
163 * return PelFFDC - pel formated FFDC files.
164 */
165 const PelFFDC& getSbeFFDC()
166 {
167 return ffdcFiles;
168 }
169
Jayanth Othayoth742b00b2022-06-30 05:16:57 -0500170 /**
171 * @brief Helper function to get severity type
172 *
173 * @return severity type as informational for spare clock
174 * failure type ffdc. Otherwise null string.
175 */
176 std::optional<LogSeverity> getSeverity();
177
Jayanth Othayothe8bdeea2021-06-03 03:01:16 -0500178 private:
179 /**
Jayanth Othayoth0866c3f2021-06-07 07:06:20 -0500180 * @brief Helper function to parse SBE FFDC file.
181 * parsing is based on the FFDC structure definition
182 * define initially in this file.
183 *
184 * @param fd SBE ffdc file descriptor
185 *
186 * Any failure during the process stops the function
187 * execution to support the raw SBE FFDC data based
188 * PEL creation.
189 */
190 void parse(int fd);
191
192 /**
Jayanth Othayothc74c2202021-06-04 06:42:43 -0500193 * @brief Helper function to process SBE FFDC packet.
194 * This function call libekb function to process the
195 * FFDC packet and convert in to known format for PEL
196 * specific file creation. This function also creates
197 * json callout file and text type file, which includes
198 * the addition debug data included in SBE FFDC packet.
199 *
200 * @param ffdcPkt SBE FFDC packet
201 *
202 * Any failure during the process stops the function
203 * execution to support the raw SBE FFDC data based
204 * PEL creation.
205 */
206 void process(const sbeFfdcPacketType& ffdcPkt);
Jayanth Othayoth0866c3f2021-06-07 07:06:20 -0500207
Jayanth Othayothc74c2202021-06-04 06:42:43 -0500208 /**
Matt Spinler8c7bb862023-08-31 14:32:22 -0500209 * @brief Temporary files path and FD information created as part of FFDC
Jayanth Othayothe8bdeea2021-06-03 03:01:16 -0500210 * processing.
211 */
Matt Spinler8c7bb862023-08-31 14:32:22 -0500212 std::vector<std::pair<std::filesystem::path, int>> paths;
Jayanth Othayothe8bdeea2021-06-03 03:01:16 -0500213
214 /**
215 * @brief PEL FFDC files, which includes the user data sections and the
216 * added callout details if any, found during SBE FFDC processing.
217 */
218 PelFFDC ffdcFiles;
219
220 /**
devenraoda876612024-02-16 18:48:27 +0530221 * @brief Chip position associated to SBE FFDC
Jayanth Othayothe8bdeea2021-06-03 03:01:16 -0500222 */
devenraoda876612024-02-16 18:48:27 +0530223 uint32_t chipPos;
Jayanth Othayoth742b00b2022-06-30 05:16:57 -0500224
225 /**
226 * @brief Used to get type of ffdc
227 */
228 FFDC_TYPE ffdcType;
devenraoda876612024-02-16 18:48:27 +0530229
230 /**
231 * @brief Chip type associated to SBE FFDC
232 */
233 uint32_t chipType;
Jayanth Othayothe8bdeea2021-06-03 03:01:16 -0500234};
235
236} // namespace sbe
237} // namespace pels
238} // namespace openpower