test(realm): add test for rtt_fold unassigned

Add testcase for RMI_RTT_FOLD,
for protected IPA unassigned empty and unassigned ram RTTs.
Host attempts to fold till max level permitted by Arch.
Fix helper to align with RMI call, remove unused code.

Change-Id: Ib94efa7ba60e028bb9f765e769fe377c101a71fc
Signed-off-by: Shruti Gupta <shruti.gupta@arm.com>
diff --git a/include/runtime_services/host_realm_managment/host_realm_helper.h b/include/runtime_services/host_realm_managment/host_realm_helper.h
index 9f6d934..ae5f461 100644
--- a/include/runtime_services/host_realm_managment/host_realm_helper.h
+++ b/include/runtime_services/host_realm_managment/host_realm_helper.h
@@ -54,5 +54,6 @@
 		int test_exit_reason, unsigned int rec_num);
 test_result_t host_cmp_result(void);
 void realm_print_handler(struct realm *realm_ptr, unsigned int rec_num);
+bool host_ipa_is_ns(u_register_t addr, u_register_t rmm_feat_reg0);
 
 #endif /* HOST_REALM_HELPER_H */
diff --git a/include/runtime_services/host_realm_managment/host_realm_rmi.h b/include/runtime_services/host_realm_managment/host_realm_rmi.h
index 55233a1..6a1d987 100644
--- a/include/runtime_services/host_realm_managment/host_realm_rmi.h
+++ b/include/runtime_services/host_realm_managment/host_realm_rmi.h
@@ -609,5 +609,6 @@
 					   u_register_t src_pa);
 u_register_t host_realm_map_unprotected(struct realm *realm, u_register_t ns_pa,
 					u_register_t map_size);
+u_register_t host_realm_fold_rtt(u_register_t rd, u_register_t addr, u_register_t level);
 
 #endif /* HOST_REALM_RMI_H */
diff --git a/tftf/tests/runtime_services/host_realm_managment/host_realm_rmi.c b/tftf/tests/runtime_services/host_realm_managment/host_realm_rmi.c
index 313009c..805153b 100644
--- a/tftf/tests/runtime_services/host_realm_managment/host_realm_rmi.c
+++ b/tftf/tests/runtime_services/host_realm_managment/host_realm_rmi.c
@@ -217,6 +217,12 @@
 	return rets.ret0;
 }
 
+/*
+ * RMI_RTT_FOLD destroys a homogeneous child RTT,
+ * and moves information which was stored in the child RTT into the parent RTTE.
+ * Input rd, base adr of IPA range in RTT, level of RTT
+ * Output result, base PA of child RTT which was destroyed
+ */
 static inline u_register_t host_rmi_rtt_fold(u_register_t rd,
 					     u_register_t map_addr,
 					     u_register_t level,
@@ -292,7 +298,7 @@
 	return rets.ret0;
 }
 
-static inline bool ipa_is_ns(u_register_t addr, u_register_t rmm_feat_reg0)
+bool host_ipa_is_ns(u_register_t addr, u_register_t rmm_feat_reg0)
 {
 	return (addr >> (EXTRACT(RMI_FEATURE_REGISTER_0_S2SZ, rmm_feat_reg0) - 1UL) == 1UL);
 }
@@ -339,34 +345,29 @@
 	return REALM_SUCCESS;
 }
 
