test: group0 interrupt triggers while VM/SP is running

This patch introduces two tests for TC platform to ensure the
platform firmware handles Group0 secure interrupt and resumes the
execution of preempted endpoint context(a VM in normal world as well
as an SP in secure world).

Signed-off-by: Madhukar Pappireddy <madhukar.pappireddy@arm.com>
Change-Id: I8c4b23497eab143773dd7ab9372a05760ce78881
diff --git a/plat/arm/fvp/fvp_tests_to_skip.txt b/plat/arm/fvp/fvp_tests_to_skip.txt
index d52947d..1769cac 100644
--- a/plat/arm/fvp/fvp_tests_to_skip.txt
+++ b/plat/arm/fvp/fvp_tests_to_skip.txt
@@ -1,6 +1,8 @@
 #
-# Copyright (c) 2020, Arm Limited. All rights reserved.
+# Copyright (c) 2020-2023, Arm Limited. All rights reserved.
 #
 # SPDX-License-Identifier: BSD-3-Clause
 #
 
+# Disable Group0 secure interrupt tests as there is no source of EL3 interrupt
+FF-A Group0 interrupts
diff --git a/tftf/tests/runtime_services/secure_service/test_ffa_group0_interrupts.c b/tftf/tests/runtime_services/secure_service/test_ffa_group0_interrupts.c
new file mode 100644
index 0000000..9359edf
--- /dev/null
+++ b/tftf/tests/runtime_services/secure_service/test_ffa_group0_interrupts.c
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 2023, Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <cactus_test_cmds.h>
+#include <ffa_endpoints.h>
+#include <platform.h>
+#include <test_helpers.h>
+
+#define SP_SLEEP_TIME	200U
+#define NS_TIME_SLEEP	200U
+
+#define SENDER		HYP_ID
+#define RECEIVER	SP_ID(1)
+
+static const struct ffa_uuid expected_sp_uuids[] = { {PRIMARY_UUID} };
+
+test_result_t test_ffa_group0_interrupt_sp_running(void)
+{
+	struct ffa_value ret_values;
+
+	CHECK_SPMC_TESTING_SETUP(1, 1, expected_sp_uuids);
+
+	/* Send request to first Cactus SP to sleep for 200ms.*/
+	ret_values = cactus_sleep_cmd(SENDER, RECEIVER, SP_SLEEP_TIME);
+
+	/*
+	 * SBSA secure watchdog timer fires every 100ms. Hence a Group0 secure
+	 * interrupt should trigger during this time.
+	 */
+	if (!is_ffa_direct_response(ret_values)) {
+		ERROR("Expected a direct response for sleep command\n");
+		return TEST_RESULT_FAIL;
+	}
+
+	/* Make sure elapsed time not less than sleep time. */
+	if (cactus_get_response(ret_values) < SP_SLEEP_TIME) {
+		ERROR("Lapsed time less than requested sleep time\n");
+		return TEST_RESULT_FAIL;
+	}
+
+	return TEST_RESULT_SUCCESS;
+}
+
+test_result_t test_ffa_group0_interrupt_in_nwd(void)
+{
+	uint64_t time1;
+	volatile uint64_t time2, time_lapsed;
+	uint64_t timer_freq = read_cntfrq_el0();
+
+	time1 = syscounter_read();
+
+	/*
+	 * Sleep for NS_TIME_SLEEP ms. This ensures SBSA secure wdog timer
+	 * triggers during this time.
+	 */
+	waitms(NS_TIME_SLEEP);
+	time2 = syscounter_read();
+
+	/* Lapsed time should be at least equal to sleep time. */
+	time_lapsed = ((time2 - time1) * 1000) / timer_freq;
+
+	if (time_lapsed < NS_TIME_SLEEP) {
+		ERROR("Time elapsed less than expected value: %llu vs %u\n",
+				time_lapsed, NS_TIME_SLEEP);
+		return TEST_RESULT_FAIL;
+	}
+
+	return TEST_RESULT_SUCCESS;
+}
diff --git a/tftf/tests/tests-spm.mk b/tftf/tests/tests-spm.mk
index fccddb4..737c4cb 100644
--- a/tftf/tests/tests-spm.mk
+++ b/tftf/tests/tests-spm.mk
@@ -20,6 +20,7 @@
 		test_ffa_notifications.c				\
 		test_spm_smmu.c						\
 		test_ffa_exceptions.c					\
+		test_ffa_group0_interrupts.c				\
 	)
 
 ifeq (${ARCH},aarch64)
diff --git a/tftf/tests/tests-spm.xml b/tftf/tests/tests-spm.xml
index 6c701ce..6285a97 100644
--- a/tftf/tests/tests-spm.xml
+++ b/tftf/tests/tests-spm.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 
 <!--
-  Copyright (c) 2018-2022, Arm Limited. All rights reserved.
+  Copyright (c) 2018-2023, Arm Limited. All rights reserved.
 
   SPDX-License-Identifier: BSD-3-Clause
 -->
@@ -64,6 +64,14 @@
 
   </testsuite>
 
+  <testsuite name="FF-A Group0 interrupts"
+             description="Test FF-A Group0 secure interrupt delegation to EL3" >
+     <testcase name="FF-A Group0 secure world"
+               function="test_ffa_group0_interrupt_sp_running" />
+     <testcase name="FF-A Group0 normal world"
+               function="test_ffa_group0_interrupt_in_nwd" />
+  </testsuite>
+
  <testsuite name="FF-A Power management"
              description="Test FF-A power management" >
     <testcase name="FF-A SP hotplug"