1*1b0b00e3SLawrence Tang /** 2*1b0b00e3SLawrence Tang * Describes utility functions for parsing CPER into JSON IR. 3*1b0b00e3SLawrence Tang * 4*1b0b00e3SLawrence Tang * Author: Lawrence.Tang@arm.com 5*1b0b00e3SLawrence Tang **/ 6*1b0b00e3SLawrence Tang 7*1b0b00e3SLawrence Tang #include <stdio.h> 8*1b0b00e3SLawrence Tang #include "json.h" 9*1b0b00e3SLawrence Tang #include "edk/Cper.h" 10*1b0b00e3SLawrence Tang #include "cper-utils.h" 11*1b0b00e3SLawrence Tang 12*1b0b00e3SLawrence Tang //The available severity types for CPER. 13*1b0b00e3SLawrence Tang const char* CPER_SEVERITY_TYPES[4] = {"Recoverable", "Fatal", "Corrected", "Informational"}; 14*1b0b00e3SLawrence Tang 15*1b0b00e3SLawrence Tang //Converts a single UINT16 revision number into JSON IR representation. 16*1b0b00e3SLawrence Tang json_object* revision_to_ir(UINT16 revision) 17*1b0b00e3SLawrence Tang { 18*1b0b00e3SLawrence Tang json_object* revision_info = json_object_new_object(); 19*1b0b00e3SLawrence Tang json_object_object_add(revision_info, "major", json_object_new_int(revision >> 8)); 20*1b0b00e3SLawrence Tang json_object_object_add(revision_info, "minor", json_object_new_int(revision & 0xFF)); 21*1b0b00e3SLawrence Tang return revision_info; 22*1b0b00e3SLawrence Tang } 23*1b0b00e3SLawrence Tang 24*1b0b00e3SLawrence Tang //Returns the appropriate string for the given integer severity. 25*1b0b00e3SLawrence Tang const char* severity_to_string(UINT8 severity) 26*1b0b00e3SLawrence Tang { 27*1b0b00e3SLawrence Tang return severity < 4 ? CPER_SEVERITY_TYPES[severity] : "Unknown"; 28*1b0b00e3SLawrence Tang } 29*1b0b00e3SLawrence Tang 30*1b0b00e3SLawrence Tang //Helper function to convert an EDK EFI GUID into a string for intermediate use. 31*1b0b00e3SLawrence Tang void guid_to_string(char* out, EFI_GUID* guid) 32*1b0b00e3SLawrence Tang { 33*1b0b00e3SLawrence Tang sprintf(out, "%08x-%04x-%04x-%02x%02x%02x%02x%02x%02x%02x%02x", 34*1b0b00e3SLawrence Tang guid->Data1, 35*1b0b00e3SLawrence Tang guid->Data2, 36*1b0b00e3SLawrence Tang guid->Data3, 37*1b0b00e3SLawrence Tang guid->Data4[0], 38*1b0b00e3SLawrence Tang guid->Data4[1], 39*1b0b00e3SLawrence Tang guid->Data4[2], 40*1b0b00e3SLawrence Tang guid->Data4[3], 41*1b0b00e3SLawrence Tang guid->Data4[4], 42*1b0b00e3SLawrence Tang guid->Data4[5], 43*1b0b00e3SLawrence Tang guid->Data4[6], 44*1b0b00e3SLawrence Tang guid->Data4[7]); 45*1b0b00e3SLawrence Tang } 46*1b0b00e3SLawrence Tang 47*1b0b00e3SLawrence Tang //Returns one if two EFI GUIDs are equal, zero otherwise. 48*1b0b00e3SLawrence Tang int guid_equal(EFI_GUID* a, EFI_GUID* b) 49*1b0b00e3SLawrence Tang { 50*1b0b00e3SLawrence Tang //Check top base 3 components. 51*1b0b00e3SLawrence Tang if (a->Data1 != b->Data1 52*1b0b00e3SLawrence Tang || a->Data2 != b->Data2 53*1b0b00e3SLawrence Tang || a->Data3 != b->Data3) 54*1b0b00e3SLawrence Tang { 55*1b0b00e3SLawrence Tang return 0; 56*1b0b00e3SLawrence Tang } 57*1b0b00e3SLawrence Tang 58*1b0b00e3SLawrence Tang //Check Data4 array for equality. 59*1b0b00e3SLawrence Tang for (int i=0; i<8; i++) 60*1b0b00e3SLawrence Tang { 61*1b0b00e3SLawrence Tang if (a->Data4[i] != b->Data4[i]) 62*1b0b00e3SLawrence Tang return 0; 63*1b0b00e3SLawrence Tang } 64*1b0b00e3SLawrence Tang 65*1b0b00e3SLawrence Tang return 1; 66*1b0b00e3SLawrence Tang }