xref: /openbmc/libcper/generator/gen-utils.c (revision fedd457d)
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.
generate_random_section(void ** location,size_t size)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.
generate_random_bytes(size_t 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.
create_valid_error_section(UINT8 * start)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.
init_random()4502c801a5SLawrence Tang void init_random()
4602c801a5SLawrence Tang {
4702c801a5SLawrence Tang 	srand((unsigned int)time(NULL));
4802c801a5SLawrence Tang }
49