[U-Boot] [PATCH 1/1] cmd: add exception command

Simon Glass sjg at chromium.org
Tue Nov 27 00:08:44 UTC 2018


Hi Heinrich,

On Sat, 17 Nov 2018 at 07:29, Heinrich Schuchardt <xypron.glpk at gmx.de> wrote:
>
> The 'exception' command allows to test exception handling.
>
> This implementation supports ARM, x86, RISC-V and the following exceptions:
> * 'breakpoint' - prefetch abort exception (ARM 32bit only)
> * 'unaligned'  - data abort exception (ARM only)
> * 'undefined'  - undefined instruction exception
>
> Signed-off-by: Heinrich Schuchardt <xypron.glpk at gmx.de>
> ---
> Currently RISC-V 64bit gets into an endless loop when hitting the
> undefined instruction.
>
> So it makes sense to have a testing capability.
> ---
>  cmd/Kconfig     |   6 ++
>  cmd/Makefile    |   1 +
>  cmd/exception.c | 161 ++++++++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 168 insertions(+)
>  create mode 100644 cmd/exception.c
>
> diff --git a/cmd/Kconfig b/cmd/Kconfig
> index e2973b3c51..9d2b8199b8 100644
> --- a/cmd/Kconfig
> +++ b/cmd/Kconfig
> @@ -1388,6 +1388,12 @@ config CMD_DISPLAY
>           displayed on a simple board-specific display. Implement
>           display_putc() to use it.
>
> +config CMD_EXCEPTION
> +       bool "exception - raise exception"
> +       depends on ARM || RISCV || X86
> +       help
> +         Enable the 'exception' command which allows to raise an exception.
> +
>  config CMD_LED
>         bool "led"
>         default y if LED
> diff --git a/cmd/Makefile b/cmd/Makefile
> index 0534ddc679..cd67a79170 100644
> --- a/cmd/Makefile
> +++ b/cmd/Makefile
> @@ -46,6 +46,7 @@ endif
>  obj-$(CONFIG_CMD_DISPLAY) += display.o
>  obj-$(CONFIG_CMD_DTIMG) += dtimg.o
>  obj-$(CONFIG_CMD_ECHO) += echo.o
> +obj-$(CONFIG_CMD_EXCEPTION) += exception.o
>  obj-$(CONFIG_ENV_IS_IN_EEPROM) += eeprom.o
>  obj-$(CONFIG_CMD_EEPROM) += eeprom.o
>  obj-$(CONFIG_EFI_STUB) += efi.o
> diff --git a/cmd/exception.c b/cmd/exception.c
> new file mode 100644
> index 0000000000..fb6a15573e
> --- /dev/null
> +++ b/cmd/exception.c
> @@ -0,0 +1,161 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * The 'exception' command can be used for testing exception handling.
> + *
> + * Copyright (c) 2018, Heinrich Schuchardt <xypron.glpk at gmx.de>
> + */
> +#include <common.h>
> +#include <command.h>
> +
> +enum exception {
> +       UNDEFINED_INSTRUCTION = 1,
> +       DATA_ABORT,
> +       BREAKPOINT,
> +};
> +
> +struct exception_str {
> +       enum exception id;
> +       char *text;
> +       void (*func)(void);
> +};

Can you use the normal subcommand approach for this, as with other commands?

> +
> +#if defined(CONFIG_ARM)

How about creating a uclass for this? It isn't nice to have a
arch-specific #ifdefs in commands. Something like we did with
sysreset.

> +static void data_abort(void)
> +{
> +#if defined(CONFIG_ARM64)
> +       /*
> +        * The LDR instruction requires the data source to be eight byte
> +        * aligned.
> +        */
> +       asm volatile (
> +               "MOV x1, sp\n"
> +               "ADD x1, x1, 1\n"
> +               "LDR x3, [x1]\n");

Regards,
Simon


More information about the U-Boot mailing list