blob: e648cba9002ef29e24d8cd9c99ed1edc82cfa426 [file] [log] [blame]
Lawrence Tangde9707f2022-07-19 10:54:31 +01001/**
Lawrence Tangefe17e22022-08-08 09:16:23 +01002 * Functions for generating pseudo-random CCIX PER 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>
Thu Nguyene42fb482024-10-15 14:43:11 +00008#include <libcper/BaseTypes.h>
9#include <libcper/generator/gen-utils.h>
10#include <libcper/generator/sections/gen-section.h>
Lawrence Tangde9707f2022-07-19 10:54:31 +010011
Lawrence Tangefe17e22022-08-08 09:16:23 +010012//Generates a single pseudo-random CCIX PER 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.
Aushim Nagarkattiae8f6d92025-01-29 17:34:44 -080014size_t generate_section_ccix_per(void **location,
15 GEN_VALID_BITS_TEST_TYPE validBitsType)
Lawrence Tangde9707f2022-07-19 10:54:31 +010016{
John Chungf8fc7052024-05-03 20:05:29 +080017 //Create a random length for the CCIX PER log.
18 //The log attached here does not necessarily conform to the CCIX specification, and is simply random.
19 int log_len = (rand() % 5 + 1) * 32;
Lawrence Tangde9707f2022-07-19 10:54:31 +010020
John Chungf8fc7052024-05-03 20:05:29 +080021 //Create random bytes.
22 int size = 16 + log_len;
23 UINT8 *bytes = generate_random_bytes(size);
Lawrence Tangde9707f2022-07-19 10:54:31 +010024
John Chungf8fc7052024-05-03 20:05:29 +080025 //Set reserved areas to zero.
26 UINT32 *validation = (UINT32 *)(bytes + 4);
27 *validation &= 0x7; //Validation bits 3-63.
28 *(validation + 1) = 0; //Validation bits 3-63.
Aushim Nagarkattiae8f6d92025-01-29 17:34:44 -080029 if (validBitsType == ALL_VALID) {
30 *validation = 0x7;
31 } else if (validBitsType == SOME_VALID) {
32 *validation = 0x5;
33 }
John Chungf8fc7052024-05-03 20:05:29 +080034 *(bytes + 13) &= 0x1F; //CCIX port ID bits 5-7.
35 UINT16 *reserved = (UINT16 *)(bytes + 14);
36 *reserved = 0; //Reserved bytes 14-15.
Lawrence Tangd34f2b12022-07-19 15:36:31 +010037
John Chungf8fc7052024-05-03 20:05:29 +080038 //Set expected values.
39 UINT32 *length = (UINT32 *)bytes;
40 *length = size;
41
42 //Set return values, exit.
43 *location = bytes;
44 return size;
45}