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 ")