| Lawrence Tang | de9707f | 2022-07-19 10:54:31 +0100 | [diff] [blame] | 1 | /** | 
| Lawrence Tang | efe17e2 | 2022-08-08 09:16:23 +0100 | [diff] [blame] | 2 |  * Functions for generating pseudo-random CPER firmware error sections. | 
| Ed Tanous | fedd457 | 2024-07-12 13:56:00 -0700 | [diff] [blame] | 3 |  * | 
| Lawrence Tang | de9707f | 2022-07-19 10:54:31 +0100 | [diff] [blame] | 4 |  * Author: Lawrence.Tang@arm.com | 
 | 5 |  **/ | 
 | 6 |  | 
 | 7 | #include <stdlib.h> | 
| Thu Nguyen | e42fb48 | 2024-10-15 14:43:11 +0000 | [diff] [blame] | 8 | #include <libcper/BaseTypes.h> | 
 | 9 | #include <libcper/generator/gen-utils.h> | 
 | 10 | #include <libcper/generator/sections/gen-section.h> | 
| Lawrence Tang | de9707f | 2022-07-19 10:54:31 +0100 | [diff] [blame] | 11 |  | 
| Lawrence Tang | efe17e2 | 2022-08-08 09:16:23 +0100 | [diff] [blame] | 12 | //Generates a single pseudo-random firmware error section, saving the resulting address to the given | 
| Lawrence Tang | de9707f | 2022-07-19 10:54:31 +0100 | [diff] [blame] | 13 | //location. Returns the size of the newly created section. | 
| Aushim Nagarkatti | ae8f6d9 | 2025-01-29 17:34:44 -0800 | [diff] [blame] | 14 | size_t generate_section_firmware(void **location, | 
 | 15 | 				 GEN_VALID_BITS_TEST_TYPE validBitsType) | 
| Lawrence Tang | de9707f | 2022-07-19 10:54:31 +0100 | [diff] [blame] | 16 | { | 
| Aushim Nagarkatti | ae8f6d9 | 2025-01-29 17:34:44 -0800 | [diff] [blame] | 17 | 	(void)validBitsType; | 
| John Chung | f8fc705 | 2024-05-03 20:05:29 +0800 | [diff] [blame] | 18 | 	//Create random bytes. | 
 | 19 | 	int size = 32; | 
 | 20 | 	UINT8 *bytes = generate_random_bytes(size); | 
| Lawrence Tang | de9707f | 2022-07-19 10:54:31 +0100 | [diff] [blame] | 21 |  | 
| John Chung | f8fc705 | 2024-05-03 20:05:29 +0800 | [diff] [blame] | 22 | 	//Set reserved areas to zero. | 
 | 23 | 	for (int i = 0; i < 6; i++) { | 
 | 24 | 		*(bytes + 2 + i) = 0; //Reserved bytes 2-7. | 
 | 25 | 	} | 
| Lawrence Tang | de9707f | 2022-07-19 10:54:31 +0100 | [diff] [blame] | 26 |  | 
| John Chung | f8fc705 | 2024-05-03 20:05:29 +0800 | [diff] [blame] | 27 | 	//Set expected values. | 
| Ed Tanous | 2d4d3b6 | 2025-03-11 10:34:29 -0700 | [diff] [blame] | 28 | 	*(bytes + 1) = 2;	  //Revision, referenced version of spec is 2. | 
| John Chung | f8fc705 | 2024-05-03 20:05:29 +0800 | [diff] [blame] | 29 | 	UINT64 *record_id = (UINT64 *)(bytes + 8); | 
| Ed Tanous | 2d4d3b6 | 2025-03-11 10:34:29 -0700 | [diff] [blame] | 30 | 	*record_id = 0;		  //Record ID, should be forced to NULL. | 
 | 31 | 	*bytes = cper_rand() % 3; //Record type. | 
| John Chung | f8fc705 | 2024-05-03 20:05:29 +0800 | [diff] [blame] | 32 |  | 
 | 33 | 	//Set return values, exit. | 
 | 34 | 	*location = bytes; | 
 | 35 | 	return size; | 
 | 36 | } |