feat(realm_payload): use random start REC

This patch modifies tests below
host_test_realm_create_enter
host_test_multiple_realm_create_enter
host_realm_multi_rec_single_cpu
to start Realm execution with a random REC number.

Change-Id: I5961f953efc4dab25d301a7026d0c3949701df4a
Signed-off-by: AlexeiFedorov <Alexei.Fedorov@arm.com>
diff --git a/tftf/tests/runtime_services/realm_payload/host_realm_payload_multiple_rec_tests.c b/tftf/tests/runtime_services/realm_payload/host_realm_payload_multiple_rec_tests.c
index f0bfc8c..e3ee23b 100644
--- a/tftf/tests/runtime_services/realm_payload/host_realm_payload_multiple_rec_tests.c
+++ b/tftf/tests/runtime_services/realm_payload/host_realm_payload_multiple_rec_tests.c
@@ -33,6 +33,7 @@
 	u_register_t rec_flag[MAX_REC_COUNT];
 	u_register_t feature_flag = 0U;
 	long sl = RTT_MIN_LEVEL;
+	unsigned int rec_num;
 
 	SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
 
@@ -50,13 +51,21 @@
 		return TEST_RESULT_FAIL;
 	}
 
+	/* Start random Rec */
+	rec_num = (unsigned int)rand() % MAX_REC_COUNT;
+
 	for (unsigned int i = 0; i < MAX_REC_COUNT; i++) {
-		host_shared_data_set_host_val(&realm, i, HOST_ARG1_INDEX, 10U);
+		host_shared_data_set_host_val(&realm, rec_num, HOST_ARG1_INDEX, 10U);
 		ret1 = host_enter_realm_execute(&realm, REALM_SLEEP_CMD,
-				RMI_EXIT_HOST_CALL, i);
+				RMI_EXIT_HOST_CALL, rec_num);
 		if (!ret1) {
 			break;
 		}
+
+		/* Increment Rec number */
+		if (++rec_num == MAX_REC_COUNT) {
+			rec_num = 0U;
+		}
 	}
 
 	ret2 = host_destroy_realm(&realm);
@@ -319,7 +328,7 @@
  * Each of the secondary then enters Realm with a different REC
  * and executes the test REALM_MULTIPLE_REC_MULTIPLE_CPU_CMD in Realm payload.
  * It is expected that the REC will exit with PSCI_CPU_OFF as the exit reason.
- * REC00 checks if all other CPUs are off, via PSCI_AFFINITY_INFO.
+ * REC0 checks if all other CPUs are off, via PSCI_AFFINITY_INFO.
  * Host completes the PSCI requests.
  */
 test_result_t host_realm_multi_rec_multiple_cpu(void)
@@ -330,7 +339,7 @@
 	u_register_t rec_num;
 	u_register_t other_mpidr, my_mpidr;
 	struct rmi_rec_run *run;
-	unsigned int host_call_result, i = 0U;
+	unsigned int host_call_result, i;
 	u_register_t rec_flag[MAX_REC_COUNT] = {RMI_RUNNABLE};
 	u_register_t exit_reason;
 	unsigned int cpu_node, rec_count;
@@ -347,7 +356,7 @@
 		sl = RTT_MIN_LEVEL_LPA2;
 	}
 
-	for (unsigned int i = 1U; i < rec_count; i++) {
+	for (i = 1U; i < rec_count; i++) {
 		rec_flag[i] = RMI_NOT_RUNNABLE;
 	}
 
@@ -396,6 +405,8 @@
 		goto destroy_realm;
 	}
 
