blob: 3d2b706631f94fd3354faaa6368471dc0c97a4b1 [file] [log] [blame] [edit]
/**
* 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;
}