mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-15 00:54:22 +00:00
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 <antonio.ninodiaz@arm.com>
This commit is contained in:
parent
c02c69f8ef
commit
6c9ada3150
3 changed files with 211 additions and 17 deletions
|
@ -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.
|
||||
|
|
92
plat/common/aarch32/crash_console_helpers.S
Normal file
92
plat/common/aarch32/crash_console_helpers.S
Normal file
|
@ -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 <asm_macros.S>
|
||||
#include <console.h>
|
||||
|
||||
.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
|
92
plat/common/aarch64/crash_console_helpers.S
Normal file
92
plat/common/aarch64/crash_console_helpers.S
Normal file
|
@ -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 <asm_macros.S>
|
||||
#include <console.h>
|
||||
|
||||
.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
|
Loading…
Add table
Reference in a new issue