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"