Hi Heinrich, On Sat, 17 Nov 2018 at 07:29, Heinrich Schuchardt <xypron.g...@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.g...@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.g...@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 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot