| /** |
| * Functions for generating pseudo-random CPER NVIDIA error sections. |
| * |
| **/ |
| |
| #include <stdlib.h> |
| #include <stddef.h> |
| #include <string.h> |
| #include <stdio.h> |
| #include <libcper/BaseTypes.h> |
| #include <libcper/generator/gen-utils.h> |
| #include <libcper/generator/sections/gen-section.h> |
| |
| //Generates a single pseudo-random NVIDIA error section, saving the resulting address to the given |
| //location. Returns the size of the newly created section. |
| size_t generate_section_nvidia(void **location) |
| { |
| const char *signatures[] = { |
| "DCC-ECC", "DCC-COH", "HSS-BUSY", "HSS-IDLE", |
| "CLink", "C2C", "C2C-IP-FAIL", "L0 RESET", |
| "L1 RESET", "L2 RESET", "PCIe", "PCIe-DPC", |
| "SOCHUB", "CCPLEXSCF", "CMET-NULL", "CMET-SHA256", |
| "CMET-FULL", "DRAM-CHANNELS", "PAGES-RETIRED", "CCPLEXGIC", |
| "MCF", "GPU-STATUS", "GPU-CONTNMT", "SMMU", |
| }; |
| |
| init_random(); |
| |
| //Create random bytes. |
| int numRegs = 6; |
| size_t size = offsetof(EFI_NVIDIA_ERROR_DATA, Register) + |
| numRegs * sizeof(EFI_NVIDIA_REGISTER_DATA); |
| UINT8 *section = generate_random_bytes(size); |
| |
| //Reserved byte. |
| EFI_NVIDIA_ERROR_DATA *nvidia_error = (EFI_NVIDIA_ERROR_DATA *)section; |
| nvidia_error->Reserved = 0; |
| |
| //Number of Registers. |
| nvidia_error->NumberRegs = numRegs; |
| |
| //Severity (0 to 3 as defined in UEFI spec). |
| nvidia_error->Severity %= 4; |
| |
| //Signature. |
| int idx_random = rand() % (sizeof(signatures) / sizeof(signatures[0])); |
| strncpy(nvidia_error->Signature, signatures[idx_random], |
| sizeof(nvidia_error->Signature) - 1); |
| nvidia_error->Signature[sizeof(nvidia_error->Signature) - 1] = '\0'; |
| |
| //Set return values, exit. |
| *location = section; |
| return size; |
| } |