feat(BTI): add support for RMM

Setting commandline mbranch-protection=standard
to enable pac-ret+bti.
Set GP Bit in all Stage1 translation entries for code pages.

Signed-off-by: Shruti Gupta <shruti.gupta@arm.com>
Change-Id: I9fad86bb8d393b02a511864046ec65e5a0909d2b
diff --git a/lib/arch/include/aarch64/asm_macros.S b/lib/arch/include/aarch64/asm_macros.S
index 887ab68..787a78a 100644
--- a/lib/arch/include/aarch64/asm_macros.S
+++ b/lib/arch/include/aarch64/asm_macros.S
@@ -43,6 +43,7 @@
 	.cfi_startproc
 	.align \_align
 	\_name:
+	bti	jc
 	.endm
 
 	/*
diff --git a/lib/arch/include/arch.h b/lib/arch/include/arch.h
index 64752d1..a37592a 100644
--- a/lib/arch/include/arch.h
+++ b/lib/arch/include/arch.h
@@ -680,6 +680,8 @@
 #define SCTLR_ELx_nTLSMD_BIT		(UL(1) << 28)
 #define SCTLR_ELx_LSMAOE_BIT		(UL(1) << 29)
 #define SCTLR_ELx_EnIA_BIT		(UL(1) << 31)
+#define SCTLR_ELx_BT0_BIT		(UL(1) << 35)
+#define SCTLR_ELx_BT1_BIT		(UL(1) << 36)
 
 #define SCTLR_EL1_FLAGS (SCTLR_ELx_SPAN_BIT | SCTLR_ELx_EIS_BIT | SCTLR_ELx_nTWE_BIT | \
 			 SCTLR_ELx_nTWI_BIT | SCTLR_ELx_EOS_BIT | SCTLR_ELx_nAA_BIT | \
diff --git a/lib/xlat/src/xlat_defs_private.h b/lib/xlat/src/xlat_defs_private.h
index 1022dae..2d155e3 100644
--- a/lib/xlat/src/xlat_defs_private.h
+++ b/lib/xlat/src/xlat_defs_private.h
@@ -35,19 +35,18 @@
 #define DESC_MASK		UL(0x3)
 
 /* Upper attributes on a TTE */
-#define XN			(ULL(1) << 2)
-#define UXN			(ULL(1) << 2)
-#define PXN			(ULL(1) << 1)
-#define CONT_HINT		(ULL(1) << 0)
+#define XN			(ULL(1) << 4)
+#define UXN			(ULL(1) << 4)
+#define PXN			(ULL(1) << 3)
+#define CONT_HINT		(ULL(1) << 2)
+/* Guarded Page bit */
+#define GP			(ULL(1) << 0)
 
-#define UPPER_ATTRS_SHIFT	(52U)
-#define UPPER_ATTRS_WIDTH	(3U)
+#define UPPER_ATTRS_SHIFT	(50U)
+#define UPPER_ATTRS_WIDTH	(5U)
 #define UPPER_ATTRS_MASK	MASK(UPPER_ATTRS)
 #define UPPER_ATTRS(x)		(INPLACE(UPPER_ATTRS, x) & (UPPER_ATTRS_MASK))
 
-/* Guarded Page bit */
-#define GP			(ULL(1) << 50)
-
 #define AP2_SHIFT		UL(0x7)
 #define AP2_RO			ULL(0x1)
 #define AP2_RW			ULL(0x0)
diff --git a/lib/xlat/src/xlat_tables_core.c b/lib/xlat/src/xlat_tables_core.c
index 162f1ee..815ee0c 100644
--- a/lib/xlat/src/xlat_tables_core.c
+++ b/lib/xlat/src/xlat_tables_core.c
@@ -449,6 +449,9 @@
 
 		if (((attr & MT_RW) != 0UL) || ((attr & MT_EXECUTE_NEVER) != 0UL)) {
 			desc |= XLAT_GET_PXN_DESC();
+		} else {
+			/* Set GP bit for block and page code entries for BTI */
+			desc |= XLAT_GET_GP_DESC();
 		}
 
 		desc |= LOWER_ATTRS(ATTR_IWBWA_OWBWA_NTR_INDEX);
