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