1*683e0550SKarthik Rajagopalan /** 2*683e0550SKarthik Rajagopalan * Functions for generating pseudo-random CPER NVIDIA error sections. 3*683e0550SKarthik Rajagopalan * 4*683e0550SKarthik Rajagopalan **/ 5*683e0550SKarthik Rajagopalan 6*683e0550SKarthik Rajagopalan #include <stdlib.h> 7*683e0550SKarthik Rajagopalan #include <string.h> 8*683e0550SKarthik Rajagopalan #include <stdio.h> 9*683e0550SKarthik Rajagopalan #include "../../edk/BaseTypes.h" 10*683e0550SKarthik Rajagopalan #include "../gen-utils.h" 11*683e0550SKarthik Rajagopalan #include "gen-section.h" 12*683e0550SKarthik Rajagopalan 13*683e0550SKarthik Rajagopalan //Generates a single pseudo-random NVIDIA error section, saving the resulting address to the given 14*683e0550SKarthik Rajagopalan //location. Returns the size of the newly created section. 15*683e0550SKarthik Rajagopalan size_t generate_section_nvidia(void **location) 16*683e0550SKarthik Rajagopalan { 17*683e0550SKarthik Rajagopalan const char *signatures[] = { 18*683e0550SKarthik Rajagopalan "DCC-ECC", "DCC-COH", "HSS-BUSY", "HSS-IDLE", 19*683e0550SKarthik Rajagopalan "CLink", "C2C", "C2C-IP-FAIL", "L0 RESET", 20*683e0550SKarthik Rajagopalan "L1 RESET", "L2 RESET", "PCIe", "PCIe-DPC", 21*683e0550SKarthik Rajagopalan "SOCHUB", "CCPLEXSCF", "CMET-NULL", "CMET-SHA256", 22*683e0550SKarthik Rajagopalan "CMET-FULL", "DRAM-CHANNELS", "PAGES-RETIRED", "CCPLEXGIC", 23*683e0550SKarthik Rajagopalan "MCF", "GPU-STATUS", "GPU-CONTNMT", "SMMU", 24*683e0550SKarthik Rajagopalan }; 25*683e0550SKarthik Rajagopalan 26*683e0550SKarthik Rajagopalan init_random(); 27*683e0550SKarthik Rajagopalan 28*683e0550SKarthik Rajagopalan //Create random bytes. 29*683e0550SKarthik Rajagopalan size_t size = sizeof(EFI_NVIDIA_ERROR_DATA); 30*683e0550SKarthik Rajagopalan UINT8 *section = generate_random_bytes(size); 31*683e0550SKarthik Rajagopalan 32*683e0550SKarthik Rajagopalan //Reserved byte. 33*683e0550SKarthik Rajagopalan EFI_NVIDIA_ERROR_DATA *nvidia_error = (EFI_NVIDIA_ERROR_DATA *)section; 34*683e0550SKarthik Rajagopalan nvidia_error->Reserved = 0; 35*683e0550SKarthik Rajagopalan 36*683e0550SKarthik Rajagopalan //Signature. 37*683e0550SKarthik Rajagopalan int idx_random = rand() % (sizeof(signatures) / sizeof(signatures[0])); 38*683e0550SKarthik Rajagopalan strncpy(nvidia_error->Signature, signatures[idx_random], 39*683e0550SKarthik Rajagopalan sizeof(nvidia_error->Signature)); 40*683e0550SKarthik Rajagopalan 41*683e0550SKarthik Rajagopalan //Set return values, exit. 42*683e0550SKarthik Rajagopalan *location = section; 43*683e0550SKarthik Rajagopalan return size; 44*683e0550SKarthik Rajagopalan } 45