-static u_register_t host_realm_fold_rtt(u_register_t rd, u_register_t addr,
-					u_register_t level)
+u_register_t host_realm_fold_rtt(u_register_t rd, u_register_t addr,
+				 u_register_t level)
 {
-	struct rtt_entry rtt;
 	u_register_t pa, ret;
 
-	ret = host_rmi_rtt_readentry(rd, addr, level, &rtt);
-
-	if (ret != RMI_SUCCESS) {
-		ERROR("%s() failed, level=0x%lx addr=0x%lx ret=0x%lx\n",
-			"host_rmi_rtt_readentry", level, addr, ret);
-		return REALM_ERROR;
-	}
-
-	if (rtt.state != RMI_TABLE) {
-		ERROR("%s() failed, rtt.state=%lu\n", "rmi_rtt_readentry",
-			rtt.state);
-		return REALM_ERROR;
-	}
-
-	ret = host_rmi_rtt_fold(rd, addr, level + 1U, &pa);
+	ret = host_rmi_rtt_fold(rd, addr, level, &pa);
 	if (ret != RMI_SUCCESS) {
 		ERROR("%s() failed, addr=0x%lx ret=0x%lx\n",
 			"host_rmi_rtt_fold", addr, ret);
 		return REALM_ERROR;
 	}
 
-	page_free(rtt.out_addr);
+	/*
+	 * RMI_RTT_FOLD returns PA of the RTT which was destroyed
+	 * Corresponding IPA needs to be undelegated and freed
+	 */
+	ret = host_rmi_granule_undelegate(pa);
+	if (ret != RMI_SUCCESS) {
+		ERROR("%s() failed, rtt=0x%lx ret=0x%lx\n",
+			"host_rmi_granule_undelegate", pa, ret);
+		return REALM_ERROR;
+	}
+	page_free(pa);
 
 	return REALM_SUCCESS;
 
@@ -379,7 +380,7 @@
 						    u_register_t src_pa)
 {
 	u_register_t rd = realm->rd;
-	u_register_t map_level, level;
+	u_register_t level;
 	u_register_t ret = 0UL;
 	u_register_t size = 0UL;
 	u_register_t phys = target_pa;
@@ -389,18 +390,6 @@
 		return REALM_ERROR;
 	}
 
