blob: e7916bec48f6671ebe70ec6c211b3d3013d6a971 [file] [log] [blame]
Lawrence Tangde9707f2022-07-19 10:54:31 +01001/**
Lawrence Tangefe17e22022-08-08 09:16:23 +01002 * Functions for generating pseudo-random CPER DMAr error sections.
Ed Tanousfedd4572024-07-12 13:56:00 -07003 *
Lawrence Tangde9707f2022-07-19 10:54:31 +01004 * Author: Lawrence.Tang@arm.com
5 **/
6
7#include <stdlib.h>
8#include "../../edk/BaseTypes.h"
9#include "../gen-utils.h"
Lawrence Tang8f977452022-08-24 14:55:07 +010010#include "gen-section.h"
Lawrence Tangde9707f2022-07-19 10:54:31 +010011
Lawrence Tangefe17e22022-08-08 09:16:23 +010012//Generates a single pseudo-random generic DMAr error section, saving the resulting address to the given
Lawrence Tangde9707f2022-07-19 10:54:31 +010013//location. Returns the size of the newly created section.
John Chungf8fc7052024-05-03 20:05:29 +080014size_t generate_section_dmar_generic(void **location)
Lawrence Tangde9707f2022-07-19 10:54:31 +010015{
John Chungf8fc7052024-05-03 20:05:29 +080016 //Create random bytes.
17 int size = 32;
18 UINT8 *bytes = generate_random_bytes(size);
Lawrence Tangde9707f2022-07-19 10:54:31 +010019
John Chungf8fc7052024-05-03 20:05:29 +080020 //Set reserved areas to zero.
21 UINT64 *reserved = (UINT64 *)(bytes + 16);
22 *reserved = 0;
23 *(reserved + 1) = 0;
Lawrence Tangde9707f2022-07-19 10:54:31 +010024
John Chungf8fc7052024-05-03 20:05:29 +080025 //Set expected values.
26 *(bytes + 4) = rand() % 0xC; //Fault reason.
27 *(bytes + 5) = rand() % 2; //Access type.
28 *(bytes + 6) = rand() % 2; //Address type.
29 *(bytes + 7) = rand() % 2 + 1; //Architecture type.
30
31 //Set return values, exit.
32 *location = bytes;
33 return size;
Lawrence Tangde9707f2022-07-19 10:54:31 +010034}
35
Lawrence Tangefe17e22022-08-08 09:16:23 +010036//Generates a single pseudo-random VT-d DMAr error section, saving the resulting address to the given
Lawrence Tangde9707f2022-07-19 10:54:31 +010037//location. Returns the size of the newly created section.
John Chungf8fc7052024-05-03 20:05:29 +080038size_t generate_section_dmar_vtd(void **location)
Lawrence Tangde9707f2022-07-19 10:54:31 +010039{
John Chungf8fc7052024-05-03 20:05:29 +080040 //Create random bytes.
41 int size = 144;
42 UINT8 *bytes = generate_random_bytes(size);
Lawrence Tangde9707f2022-07-19 10:54:31 +010043
John Chungf8fc7052024-05-03 20:05:29 +080044 //Set reserved areas to zero.
45 for (int i = 0; i < 12; i++) {
46 *(bytes + 36 + i) = 0; //Reserved bytes 36-47.
47 }
48 UINT8 *fault_record = bytes + 48;
49 UINT32 *reserved = (UINT32 *)(fault_record);
50 *reserved &= ~0xFFF; //First 12 bits of fault record.
51 reserved = (UINT32 *)(fault_record + 8);
52 *reserved &= ~0x1FFF0000; //Bits 80-92 of fault record.
53 *(fault_record + 15) &= 0x7; //Very last bit of fault record.
54
55 //Set return values, exit.
56 *location = bytes;
57 return size;
Lawrence Tangde9707f2022-07-19 10:54:31 +010058}
59
Lawrence Tangefe17e22022-08-08 09:16:23 +010060//Generates a single pseudo-random IOMMU DMAr error section, saving the resulting address to the given
Lawrence Tangde9707f2022-07-19 10:54:31 +010061//location. Returns the size of the newly created section.
John Chungf8fc7052024-05-03 20:05:29 +080062size_t generate_section_dmar_iommu(void **location)
Lawrence Tangde9707f2022-07-19 10:54:31 +010063{
John Chungf8fc7052024-05-03 20:05:29 +080064 //Create random bytes.
65 int size = 144;
66 UINT8 *bytes = generate_random_bytes(size);
Lawrence Tangde9707f2022-07-19 10:54:31 +010067
John Chungf8fc7052024-05-03 20:05:29 +080068 //Set reserved areas to zero.
69 for (int i = 0; i < 7; i++) {
70 *(bytes + 1 + i) = 0; //Reserved bytes 1 to 7.
71 }
72 UINT64 *reserved = (UINT64 *)(bytes + 24);
73 *reserved = 0; //Reserved bytes 24-31.
74 for (int i = 0; i < 16; i++) {
75 *(bytes + 48 + i) = 0; //Reserved bytes 48-63.
76 }
77
78 //Set return values, exit.
79 *location = bytes;
80 return size;
81}