aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBipin Ravi <bipin.ravi@arm.com>2022-09-27 20:17:08 +0200
committerTrustedFirmware Code Review <review@review.trustedfirmware.org>2022-09-27 20:17:08 +0200
commit85417644ea342c54205183cfba7f8c3b2f5f5beb (patch)
tree9248ee002a48cfcdca306672b15954277b2541cf
parent10f278d7d1713ae53ef55f5aba080d9d37401417 (diff)
parentebd1b69ee3b9551948dfd688b2b92ce8c7c8e016 (diff)
downloadtf-a-tests-85417644ea342c54205183cfba7f8c3b2f5f5beb.tar.gz
Merge "test(pauth): updated helpers to include QARMA3"
-rw-r--r--include/lib/aarch64/arch.h4
-rw-r--r--include/lib/aarch64/arch_features.h53
-rw-r--r--tftf/framework/main.c2
-rw-r--r--tftf/tests/extensions/pauth/test_pauth.c10
4 files changed, 49 insertions, 20 deletions
diff --git a/include/lib/aarch64/arch.h b/include/lib/aarch64/arch.h
index 0c3678530..534e1cf22 100644
--- a/include/lib/aarch64/arch.h
+++ b/include/lib/aarch64/arch.h
@@ -215,6 +215,10 @@
#define ID_AA64ISAR2_WFXT_MASK ULL(0xf)
#define ID_AA64ISAR2_WFXT_SHIFT U(0x0)
#define ID_AA64ISAR2_WFXT_SUPPORTED ULL(0x2)
+#define ID_AA64ISAR2_GPA3_SHIFT U(8)
+#define ID_AA64ISAR2_GPA3_MASK ULL(0xf)
+#define ID_AA64ISAR2_APA3_SHIFT U(12)
+#define ID_AA64ISAR2_APA3_MASK ULL(0xf)
/* ID_AA64MMFR0_EL1 definitions */
#define ID_AA64MMFR0_EL1_PARANGE_SHIFT U(0)
diff --git a/include/lib/aarch64/arch_features.h b/include/lib/aarch64/arch_features.h
index 1d9013846..761a42eee 100644
--- a/include/lib/aarch64/arch_features.h
+++ b/include/lib/aarch64/arch_features.h
@@ -34,31 +34,56 @@ static inline bool is_armv8_2_ttcnp_present(void)
ID_AA64MMFR2_EL1_CNP_MASK) != 0U;
}
+static inline bool is_feat_pacqarma3_present(void)
+{
+ uint64_t mask_id_aa64isar2 =
+ (ID_AA64ISAR2_GPA3_MASK << ID_AA64ISAR2_GPA3_SHIFT) |
+ (ID_AA64ISAR2_APA3_MASK << ID_AA64ISAR2_APA3_SHIFT);
+
+ /* If any of the fields is not zero, QARMA3 algorithm is present */
+ return (read_id_aa64isar2_el1() & mask_id_aa64isar2) != 0U;
+}
+
static inline bool is_armv8_3_pauth_present(void)
{
- uint64_t mask = (ID_AA64ISAR1_GPI_MASK << ID_AA64ISAR1_GPI_SHIFT) |
- (ID_AA64ISAR1_GPA_MASK << ID_AA64ISAR1_GPA_SHIFT) |
- (ID_AA64ISAR1_API_MASK << ID_AA64ISAR1_API_SHIFT) |
- (ID_AA64ISAR1_APA_MASK << ID_AA64ISAR1_APA_SHIFT);
+ uint64_t mask_id_aa64isar1 =
+ (ID_AA64ISAR1_GPI_MASK << ID_AA64ISAR1_GPI_SHIFT) |
+ (ID_AA64ISAR1_GPA_MASK << ID_AA64ISAR1_GPA_SHIFT) |
+ (ID_AA64ISAR1_API_MASK << ID_AA64ISAR1_API_SHIFT) |
+ (ID_AA64ISAR1_APA_MASK << ID_AA64ISAR1_APA_SHIFT);
- /* If any of the fields is not zero, PAuth is present */
- return (read_id_aa64isar1_el1() & mask) != 0U;
+ /*
+ * If any of the fields is not zero or QARMA3 is present,
+ * PAuth is present.
+ */
+ return ((read_id_aa64isar1_el1() & mask_id_aa64isar1) != 0U ||
+ is_feat_pacqarma3_present());
}
-static inline bool is_armv8_3_pauth_apa_api_present(void)
+static inline bool is_armv8_3_pauth_apa_api_apa3_present(void)
{
- uint64_t mask = (ID_AA64ISAR1_API_MASK << ID_AA64ISAR1_API_SHIFT) |
- (ID_AA64ISAR1_APA_MASK << ID_AA64ISAR1_APA_SHIFT);
+ uint64_t mask_id_aa64isar1 =
+ (ID_AA64ISAR1_API_MASK << ID_AA64ISAR1_API_SHIFT) |
+ (ID_AA64ISAR1_APA_MASK << ID_AA64ISAR1_APA_SHIFT);
- return (read_id_aa64isar1_el1() & mask) != 0U;
+ uint64_t mask_id_aa64isar2 =
+ (ID_AA64ISAR2_APA3_MASK << ID_AA64ISAR2_APA3_SHIFT);
+
+ return ((read_id_aa64isar1_el1() & mask_id_aa64isar1) |
+ (read_id_aa64isar2_el1() & mask_id_aa64isar2)) != 0U;
}
-static inline bool is_armv8_3_pauth_gpa_gpi_present(void)
+static inline bool is_armv8_3_pauth_gpa_gpi_gpa3_present(void)
{
- uint64_t mask = (ID_AA64ISAR1_GPI_MASK << ID_AA64ISAR1_GPI_SHIFT) |
- (ID_AA64ISAR1_GPA_MASK << ID_AA64ISAR1_GPA_SHIFT);
+ uint64_t mask_id_aa64isar1 =
+ (ID_AA64ISAR1_GPI_MASK << ID_AA64ISAR1_GPI_SHIFT) |
+ (ID_AA64ISAR1_GPA_MASK << ID_AA64ISAR1_GPA_SHIFT);
+
+ uint64_t mask_id_aa64isar2 =
+ (ID_AA64ISAR2_GPA3_MASK << ID_AA64ISAR2_GPA3_SHIFT);
- return (read_id_aa64isar1_el1() & mask) != 0U;
+ return ((read_id_aa64isar1_el1() & mask_id_aa64isar1) |
+ (read_id_aa64isar2_el1() & mask_id_aa64isar2)) != 0U;
}
static inline bool is_armv8_4_dit_present(void)
diff --git a/tftf/framework/main.c b/tftf/framework/main.c
index f75cb078d..a203bd2f2 100644
--- a/tftf/framework/main.c
+++ b/tftf/framework/main.c
@@ -550,7 +550,7 @@ void __dead2 tftf_cold_boot_main(void)
* authentication would fail then.
*/
#if ENABLE_PAUTH
- assert(is_armv8_3_pauth_apa_api_present());
+ assert(is_armv8_3_pauth_apa_api_apa3_present());
/*
* Program APIAKey_EL1 key and enable ARMv8.3-PAuth here as this
diff --git a/tftf/tests/extensions/pauth/test_pauth.c b/tftf/tests/extensions/pauth/test_pauth.c
index 30b78ef19..b7434a81c 100644
--- a/tftf/tests/extensions/pauth/test_pauth.c
+++ b/tftf/tests/extensions/pauth/test_pauth.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2019, Arm Limited. All rights reserved.
+ * Copyright (c) 2019-2022, Arm Limited. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
@@ -60,7 +60,7 @@ static void set_store_pauth_keys(void)
memset(pauth_keys_before, 0, NUM_KEYS * sizeof(uint128_t));
- if (is_armv8_3_pauth_apa_api_present()) {
+ if (is_armv8_3_pauth_apa_api_apa3_present()) {
if (is_pauth_key_enabled(SCTLR_EnIA_BIT)) {
/* Read APIAKey_EL1 */
plat_key = read_apiakeylo_el1() |
@@ -119,7 +119,7 @@ static void set_store_pauth_keys(void)
* APGAKey_EL1 can be re-programmed, as this key is not set in
* TF-A Test suite and PACGA instruction is not used.
*/
- if (is_armv8_3_pauth_gpa_gpi_present()) {
+ if (is_armv8_3_pauth_gpa_gpi_gpa3_present()) {
/* Program APGAKey_EL1 */
plat_key = init_apkey();
write_apgakeylo_el1((uint64_t)plat_key);
@@ -138,7 +138,7 @@ static void read_pauth_keys(void)
{
memset(pauth_keys_after, 0, NUM_KEYS * sizeof(uint128_t));
- if (is_armv8_3_pauth_apa_api_present()) {
+ if (is_armv8_3_pauth_apa_api_apa3_present()) {
/* Read APIAKey_EL1 */
pauth_keys_after[0] = read_apiakeylo_el1() |
((uint128_t)(read_apiakeyhi_el1()) << 64);
@@ -156,7 +156,7 @@ static void read_pauth_keys(void)
((uint128_t)(read_apdbkeyhi_el1()) << 64);
}
- if (is_armv8_3_pauth_gpa_gpi_present()) {
+ if (is_armv8_3_pauth_gpa_gpi_gpa3_present()) {
/* Read APGAKey_EL1 */
pauth_keys_after[4] = read_apgakeylo_el1() |
((uint128_t)(read_apgakeyhi_el1()) << 64);