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 }