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"