Commit 6c9ada31 authored by Antonio Nino Diaz's avatar Antonio Nino Diaz
Browse files

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: default avatarAntonio Nino Diaz <antonio.ninodiaz@arm.com>
parent c02c69f8
...@@ -2554,8 +2554,13 @@ NOTE: This section assumes that your platform is enabling the MULTI_CONSOLE_API ...@@ -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. 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 BL31 implements a crash reporting mechanism which prints the various registers
of the CPU to enable quick crash analysis and debugging. By default, the of the CPU to enable quick crash analysis and debugging. This mechanism relies
definitions in ``plat/common/aarch64/platform\_helpers.S`` will cause the crash 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 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 consoles configured to output in crash state. ``console_set_scope()`` can be
used to control whether a console is used for crash output. 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 ...@@ -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 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. 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 ...@@ -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 console. It must only use the general purpose registers x0 through x7 to do the
initialization and returns 1 on success. initialization and returns 1 on success.
If you are trying to debug crashes before the console driver would normally get When using the sample implementation, if you are trying to debug crashes before
registered, you can use this to register a driver from assembly with hardcoded the console driver would normally get registered, you can use this to register a
parameters. For example, you could register the 16550 driver like this: 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: ...@@ -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 */ b console_16550_register /* tail call, returns 1 on success */
endfunc plat_crash_console_init endfunc plat_crash_console_init
If you're trying to debug crashes in BL1, you can call the console_xxx_core_init If you're trying to debug crashes in BL1, you can call the
function exported by some console drivers from here. ``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 ...@@ -2612,13 +2622,13 @@ x2 to do its work. The parameter and the return value are in general purpose
register x0. register x0.
If you have registered a normal console driver in ``plat_crash_console_init``, 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 If you're trying to debug crashes in BL1, you can call the
function exported by some console drivers from here. ``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 ...@@ -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. completion; otherwise the return value is -1.
If you have registered a normal console driver in ``plat_crash_console_init``, 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 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. function exported by some console drivers from here.
......
/*
* 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
/*
* 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
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment