diff --git a/bl31/aarch64/crash_reporting.S b/bl31/aarch64/crash_reporting.S index f2c12961d5ce12bf08493d3d14923c504c1b92a3..97db2a167999b080d6b1d64469a959936a8d9a6e 100644 --- a/bl31/aarch64/crash_reporting.S +++ b/bl31/aarch64/crash_reporting.S @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014-2019, ARM Limited and Contributors. All rights reserved. + * Copyright (c) 2014-2020, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -244,6 +244,11 @@ func do_crash_reporting mrs x0, tpidr_el3 /* report x30 first from the crash buf */ ldr x4, [x0, #REGSZ * 7] + +#if ENABLE_PAUTH + /* Demangle address */ + xpaci x4 +#endif bl asm_print_hex bl asm_print_newline /* Load the crash buf address */ diff --git a/common/backtrace/backtrace.c b/common/backtrace/backtrace.c index 506d4a4822dae8067c6171c203e548c1e6ff6c04..907117f3674882728248c86e2815962f9cac56ba 100644 --- a/common/backtrace/backtrace.c +++ b/common/backtrace/backtrace.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018-2019, ARM Limited and Contributors. All rights reserved. + * Copyright (c) 2018-2020, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -37,47 +37,6 @@ struct frame_record { uintptr_t return_addr; }; -/* - * Strip the Pointer Authentication Code (PAC) from the address to retrieve the - * original one. - * - * The PAC field is stored on the high bits of the address and defined as: - * - PAC field = Xn[54:bottom_PAC_bit], when address tagging is used. - * - PAC field = Xn[63:56, 54:bottom_PAC_bit], without address tagging. - * - * With bottom_PAC_bit = 64 - TCR_ELx.TnSZ - */ -#if ENABLE_PAUTH -static uintptr_t demangle_address(uintptr_t addr) -{ - unsigned int el, t0sz, bottom_pac_bit; - uint64_t tcr, pac_mask; - - /* - * Different virtual address space size can be defined for each EL. - * Ensure that we use the proper one by reading the corresponding - * TCR_ELx register. - */ - el = get_current_el(); - - if (el == 3U) { - tcr = read_tcr_el3(); - } else if (el == 2U) { - tcr = read_tcr_el2(); - } else { - tcr = read_tcr_el1(); - } - - /* T0SZ = TCR_ELx[5:0] */ - t0sz = tcr & 0x1f; - bottom_pac_bit = 64 - t0sz; - pac_mask = (1ULL << bottom_pac_bit) - 1; - - /* demangle the address with the computed mask */ - return (addr & pac_mask); -} -#endif /* ENABLE_PAUTH */ - static const char *get_el_str(unsigned int el) { if (el == 3U) { @@ -104,9 +63,8 @@ static bool is_address_readable(uintptr_t addr) * stack contains a PAC. It must be stripped to retrieve the return * address. */ - addr = demangle_address(addr); + xpaci(addr); #endif - if (el == 3U) { ats1e3r(addr); } else if (el == 2U) { @@ -257,9 +215,8 @@ static void unwind_stack(struct frame_record *fr, uintptr_t current_pc, * the stack contains a PAC. It must be stripped to retrieve the * return address. */ - call_site = demangle_address(call_site); + xpaci(call_site); #endif - /* * If the address is invalid it means that the frame record is * probably corrupted. diff --git a/docs/getting_started/build-options.rst b/docs/getting_started/build-options.rst index 2f44fe817e3aa63709469e54aac7d527da5e77aa..fa83b4f54aa06aa3795b0777e3ddba37e270e5e8 100644 --- a/docs/getting_started/build-options.rst +++ b/docs/getting_started/build-options.rst @@ -189,7 +189,7 @@ Common build options that is only required for the assertion and does not fit in the assertion itself. -- ``ENABLE_BACKTRACE``: This option controls whether to enables backtrace +- ``ENABLE_BACKTRACE``: This option controls whether to enable backtrace dumps or not. It is supported in both AArch64 and AArch32. However, in AArch32 the format of the frame records are not defined in the AAPCS and they are defined by the implementation. This implementation of backtrace only diff --git a/include/arch/aarch64/arch_helpers.h b/include/arch/aarch64/arch_helpers.h index c60f2e8f7f2b35ab3db5e32077f6772a5f35896c..240c1fbda62b47b7830a768a404346abdbce060a 100644 --- a/include/arch/aarch64/arch_helpers.h +++ b/include/arch/aarch64/arch_helpers.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2019, ARM Limited and Contributors. All rights reserved. + * Copyright (c) 2013-2020, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -69,6 +69,13 @@ static inline void _op(void) \ __asm__ (#_op); \ } +/* Define function for system instruction with register parameter */ +#define DEFINE_SYSOP_PARAM_FUNC(_op) \ +static inline void _op(uint64_t v) \ +{ \ + __asm__ (#_op " %0" : : "r" (v)); \ +} + /* Define function for system instruction with type specifier */ #define DEFINE_SYSOP_TYPE_FUNC(_op, _type) \ static inline void _op ## _type(void) \ @@ -211,6 +218,11 @@ DEFINE_SYSOP_TYPE_PARAM_FUNC(at, s1e1r) DEFINE_SYSOP_TYPE_PARAM_FUNC(at, s1e2r) DEFINE_SYSOP_TYPE_PARAM_FUNC(at, s1e3r) +/******************************************************************************* + * Strip Pointer Authentication Code + ******************************************************************************/ +DEFINE_SYSOP_PARAM_FUNC(xpaci) + void flush_dcache_range(uintptr_t addr, size_t size); void clean_dcache_range(uintptr_t addr, size_t size); void inv_dcache_range(uintptr_t addr, size_t size);