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;
+ }
}
}