102c801a5SLawrence Tang /** 2efe17e2cSLawrence Tang * Utility functions to assist in generating pseudo-random CPER sections. 302c801a5SLawrence Tang * 402c801a5SLawrence Tang * Author: Lawrence.Tang@arm.com 502c801a5SLawrence Tang **/ 602c801a5SLawrence Tang #include <stdlib.h> 702c801a5SLawrence Tang #include <time.h> 802c801a5SLawrence Tang #include "../edk/BaseTypes.h" 902c801a5SLawrence Tang #include "gen-utils.h" 1002c801a5SLawrence Tang 1102c801a5SLawrence Tang //Generates a random section of the given byte size, saving the result to the given location. 1202c801a5SLawrence Tang //Returns the length of the section as passed in. 1302c801a5SLawrence Tang size_t generate_random_section(void **location, size_t size) 1402c801a5SLawrence Tang { 1502c801a5SLawrence Tang *location = generate_random_bytes(size); 1602c801a5SLawrence Tang return size; 1702c801a5SLawrence Tang } 1802c801a5SLawrence Tang 1902c801a5SLawrence Tang //Generates a random byte allocation of the given size. 2002c801a5SLawrence Tang UINT8 *generate_random_bytes(size_t size) 2102c801a5SLawrence Tang { 2202c801a5SLawrence Tang UINT8 *bytes = malloc(size); 23*f8fc7052SJohn Chung for (size_t i = 0; i < size; i++) { 2402c801a5SLawrence Tang bytes[i] = rand(); 25*f8fc7052SJohn Chung } 2602c801a5SLawrence Tang return bytes; 2702c801a5SLawrence Tang } 2802c801a5SLawrence Tang 29de9707f9SLawrence Tang //Creates a valid common CPER error section, given the start of the error section. 30de9707f9SLawrence Tang //Clears reserved bits. 31de9707f9SLawrence Tang void create_valid_error_section(UINT8 *start) 32de9707f9SLawrence Tang { 33de9707f9SLawrence Tang //Fix reserved bits. 34de9707f9SLawrence Tang UINT64 *error_section = (UINT64 *)start; 35de9707f9SLawrence Tang *error_section &= ~0xFF; //Reserved bits 0-7. 36de9707f9SLawrence Tang *error_section &= 0x7FFFFF; //Reserved bits 23-63 37de9707f9SLawrence Tang 38de9707f9SLawrence Tang //Ensure error type has a valid value. 39e407b4c8SLawrence Tang *(start + 1) = 40e407b4c8SLawrence Tang CPER_ERROR_TYPES_KEYS[rand() % (sizeof(CPER_ERROR_TYPES_KEYS) / 41e407b4c8SLawrence Tang sizeof(int))]; 42de9707f9SLawrence Tang } 43de9707f9SLawrence Tang 4402c801a5SLawrence Tang //Initializes the random seed for rand() using the current time. 4502c801a5SLawrence Tang void init_random() 4602c801a5SLawrence Tang { 4702c801a5SLawrence Tang srand((unsigned int)time(NULL)); 4802c801a5SLawrence Tang } 49