diff options
author | Soby Mathew <soby.mathew@arm.com> | 2019-09-13 15:22:23 +0000 |
---|---|---|
committer | TrustedFirmware Code Review <review@review.trustedfirmware.org> | 2019-09-13 15:22:23 +0000 |
commit | 6129e9a643274e658a0e6f5428ad976676c7bb7a (patch) | |
tree | 04ab176ebe7086290e4f788566d3d25b647a086f /plat/arm | |
parent | 2cb662f3d0676099d469478be17e5889014677e6 (diff) | |
parent | ed108b56051de5da8024568a06781ce287e86c78 (diff) |
Merge "Refactor ARMv8.3 Pointer Authentication support code" into integration
Diffstat (limited to 'plat/arm')
-rw-r--r-- | plat/arm/common/aarch64/arm_pauth.c | 28 | ||||
-rw-r--r-- | plat/arm/common/arm_common.mk | 3 |
2 files changed, 15 insertions, 16 deletions
diff --git a/plat/arm/common/aarch64/arm_pauth.c b/plat/arm/common/aarch64/arm_pauth.c index a685c319..7cea8a0c 100644 --- a/plat/arm/common/aarch64/arm_pauth.c +++ b/plat/arm/common/aarch64/arm_pauth.c @@ -4,27 +4,25 @@ * SPDX-License-Identifier: BSD-3-Clause */ +#include <arch_helpers.h> #include <cdefs.h> #include <stdint.h> /* - * Instruction pointer authentication key A. The low 64-bit are at [0], and the - * high bits at [1]. + * This is only a toy implementation to generate a seemingly random + * 128-bit key from sp, x30 and cntpct_el0 values. + * A production system must re-implement this function to generate + * keys from a reliable randomness source. */ -uint64_t plat_apiakey[2]; - -/* - * This is only a toy implementation to generate a seemingly random 128-bit key - * from sp and x30 values. A production system must re-implement this function - * to generate keys from a reliable randomness source. - */ -uint64_t *plat_init_apiakey(void) +uint128_t plat_init_apkey(void) { - uintptr_t return_addr = (uintptr_t)__builtin_return_address(0U); - uintptr_t frame_addr = (uintptr_t)__builtin_frame_address(0U); + uint64_t return_addr = (uint64_t)__builtin_return_address(0U); + uint64_t frame_addr = (uint64_t)__builtin_frame_address(0U); + uint64_t cntpct = read_cntpct_el0(); - plat_apiakey[0] = (return_addr << 13) ^ frame_addr; - plat_apiakey[1] = (frame_addr << 15) ^ return_addr; + /* Generate 128-bit key */ + uint64_t key_lo = (return_addr << 13) ^ frame_addr ^ cntpct; + uint64_t key_hi = (frame_addr << 15) ^ return_addr ^ cntpct; - return plat_apiakey; + return ((uint128_t)(key_hi) << 64) | key_lo; } diff --git a/plat/arm/common/arm_common.mk b/plat/arm/common/arm_common.mk index 10b6e512..a4a29bf7 100644 --- a/plat/arm/common/arm_common.mk +++ b/plat/arm/common/arm_common.mk @@ -234,7 +234,8 @@ endif # Pointer Authentication sources ifeq (${ENABLE_PAUTH}, 1) -PLAT_BL_COMMON_SOURCES += plat/arm/common/aarch64/arm_pauth.c +PLAT_BL_COMMON_SOURCES += plat/arm/common/aarch64/arm_pauth.c \ + lib/extensions/pauth/pauth_helpers.S endif # SPM uses libfdt in Arm platforms |