@@ -457,12 +460,6 @@
 			/* Configure Inner Shareability */
 			desc |= INPLACE(LOWER_ATTR_SH, ISH);
 		}
-
-		/* Check if Branch Target Identification is enabled */
-		/* TODO: This is needed if BTI is enabled. Double check this code. */
-		/* Set GP bit for block and page code entries
-		 * if BTI mechanism is implemented.
-		 */
 	}
 
 	return desc;
diff --git a/lib/xlat/src/xlat_tables_private.h b/lib/xlat/src/xlat_tables_private.h
index d1b4aaf..6a33ee8 100644
--- a/lib/xlat/src/xlat_tables_private.h
+++ b/lib/xlat/src/xlat_tables_private.h
@@ -73,6 +73,11 @@
 #define XLAT_GET_PXN_DESC() (UPPER_ATTRS(PXN))
 
 /*
+ * Return the Guarded Page mask that will be used by BTI.
+ */
+#define XLAT_GET_GP_DESC() (UPPER_ATTRS(GP))
+
+/*
  * Return the NG flag for a page or block descriptor
  */
 #define XLAT_GET_NG_HINT() (LOWER_ATTRS(NG_HINT))
diff --git a/lib/xlat/src/xlat_tables_utils.c b/lib/xlat/src/xlat_tables_utils.c
index 1ba7651..19ca090 100644
--- a/lib/xlat/src/xlat_tables_utils.c
+++ b/lib/xlat/src/xlat_tables_utils.c
@@ -88,7 +88,7 @@
 	}
 
 	/* Check Guarded Page bit */
-	if ((desc & GP) != 0ULL) {
+	if ((desc & UPPER_ATTRS(GP)) != 0ULL) {
 		VERBOSE("-GP");
 	}
 }
diff --git a/lib/xlat/tests/xlat_test_helpers.c b/lib/xlat/tests/xlat_test_helpers.c
index 87a2b16..24da050 100644
--- a/lib/xlat/tests/xlat_test_helpers.c
+++ b/lib/xlat/tests/xlat_test_helpers.c
@@ -347,6 +347,11 @@
 			lower_attrs |= INPLACE(LOWER_ATTR_SH, ISH);
 		}
 		upper_attrs = 0ULL;
+		if (((mmap_attrs & MT_RW) != 0UL) || ((mmap_attrs & MT_EXECUTE_NEVER) != 0UL)) {
+			upper_attrs |= XLAT_GET_PXN_DESC();
+		} else {
+			upper_attrs |= XLAT_GET_GP_DESC();
+		}
 		break;
 	default:
 		return -EINVAL;
@@ -372,10 +377,6 @@
 		lower_attrs |= LOWER_ATTRS(AP_RO);
 	}
 
-	if (mmap_attrs & MT_EXECUTE_NEVER) {
-		upper_attrs |= XLAT_GET_PXN_DESC();
-	}
-
 	*attrs = upper_attrs | lower_attrs;
 
 	return 0;
diff --git a/toolchains/aarch64/common_aarch64.cmake b/toolchains/aarch64/common_aarch64.cmake
index 3452395..b785b4a 100644
--- a/toolchains/aarch64/common_aarch64.cmake
+++ b/toolchains/aarch64/common_aarch64.cmake
@@ -12,7 +12,7 @@
 foreach(language IN ITEMS ASM C)
 	string(APPEND CMAKE_${language}_FLAGS_INIT "-ffreestanding ")
 	string(APPEND CMAKE_${language}_FLAGS_INIT "-march=armv8.5-a ")
-	string(APPEND CMAKE_${language}_FLAGS_INIT "-mbranch-protection=pac-ret ")
+	string(APPEND CMAKE_${language}_FLAGS_INIT "-mbranch-protection=standard ")
 	string(APPEND CMAKE_${language}_FLAGS_INIT "-mgeneral-regs-only ")
 	string(APPEND CMAKE_${language}_FLAGS_INIT "-mstrict-align ")
 	string(APPEND CMAKE_${language}_FLAGS_INIT "-fomit-frame-pointer ")