test(realm): testcase for multiple realms
Testcase creates 2 realms with 1 rec each.
Change-Id: I2f4a83c3cef3be0ce25d3b18521d9e04c5754c97
Signed-off-by: Shruti Gupta <shruti.gupta@arm.com>
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 b11fec0..7e77cb9 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
@@ -20,7 +20,7 @@
#include <host_realm_pmu.h>
#include <host_shared_data.h>
-#define SLEEP_TIME_MS 200U
+#define SLEEP_TIME_MS 20U
extern const char *rmi_exit[];
@@ -355,3 +355,74 @@
tftf_irq_enable(PMU_PPI, GIC_HIGHEST_NS_PRIORITY);
return host_test_realm_pmuv3(REALM_PMU_INTERRUPT);
}
+
+/*
+ * Test aim to create, enter and destroy 2 realms
+ * Host created 2 realms with 1 rec each
+ * Host enters both rec sequentially
+ * Verifies both realm returned success
+ * Destroys both realms
+ */
+test_result_t host_test_multiple_realm_create_enter(void)
+{
+ bool ret1, ret2, ret3;
+ u_register_t rec_flag[1] = {RMI_RUNNABLE};
+ struct realm realm1, realm2;
+
+ SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
+
+ if (!host_create_realm_payload(&realm1, (u_register_t)REALM_IMAGE_BASE,
+ (u_register_t)PAGE_POOL_BASE,
+ (u_register_t)(PAGE_POOL_MAX_SIZE +
+ NS_REALM_SHARED_MEM_SIZE),
+ (u_register_t)PAGE_POOL_MAX_SIZE,
+ 0UL, rec_flag, 1U)) {
+ return TEST_RESULT_FAIL;
+ }
+
+
+ if (!host_create_realm_payload(&realm2, (u_register_t)REALM_IMAGE_BASE,
+ (u_register_t)PAGE_POOL_BASE + PAGE_POOL_MAX_SIZE,
+ (u_register_t)(PAGE_POOL_MAX_SIZE +
+ NS_REALM_SHARED_MEM_SIZE),
+ (u_register_t)PAGE_POOL_MAX_SIZE,
+ 0UL, rec_flag, 1U)) {
+ ret2 = host_destroy_realm(&realm1);
+ return TEST_RESULT_FAIL;
+ }
+
+ if (!host_create_shared_mem(&realm1, NS_REALM_SHARED_MEM_BASE,
+ NS_REALM_SHARED_MEM_SIZE)) {
+ ret1 = false;
+ goto destroy_realms;
+ }
+
+ if (!host_create_shared_mem(&realm2, NS_REALM_SHARED_MEM_BASE +
+ NS_REALM_SHARED_MEM_SIZE, NS_REALM_SHARED_MEM_SIZE)) {
+ ret1 = false;
+ goto destroy_realms;
+ }
+
+ host_shared_data_set_host_val(&realm1, 0U, HOST_ARG1_INDEX, SLEEP_TIME_MS);
+ ret1 = host_enter_realm_execute(&realm1, REALM_SLEEP_CMD, RMI_EXIT_HOST_CALL, 0U);
+ if (!ret1) {
+ goto destroy_realms;
+ }
+ host_shared_data_set_host_val(&realm2, 0U, HOST_ARG1_INDEX, SLEEP_TIME_MS);
+ ret1 = host_enter_realm_execute(&realm2, REALM_SLEEP_CMD, RMI_EXIT_HOST_CALL, 0U);
+
+destroy_realms:
+ ret2 = host_destroy_realm(&realm1);
+ ret3 = host_destroy_realm(&realm2);
+
+ if (!ret3 || !ret2) {
+ ERROR("destroy failed\n");
+ return TEST_RESULT_FAIL;
+ }
+
+ if (!ret1) {
+ return TEST_RESULT_FAIL;
+ }
+
+ return TEST_RESULT_SUCCESS;
+}
diff --git a/tftf/tests/tests-realm-payload.xml b/tftf/tests/tests-realm-payload.xml
index 1142b93..137a768 100644
--- a/tftf/tests/tests-realm-payload.xml
+++ b/tftf/tests/tests-realm-payload.xml
@@ -10,6 +10,8 @@
<testsuite name="Realm payload at EL1" description="Test Realm EL1 framework capabilities" >
<testcase name="Realm EL1 creation and execution test"
function="host_test_realm_create_enter" />
+ <testcase name="Multiple Realm EL1 creation and execution test"
+ function="host_test_multiple_realm_create_enter" />
<testcase name="Realm payload multi rec single cpu"
function="host_realm_multi_rec_single_cpu" />
<testcase name="Realm payload multi rec psci denied"