1*de9707f9SLawrence Tang /**
2*de9707f9SLawrence Tang  * Functions for generating psuedo-random CPER firmware 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 firmware 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_firmware(void** location)
15*de9707f9SLawrence Tang {
16*de9707f9SLawrence Tang     //Create random bytes.
17*de9707f9SLawrence Tang     int size = 32;
18*de9707f9SLawrence Tang     UINT8* bytes = generate_random_bytes(size);
19*de9707f9SLawrence Tang 
20*de9707f9SLawrence Tang     //Set reserved areas to zero.
21*de9707f9SLawrence Tang     for (int i=0; i<7; i++)
22*de9707f9SLawrence Tang         *(bytes + 2 + i) = 0; //Reserved bytes 2-9.
23*de9707f9SLawrence Tang 
24*de9707f9SLawrence Tang     //Set expected values.
25*de9707f9SLawrence Tang     *(bytes + 1) = 2; //Revision, referenced version of spec is 2.
26*de9707f9SLawrence Tang     UINT64* record_id = (UINT64*)(bytes + 8);
27*de9707f9SLawrence Tang     *record_id = 0; //Record ID, should be forced to NULL.
28*de9707f9SLawrence Tang     *bytes = rand() % 3; //Record type.
29*de9707f9SLawrence Tang 
30*de9707f9SLawrence Tang     //Set return values, exit.
31*de9707f9SLawrence Tang     *location = bytes;
32*de9707f9SLawrence Tang     return size;
33*de9707f9SLawrence Tang }