blob: 259eef1ab44a36015756b306a6a749a716b8590b [file] [log] [blame]
Karthik Rajagopalan683e0552024-03-07 12:30:43 -08001/**
2 * Describes functions for converting NVIDIA CPER sections from binary and JSON format
3 * into an intermediate format.
4 **/
5
6#include <stdio.h>
Ed Tanous2d17ace2024-08-27 14:45:38 -07007#include <stddef.h>
Karthik Rajagopalan683e0552024-03-07 12:30:43 -08008#include <string.h>
9#include <json.h>
Ed Tanousa3b7f8a2024-11-04 16:38:59 -080010#include "Cper.h"
Karthik Rajagopalan683e0552024-03-07 12:30:43 -080011#include "../cper-utils.h"
12#include "cper-section-nvidia.h"
13
14//Converts a single NVIDIA CPER section into JSON IR.
15json_object *cper_section_nvidia_to_ir(void *section)
16{
17 EFI_NVIDIA_ERROR_DATA *nvidia_error = (EFI_NVIDIA_ERROR_DATA *)section;
18 json_object *section_ir = json_object_new_object();
19
Karthik Rajagopalan683e0552024-03-07 12:30:43 -080020 json_object_object_add(section_ir, "signature",
21 json_object_new_string(nvidia_error->Signature));
22
Ed Tanous2d17ace2024-08-27 14:45:38 -070023 json_object *severity = json_object_new_object();
24 json_object_object_add(severity, "code",
25 json_object_new_uint64(nvidia_error->Severity));
26 json_object_object_add(severity, "name",
27 json_object_new_string(severity_to_string(
28 nvidia_error->Severity)));
29 json_object_object_add(section_ir, "severity", severity);
30
Karthik Rajagopalan683e0552024-03-07 12:30:43 -080031 json_object_object_add(section_ir, "errorType",
32 json_object_new_int(nvidia_error->ErrorType));
33 json_object_object_add(
34 section_ir, "errorInstance",
35 json_object_new_int(nvidia_error->ErrorInstance));
Karthik Rajagopalan683e0552024-03-07 12:30:43 -080036 json_object_object_add(section_ir, "socket",
37 json_object_new_int(nvidia_error->Socket));
Ed Tanous2d17ace2024-08-27 14:45:38 -070038 json_object_object_add(section_ir, "registerCount",
Karthik Rajagopalan683e0552024-03-07 12:30:43 -080039 json_object_new_int(nvidia_error->NumberRegs));
40 json_object_object_add(
41 section_ir, "instanceBase",
42 json_object_new_uint64(nvidia_error->InstanceBase));
43
44 // Registers (Address Value pairs).
45 json_object *regarr = json_object_new_array();
Ed Tanous2d17ace2024-08-27 14:45:38 -070046 EFI_NVIDIA_REGISTER_DATA *regPtr = nvidia_error->Register;
47 for (int i = 0; i < nvidia_error->NumberRegs; i++, regPtr++) {
Karthik Rajagopalan683e0552024-03-07 12:30:43 -080048 json_object *reg = json_object_new_object();
49 json_object_object_add(reg, "address",
Ed Tanous2d17ace2024-08-27 14:45:38 -070050 json_object_new_uint64(regPtr->Address));
Karthik Rajagopalan683e0552024-03-07 12:30:43 -080051 json_object_object_add(reg, "value",
Ed Tanous2d17ace2024-08-27 14:45:38 -070052 json_object_new_uint64(regPtr->Value));
Karthik Rajagopalan683e0552024-03-07 12:30:43 -080053 json_object_array_add(regarr, reg);
54 }
55 json_object_object_add(section_ir, "registers", regarr);
56
57 return section_ir;
58}
59
60//Converts a single NVIDIA CPER-JSON section into CPER binary, outputting to the given stream.
61void ir_section_nvidia_to_cper(json_object *section, FILE *out)
62{
63 json_object *regarr = json_object_object_get(section, "registers");
64 int numRegs = json_object_array_length(regarr);
65
Ed Tanous2d17ace2024-08-27 14:45:38 -070066 size_t section_sz = offsetof(EFI_NVIDIA_ERROR_DATA, Register) +
67 numRegs * sizeof(EFI_NVIDIA_REGISTER_DATA);
Karthik Rajagopalan683e0552024-03-07 12:30:43 -080068 EFI_NVIDIA_ERROR_DATA *section_cper =
69 (EFI_NVIDIA_ERROR_DATA *)calloc(1, section_sz);
70
71 //Signature.
72 strncpy(section_cper->Signature,
73 json_object_get_string(
74 json_object_object_get(section, "signature")),
Patrick Williams379e4922024-08-28 11:14:34 -040075 sizeof(section_cper->Signature) - 1);
76 section_cper->Signature[sizeof(section_cper->Signature) - 1] = '\0';
Karthik Rajagopalan683e0552024-03-07 12:30:43 -080077
78 //Fields.
79 section_cper->ErrorType = json_object_get_int(
80 json_object_object_get(section, "errorType"));
81 section_cper->ErrorInstance = json_object_get_int(
82 json_object_object_get(section, "errorInstance"));
Ed Tanous2d17ace2024-08-27 14:45:38 -070083 json_object *severity = json_object_object_get(section, "severity");
84 section_cper->Severity = (UINT8)json_object_get_uint64(
85 json_object_object_get(severity, "code"));
Karthik Rajagopalan683e0552024-03-07 12:30:43 -080086 section_cper->Socket =
87 json_object_get_int(json_object_object_get(section, "socket"));
88 section_cper->NumberRegs = json_object_get_int(
Ed Tanous2d17ace2024-08-27 14:45:38 -070089 json_object_object_get(section, "registerCount"));
Karthik Rajagopalan683e0552024-03-07 12:30:43 -080090 section_cper->InstanceBase = json_object_get_uint64(
91 json_object_object_get(section, "instanceBase"));
92
93 // Registers (Address Value pairs).
Ed Tanous2d17ace2024-08-27 14:45:38 -070094 EFI_NVIDIA_REGISTER_DATA *regPtr = section_cper->Register;
95 for (int i = 0; i < numRegs; i++, regPtr++) {
Karthik Rajagopalan683e0552024-03-07 12:30:43 -080096 json_object *reg = json_object_array_get_idx(regarr, i);
Ed Tanous2d17ace2024-08-27 14:45:38 -070097 regPtr->Address = json_object_get_uint64(
Karthik Rajagopalan683e0552024-03-07 12:30:43 -080098 json_object_object_get(reg, "address"));
Ed Tanous2d17ace2024-08-27 14:45:38 -070099 regPtr->Value = json_object_get_uint64(
Karthik Rajagopalan683e0552024-03-07 12:30:43 -0800100 json_object_object_get(reg, "value"));
101 }
102
103 //Write to stream, free resources.
104 fwrite(section_cper, section_sz, 1, out);
105 fflush(out);
106 free(section_cper);
107}