feat(fgt): add support for FEAT_FGT2 testing

This patch adds testcase that validates FEAT_FGT2 support
by reading Fine-grained trap registers that are part of FEAT_FGT2.
These registers are only present when FEAT_FGT2 is implemented

Change-Id: Ifc1106d12dbe03b956310d364600368d3f035491
Signed-off-by: Arvind Ram Prakash <arvind.ramprakash@arm.com>
diff --git a/include/common/test_helpers.h b/include/common/test_helpers.h
index ced1745..33d2db6 100644
--- a/include/common/test_helpers.h
+++ b/include/common/test_helpers.h
@@ -125,6 +125,15 @@
 		}								\
 	} while (0)
 
+#define SKIP_TEST_IF_FGT2_NOT_SUPPORTED()					\
+	do {									\
+		if (!is_armv8_9_fgt2_present()) {				\
+			tftf_testcase_printf(					\
+				"Fine Grained Traps 2 not supported\n");	\
+			return TEST_RESULT_SKIPPED;				\
+		}								\
+	} while (0)
+
 #define SKIP_TEST_IF_SVE_NOT_SUPPORTED()					\
 	do {									\
 		if (!is_armv8_2_sve_present()) {				\
diff --git a/include/lib/aarch64/arch.h b/include/lib/aarch64/arch.h
index a57b8de..3c30c9d 100644
--- a/include/lib/aarch64/arch.h
+++ b/include/lib/aarch64/arch.h
@@ -303,6 +303,7 @@
 #define ID_AA64MMFR0_EL1_FGT_MASK		ULL(0xf)
 #define ID_AA64MMFR0_EL1_FGT_NOT_SUPPORTED	ULL(0x0)
 #define ID_AA64MMFR0_EL1_FGT_SUPPORTED		ULL(0x1)
+#define ID_AA64MMFR0_EL1_FGT2_SUPPORTED		ULL(0x2)
 
 #define ID_AA64MMFR0_EL1_TGRAN4_SHIFT		U(28)
 #define ID_AA64MMFR0_EL1_TGRAN4_WIDTH		U(4)
@@ -1286,6 +1287,15 @@
 #define HDFGWTR_EL2		S3_4_C3_C1_5
 
 /*******************************************************************************
+ * Armv8.9 - Fine Grained Virtualization Traps 2 Registers
+ ******************************************************************************/
+#define HFGRTR2_EL2            S3_4_C3_C1_2
+#define HFGWTR2_EL2            S3_4_C3_C1_3
+#define HFGITR2_EL2            S3_4_C3_C1_7
+#define HDFGRTR2_EL2           S3_4_C3_C1_0
+#define HDFGWTR2_EL2           S3_4_C3_C1_1
+
+/*******************************************************************************
  * Armv8.6 - Enhanced Counter Virtualization Registers
  ******************************************************************************/
 #define CNTPOFF_EL2  S3_4_C14_C0_6
diff --git a/include/lib/aarch64/arch_features.h b/include/lib/aarch64/arch_features.h
index b6d0ce7..86cbec9 100644
--- a/include/lib/aarch64/arch_features.h
+++ b/include/lib/aarch64/arch_features.h
@@ -126,8 +126,14 @@
 
 static inline bool is_armv8_6_fgt_present(void)
 {
+	return (((read_id_aa64mmfr0_el1() >> ID_AA64MMFR0_EL1_FGT_SHIFT) &
+		ID_AA64MMFR0_EL1_FGT_MASK) != 0U);
+}
+
+static inline bool is_armv8_9_fgt2_present(void)
+{
 	return ((read_id_aa64mmfr0_el1() >> ID_AA64MMFR0_EL1_FGT_SHIFT) &
-		ID_AA64MMFR0_EL1_FGT_MASK) == ID_AA64MMFR0_EL1_FGT_SUPPORTED;
+		ID_AA64MMFR0_EL1_FGT_MASK) == ID_AA64MMFR0_EL1_FGT2_SUPPORTED;
 }
 
 static inline unsigned long int get_armv8_6_ecv_support(void)
diff --git a/include/lib/aarch64/arch_helpers.h b/include/lib/aarch64/arch_helpers.h
index a91625c..076a9cd 100644
--- a/include/lib/aarch64/arch_helpers.h
+++ b/include/lib/aarch64/arch_helpers.h
@@ -572,6 +572,13 @@
 DEFINE_RENAME_SYSREG_RW_FUNCS(hdfgrtr_el2, HDFGRTR_EL2)
 DEFINE_RENAME_SYSREG_RW_FUNCS(hdfgwtr_el2, HDFGWTR_EL2)
 
+/* Armv8.9 Fine Grained Virtualization Traps 2 Registers */
+DEFINE_RENAME_SYSREG_RW_FUNCS(hfgrtr2_el2,  HFGRTR2_EL2)
+DEFINE_RENAME_SYSREG_RW_FUNCS(hfgwtr2_el2,  HFGWTR2_EL2)
+DEFINE_RENAME_SYSREG_RW_FUNCS(hfgitr2_el2,  HFGITR2_EL2)
+DEFINE_RENAME_SYSREG_RW_FUNCS(hdfgrtr2_el2, HDFGRTR2_EL2)
+DEFINE_RENAME_SYSREG_RW_FUNCS(hdfgwtr2_el2, HDFGWTR2_EL2)
+
 /* Armv8.6 Enhanced Counter Virtualization Register */
 DEFINE_RENAME_SYSREG_RW_FUNCS(cntpoff_el2,  CNTPOFF_EL2)
 
diff --git a/tftf/tests/extensions/fgt/test_fgt.c b/tftf/tests/extensions/fgt/test_fgt.c
index 5d9600d..e38f6c7 100644
--- a/tftf/tests/extensions/fgt/test_fgt.c
+++ b/tftf/tests/extensions/fgt/test_fgt.c
@@ -132,3 +132,25 @@
 	return TEST_RESULT_SUCCESS;
 #endif	/* __aarch64__ */
 }
+
+test_result_t test_fgt2_enabled(void)
+{
+	SKIP_TEST_IF_AARCH32();
+
+
+#ifdef __aarch64__
+	SKIP_TEST_IF_FGT2_NOT_SUPPORTED();
+
+	/* The following registers are read to test their presence when
+	 * FEAT_FGT2 is supported
+	 */
+
+	read_hfgitr2_el2();
+	read_hfgrtr2_el2();
+	read_hfgwtr2_el2();
+	read_hdfgrtr2_el2();
+	read_hdfgwtr2_el2();
+
+	return TEST_RESULT_SUCCESS;
+#endif /* __aarch64__ */
+}
diff --git a/tftf/tests/tests-cpu-extensions.xml b/tftf/tests/tests-cpu-extensions.xml
index 0f8d0f6..596f21f 100644
--- a/tftf/tests/tests-cpu-extensions.xml
+++ b/tftf/tests/tests-cpu-extensions.xml
@@ -21,6 +21,7 @@
     <testcase name="Use MTE Instructions" function="test_mte_instructions" />
     <testcase name="Check for MTE register leakage" function="test_mte_leakage" />
     <testcase name="Use FGT Registers" function="test_fgt_enabled" />
+    <testcase name="Use FGT2 Registers" function="test_fgt2_enabled" />
     <testcase name="Use ECV Registers" function="test_ecv_enabled" />
     <testcase name="Use trace buffer control Registers" function="test_trbe_enabled" />
     <testcase name="Use branch record buffer control registers" function="test_brbe_enabled" />