xref: /openbmc/libcper/cper-utils.c (revision 3c43f743)
11b0b00e3SLawrence Tang /**
21b0b00e3SLawrence Tang  * Describes utility functions for parsing CPER into JSON IR.
31b0b00e3SLawrence Tang  *
41b0b00e3SLawrence Tang  * Author: Lawrence.Tang@arm.com
51b0b00e3SLawrence Tang  **/
61b0b00e3SLawrence Tang 
71b0b00e3SLawrence Tang #include <stdio.h>
81b0b00e3SLawrence Tang #include "json.h"
91b0b00e3SLawrence Tang #include "edk/Cper.h"
101b0b00e3SLawrence Tang #include "cper-utils.h"
111b0b00e3SLawrence Tang 
121b0b00e3SLawrence Tang //The available severity types for CPER.
131b0b00e3SLawrence Tang const char* CPER_SEVERITY_TYPES[4] = {"Recoverable", "Fatal", "Corrected", "Informational"};
141b0b00e3SLawrence Tang 
15*3c43f743SLawrence Tang //Converts a single integer value to an object containing a value, and a readable name if possible.
16*3c43f743SLawrence Tang json_object* integer_to_readable_pair(int value, int len, int keys[], const char* values[], const char* default_value)
17*3c43f743SLawrence Tang {
18*3c43f743SLawrence Tang     json_object* result = json_object_new_object();
19*3c43f743SLawrence Tang     json_object_object_add(result, "value", json_object_new_int(value));
20*3c43f743SLawrence Tang 
21*3c43f743SLawrence Tang     //Search for human readable name, add.
22*3c43f743SLawrence Tang     char* name = default_value;
23*3c43f743SLawrence Tang     for (int i=0; i<len; i++)
24*3c43f743SLawrence Tang     {
25*3c43f743SLawrence Tang         if (keys[i] == value)
26*3c43f743SLawrence Tang             name = values[i];
27*3c43f743SLawrence Tang     }
28*3c43f743SLawrence Tang 
29*3c43f743SLawrence Tang     json_object_object_add(result, "name", json_object_new_string(name));
30*3c43f743SLawrence Tang     return result;
31*3c43f743SLawrence Tang }
32*3c43f743SLawrence Tang 
331b0b00e3SLawrence Tang //Converts a single UINT16 revision number into JSON IR representation.
341b0b00e3SLawrence Tang json_object* revision_to_ir(UINT16 revision)
351b0b00e3SLawrence Tang {
361b0b00e3SLawrence Tang     json_object* revision_info = json_object_new_object();
371b0b00e3SLawrence Tang     json_object_object_add(revision_info, "major", json_object_new_int(revision >> 8));
381b0b00e3SLawrence Tang     json_object_object_add(revision_info, "minor", json_object_new_int(revision & 0xFF));
391b0b00e3SLawrence Tang     return revision_info;
401b0b00e3SLawrence Tang }
411b0b00e3SLawrence Tang 
421b0b00e3SLawrence Tang //Returns the appropriate string for the given integer severity.
431b0b00e3SLawrence Tang const char* severity_to_string(UINT8 severity)
441b0b00e3SLawrence Tang {
451b0b00e3SLawrence Tang     return severity < 4 ? CPER_SEVERITY_TYPES[severity] : "Unknown";
461b0b00e3SLawrence Tang }
471b0b00e3SLawrence Tang 
481b0b00e3SLawrence Tang //Helper function to convert an EDK EFI GUID into a string for intermediate use.
491b0b00e3SLawrence Tang void guid_to_string(char* out, EFI_GUID* guid)
501b0b00e3SLawrence Tang {
511b0b00e3SLawrence Tang     sprintf(out, "%08x-%04x-%04x-%02x%02x%02x%02x%02x%02x%02x%02x",
521b0b00e3SLawrence Tang         guid->Data1,
531b0b00e3SLawrence Tang         guid->Data2,
541b0b00e3SLawrence Tang         guid->Data3,
551b0b00e3SLawrence Tang         guid->Data4[0],
561b0b00e3SLawrence Tang         guid->Data4[1],
571b0b00e3SLawrence Tang         guid->Data4[2],
581b0b00e3SLawrence Tang         guid->Data4[3],
591b0b00e3SLawrence Tang         guid->Data4[4],
601b0b00e3SLawrence Tang         guid->Data4[5],
611b0b00e3SLawrence Tang         guid->Data4[6],
621b0b00e3SLawrence Tang         guid->Data4[7]);
631b0b00e3SLawrence Tang }
641b0b00e3SLawrence Tang 
651b0b00e3SLawrence Tang //Returns one if two EFI GUIDs are equal, zero otherwise.
661b0b00e3SLawrence Tang int guid_equal(EFI_GUID* a, EFI_GUID* b)
671b0b00e3SLawrence Tang {
681b0b00e3SLawrence Tang     //Check top base 3 components.
691b0b00e3SLawrence Tang     if (a->Data1 != b->Data1
701b0b00e3SLawrence Tang         || a->Data2 != b->Data2
711b0b00e3SLawrence Tang         || a->Data3 != b->Data3)
721b0b00e3SLawrence Tang     {
731b0b00e3SLawrence Tang         return 0;
741b0b00e3SLawrence Tang     }
751b0b00e3SLawrence Tang 
761b0b00e3SLawrence Tang     //Check Data4 array for equality.
771b0b00e3SLawrence Tang     for (int i=0; i<8; i++)
781b0b00e3SLawrence Tang     {
791b0b00e3SLawrence Tang         if (a->Data4[i] != b->Data4[i])
801b0b00e3SLawrence Tang             return 0;
811b0b00e3SLawrence Tang     }
821b0b00e3SLawrence Tang 
831b0b00e3SLawrence Tang     return 1;
841b0b00e3SLawrence Tang }