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

Heinrich Schuchardt xypron.glpk at gmx.de
Thu Dec 20 12:23:19 UTC 2018


On 11/27/18 1:08 AM, Simon Glass wrote:
> 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?

Could you give an example, please. I looked at cmd/scsi. and cmd/mmc.c
And the only difference I spot is that the names of subcommand functions
start with "do_".

> 
>> +
>> +#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.

If you want separate files per architecture, why would we need a uclass?

We could simply put the architecture specific U_BOOT_CMD into the
implementation file, e.g arch/arm/cpu/exception.c and
arch/arm/cpu/exception_64.c

With a uclass I would not know how to implement an architecture specific
help output.

Best regards

Heinrich

> 
>> +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