diff options
author | Bipin Ravi <bipin.ravi@arm.com> | 2022-09-27 20:17:08 +0200 |
---|---|---|
committer | TrustedFirmware Code Review <review@review.trustedfirmware.org> | 2022-09-27 20:17:08 +0200 |
commit | 85417644ea342c54205183cfba7f8c3b2f5f5beb (patch) | |
tree | 9248ee002a48cfcdca306672b15954277b2541cf | |
parent | 10f278d7d1713ae53ef55f5aba080d9d37401417 (diff) | |
parent | ebd1b69ee3b9551948dfd688b2b92ce8c7c8e016 (diff) | |
download | tf-a-tests-85417644ea342c54205183cfba7f8c3b2f5f5beb.tar.gz |
Merge "test(pauth): updated helpers to include QARMA3"
-rw-r--r-- | include/lib/aarch64/arch.h | 4 | ||||
-rw-r--r-- | include/lib/aarch64/arch_features.h | 53 | ||||
-rw-r--r-- | tftf/framework/main.c | 2 | ||||
-rw-r--r-- | tftf/tests/extensions/pauth/test_pauth.c | 10 |
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); |