/** * Utility functions to assist in generating pseudo-random CPER sections. * * Author: Lawrence.Tang@arm.com **/ #include #include #include #include UINT32 lfsr = 0xACE1u; void cper_rand_seed(UINT32 seed) { lfsr = seed; } UINT32 cper_rand() { lfsr |= lfsr == 0; // if x == 0, set x = 1 instead lfsr ^= (lfsr & 0x0007ffff) << 13; lfsr ^= lfsr >> 17; lfsr ^= (lfsr & 0x07ffffff) << 5; return lfsr; } //Generates a random section of the given byte size, saving the result to the given location. //Returns the length of the section as passed in. size_t generate_random_section(void **location, size_t size) { *location = generate_random_bytes(size); return size; } //Generates a random byte allocation of the given size. UINT8 *generate_random_bytes(size_t size) { UINT8 *bytes = malloc(size); for (size_t i = 0; i < size; i++) { bytes[i] = cper_rand(); } return bytes; } //Creates a valid common CPER error section, given the start of the error section. //Clears reserved bits. void create_valid_error_section(UINT8 *start) { //Fix reserved bits. UINT64 *error_section = (UINT64 *)start; *error_section &= ~0xFF; //Reserved bits 0-7. *error_section &= 0x7FFFFF; //Reserved bits 23-63 //Ensure error type has a valid value. *(start + 1) = CPER_ERROR_TYPES_KEYS[cper_rand() % (sizeof(CPER_ERROR_TYPES_KEYS) / sizeof(int))]; }