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 }