-	switch (map_size) {
-	case PAGE_SIZE:
-		map_level = 3UL;
-		break;
-	case RTT_L2_BLOCK_SIZE:
-		map_level = 2UL;
-		break;
-	default:
-		ERROR("Unknown map_size=0x%lx\n", map_size);
-		return REALM_ERROR;
-	}
-
 	for (size = 0UL; size < map_size; size += PAGE_SIZE) {
 		ret = host_rmi_granule_delegate(phys);
 		if (ret != RMI_SUCCESS) {
@@ -412,10 +401,10 @@
 		ret = host_rmi_data_create(unknown, rd, phys, map_addr, src_pa);
 
 		if (RMI_RETURN_STATUS(ret) == RMI_ERROR_RTT) {
-			/* Create missing RTTs and retry */
+			/* Create missing RTTs till L3 and retry */
 			level = RMI_RETURN_INDEX(ret);
 			ret = host_rmi_create_rtt_levels(realm, map_addr, level,
-							 map_level);
+							 3U);
 			if (ret != RMI_SUCCESS) {
 				ERROR("%s() failed, ret=0x%lx line=%u\n",
 					"host_rmi_create_rtt_levels",
@@ -438,20 +427,6 @@
 		map_addr += PAGE_SIZE;
 	}
 
-	if (map_size == RTT_L2_BLOCK_SIZE) {
-		ret = host_realm_fold_rtt(rd, target_pa, map_level);
-		if (ret != RMI_SUCCESS) {
-			ERROR("%s() failed, ret=0x%lx\n",
-				"host_realm_fold_rtt", ret);
-			goto err;
-		}
-	}
-
-	if (ret != RMI_SUCCESS) {
-		ERROR("%s() failed, ret=0x%lx\n", __func__, ret);
-		goto err;
-	}
-
 	return REALM_SUCCESS;
 
 err:
@@ -625,7 +600,7 @@
 
 		switch (rtt.state) {
 		case RMI_ASSIGNED:
-			if (ipa_is_ns(map_addr, realm->rmm_feat_reg0)) {
+			if (host_ipa_is_ns(map_addr, realm->rmm_feat_reg0)) {
 
 				ret = host_rmi_rtt_unmap_unprotected(
 								rd,
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 1ccf317..6842f49 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
@@ -1822,3 +1822,333 @@
 
 	return res;
 }
+
+/*
+ * Test aims to test RMI_RTT_FOLD for Unassinged Empty entries
+ * Find a adr not mapped in L1 RTT of Stage 2 tables in RMM
+ * and mapped at L0 with HIPAS=unassigned RIPAS=empty
+ * Host creates L3 RTT for this adr
+ * Host folds RTT till L0
+ * Host recreates L3, which should cause unfold operation
+ */
+test_result_t host_test_rtt_fold_unfold_unassigned_empty(void)
+{
+
+	bool ret1;
+	test_result_t res = TEST_RESULT_FAIL;
+	u_register_t ret, base;
+	struct realm realm;
+	struct rtt_entry rtt;
+	u_register_t rec_flag[] = {RMI_RUNNABLE};
+
+	SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
+
+	if (!host_create_activate_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
+			(u_register_t)PAGE_POOL_BASE,
+			(u_register_t)PAGE_POOL_MAX_SIZE,
+			0UL, rec_flag, 1U)) {
+		ERROR("Realm creation failed\n");
+		goto destroy_realm;
+	}
+	if (!host_create_shared_mem(&realm, NS_REALM_SHARED_MEM_BASE,
+			NS_REALM_SHARED_MEM_SIZE)) {
+		goto destroy_realm;
+	}
+
+	/* Find an address not mapped at L1 and mapped at L0 as unassigned empty */
+	base = ALIGN_DOWN(TFTF_BASE, RTT_MAP_SIZE(1U));
+	while (true) {
+		ret = host_rmi_rtt_readentry(realm.rd, base, 1U, &rtt);
+		if (ret != RMI_SUCCESS || rtt.walk_level > 0U || rtt.state != RMI_UNASSIGNED
+			|| (rtt.ripas != RMI_EMPTY)) {
+			base += RTT_MAP_SIZE(1U);
+			if (host_ipa_is_ns(base, realm.rmm_feat_reg0)) {
+				ERROR("could not find unmapped adr range\n");
+				goto destroy_realm;
+			}
+			continue;
+		}
+		break;
+	}
+
+	INFO("base=0x%lx\n", base);
+
+	/* Create RTT entries */
+	ret = host_rmi_create_rtt_levels(&realm, base, 0U, 3U);
+	if (ret != RMI_SUCCESS) {
+		ERROR("host_rmi_create_rtt_levels failed ret=0x%lx\n", ret);
+		goto destroy_realm;
+	}
+
+	/* L3 entry is expected now */
+	ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
+	if (ret != RMI_SUCCESS || rtt.walk_level != 3U || rtt.state != RMI_UNASSIGNED
+			|| (rtt.ripas != RMI_EMPTY)) {
+		ERROR("host_rmi_create_rtt_levels failed ret=0x%lx\n", ret);
+		goto destroy_realm;
+	}
+	INFO("rtt.state=0x%lx rtt.walk_level=0x%llx rtt.out_addr=0x%llx rtt.ripas=0x%lx\n",
+			rtt.state, rtt.walk_level, rtt.out_addr, rtt.ripas);
+
+	/* RTT Fold */
+	ret = host_realm_fold_rtt(realm.rd, base, 3U);
+	if (ret != RMI_SUCCESS) {
+		ERROR("host_rmi_rtt_fold failed ret=0x%lx\n", ret);
+		goto destroy_realm;
+	}
+
+	/* Walk should terminate at L2 */
+	ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
+	if (ret != RMI_SUCCESS || rtt.walk_level != 2U || rtt.state != RMI_UNASSIGNED
+			|| (rtt.ripas != RMI_EMPTY)) {
+		ERROR("host_rmi_fold_rtt failed ret=0x%lx rtt.state=0x%lx"
+				" rtt.walk_level=0x%llx rtt.out_addr=0x%llx\n",
+				ret, rtt.state, rtt.walk_level, rtt.out_addr);
+		goto destroy_realm;
+	}
+	INFO("rtt.state=0x%lx rtt.walk_level=0x%llx rtt.out_addr=0x%llx rtt.ripas=0x%lx\n",
+			rtt.state, rtt.walk_level, rtt.out_addr, rtt.ripas);
+
+	/* RTT Fold */
+	ret = host_realm_fold_rtt(realm.rd, base, 2U);
+	if (ret != RMI_SUCCESS) {
+		ERROR("host_rmi_rtt_fold failed ret=0x%lx\n", ret);
+		goto destroy_realm;
+	}
+
+	/* Walk should terminate at L1 */
+	ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
+	if (ret != RMI_SUCCESS || rtt.walk_level != 1U || rtt.state != RMI_UNASSIGNED
+			|| (rtt.ripas != RMI_EMPTY)) {
+		ERROR("host_rmi_fold_rtt failed ret=0x%lx rtt.state=0x%lx"
+				" rtt.walk_level=0x%llx rtt.out_addr=0x%llx\n",
+				ret, rtt.state, rtt.walk_level, rtt.out_addr);
+		goto destroy_realm;
+	}
+	INFO("rtt.state=0x%lx rtt.walk_level=0x%llx rtt.out_addr=0x%llx rtt.ripas=0x%lx\n",
+			rtt.state, rtt.walk_level, rtt.out_addr, rtt.ripas);
+
+	/* RTT Fold */
+	ret = host_realm_fold_rtt(realm.rd, base, 1U);
+	if (ret != RMI_SUCCESS) {
+		ERROR("host_rmi_rtt_fold failed ret=0x%lx\n", ret);
+		goto destroy_realm;
+	}
+
+	/* Walk should terminate at L0 */
+	ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
+	if (ret != RMI_SUCCESS || rtt.walk_level != 0U || rtt.state != RMI_UNASSIGNED
+			|| (rtt.ripas != RMI_EMPTY)) {
+		ERROR("host_rmi_fold_rtt failed ret=0x%lx rtt.state=0x%lx"
+				" rtt.walk_level=0x%llx rtt.out_addr=0x%llx\n",
+				ret, rtt.state, rtt.walk_level, rtt.out_addr);
+		goto destroy_realm;
+	}
+	INFO("rtt.state=0x%lx rtt.walk_level=0x%llx rtt.out_addr=0x%llx rtt.ripas=0x%lx\n",
+			rtt.state, rtt.walk_level, rtt.out_addr, rtt.ripas);
+
+	/* Create RTT entries will cause unfold operation */
+	ret = host_rmi_create_rtt_levels(&realm, base, rtt.walk_level, 3U);
+	if (ret != RMI_SUCCESS) {
+		ERROR("host_rmi_create_rtt_levels failed ret=0x%lx\n", ret);
+		goto destroy_realm;
+	}
+
+	/* L3 entry should be created */
+	ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
+	if (ret != RMI_SUCCESS || rtt.walk_level != 3U || rtt.state != RMI_UNASSIGNED
+			|| (rtt.ripas != RMI_EMPTY)) {
+		ERROR("host_rmi_create_rtt_levels failed ret=0x%lx\n", ret);
+		goto destroy_realm;
+	}
+	INFO("rtt.state=0x%lx rtt.walk_level=0x%llx rtt.out_addr=0x%llx rtt.ripas=0x%lx\n",
+			rtt.state, rtt.walk_level, rtt.out_addr, rtt.ripas);
+
+	res = TEST_RESULT_SUCCESS;
+
+destroy_realm:
+	ret1 = host_destroy_realm(&realm);
+
+	if (!ret1) {
+		ERROR("%s(): destroy=%d\n",
+		__func__, ret1);
+		return TEST_RESULT_FAIL;
+	}
+
+	return res;
+}
+
+/*
+ * Test aims to test RMI_RTT_FOLD for Unassigned RAM entries
+ * Find a adr not mapped in L1 RTT of Stage 2 tables in RMM
+ * and mapped at L0 with HIPAS=unassigned RIPAS=empty
+ * Change RIPAS to RAM by calling RMI_RTT_INIT_RIPAS
+ * Host creates L3 RTT for this adr
+ * Host folds RTT till L0
+ * Host recreates L3, which should cause unfold operation
+ */
+test_result_t host_test_rtt_fold_unfold_unassigned_ram(void)
+{
+
+	bool ret1;
+	test_result_t res = TEST_RESULT_FAIL;
+	u_register_t ret, base, top;
+	struct realm realm;
+	struct rtt_entry rtt;
+	u_register_t rec_flag[] = {RMI_RUNNABLE};
+
+	SKIP_TEST_IF_RME_NOT_SUPPORTED_OR_RMM_IS_TRP();
+
+	if (!host_create_realm_payload(&realm, (u_register_t)REALM_IMAGE_BASE,
+			(u_register_t)PAGE_POOL_BASE,
+			(u_register_t)PAGE_POOL_MAX_SIZE,
+			0UL, rec_flag, 1U)) {
+		ERROR("Realm creation failed\n");
+		goto destroy_realm;
+	}
+	if (!host_create_shared_mem(&realm, NS_REALM_SHARED_MEM_BASE,
+			NS_REALM_SHARED_MEM_SIZE)) {
+		goto destroy_realm;
+	}
+
+	/* Find an address not mapped at L1 and mapped at L0 as unassigned empty */
+	base = ALIGN_DOWN(TFTF_BASE, RTT_MAP_SIZE(1U));
+	while (true) {
+		ret = host_rmi_rtt_readentry(realm.rd, base, 1U, &rtt);
+		if (ret != RMI_SUCCESS || rtt.walk_level > 0U || rtt.state != RMI_UNASSIGNED
+			|| (rtt.ripas != RMI_EMPTY)) {
+			base += RTT_MAP_SIZE(1U);
+			if (host_ipa_is_ns(base, realm.rmm_feat_reg0)) {
+				ERROR("could not find unmapped adr range\n");
+				goto destroy_realm;
+			}
+			continue;
+		}
+		break;
+	}
+
+	/* Set RIPAS of PAGE to RAM */
+	ret = host_rmi_rtt_init_ripas(realm.rd, base, base + RTT_MAP_SIZE(0U), &top);
+	if (ret != RMI_SUCCESS || top != (base + RTT_MAP_SIZE(0))) {
+		ERROR("%s() failed, ret=0x%lx line=%u\n",
+			"host_rmi_rtt_init_ripas", ret, __LINE__);
+		goto destroy_realm;
+	}
+	if (host_realm_activate(&realm) != REALM_SUCCESS) {
+		ERROR("%s() failed\n", "host_realm_activate");
+		goto destroy_realm;
+	}
+
+	ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
+	if (ret != RMI_SUCCESS || rtt.state != RMI_UNASSIGNED ||
+			(rtt.ripas != RMI_RAM) || rtt.walk_level != 0U) {
+		ERROR("wrong initial state\n");
+		goto destroy_realm;
+	}
+
+	INFO("base=0x%lx\n", base);
+
+	/* Create RTT entries */
+	ret = host_rmi_create_rtt_levels(&realm, base, 0U, 3U);
+	if (ret != RMI_SUCCESS) {
+		ERROR("host_rmi_create_rtt_levels failed ret=0x%lx\n", ret);
+		goto destroy_realm;
+	}
+
+	/* L3 entry should be created */
+	ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
+	if (ret != RMI_SUCCESS || rtt.walk_level != 3U || rtt.state != RMI_UNASSIGNED
+			|| (rtt.ripas != RMI_RAM)) {
+		ERROR("host_rmi_create_rtt_levels failed ret=0x%lx\n", ret);
+		goto destroy_realm;
+	}
+	INFO("rtt.state=0x%lx rtt.walk_level=0x%llx rtt.out_addr=0x%llx rtt.ripas=0x%lx\n",
+			rtt.state, rtt.walk_level, rtt.out_addr, rtt.ripas);
+
+	/* RTT Fold */
+	ret = host_realm_fold_rtt(realm.rd, base, 3U);
+	if (ret != RMI_SUCCESS) {
+		ERROR("host_rmi_rtt_fold failed ret=0x%lx\n", ret);
+		goto destroy_realm;
+	}
+
+	/* Walk should terminate at L2 */
+	ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
+	if (ret != RMI_SUCCESS || rtt.walk_level != 2U || rtt.state != RMI_UNASSIGNED
+			|| (rtt.ripas != RMI_RAM)) {
+		ERROR("host_rmi_fold_rtt failed ret=0x%lx rtt.state=0x%lx"
+				" rtt.walk_level=0x%llx rtt.out_addr=0x%llx\n",
+				ret, rtt.state, rtt.walk_level, rtt.out_addr);
+		goto destroy_realm;
+	}
+	INFO("rtt.state=0x%lx rtt.walk_level=0x%llx rtt.out_addr=0x%llx rtt.ripas=0x%lx\n",
+			rtt.state, rtt.walk_level, rtt.out_addr, rtt.ripas);
+
+	/* RTT Fold */
+	ret = host_realm_fold_rtt(realm.rd, base, 2U);
+	if (ret != RMI_SUCCESS) {
+		ERROR("host_rmi_rtt_fold failed ret=0x%lx\n", ret);
+		goto destroy_realm;
+	}
+
+	/* Walk should terminate at L1 */
+	ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
+	if (ret != RMI_SUCCESS || rtt.walk_level != 1U || rtt.state != RMI_UNASSIGNED
+			|| (rtt.ripas != RMI_RAM)) {
+		ERROR("host_rmi_fold_rtt failed ret=0x%lx rtt.state=0x%lx"
+				" rtt.walk_level=0x%llx rtt.out_addr=0x%llx\n",
+				ret, rtt.state, rtt.walk_level, rtt.out_addr);
+		goto destroy_realm;
+	}
+	INFO("rtt.state=0x%lx rtt.walk_level=0x%llx rtt.out_addr=0x%llx rtt.ripas=0x%lx\n",
+			rtt.state, rtt.walk_level, rtt.out_addr, rtt.ripas);
+
+	/* RTT Fold */
+	ret = host_realm_fold_rtt(realm.rd, base, 1U);
+	if (ret != RMI_SUCCESS) {
+		ERROR("host_rmi_rtt_fold failed ret=0x%lx\n", ret);
+		goto destroy_realm;
+	}
+
+	/* Walk should terminate at L0 */
+	ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
+	if (ret != RMI_SUCCESS || rtt.walk_level != 0U || rtt.state != RMI_UNASSIGNED
+			|| (rtt.ripas != RMI_RAM)) {
+		ERROR("host_rmi_fold_rtt failed ret=0x%lx rtt.state=0x%lx"
+				" rtt.walk_level=0x%llx rtt.out_addr=0x%llx\n",
+				ret, rtt.state, rtt.walk_level, rtt.out_addr);
+		goto destroy_realm;
+	}
+	INFO("rtt.state=0x%lx rtt.walk_level=0x%llx rtt.out_addr=0x%llx rtt.ripas=0x%lx\n",
+			rtt.state, rtt.walk_level, rtt.out_addr, rtt.ripas);
+
+	/* Create RTT entries will cause unfold operation */
+	ret = host_rmi_create_rtt_levels(&realm, base, rtt.walk_level, 3U);
+	if (ret != RMI_SUCCESS) {
+		ERROR("host_rmi_create_rtt_levels failed ret=0x%lx\n", ret);
+		goto destroy_realm;
+	}
+
+	/* L3 entry should be created */
+	ret = host_rmi_rtt_readentry(realm.rd, base, 3U, &rtt);
+	if (ret != RMI_SUCCESS || rtt.walk_level != 3U || rtt.state != RMI_UNASSIGNED
+			|| (rtt.ripas != RMI_RAM)) {
+		ERROR("host_rmi_create_rtt_levels failed ret=0x%lx\n", ret);
+		goto destroy_realm;
+	}
+	INFO("rtt.state=0x%lx rtt.walk_level=0x%llx rtt.out_addr=0x%llx rtt.ripas=0x%lx\n",
+			rtt.state, rtt.walk_level, rtt.out_addr, rtt.ripas);
+
+	res = TEST_RESULT_SUCCESS;
+
+destroy_realm:
+	ret1 = host_destroy_realm(&realm);
+
+	if (!ret1) {
+		ERROR("%s(): destroy=%d\n",
+		__func__, ret1);
+		return TEST_RESULT_FAIL;
+	}
+
+	return res;
+}
diff --git a/tftf/tests/tests-realm-payload.xml b/tftf/tests/tests-realm-payload.xml
index 51cb09f..985db7e 100644
--- a/tftf/tests/tests-realm-payload.xml
+++ b/tftf/tests/tests-realm-payload.xml
@@ -10,6 +10,10 @@
   <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="Realm RTT fold unfold test Unassigned Empty"
+	  function="host_test_rtt_fold_unfold_unassigned_empty" />
+	  <testcase name="Realm RTT fold unfold test Unassigned RAM"
+	  function="host_test_rtt_fold_unfold_unassigned_ram" />
 	  <testcase name="Multiple Realm EL1 creation and execution test"
 	  function="host_test_multiple_realm_create_enter" />
 	  <testcase name="Realm payload multi rec multiple cpu"