From bde25ae28f0ff5db7963d0bd6344afddfd599fc6 Mon Sep 17 00:00:00 2001 From: Antonio Nino Diaz Date: Wed, 17 Oct 2018 16:46:41 +0100 Subject: [PATCH 1/6] zynqmp: Remove dependency on arm_helpers.S Non-Arm platforms shouldn't use Arm platform code. This patch copies the implementation of the functions in arm_helpers.S to zynqmp_helpers.S to remove this dependency of zynqmp on Arm platforms. Change-Id: Ia85f303c4c63bcf0ffa57c7f3ef9d88376729b6b Signed-off-by: Antonio Nino Diaz --- plat/xilinx/zynqmp/aarch64/zynqmp_helpers.S | 81 ++++++++++++++++++++- plat/xilinx/zynqmp/plat_zynqmp.c | 7 +- plat/xilinx/zynqmp/platform.mk | 1 - plat/xilinx/zynqmp/zynqmp_def.h | 8 +- plat/xilinx/zynqmp/zynqmp_private.h | 5 +- 5 files changed, 91 insertions(+), 11 deletions(-) diff --git a/plat/xilinx/zynqmp/aarch64/zynqmp_helpers.S b/plat/xilinx/zynqmp/aarch64/zynqmp_helpers.S index ad960f493..969d8faa1 100644 --- a/plat/xilinx/zynqmp/aarch64/zynqmp_helpers.S +++ b/plat/xilinx/zynqmp/aarch64/zynqmp_helpers.S @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2016, ARM Limited and Contributors. All rights reserved. + * Copyright (c) 2013-2018, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -10,6 +10,12 @@ .globl plat_secondary_cold_boot_setup .globl plat_is_my_cpu_primary + .globl zynqmp_calc_core_pos + .globl plat_my_core_pos + .globl plat_crash_console_init + .globl plat_crash_console_putc + .globl plat_crash_console_flush + .globl platform_mem_init /* ----------------------------------------------------- * void plat_secondary_cold_boot_setup (void); @@ -47,3 +53,76 @@ func plat_is_my_cpu_primary cset x0, eq ret x9 endfunc plat_is_my_cpu_primary + + /* ----------------------------------------------------- + * unsigned int plat_my_core_pos(void) + * This function uses the zynqmp_calc_core_pos() + * definition to get the index of the calling CPU. + * ----------------------------------------------------- + */ +func plat_my_core_pos + mrs x0, mpidr_el1 + b zynqmp_calc_core_pos +endfunc plat_my_core_pos + + /* ----------------------------------------------------- + * unsigned int zynqmp_calc_core_pos(u_register_t mpidr) + * Helper function to calculate the core position. + * With this function: CorePos = (ClusterId * 4) + + * CoreId + * ----------------------------------------------------- + */ +func zynqmp_calc_core_pos + and x1, x0, #MPIDR_CPU_MASK + and x0, x0, #MPIDR_CLUSTER_MASK + add x0, x1, x0, LSR #6 + ret +endfunc zynqmp_calc_core_pos + + /* --------------------------------------------- + * int plat_crash_console_init(void) + * Function to initialize the crash console + * without a C Runtime to print crash report. + * Clobber list : x0 - x4 + * --------------------------------------------- + */ +func plat_crash_console_init + mov_imm x0, ZYNQMP_CRASH_UART_BASE + mov_imm x1, ZYNQMP_CRASH_UART_CLK_IN_HZ + mov_imm x2, ZYNQMP_UART_BAUDRATE + b console_core_init +endfunc plat_crash_console_init + + /* --------------------------------------------- + * int plat_crash_console_putc(int c) + * Function to print a character on the crash + * console without a C Runtime. + * Clobber list : x1, x2 + * --------------------------------------------- + */ +func plat_crash_console_putc + mov_imm x1, ZYNQMP_CRASH_UART_BASE + b console_core_putc +endfunc plat_crash_console_putc + + /* --------------------------------------------- + * int plat_crash_console_flush() + * Function to force a write of all buffered + * data that hasn't been output. + * Out : return -1 on error else return 0. + * Clobber list : r0 + * --------------------------------------------- + */ +func plat_crash_console_flush + mov_imm x0, ZYNQMP_CRASH_UART_BASE + b console_core_flush +endfunc plat_crash_console_flush + + /* --------------------------------------------------------------------- + * We don't need to carry out any memory initialization on ARM + * platforms. The Secure RAM is accessible straight away. + * --------------------------------------------------------------------- + */ +func platform_mem_init + ret +endfunc platform_mem_init diff --git a/plat/xilinx/zynqmp/plat_zynqmp.c b/plat/xilinx/zynqmp/plat_zynqmp.c index cbfa935c2..2441630bd 100644 --- a/plat/xilinx/zynqmp/plat_zynqmp.c +++ b/plat/xilinx/zynqmp/plat_zynqmp.c @@ -1,10 +1,11 @@ /* - * Copyright (c) 2015-2016, ARM Limited and Contributors. All rights reserved. + * Copyright (c) 2015-2018, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ -#include +#include +#include "zynqmp_private.h" int plat_core_pos_by_mpidr(u_register_t mpidr) { @@ -14,5 +15,5 @@ int plat_core_pos_by_mpidr(u_register_t mpidr) if ((mpidr & MPIDR_CPU_MASK) >= PLATFORM_CORE_COUNT) return -1; - return plat_arm_calc_core_pos(mpidr); + return zynqmp_calc_core_pos(mpidr); } diff --git a/plat/xilinx/zynqmp/platform.mk b/plat/xilinx/zynqmp/platform.mk index 53d93c326..33859ee5e 100644 --- a/plat/xilinx/zynqmp/platform.mk +++ b/plat/xilinx/zynqmp/platform.mk @@ -64,7 +64,6 @@ PLAT_BL_COMMON_SOURCES := lib/xlat_tables/xlat_tables_common.c \ drivers/arm/gic/v2/gicv2_helpers.c \ drivers/cadence/uart/aarch64/cdns_console.S \ drivers/console/aarch64/console.S \ - plat/arm/common/aarch64/arm_helpers.S \ plat/arm/common/arm_cci.c \ plat/arm/common/arm_common.c \ plat/arm/common/arm_gicv2.c \ diff --git a/plat/xilinx/zynqmp/zynqmp_def.h b/plat/xilinx/zynqmp/zynqmp_def.h index 50a733176..9d19b1bbd 100644 --- a/plat/xilinx/zynqmp/zynqmp_def.h +++ b/plat/xilinx/zynqmp/zynqmp_def.h @@ -145,13 +145,11 @@ # error "invalid ZYNQMP_CONSOLE" #endif -#define PLAT_ARM_CRASH_UART_BASE ZYNQMP_UART_BASE +#define ZYNQMP_CRASH_UART_BASE ZYNQMP_UART_BASE /* impossible to call C routine how it is done now - hardcode any value */ -#define PLAT_ARM_CRASH_UART_CLK_IN_HZ 100000000 /* FIXME */ - +#define ZYNQMP_CRASH_UART_CLK_IN_HZ 100000000 /* FIXME */ /* Must be non zero */ -#define ZYNQMP_UART_BAUDRATE 115200 -#define ARM_CONSOLE_BAUDRATE ZYNQMP_UART_BAUDRATE +#define ZYNQMP_UART_BAUDRATE 115200 /* Silicon version detection */ #define ZYNQMP_SILICON_VER_MASK 0xF000 diff --git a/plat/xilinx/zynqmp/zynqmp_private.h b/plat/xilinx/zynqmp/zynqmp_private.h index 08a54107a..d5024c3ec 100644 --- a/plat/xilinx/zynqmp/zynqmp_private.h +++ b/plat/xilinx/zynqmp/zynqmp_private.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014-2016, ARM Limited and Contributors. All rights reserved. + * Copyright (c) 2014-2018, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -9,9 +9,12 @@ #include #include +#include void zynqmp_config_setup(void); +unsigned int zynqmp_calc_core_pos(u_register_t mpidr); + /* ZynqMP specific functions */ unsigned int zynqmp_get_uart_clk(void); unsigned int zynqmp_get_bootmode(void); From 9c675b374a88f273f23f590bd5665be074c734d3 Mon Sep 17 00:00:00 2001 From: Antonio Nino Diaz Date: Wed, 17 Oct 2018 15:29:34 +0100 Subject: [PATCH 2/6] Add plat_crash_console_flush to platforms without it Even though at this point plat_crash_console_flush is optional, it will stop being optional in a following patch. The console driver of warp7 doesn't support flush, so the implementation is a placeholder. TI had ``plat_crash_console_init`` and ``plat_crash_console_putc``, but they weren't global so they weren't actually used. Also, they were calling the wrong functions. imx8_helpers.S only has placeholders for all of the functions. Change-Id: I8d17bbf37c7dad74e134c61ceb92acb9af497718 Signed-off-by: Antonio Nino Diaz --- plat/hisilicon/hikey/aarch64/hikey_helpers.S | 14 +++++++++++++ .../hikey960/aarch64/hikey960_helpers.S | 16 +++++++++++++- plat/imx/common/imx8_helpers.S | 7 +++++++ plat/imx/imx7/warp7/aarch32/warp7_helpers.S | 7 +++++++ plat/marvell/common/aarch64/marvell_helpers.S | 14 +++++++++++++ .../tegra/common/aarch64/tegra_helpers.S | 17 ++++++++++++++- plat/ti/k3/common/k3_helpers.S | 21 ++++++++++++++++--- 7 files changed, 91 insertions(+), 5 deletions(-) diff --git a/plat/hisilicon/hikey/aarch64/hikey_helpers.S b/plat/hisilicon/hikey/aarch64/hikey_helpers.S index 32ff8b40c..9dfdae49c 100644 --- a/plat/hisilicon/hikey/aarch64/hikey_helpers.S +++ b/plat/hisilicon/hikey/aarch64/hikey_helpers.S @@ -12,6 +12,7 @@ .globl platform_mem_init .globl plat_crash_console_init .globl plat_crash_console_putc + .globl plat_crash_console_flush .globl plat_report_exception .globl plat_reset_handler @@ -60,6 +61,19 @@ func plat_crash_console_putc b console_core_putc endfunc plat_crash_console_putc + /* --------------------------------------------- + * int plat_crash_console_flush() + * Function to force a write of all buffered + * data that hasn't been output. + * Out : return -1 on error else return 0. + * Clobber list : x0, x1 + * --------------------------------------------- + */ +func plat_crash_console_flush + mov_imm x0, CRASH_CONSOLE_BASE + b console_core_flush +endfunc plat_crash_console_flush + /* --------------------------------------------- * void plat_report_exception(unsigned int type) * Function to report an unhandled exception diff --git a/plat/hisilicon/hikey960/aarch64/hikey960_helpers.S b/plat/hisilicon/hikey960/aarch64/hikey960_helpers.S index d18399fbf..550c5604b 100644 --- a/plat/hisilicon/hikey960/aarch64/hikey960_helpers.S +++ b/plat/hisilicon/hikey960/aarch64/hikey960_helpers.S @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved. + * Copyright (c) 2017-2018, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -14,6 +14,7 @@ .globl platform_mem_init .globl plat_crash_console_init .globl plat_crash_console_putc + .globl plat_crash_console_flush .globl plat_report_exception .globl plat_reset_handler .globl clr_ex @@ -64,6 +65,19 @@ func plat_crash_console_putc b console_core_putc endfunc plat_crash_console_putc + /* --------------------------------------------- + * int plat_crash_console_flush() + * Function to force a write of all buffered + * data that hasn't been output. + * Out : return -1 on error else return 0. + * Clobber list : x0, x1 + * --------------------------------------------- + */ +func plat_crash_console_flush + mov_imm x0, CRASH_CONSOLE_BASE + b console_core_flush +endfunc plat_crash_console_flush + /* --------------------------------------------- * void plat_report_exception(unsigned int type) * Function to report an unhandled exception diff --git a/plat/imx/common/imx8_helpers.S b/plat/imx/common/imx8_helpers.S index b89d346c6..19293bfe7 100644 --- a/plat/imx/common/imx8_helpers.S +++ b/plat/imx/common/imx8_helpers.S @@ -16,6 +16,7 @@ .globl plat_secondary_cold_boot_setup .globl plat_crash_console_init .globl plat_crash_console_putc + .globl plat_crash_console_flush .globl platform_mem_init .globl imx_mailbox_init @@ -106,6 +107,7 @@ func plat_secondary_cold_boot_setup endfunc plat_secondary_cold_boot_setup func plat_crash_console_init + mov x0, #1 ret endfunc plat_crash_console_init @@ -113,6 +115,11 @@ func plat_crash_console_putc ret endfunc plat_crash_console_putc +func plat_crash_console_flush + mov x0, #0 + ret +endfunc plat_crash_console_flush + func platform_mem_init ret endfunc platform_mem_init diff --git a/plat/imx/imx7/warp7/aarch32/warp7_helpers.S b/plat/imx/imx7/warp7/aarch32/warp7_helpers.S index b1921cc38..3695b32db 100644 --- a/plat/imx/imx7/warp7/aarch32/warp7_helpers.S +++ b/plat/imx/imx7/warp7/aarch32/warp7_helpers.S @@ -14,6 +14,7 @@ .globl plat_get_my_entrypoint .globl plat_crash_console_init .globl plat_crash_console_putc + .globl plat_crash_console_flush .globl plat_panic_handler /* --------------------------------------------- @@ -45,6 +46,12 @@ func plat_crash_console_putc b imx_crash_uart_putc endfunc plat_crash_console_putc +func plat_crash_console_flush + /* Placeholder */ + mov r0, #0 + bx lr +endfunc plat_crash_console_flush + func plat_panic_handler mov r3, #HAB_ROM_VECTOR_TABLE_FAILSAFE ldr r3, [r3, #0] diff --git a/plat/marvell/common/aarch64/marvell_helpers.S b/plat/marvell/common/aarch64/marvell_helpers.S index a3dc917c6..128c3ab69 100644 --- a/plat/marvell/common/aarch64/marvell_helpers.S +++ b/plat/marvell/common/aarch64/marvell_helpers.S @@ -18,6 +18,7 @@ .weak plat_my_core_pos .globl plat_crash_console_init .globl plat_crash_console_putc + .globl plat_crash_console_flush .globl platform_mem_init .globl disable_mmu_dcache .globl invalidate_tlb_all @@ -79,6 +80,19 @@ func plat_crash_console_putc b console_core_putc endfunc plat_crash_console_putc + /* --------------------------------------------- + * int plat_crash_console_flush() + * Function to force a write of all buffered + * data that hasn't been output. + * Out : return -1 on error else return 0. + * Clobber list : x0, x1 + * --------------------------------------------- + */ +func plat_crash_console_flush + mov_imm x0, PLAT_MARVELL_CRASH_UART_BASE + b console_core_flush +endfunc plat_crash_console_flush + /* --------------------------------------------------------------------- * We don't need to carry out any memory initialization on ARM * platforms. The Secure RAM is accessible straight away. diff --git a/plat/nvidia/tegra/common/aarch64/tegra_helpers.S b/plat/nvidia/tegra/common/aarch64/tegra_helpers.S index 3c490d078..0476ba826 100644 --- a/plat/nvidia/tegra/common/aarch64/tegra_helpers.S +++ b/plat/nvidia/tegra/common/aarch64/tegra_helpers.S @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2017, ARM Limited and Contributors. All rights reserved. + * Copyright (c) 2015-2018, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -36,6 +36,7 @@ .globl platform_mem_init .globl plat_crash_console_init .globl plat_crash_console_putc + .globl plat_crash_console_flush .globl tegra_secure_entrypoint .globl plat_reset_handler @@ -240,6 +241,20 @@ func plat_crash_console_putc b console_core_putc endfunc plat_crash_console_putc + /* --------------------------------------------- + * int plat_crash_console_flush() + * Function to force a write of all buffered + * data that hasn't been output. + * Out : return -1 on error else return 0. + * Clobber list : x0, x1 + * --------------------------------------------- + */ +func plat_crash_console_flush + adr x0, tegra_console_base + ldr x0, [x0] + b console_core_flush +endfunc plat_crash_console_flush + /* --------------------------------------------------- * Function to handle a platform reset and store * input parameters passed by BL2. diff --git a/plat/ti/k3/common/k3_helpers.S b/plat/ti/k3/common/k3_helpers.S index c95e9c367..3dfdda4bd 100644 --- a/plat/ti/k3/common/k3_helpers.S +++ b/plat/ti/k3/common/k3_helpers.S @@ -100,13 +100,13 @@ endfunc plat_my_core_pos * Clobber list : x0 - x4 * --------------------------------------------- */ + .globl plat_crash_console_init func plat_crash_console_init mov_imm x0, CRASH_CONSOLE_BASE mov_imm x1, CRASH_CONSOLE_CLK mov_imm x2, CRASH_CONSOLE_BAUD_RATE mov w3, #0x0 - b console_core_init - + b console_16550_core_init endfunc plat_crash_console_init /* --------------------------------------------- @@ -116,7 +116,22 @@ endfunc plat_crash_console_init * Clobber list : x1, x2 * --------------------------------------------- */ + .globl plat_crash_console_putc func plat_crash_console_putc mov_imm x1, CRASH_CONSOLE_BASE - b console_core_putc + b console_16550_core_putc endfunc plat_crash_console_putc + + /* --------------------------------------------- + * int plat_crash_console_flush() + * Function to force a write of all buffered + * data that hasn't been output. + * Out : return -1 on error else return 0. + * Clobber list : x0, x1 + * --------------------------------------------- + */ + .globl plat_crash_console_flush +func plat_crash_console_flush + mov_imm x0, CRASH_CONSOLE_BASE + b console_16550_core_flush +endfunc plat_crash_console_flush From c02c69f8ef9020f82f4f09f5108a40b058fbaa06 Mon Sep 17 00:00:00 2001 From: Antonio Nino Diaz Date: Tue, 16 Oct 2018 14:10:15 +0100 Subject: [PATCH 3/6] plat/arm: Make crash console functions strong In Arm platforms the crash console doesn't print anything if the crash happens early enough. This happens in all images, not only BL1. The reason is that they the files ``plat/common/aarch64/platform_helpers.S`` and ``plat/arm/common/aarch64/arm_helpers.S``, and the crash console functions are defined as weak in both files. In practice, the linker can pick the one in ``plat/common``, which simply switches the multi console to crash mode when it wants to initialize the crash console. In the case of Arm platforms, there are no console drivers registered at that point, so nothing is printed. This patch makes the functions in plat/arm strong so that they override the weak functions in plat/common. Change-Id: Id358db7d2567d7df0951790a695636cf6c9ac57f Signed-off-by: Antonio Nino Diaz --- plat/arm/common/aarch64/arm_helpers.S | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plat/arm/common/aarch64/arm_helpers.S b/plat/arm/common/aarch64/arm_helpers.S index 752929db5..06720589a 100644 --- a/plat/arm/common/aarch64/arm_helpers.S +++ b/plat/arm/common/aarch64/arm_helpers.S @@ -8,9 +8,9 @@ .weak plat_arm_calc_core_pos .weak plat_my_core_pos - .weak plat_crash_console_init - .weak plat_crash_console_putc - .weak plat_crash_console_flush + .globl plat_crash_console_init + .globl plat_crash_console_putc + .globl plat_crash_console_flush .globl platform_mem_init From 6c9ada3150c08da557348a6f88c794caf62740c4 Mon Sep 17 00:00:00 2001 From: Antonio Nino Diaz Date: Tue, 16 Oct 2018 14:32:34 +0100 Subject: [PATCH 4/6] Add sample crash console functions Platforms that wish to use the sample functions have to add the file to their Makefile. It is not included by default. Change-Id: I713617bb58dc218967199248f68da86241d7ec40 Signed-off-by: Antonio Nino Diaz --- docs/porting-guide.rst | 44 ++++++---- plat/common/aarch32/crash_console_helpers.S | 92 +++++++++++++++++++++ plat/common/aarch64/crash_console_helpers.S | 92 +++++++++++++++++++++ 3 files changed, 211 insertions(+), 17 deletions(-) create mode 100644 plat/common/aarch32/crash_console_helpers.S create mode 100644 plat/common/aarch64/crash_console_helpers.S diff --git a/docs/porting-guide.rst b/docs/porting-guide.rst index 1667ccec8..bef4af656 100644 --- a/docs/porting-guide.rst +++ b/docs/porting-guide.rst @@ -2554,8 +2554,13 @@ NOTE: This section assumes that your platform is enabling the MULTI_CONSOLE_API flag in its platform.mk. Not using this flag is deprecated for new platforms. BL31 implements a crash reporting mechanism which prints the various registers -of the CPU to enable quick crash analysis and debugging. By default, the -definitions in ``plat/common/aarch64/platform\_helpers.S`` will cause the crash +of the CPU to enable quick crash analysis and debugging. This mechanism relies +on the platform implementating ``plat_crash_console_init``, +``plat_crash_console_putc`` and ``plat_crash_console_flush``. + +The file ``plat/common/aarch64/crash_console_helpers.S`` contains sample +implementation of all of them. Platforms may include this file to their +makefiles in order to benefit from them. By default, they will cause the crash output to be routed over the normal console infrastructure and get printed on consoles configured to output in crash state. ``console_set_scope()`` can be used to control whether a console is used for crash output. @@ -2565,8 +2570,12 @@ normal boot console can be set up), platforms may want to control crash output more explicitly. For these, the following functions can be overridden by platform code. They are executed outside of a C environment and without a stack. -Function : plat\_crash\_console\_init -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +If this behaviour is not desirable, the platform may implement functions that +redirect the prints to the console driver (``console_xxx_core_init``, etc). Most +platforms (including Arm platforms) do this and they can be used as an example. + +Function : plat\_crash\_console\_init [mandatory] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -2577,9 +2586,10 @@ This API is used by the crash reporting mechanism to initialize the crash console. It must only use the general purpose registers x0 through x7 to do the initialization and returns 1 on success. -If you are trying to debug crashes before the console driver would normally get -registered, you can use this to register a driver from assembly with hardcoded -parameters. For example, you could register the 16550 driver like this: +When using the sample implementation, if you are trying to debug crashes before +the console driver would normally get registered, you can use this to register a +driver from assembly with hardcoded parameters. For example, you could register +the 16550 driver like this: :: @@ -2595,11 +2605,11 @@ parameters. For example, you could register the 16550 driver like this: b console_16550_register /* tail call, returns 1 on success */ endfunc plat_crash_console_init -If you're trying to debug crashes in BL1, you can call the console_xxx_core_init -function exported by some console drivers from here. +If you're trying to debug crashes in BL1, you can call the +``console_xxx_core_init`` function exported by some console drivers from here. -Function : plat\_crash\_console\_putc -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : plat\_crash\_console\_putc [mandatory] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -2612,13 +2622,13 @@ x2 to do its work. The parameter and the return value are in general purpose register x0. If you have registered a normal console driver in ``plat_crash_console_init``, -you can keep the default implementation here (which calls ``console_putc()``). +you can keep the sample implementation here (which calls ``console_putc()``). -If you're trying to debug crashes in BL1, you can call the console_xxx_core_putc -function exported by some console drivers from here. +If you're trying to debug crashes in BL1, you can call the +``console_xxx_core_putc`` function exported by some console drivers from here. -Function : plat\_crash\_console\_flush -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Function : plat\_crash\_console\_flush [mandatory] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: @@ -2631,7 +2641,7 @@ registers x0 through x5 to do its work. The return value is 0 on successful completion; otherwise the return value is -1. If you have registered a normal console driver in ``plat_crash_console_init``, -you can keep the default implementation here (which calls ``console_flush()``). +you can keep the sample implementation here (which calls ``console_flush()``). If you're trying to debug crashes in BL1, you can call the console_xx_core_flush function exported by some console drivers from here. diff --git a/plat/common/aarch32/crash_console_helpers.S b/plat/common/aarch32/crash_console_helpers.S new file mode 100644 index 000000000..fc37c08fa --- /dev/null +++ b/plat/common/aarch32/crash_console_helpers.S @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2018, ARM Limited and Contributors. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * If a platform wishes to use the functions in this file it has to be added to + * the Makefile of the platform. It is not included in the common Makefile. + */ + +#include +#include + + .globl plat_crash_console_init + .globl plat_crash_console_putc + .globl plat_crash_console_flush + +#if MULTI_CONSOLE_API + + /* ----------------------------------------------------- + * int plat_crash_console_init(void) + * Use normal console by default. Switch it to crash + * mode so serial consoles become active again. + * NOTE: This default implementation will only work for + * crashes that occur after a normal console (marked + * valid for the crash state) has been registered with + * the console framework. To debug crashes that occur + * earlier, the platform has to override these functions + * with an implementation that initializes a console + * driver with hardcoded parameters. See + * docs/porting-guide.rst for more information. + * ----------------------------------------------------- + */ +func plat_crash_console_init +#if defined(IMAGE_BL1) + /* + * BL1 code can possibly crash so early that the data segment is not yet + * accessible. Don't risk undefined behavior by trying to run the normal + * console framework. Platforms that want to debug BL1 will need to + * override this with custom functions that can run from registers only. + */ + mov r0, #0 + bx lr +#else /* IMAGE_BL1 */ + mov r3, lr + mov r0, #CONSOLE_FLAG_CRASH + bl console_switch_state + mov r0, #1 + bx r3 +#endif +endfunc plat_crash_console_init + + /* ----------------------------------------------------- + * void plat_crash_console_putc(int character) + * Output through the normal console by default. + * ----------------------------------------------------- + */ +func plat_crash_console_putc + b console_putc +endfunc plat_crash_console_putc + + /* ----------------------------------------------------- + * void plat_crash_console_flush(void) + * Flush normal console by default. + * ----------------------------------------------------- + */ +func plat_crash_console_flush + b console_flush +endfunc plat_crash_console_flush + +#else /* MULTI_CONSOLE_API */ + + /* ----------------------------------------------------- + * In the old API these are all no-op stubs that need to + * be overridden by the platform to be useful. + * ----------------------------------------------------- + */ +func plat_crash_console_init + mov r0, #0 + bx lr +endfunc plat_crash_console_init + +func plat_crash_console_putc + bx lr +endfunc plat_crash_console_putc + +func plat_crash_console_flush + bx lr +endfunc plat_crash_console_flush + +#endif diff --git a/plat/common/aarch64/crash_console_helpers.S b/plat/common/aarch64/crash_console_helpers.S new file mode 100644 index 000000000..5af8db252 --- /dev/null +++ b/plat/common/aarch64/crash_console_helpers.S @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2018, ARM Limited and Contributors. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/* + * If a platform wishes to use the functions in this file it has to be added to + * the Makefile of the platform. It is not included in the common Makefile. + */ + +#include +#include + + .globl plat_crash_console_init + .globl plat_crash_console_putc + .globl plat_crash_console_flush + +#if MULTI_CONSOLE_API + + /* ----------------------------------------------------- + * int plat_crash_console_init(void) + * Use normal console by default. Switch it to crash + * mode so serial consoles become active again. + * NOTE: This default implementation will only work for + * crashes that occur after a normal console (marked + * valid for the crash state) has been registered with + * the console framework. To debug crashes that occur + * earlier, the platform has to override these functions + * with an implementation that initializes a console + * driver with hardcoded parameters. See + * docs/porting-guide.rst for more information. + * ----------------------------------------------------- + */ +func plat_crash_console_init +#if defined(IMAGE_BL1) + /* + * BL1 code can possibly crash so early that the data segment is not yet + * accessible. Don't risk undefined behavior by trying to run the normal + * console framework. Platforms that want to debug BL1 will need to + * override this with custom functions that can run from registers only. + */ + mov x0, #0 + ret +#else /* IMAGE_BL1 */ + mov x3, x30 + mov x0, #CONSOLE_FLAG_CRASH + bl console_switch_state + mov x0, #1 + ret x3 +#endif +endfunc plat_crash_console_init + + /* ----------------------------------------------------- + * void plat_crash_console_putc(int character) + * Output through the normal console by default. + * ----------------------------------------------------- + */ +func plat_crash_console_putc + b console_putc +endfunc plat_crash_console_putc + + /* ----------------------------------------------------- + * void plat_crash_console_flush(void) + * Flush normal console by default. + * ----------------------------------------------------- + */ +func plat_crash_console_flush + b console_flush +endfunc plat_crash_console_flush + +#else /* MULTI_CONSOLE_API */ + + /* ----------------------------------------------------- + * In the old API these are all no-op stubs that need to + * be overridden by the platform to be useful. + * ----------------------------------------------------- + */ +func plat_crash_console_init + mov x0, #0 + ret +endfunc plat_crash_console_init + +func plat_crash_console_putc + ret +endfunc plat_crash_console_putc + +func plat_crash_console_flush + ret +endfunc plat_crash_console_flush + +#endif From a9d5a3ff012aeeb0edd9e50cc778ef6e4218dfad Mon Sep 17 00:00:00 2001 From: Antonio Nino Diaz Date: Tue, 16 Oct 2018 16:39:12 +0100 Subject: [PATCH 5/6] rockchip: Use common crash console functions This platform depends on weak functions defined in ``plat/common/aarch64/platform_helpers.S`` that are going to be removed. Change-Id: I5104d091c32271d77ed9690e9dc257c061289def Signed-off-by: Antonio Nino Diaz --- plat/rockchip/rk3328/platform.mk | 1 + plat/rockchip/rk3368/platform.mk | 1 + plat/rockchip/rk3399/platform.mk | 1 + 3 files changed, 3 insertions(+) diff --git a/plat/rockchip/rk3328/platform.mk b/plat/rockchip/rk3328/platform.mk index 560cccae6..785f64036 100644 --- a/plat/rockchip/rk3328/platform.mk +++ b/plat/rockchip/rk3328/platform.mk @@ -29,6 +29,7 @@ RK_GIC_SOURCES := drivers/arm/gic/common/gic_common.c \ PLAT_BL_COMMON_SOURCES := lib/xlat_tables/aarch64/xlat_tables.c \ lib/xlat_tables/xlat_tables_common.c \ + plat/common/aarch64/crash_console_helpers.S \ plat/common/plat_psci_common.c BL31_SOURCES += ${RK_GIC_SOURCES} \ diff --git a/plat/rockchip/rk3368/platform.mk b/plat/rockchip/rk3368/platform.mk index 050a2c423..a3e593e60 100644 --- a/plat/rockchip/rk3368/platform.mk +++ b/plat/rockchip/rk3368/platform.mk @@ -26,6 +26,7 @@ RK_GIC_SOURCES := drivers/arm/gic/common/gic_common.c \ PLAT_BL_COMMON_SOURCES := lib/xlat_tables/xlat_tables_common.c \ lib/xlat_tables/aarch64/xlat_tables.c \ + plat/common/aarch64/crash_console_helpers.S \ plat/common/plat_psci_common.c BL31_SOURCES += ${RK_GIC_SOURCES} \ diff --git a/plat/rockchip/rk3399/platform.mk b/plat/rockchip/rk3399/platform.mk index 912041928..eccf1cc85 100644 --- a/plat/rockchip/rk3399/platform.mk +++ b/plat/rockchip/rk3399/platform.mk @@ -32,6 +32,7 @@ RK_GIC_SOURCES := drivers/arm/gic/common/gic_common.c \ PLAT_BL_COMMON_SOURCES := lib/xlat_tables/xlat_tables_common.c \ lib/xlat_tables/aarch64/xlat_tables.c \ + plat/common/aarch64/crash_console_helpers.S \ plat/common/plat_psci_common.c BL31_SOURCES += ${RK_GIC_SOURCES} \ From e74afb652c30414cc404b8d4e5b7ce44d006bde8 Mon Sep 17 00:00:00 2001 From: Antonio Nino Diaz Date: Wed, 17 Oct 2018 16:49:26 +0100 Subject: [PATCH 6/6] Deprecate weak crash console functions The default behaviour of the plat_crash_console_xxx functions isn't obvious to someone that hasn't read all the documentation. As they are not mandatory, it is unlikely that the code will be checked when doing a platform port, which may mean that some platforms may not have crash console support at all. The idea of this patch is to force platform maintainers to decide how the crash console has to behave so that the final behaviour isn't unexpected. Change-Id: I40b2a7b56c5530c1dcd63eace5bd37ae6335056e Signed-off-by: Antonio Nino Diaz --- plat/common/aarch32/platform_helpers.S | 4 ++++ plat/common/aarch64/platform_helpers.S | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/plat/common/aarch32/platform_helpers.S b/plat/common/aarch32/platform_helpers.S index d61853942..e1e2a6f58 100644 --- a/plat/common/aarch32/platform_helpers.S +++ b/plat/common/aarch32/platform_helpers.S @@ -8,9 +8,11 @@ #include .weak plat_report_exception +#if !ERROR_DEPRECATED .weak plat_crash_console_init .weak plat_crash_console_putc .weak plat_crash_console_flush +#endif .weak plat_reset_handler .weak plat_disable_acp .weak bl1_plat_prepare_exit @@ -26,6 +28,7 @@ func plat_report_exception bx lr endfunc plat_report_exception +#if !ERROR_DEPRECATED /* ----------------------------------------------------- * Placeholder function which should be redefined by * each platform. @@ -54,6 +57,7 @@ func plat_crash_console_flush mov r0, #0 bx lr endfunc plat_crash_console_flush +#endif /* ----------------------------------------------------- * Placeholder function which should be redefined by diff --git a/plat/common/aarch64/platform_helpers.S b/plat/common/aarch64/platform_helpers.S index 7214588a6..d3ffcaf19 100644 --- a/plat/common/aarch64/platform_helpers.S +++ b/plat/common/aarch64/platform_helpers.S @@ -10,9 +10,11 @@ #include .weak plat_report_exception +#if !ERROR_DEPRECATED .weak plat_crash_console_init .weak plat_crash_console_putc .weak plat_crash_console_flush +#endif .weak plat_reset_handler .weak plat_disable_acp .weak bl1_plat_prepare_exit @@ -37,6 +39,7 @@ func plat_report_exception ret endfunc plat_report_exception +#if !ERROR_DEPRECATED #if MULTI_CONSOLE_API /* ----------------------------------------------------- * int plat_crash_console_init(void) @@ -109,6 +112,7 @@ func plat_crash_console_flush ret endfunc plat_crash_console_flush #endif +#endif /* ERROR_DEPRECATED */ /* ----------------------------------------------------- * Placeholder function which should be redefined by