Karthik Rajagopalan | 683e055 | 2024-03-07 12:30:43 -0800 | [diff] [blame] | 1 | /** |
| 2 | * Functions for generating pseudo-random CPER NVIDIA error sections. |
| 3 | * |
| 4 | **/ |
| 5 | |
| 6 | #include <stdlib.h> |
Ed Tanous | 2d17ace | 2024-08-27 14:45:38 -0700 | [diff] [blame] | 7 | #include <stddef.h> |
Karthik Rajagopalan | 683e055 | 2024-03-07 12:30:43 -0800 | [diff] [blame] | 8 | #include <string.h> |
| 9 | #include <stdio.h> |
Thu Nguyen | e42fb48 | 2024-10-15 14:43:11 +0000 | [diff] [blame] | 10 | #include <libcper/BaseTypes.h> |
| 11 | #include <libcper/generator/gen-utils.h> |
| 12 | #include <libcper/generator/sections/gen-section.h> |
Karthik Rajagopalan | 683e055 | 2024-03-07 12:30:43 -0800 | [diff] [blame] | 13 | |
| 14 | //Generates a single pseudo-random NVIDIA error section, saving the resulting address to the given |
| 15 | //location. Returns the size of the newly created section. |
Aushim Nagarkatti | ae8f6d9 | 2025-01-29 17:34:44 -0800 | [diff] [blame^] | 16 | size_t generate_section_nvidia(void **location, |
| 17 | GEN_VALID_BITS_TEST_TYPE validBitsType) |
Karthik Rajagopalan | 683e055 | 2024-03-07 12:30:43 -0800 | [diff] [blame] | 18 | { |
Aushim Nagarkatti | ae8f6d9 | 2025-01-29 17:34:44 -0800 | [diff] [blame^] | 19 | (void)validBitsType; |
Karthik Rajagopalan | 683e055 | 2024-03-07 12:30:43 -0800 | [diff] [blame] | 20 | const char *signatures[] = { |
| 21 | "DCC-ECC", "DCC-COH", "HSS-BUSY", "HSS-IDLE", |
| 22 | "CLink", "C2C", "C2C-IP-FAIL", "L0 RESET", |
| 23 | "L1 RESET", "L2 RESET", "PCIe", "PCIe-DPC", |
| 24 | "SOCHUB", "CCPLEXSCF", "CMET-NULL", "CMET-SHA256", |
| 25 | "CMET-FULL", "DRAM-CHANNELS", "PAGES-RETIRED", "CCPLEXGIC", |
| 26 | "MCF", "GPU-STATUS", "GPU-CONTNMT", "SMMU", |
| 27 | }; |
| 28 | |
| 29 | init_random(); |
| 30 | |
| 31 | //Create random bytes. |
Ed Tanous | 2d17ace | 2024-08-27 14:45:38 -0700 | [diff] [blame] | 32 | int numRegs = 6; |
| 33 | size_t size = offsetof(EFI_NVIDIA_ERROR_DATA, Register) + |
| 34 | numRegs * sizeof(EFI_NVIDIA_REGISTER_DATA); |
Karthik Rajagopalan | 683e055 | 2024-03-07 12:30:43 -0800 | [diff] [blame] | 35 | UINT8 *section = generate_random_bytes(size); |
| 36 | |
| 37 | //Reserved byte. |
| 38 | EFI_NVIDIA_ERROR_DATA *nvidia_error = (EFI_NVIDIA_ERROR_DATA *)section; |
| 39 | nvidia_error->Reserved = 0; |
| 40 | |
Ed Tanous | 2d17ace | 2024-08-27 14:45:38 -0700 | [diff] [blame] | 41 | //Number of Registers. |
| 42 | nvidia_error->NumberRegs = numRegs; |
| 43 | |
| 44 | //Severity (0 to 3 as defined in UEFI spec). |
| 45 | nvidia_error->Severity %= 4; |
| 46 | |
Karthik Rajagopalan | 683e055 | 2024-03-07 12:30:43 -0800 | [diff] [blame] | 47 | //Signature. |
| 48 | int idx_random = rand() % (sizeof(signatures) / sizeof(signatures[0])); |
| 49 | strncpy(nvidia_error->Signature, signatures[idx_random], |
Patrick Williams | 379e492 | 2024-08-28 11:14:34 -0400 | [diff] [blame] | 50 | sizeof(nvidia_error->Signature) - 1); |
| 51 | nvidia_error->Signature[sizeof(nvidia_error->Signature) - 1] = '\0'; |
Karthik Rajagopalan | 683e055 | 2024-03-07 12:30:43 -0800 | [diff] [blame] | 52 | |
| 53 | //Set return values, exit. |
| 54 | *location = section; |
| 55 | return size; |
| 56 | } |