summaryrefslogtreecommitdiffstats
path: root/extensions/openpower-pels
Commit message (Collapse)AuthorAgeFilesLines
* PEL: Add repository to save PELsMatt Spinler2019-08-057-1/+209
| | | | | | | | | | | | | | Create the Repository class that can save PELs in (and later retrieve them from) the filesystem. It provides an add() method that can add a PEL object to the repository. Now, when the Manager class sees an OpenBMC event log created with the RAWPEL metadata in the AdditionalData property that points at a file that contains a PEL, it can save that PEL. Before the PEL is saved, the log ID and commit timestamp fields in the PEL will be updated - the log ID to a unique value, and the timestamp to the current time. Change-Id: I8dbaddf0f155bcb6d40b933294ada83feb75ce53
* PEL: Add PEL classMatt Spinler2019-08-053-0/+290
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This class represents a Platform Event Log. A PEL consists of sections, and this commit just adds support for the only required sections - the Private Header and User Header, by including those specific objects. More will be added in the future. The only constructor provided in this commit is to construct the object from an existing flattened PEL buffer. This is for use in the case when a PEL is received from off the BMC, such as from the host. Future commits will add support for creating PELs from OpenBMC event logs. Since there aren't objects yet for every PEL section, the class cannot make a full flattened PEL without still keeping around the original PEL data it received in the constructor as mentioned above. So for now it will keep that data and just overlay the sections it does support when flattening. In the future, a fully formed PEL will be able to be constructed from just flattening the section objects in the correct order. This commit provides a few public methods of note: * data() - returns a flattened PEL * assignID() - sets a unique ID in the log ID field in the Private Header * setCommitTime() - Sets the commit timestamp in the Private Header to the current time * valid() - Says if the PEL is properly formed Signed-off-by: Matt Spinler <spinler@us.ibm.com> Change-Id: I2a9d82df9cd096ce77ecca7b2f73b097b8368aa2
* PEL: Add function to generate unique PEL IDsMatt Spinler2019-07-265-0/+184
| | | | | | | | | | | | Create generatePELID() to return a unique 4B PEL ID every time it is called. It will start at a base value, and then increment by 1 each time. It uses a file to save the next value to use. This will be used by the PEL handling code to create unique values for the error log ID field in the Private Header section. Signed-off-by: Matt Spinler <spinler@us.ibm.com> Change-Id: I841a8dcc5dc48e2b663004be3dccfb114ba366f2
* PEL: Add UserHeader classMatt Spinler2019-07-263-1/+272
| | | | | | | | | | | | | The second section in a PEL is always the 'User Header' section. This commit adds a class to represent that. Right now, the only constructor available is filling in its data fields from a PEL stream. Several of the fields in this section have predefined values that are defined by the PEL specification. Defining any constants or enums for those will be left to future commits where they will actually be used. Signed-off-by: Matt Spinler <spinler@us.ibm.com> Change-Id: I8b5f856a4284d44c31b04e98a664f20cd8fa0cb6
* PEL: Add PrivateHeader classMatt Spinler2019-07-264-2/+421
| | | | | | | | | | | | | The first section in a PEL is always the 'Private Header' section. This commit adds a class to represent that. Right now, the only constructor available is filling in its data fields from a PEL stream. The Section base class, which will be the base class of all PEL sections, is also being introduced here. It contains the section header structure, and a valid flag that derived classes can use. Signed-off-by: Matt Spinler <spinler@us.ibm.com> Change-Id: Ia5806017155fe1ef29ea57bf8ab202ff861bde2e
* PEL: Add PEL section header structureMatt Spinler2019-07-261-0/+109
| | | | | | | | | | A PEL is made up of sections, and every section has an 8B section header. This commit adds a SectionHeader structure that will represent that header. It will then be included in all upcoming PEL sections. Signed-off-by: Matt Spinler <spinler@us.ibm.com> Change-Id: Ia5356560f49707e21aebca28f4a0b525aa24158d
* PEL: Add BCD time helpers for PELsMatt Spinler2019-07-263-0/+150
| | | | | | | | | | | | | | | | | | | | | | | A PEL stores time in BCD, with a byte each for: * year MSB * year LSB * month * day * hour * minutes * seconds * hundredths This commit adds a structure to represent this, and functions to: * Create a BCD structure from a std::chrono::time_point * Convert any number to BCD * Write the BCD structure into a Stream * Extract a BCD structure from a Stream Refresher: The BCD value of 32 is 0x32. Signed-off-by: Matt Spinler <spinler@us.ibm.com> Change-Id: I09ea4098f3a3981931f595d11fb63aff31d9fb0d
* PEL: Add Stream class to manipulate PEL dataMatt Spinler2019-07-261-0/+305
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This stream inserts data into and extracts data from the vector<uint8_t> that it is given in its contructor. That vector is how PEL data is stored. This object takes care of the endian conversion for fields that require it, as PEL data is big endian. On writes, it will expand the vector if necessary. An exception will be thrown an invalid access is attempted, such as trying to extract a value when at the end of the data. It provides >> and << operators for common data types, as well as read()/write() functions when using other types. Example: std::vector<uint8_t> data; Stream stream{data}; uin32_t value = 0x12345678; stream << value; stream.offset(0); uint32_t newValue; stream >> newValue; assert(value == newValue); uint8_t buf[3000] = {0}; stream.write(buf, 3000); Signed-off-by: Matt Spinler <spinler@us.ibm.com> Change-Id: I8dc5566371749b45a260389a564836433323eef8
* PEL: Add PEL Manager classMatt Spinler2019-07-264-3/+170
| | | | | | | | | | | This class will have the logic for how to handle PELs. It will also eventually provide D-Bus interfaces. This first commit has stubs, plus some basic code to find if a PEL is being passed in with the OpenBMC event log. Signed-off-by: Matt Spinler <spinler@us.ibm.com> Change-Id: I55a5da4d2239c688fded31c112895c3c92bab56d
* PEL: Add class to wrap AdditionalDataMatt Spinler2019-07-261-0/+77
| | | | | | | | | | | | | | | | | | | | | | The AdditionalData property on the xyz.openbmc_project.Logging.Entry interface is a vector of strings of the form: "KEY=VALUE". The PEL processing code will be interested in those keys and values, and this class adds a way to get at those values based on a key without having to do string parsing each time. It returns an std::optional<std::string> value, and if the key isn't found, then the std::optional value will be empty. For Example: AdditionalData ad{additionalDataPropertyValue}; // Get the value for the FOO key std::optional<std::string> val = ad.getValue("FOO"); if (val) std::cout << (*val).size(); Signed-off-by: Matt Spinler <spinler@us.ibm.com> Change-Id: I6ba458840278784b1cc6a0ed88a7fece8794df7d
* PELs: Document _PID as an AdditionalData keywordMatt Spinler2019-07-191-0/+18
| | | | | | | | | | | | | | When one uses the new `Create` D-Bus API to create an event log that will be converted into a PEL, the log-manager daemon will not know the PID of the creator, unlike when the 'commit' or 'report' shared library APIs are used. Document this method for allowing the creator to pass in their PID, which they can find with getpid(), if they want their PID in an event log and in the corresponding PEL. Signed-off-by: Matt Spinler <spinler@us.ibm.com> Change-Id: I0fadaed301bcd87de1d4395f6c6ec0baacfe0b97
* Add initial OpenPower PEL specific documentationMatt Spinler2019-07-191-0/+28
| | | | | | | | Add a markdown file just for PEL specific documentation starting with how to specify a raw PEL in an OpenBMC event log. Signed-off-by: Matt Spinler <spinler@us.ibm.com> Change-Id: I5bde74b3f271e334dc77f42fd38ca1fef84bd29a
* OpenPower PEL Extension support frameworkMatt Spinler2019-07-162-0/+45
The goal of extensions is to extend phosphor-logging's `xyz.openbmc_project.Logging.Entry` log support to allow other log formats to be created without incurring extra D-Bus call overhead. The README.md change in this commit provides additional documentation on how extensions work. The summary is that they allow code that resides in this repository to provide functions that can be called at certain points (startup, log creation/deletion) such that the code can then create their own logs based on the contents of an OpenBMC log. A specific extension's code is compiled in using a --enable configure option, so platforms that did not use those log formats would incur no performance/size penalties. This commit provides the support for extensions, plus a basic OpenPower PEL (Platform Event Log) extension as the first extension. PELs are event logs used only on some OpenPower systems. Signed-off-by: Matt Spinler <spinler@us.ibm.com> Change-Id: Ifbb31325261c157678c29bbebc7f6d32d282582f
OpenPOWER on IntegriCloud