+	i = 0U;
+
 	/* Turn on all CPUs */
 	for_each_cpu(cpu_node) {
 		if (i == (rec_count - 1U)) {
diff --git a/tftf/tests/runtime_services/realm_payload/host_realm_payload_tests.c b/tftf/tests/runtime_services/realm_payload/host_realm_payload_tests.c
index 840c2be..e22a9f1 100644
--- a/tftf/tests/runtime_services/realm_payload/host_realm_payload_tests.c
+++ b/tftf/tests/runtime_services/realm_payload/host_realm_payload_tests.c
@@ -38,7 +38,7 @@
 test_result_t host_test_realm_create_enter(void)
 {
 	bool ret1, ret2;
-	u_register_t rec_flag[1] = {RMI_RUNNABLE};
+	u_register_t rec_flag[MAX_REC_COUNT];
 	struct realm realm;
 	u_register_t feature_flag = 0UL;
 	long sl = RTT_MIN_LEVEL;
@@ -50,14 +50,22 @@
 		sl = RTT_MIN_LEVEL_LPA2;
 	}
 
+	for (unsigned int i = 0U; i < MAX_REC_COUNT; i++) {
+		rec_flag[i] = RMI_RUNNABLE;
+	}
+
 	for (unsigned int i = 0U; i < 5U; i++) {
+		/* Run random Rec */
+		unsigned int run_num = (unsigned int)rand() % MAX_REC_COUNT;
+
 		if (!host_create_activate_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
-				feature_flag, sl, rec_flag, 1U)) {
+				feature_flag, sl, rec_flag, MAX_REC_COUNT)) {
 			return TEST_RESULT_FAIL;
 		}
 
-		host_shared_data_set_host_val(&realm, 0U, HOST_ARG1_INDEX, SLEEP_TIME_MS);
-		ret1 = host_enter_realm_execute(&realm, REALM_SLEEP_CMD, RMI_EXIT_HOST_CALL, 0U);
+		host_shared_data_set_host_val(&realm, run_num, HOST_ARG1_INDEX, SLEEP_TIME_MS);
+		ret1 = host_enter_realm_execute(&realm, REALM_SLEEP_CMD, RMI_EXIT_HOST_CALL,
+						run_num);
 		ret2 = host_destroy_realm(&realm);
 
 		if (!ret1 || !ret2) {
@@ -375,7 +383,7 @@
 /*
  * Test aim to create, enter and destroy MAX_REALM_COUNT realms
  * Host created MAX_REALM_COUNT realms with MAX_REC_COUNT rec each
- * Host enters all recs sequentially
+ * Host enters all recs sequentially, starting from the random rec
  * Verifies all realms returned success
  * Destroys all realms
  */
@@ -385,7 +393,7 @@
 	u_register_t rec_flag[MAX_REC_COUNT];
 	u_register_t feature_flag = 0U;
 	long sl = RTT_MIN_LEVEL;
-	unsigned int num;
+	unsigned int run_rec[MAX_REALM_COUNT], num;
 
 	SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
 
@@ -399,18 +407,31 @@
 	}
 
 	for (num = 0U; num < MAX_REALM_COUNT; num++) {
+		/* Generate random REC start number */
+		run_rec[num] = (unsigned int)rand() % MAX_REC_COUNT;
+
 		ret = host_create_activate_realm_payload(&realm[num],
 							(u_register_t)REALM_IMAGE_BASE,
-							feature_flag, sl, rec_flag, 1U);
+							feature_flag, sl, rec_flag, MAX_REC_COUNT);
 		if (!ret) {
 			goto destroy_realms;
 		}
+	}
 
-		host_shared_data_set_host_val(&realm[num], 0U, HOST_ARG1_INDEX, SLEEP_TIME_MS);
-		ret = host_enter_realm_execute(&realm[num], REALM_SLEEP_CMD, RMI_EXIT_HOST_CALL,
-						0U);
-		if (!ret) {
-			goto destroy_realms;
+	for (unsigned int j = 0U; j < MAX_REC_COUNT; j++) {
+		for (unsigned int i = 0U; i < MAX_REALM_COUNT; i++) {
+			host_shared_data_set_host_val(&realm[i], run_rec[i], HOST_ARG1_INDEX,
+							SLEEP_TIME_MS);
+			ret = host_enter_realm_execute(&realm[i], REALM_SLEEP_CMD,
+							RMI_EXIT_HOST_CALL, run_rec[i]);
+			if (!ret) {
+				goto destroy_realms;
+			}
+
+			/* Increment REC number */
+			if (++run_rec[i] == MAX_REC_COUNT) {
+				run_rec[i] = 0U;
+			}
 		}
 	}