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()18UINT32 cper_rand() 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 //Creates a valid common CPER error section, given the start of the error section. 46 //Clears reserved bits. create_valid_error_section(UINT8 * start)47void create_valid_error_section(UINT8 *start) 48 { 49 //Fix reserved bits. 50 UINT64 *error_section = (UINT64 *)start; 51 *error_section &= ~0xFF; //Reserved bits 0-7. 52 *error_section &= 0x7FFFFF; //Reserved bits 23-63 53 54 //Ensure error type has a valid value. 55 *(start + 1) = CPER_ERROR_TYPES_KEYS[cper_rand() % 56 (sizeof(CPER_ERROR_TYPES_KEYS) / 57 sizeof(int))]; 58 } 59