1 /** 2 * Utility functions to assist in generating pseudo-random CPER sections. 3 * 4 * Author: Lawrence.Tang@arm.com 5 **/ 6 #include <stdlib.h> 7 #include <time.h> 8 #include <libcper/BaseTypes.h> 9 #include <libcper/generator/gen-utils.h> 10 11 UINT32 lfsr = 0xACE1u; 12 cper_rand_seed(UINT32 seed)13void cper_rand_seed(UINT32 seed) 14 { 15 lfsr = seed; 16 } 17 cper_rand(void)18UINT32 cper_rand(void) 19 { 20 lfsr |= lfsr == 0; // if x == 0, set x = 1 instead 21 lfsr ^= (lfsr & 0x0007ffff) << 13; 22 lfsr ^= lfsr >> 17; 23 lfsr ^= (lfsr & 0x07ffffff) << 5; 24 return lfsr; 25 } 26 27 //Generates a random section of the given byte size, saving the result to the given location. 28 //Returns the length of the section as passed in. generate_random_section(void ** location,size_t size)29size_t generate_random_section(void **location, size_t size) 30 { 31 *location = generate_random_bytes(size); 32 return size; 33 } 34 35 //Generates a random byte allocation of the given size. generate_random_bytes(size_t size)36UINT8 *generate_random_bytes(size_t size) 37 { 38 UINT8 *bytes = malloc(size); 39 for (size_t i = 0; i < size; i++) { 40 bytes[i] = cper_rand(); 41 } 42 return bytes; 43 } 44 45 // Generates a null terminated string of printable chracters generate_random_printable_string(char * dest,size_t length)46void generate_random_printable_string(char *dest, size_t length) 47 { 48 for (size_t i = 0; i < length; i++) { 49 dest[i] = cper_rand() % ('z' - 'a') + 'a'; 50 } 51 dest[length - 1] = 0; 52 } 53 54 //Creates a valid common CPER error section, given the start of the error section. 55 //Clears reserved bits. create_valid_error_section(UINT8 * start)56void create_valid_error_section(UINT8 *start) 57 { 58 //Fix reserved bits. 59 UINT64 *error_section = (UINT64 *)start; 60 *error_section &= ~0xFF; //Reserved bits 0-7. 61 *error_section &= 0x7FFFFF; //Reserved bits 23-63 62 63 //Ensure error type has a valid value. 64 *(start + 1) = CPER_ERROR_TYPES_KEYS[cper_rand() % 65 (sizeof(CPER_ERROR_TYPES_KEYS) / 66 sizeof(int))]; 67 } 68