blob: 1882d6c5dafc6cdc6aa868248f621dd2fc97799e [file] [log] [blame]
Lawrence Tangde9707f2022-07-19 10:54:31 +01001/**
2 * Functions for generating psuedo-random CPER PCI component 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 psuedo-random PCI component error section, saving the resulting address to the given
13//location. Returns the size of the newly created section.
14size_t generate_section_pci_dev(void** location)
15{
16 //Generate how many register pairs will be attached to this section.
17 UINT32 num_memory_pairs = rand() % 4;
18 UINT32 num_io_pairs = rand() % 4;
19 UINT32 num_registers = num_memory_pairs + num_io_pairs;
20
21 //Create random bytes.
22 int size = 40 + (num_registers * 16);
23 UINT8* bytes = generate_random_bytes(size);
24
25 //Set reserved areas to zero.
26 UINT64* validation = (UINT64*)bytes;
27 *validation &= 0b11111; //Validation 5-63
28 for (int i=0; i<5; i++)
29 *(bytes + 27 + i) = 0; //Bytes 11-15 of ID info.
30
31 //Fix error status.
32 create_valid_error_section(bytes + 8);
33
34 //Set return values, exit.
35 *location = bytes;
36 return size;
37}