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-sections.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.
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) &= ~0b11100; //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.
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 }