test(realm): add test for FEAT_DIT
Add testcase to enable FEAT_DIT in realm.
Test if DIT Bit is preserved across context switch RL/NS.
Change-Id: I26cbaaf669b53ecba14a451955b6f847c45e0575
Signed-off-by: Shruti Gupta <shruti.gupta@arm.com>
diff --git a/include/runtime_services/host_realm_managment/host_shared_data.h b/include/runtime_services/host_realm_managment/host_shared_data.h
index fc0b030..632fdaa 100644
--- a/include/runtime_services/host_realm_managment/host_shared_data.h
+++ b/include/runtime_services/host_realm_managment/host_shared_data.h
@@ -67,6 +67,7 @@
REALM_PAUTH_SET_CMD,
REALM_PAUTH_CHECK_CMD,
REALM_PAUTH_FAULT,
+ REALM_DIT_CHECK_CMD,
REALM_SME_ID_REGISTERS,
REALM_SME_UNDEF_ABORT
};
diff --git a/realm/realm_payload_main.c b/realm/realm_payload_main.c
index 93e2404..ce25f43 100644
--- a/realm/realm_payload_main.c
+++ b/realm/realm_payload_main.c
@@ -130,6 +130,20 @@
return false;
}
+bool test_realm_dit_check_cmd(void)
+{
+ if (is_armv8_4_dit_present()) {
+ write_dit(DIT_BIT);
+ realm_printf("Testing DIT=0x%lx\n", read_dit());
+ /* Test if DIT is preserved after HOST_CALL */
+ if (read_dit() == DIT_BIT) {
+ return true;
+ }
+ }
+ return false;
+}
+
+
static bool test_realm_instr_fetch_cmd(void)
{
u_register_t base;
@@ -229,6 +243,9 @@
case REALM_PAUTH_FAULT:
test_succeed = test_realm_pauth_fault();
break;
+ case REALM_DIT_CHECK_CMD:
+ test_succeed = test_realm_dit_check_cmd();
+ break;
case REALM_GET_RSI_VERSION:
test_succeed = realm_get_rsi_version();
break;
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 7cb0d5b..ff69869 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
@@ -1221,3 +1221,55 @@
return res;
}
+
+/*
+ * @Test_Aim@ Test to check if DIT bit is preserved across NS/RL switch
+ */
+test_result_t host_realm_enable_dit(void)
+{
+ bool ret1, ret2;
+ struct realm realm;
+ u_register_t rec_flag[] = {RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE,
+ RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE, RMI_RUNNABLE}, dit;
+
+ 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, MAX_REC_COUNT)) {
+ return TEST_RESULT_FAIL;
+ }
+ if (!host_create_shared_mem(&realm, NS_REALM_SHARED_MEM_BASE,
+ NS_REALM_SHARED_MEM_SIZE)) {
+ return TEST_RESULT_FAIL;
+ }
+
+ /* Enable FEAT_DIT on Host */
+ write_dit(DIT_BIT);
+ for (unsigned int i = 0; i < MAX_REC_COUNT; i++) {
+ host_shared_data_set_host_val(&realm, i, HOST_ARG1_INDEX, 10U);
+ ret1 = host_enter_realm_execute(&realm, REALM_DIT_CHECK_CMD,
+ RMI_EXIT_HOST_CALL, i);
+ if (!ret1) {
+ break;
+ }
+ }
+
+ ret2 = host_destroy_realm(&realm);
+
+ dit = read_dit();
+ if (dit != DIT_BIT) {
+ ERROR("Host DIT bit not preserved\n");
+ return TEST_RESULT_FAIL;
+ }
+
+ write_dit(0U);
+ if (!ret1 || !ret2) {
+ ERROR("%s(): enter=%d destroy=%d\n",
+ __func__, ret1, ret2);
+ 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 06c4aa7..0ecefee 100644
--- a/tftf/tests/tests-realm-payload.xml
+++ b/tftf/tests/tests-realm-payload.xml
@@ -97,5 +97,7 @@
function="host_realm_enable_pauth" />
<testcase name="Generate PAuth Fault by overwriting LR"
function="host_realm_pauth_fault" />
+ <testcase name="Check if DIT Bit is preserved in RL/NS"
+ function="host_realm_enable_dit" />
</testsuite>
</testsuites>