1 /**
2  * Functions for generating pseudo-random CPER platform memory error sections.
3  *
4  * Author: Lawrence.Tang@arm.com
5  **/
6 
7 #include <stdlib.h>
8 #include "../../edk/BaseTypes.h"
9 #include "../gen-utils.h"
10 #include "gen-section.h"
11 
12 //Generates a single pseudo-random platform memory error section, saving the resulting address to the given
13 //location. Returns the size of the newly created section.
generate_section_memory(void ** location)14 size_t generate_section_memory(void **location)
15 {
16 	//Create random bytes.
17 	int size = 80;
18 	UINT8 *bytes = generate_random_bytes(size);
19 
20 	//Set reserved areas to zero.
21 	UINT64 *validation = (UINT64 *)bytes;
22 	*validation &= 0x2FFFFF; //Validation 22-63
23 	*(bytes + 73) &= ~0x1C;	 //Extended bits 2-4
24 
25 	//Fix values that could be above range.
26 	*(bytes + 72) = rand() % 16; //Memory error type
27 
28 	//Fix error status.
29 	create_valid_error_section(bytes + 8);
30 
31 	//Set return values, exit.
32 	*location = bytes;
33 	return size;
34 }
35 
36 //Generates a single pseudo-random memory 2 error section, saving the resulting address to the given
37 //location. Returns the size of the newly created section.
generate_section_memory2(void ** location)38 size_t generate_section_memory2(void **location)
39 {
40 	//Create random bytes.
41 	int size = 96;
42 	UINT8 *bytes = generate_random_bytes(size);
43 
44 	//Set reserved areas to zero.
45 	UINT64 *validation = (UINT64 *)bytes;
46 	*validation &= 0x2FFFFF; //Validation 22-63
47 	*(bytes + 63) = 0;	 //Reserved byte 63
48 
49 	//Fix values that could be above range.
50 	*(bytes + 61) = rand() % 16; //Memory error type
51 	*(bytes + 62) = rand() % 2;  //Status
52 
53 	//Fix error status.
54 	create_valid_error_section(bytes + 8);
55 
56 	//Set return values, exit.
57 	*location = bytes;
58 	return size;
59 }
60