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>