xref: /openbmc/libcper/generator/gen-utils.c (revision 2d4d3b65396596d8939bacaea54ed529530362f9)
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)13 void cper_rand_seed(UINT32 seed)
14 {
15 	lfsr = seed;
16 }
17 
cper_rand()18 UINT32 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)29 size_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)36 UINT8 *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)47 void 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