1ea4b82b3SLawrence Tang# Extending `cper-parse` With OEM Sections 2*044afd01SJohn Chung 3*044afd01SJohn ChungSection definitions within `cper-parse` are entirely modular, and can be easily 4*044afd01SJohn Chungmodified at compile time to include custom OEM section extensions. This document 5*044afd01SJohn Chungwill detail how these extensions can be added in from a stock version of the 6*044afd01SJohn Chungproject. 7ea4b82b3SLawrence Tang 8ea4b82b3SLawrence Tang## Creating a Section Parser 9ea4b82b3SLawrence Tang 10*044afd01SJohn ChungFirst, we need to create a parser to actually handle the conversion of the 11*044afd01SJohn Chungsection from CPER -> CPER-JSON and CPER-JSON -> CPER. For the purposes of 12*044afd01SJohn Chungexample here, we will create a fake CPER section, "myVendorSection", in 13*044afd01SJohn Chung`cper-section-myvendor.h` and `cper-section-myvendor.c`. 14*044afd01SJohn Chung 15*044afd01SJohn Chung_sections/cper-section-myvendor.h_ 16*044afd01SJohn Chung 17ea4b82b3SLawrence Tang```c 18ea4b82b3SLawrence Tang#ifndef CPER_SECTION_MYVENDOR 19ea4b82b3SLawrence Tang#define CPER_SECTION_MYVENDOR 20ea4b82b3SLawrence Tang 21ea4b82b3SLawrence Tang#include <json.h> 22ea4b82b3SLawrence Tang#include "../edk/Cper.h" 23ea4b82b3SLawrence Tang 24ea4b82b3SLawrence Tangjson_object* cper_section_myvendor_to_ir(void* section, EFI_ERROR_SECTION_DESCRIPTOR* descriptor); 25ea4b82b3SLawrence Tangvoid ir_section_myvendor_to_cper(json_object* section, FILE* out); 26ea4b82b3SLawrence Tang 27ea4b82b3SLawrence Tang#endif 28ea4b82b3SLawrence Tang``` 29ea4b82b3SLawrence Tang 30*044afd01SJohn Chung_sections/cper-section-myvendor.c_ 31*044afd01SJohn Chung 32ea4b82b3SLawrence Tang```c 33ea4b82b3SLawrence Tang/** 34ea4b82b3SLawrence Tang * Describes functions for converting MyVendor sections from binary and JSON format 35ea4b82b3SLawrence Tang * into an intermediate format. 36ea4b82b3SLawrence Tang * 37ea4b82b3SLawrence Tang * Author: author@example.com 38ea4b82b3SLawrence Tang **/ 39ea4b82b3SLawrence Tang#include <stdio.h> 40ea4b82b3SLawrence Tang#include <json.h> 41ea4b82b3SLawrence Tang#include "../edk/Cper.h" 42ea4b82b3SLawrence Tang#include "cper-section-ccix-per.h" 43ea4b82b3SLawrence Tang 44ea4b82b3SLawrence Tangjson_object* cper_section_myvendor_to_ir(void* section, EFI_ERROR_SECTION_DESCRIPTOR* descriptor) 45ea4b82b3SLawrence Tang{ 46ea4b82b3SLawrence Tang //Define a method here that converts the bytes starting from "section" into JSON IR. 47ea4b82b3SLawrence Tang //The length of the bytes is described in descriptor->Length. 48ea4b82b3SLawrence Tang //... 49ea4b82b3SLawrence Tang} 50ea4b82b3SLawrence Tang 51ea4b82b3SLawrence Tangvoid ir_section_myvendor_to_cper(json_object* section, FILE* out) 52ea4b82b3SLawrence Tang{ 53ea4b82b3SLawrence Tang //Define a method here that converts the given JSON IR object into CPER binary, 54ea4b82b3SLawrence Tang //writing the output to the provided stream. 55ea4b82b3SLawrence Tang //... 56ea4b82b3SLawrence Tang} 57ea4b82b3SLawrence Tang``` 58*044afd01SJohn Chung 59ea4b82b3SLawrence TangOnce this is done, we can add our section to the parser. 60ea4b82b3SLawrence Tang 61ea4b82b3SLawrence Tang## Adding a Section GUID 62ea4b82b3SLawrence Tang 63*044afd01SJohn ChungTo identify our section for parsing, we must define a section GUID within 64*044afd01SJohn Chung`edk/Cper.h` and `edk/Cper.c` respectively. They are defined here for shared use 65*044afd01SJohn Chungin both `cper-parse` and also `cper-generator` if you wish to write a generation 66*044afd01SJohn Chungmethod for your section. 67*044afd01SJohn Chung 68*044afd01SJohn Chung_edk/Cper.h_: 69*044afd01SJohn Chung 70ea4b82b3SLawrence Tang```c 71ea4b82b3SLawrence Tang... 72ea4b82b3SLawrence Tangextern EFI_GUID gEfiCxlVirtualSwitchErrorSectionGuid; 73ea4b82b3SLawrence Tangextern EFI_GUID gEfiCxlMldPortErrorSectionGuid; 74ea4b82b3SLawrence Tangextern EFI_GUID gMyVendorSectionGuid; 75ea4b82b3SLawrence Tang``` 76ea4b82b3SLawrence Tang 77*044afd01SJohn Chung_edk/Cper.c_: 78*044afd01SJohn Chung 79ea4b82b3SLawrence Tang```c 80ea4b82b3SLawrence Tang... 81ea4b82b3SLawrence TangEFI_GUID gEfiCxlVirtualSwitchErrorSectionGuid = { 0x40d26425, 0x3396, 0x4c4d, { 0xa5, 0xda, 0x3d, 0x47, 0x26, 0x3a, 0xf4, 0x25 }}; 82ea4b82b3SLawrence TangEFI_GUID gEfiCxlMldPortErrorSectionGuid = { 0x8dc44363, 0x0c96, 0x4710, { 0xb7, 0xbf, 0x04, 0xbb, 0x99, 0x53, 0x4c, 0x3f }}; 83ea4b82b3SLawrence TangEFI_GUID gMyVendorSectionGuid = { 0x40d26425, 0x3396, 0x4c4d, { 0xa5, 0xda, 0x3d, 0x47, 0x26, 0x3a, 0xf4, 0x25 }}; 84ea4b82b3SLawrence Tang``` 85ea4b82b3SLawrence Tang 86ea4b82b3SLawrence Tang## Adding a Section Definition 87ea4b82b3SLawrence Tang 88*044afd01SJohn ChungFinally, we need to add a section definition for our section, matching the GUID 89*044afd01SJohn Chungto the name and conversion methods. Open `sections/cper-section.c` and add your 90*044afd01SJohn Chungdefinition to the `section_definitions` array, like so: 91*044afd01SJohn Chung 92*044afd01SJohn Chung_sections/cper-section.c_ 93*044afd01SJohn Chung 94ea4b82b3SLawrence Tang```c 95ea4b82b3SLawrence Tang/** 96ea4b82b3SLawrence Tang * Describes available sections to the CPER parser. 97ea4b82b3SLawrence Tang * 98ea4b82b3SLawrence Tang * Author: Lawrence.Tang@arm.com 99ea4b82b3SLawrence Tang **/ 100ea4b82b3SLawrence Tang#include "../edk/Cper.h" 101ea4b82b3SLawrence Tang#include "cper-section.h" 102ea4b82b3SLawrence Tang... 103ea4b82b3SLawrence Tang#include "cper-section-myvendor.h" 104ea4b82b3SLawrence Tang 105ea4b82b3SLawrence Tang//Definitions of all sections available to the CPER parser. 106ea4b82b3SLawrence TangCPER_SECTION_DEFINITION section_definitions[] = { 107ea4b82b3SLawrence Tang ... 108ea4b82b3SLawrence Tang {&gMyVendorSectionGuid, "MyVendor Error", cper_section_myvendor_to_ir, ir_section_myvendor_to_cper}, 109ea4b82b3SLawrence Tang}; 110ea4b82b3SLawrence Tang``` 111*044afd01SJohn Chung 112*044afd01SJohn ChungNow you're done! After a further `cmake .` and `make`, `cper-convert` and all 113*044afd01SJohn Chungother conversion libraries included should successfully convert your OEM CPER 114*044afd01SJohn Chungsection between CPER-JSON and CPER binary. 115