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> --- v2: Split architecture specific code into separate files. Provide include for common code. Update MAINTAINERS file. --- MAINTAINERS | 3 +++ cmd/Kconfig | 6 +++++ cmd/Makefile | 2 ++ cmd/arm/Makefile | 7 +++++ cmd/arm/exception.c | 61 +++++++++++++++++++++++++++++++++++++++++++ cmd/arm/exception64.c | 33 +++++++++++++++++++++++ cmd/riscv/Makefile | 3 +++ cmd/riscv/exception.c | 29 ++++++++++++++++++++ cmd/x86/Makefile | 1 + cmd/x86/exception.c | 29 ++++++++++++++++++++ include/exception.h | 58 ++++++++++++++++++++++++++++++++++++++++ 11 files changed, 232 insertions(+) create mode 100644 cmd/arm/Makefile create mode 100644 cmd/arm/exception.c create mode 100644 cmd/arm/exception64.c create mode 100644 cmd/riscv/Makefile create mode 100644 cmd/riscv/exception.c create mode 100644 cmd/x86/exception.c create mode 100644 include/exception.h diff --git a/MAINTAINERS b/MAINTAINERS index ae825014bd..c26eece24c 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -84,6 +84,7 @@ M: Albert Aribaud <albert.u.b...@aribaud.net> S: Maintained T: git git://git.denx.de/u-boot-arm.git F: arch/arm/ +F: cmd/arm/ ARM ALTERA SOCFPGA M: Marek Vasut <ma...@denx.de> @@ -624,6 +625,7 @@ M: Rick Chen <r...@andestech.com> S: Maintained T: git git://git.denx.de/u-boot-riscv.git F: arch/riscv/ +F: cmd/riscv/ F: tools/prelink-riscv.c ROCKUSB @@ -725,6 +727,7 @@ M: Bin Meng <bmeng...@gmail.com> S: Maintained T: git git://git.denx.de/u-boot-x86.git F: arch/x86/ +F: cmd/x86/ XTENSA M: Max Filippov <jcmvb...@gmail.com> diff --git a/cmd/Kconfig b/cmd/Kconfig index ea1a325eb3..308e5458b9 100644 --- a/cmd/Kconfig +++ b/cmd/Kconfig @@ -1397,6 +1397,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 15ae4d250f..bff6be0146 100644 --- a/cmd/Makefile +++ b/cmd/Makefile @@ -170,6 +170,8 @@ obj-$(CONFIG_CMD_BLOB) += blob.o # Android Verified Boot 2.0 obj-$(CONFIG_CMD_AVB) += avb.o +obj-$(CONFIG_ARM) += arm/ +obj-$(CONFIG_RISCV) += riscv/ obj-$(CONFIG_X86) += x86/ obj-$(CONFIG_ARCH_MVEBU) += mvebu/ diff --git a/cmd/arm/Makefile b/cmd/arm/Makefile new file mode 100644 index 0000000000..94367dcb45 --- /dev/null +++ b/cmd/arm/Makefile @@ -0,0 +1,7 @@ +# SPDX-License-Identifier: GPL-2.0+ + +ifdef CONFIG_ARM64 +obj-$(CONFIG_CMD_EXCEPTION) += exception64.o +else +obj-$(CONFIG_CMD_EXCEPTION) += exception.o +endif diff --git a/cmd/arm/exception.c b/cmd/arm/exception.c new file mode 100644 index 0000000000..33bc75976f --- /dev/null +++ b/cmd/arm/exception.c @@ -0,0 +1,61 @@ +// 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> + +static int do_unaligned(cmd_tbl_t *cmdtp, int flag, int argc, + char * const argv[]) +{ + /* + * The LDRD instruction requires the data source to be four byte aligned + * even if strict alignment fault checking is disabled in the system + * control register. + */ + asm volatile ( + "MOV r5, sp\n" + "ADD r5, #1\n" + "LDRD r6, r7, [r5]\n"); + return CMD_RET_FAILURE; +} + +static int do_breakpoint(cmd_tbl_t *cmdtp, int flag, int argc, + char * const argv[]) +{ + asm volatile ("BKPT #123\n"); + return CMD_RET_FAILURE; +} + +static int do_undefined(cmd_tbl_t *cmdtp, int flag, int argc, + char * const argv[]) +{ + /* + * 0xe7f...f. is undefined in ARM mode + * 0xde.. is undefined in Thumb mode + */ + asm volatile (".word 0xe7f7defb\n"); + return CMD_RET_FAILURE; +} + +static cmd_tbl_t cmd_sub[] = { + U_BOOT_CMD_MKENT(breakpoint, CONFIG_SYS_MAXARGS, 1, do_breakpoint, + "", ""), + U_BOOT_CMD_MKENT(unaligned, CONFIG_SYS_MAXARGS, 1, do_unaligned, + "", ""), + U_BOOT_CMD_MKENT(undefined, CONFIG_SYS_MAXARGS, 1, do_undefined, + "", ""), +}; + +static char exception_help_text[] = + "<ex>\n" + " The following exceptions are available:\n" + " breakpoint - prefetch abort\n" + " unaligned - data abort\n" + " undefined - undefined instruction\n" + ; + +#include <exception.h> diff --git a/cmd/arm/exception64.c b/cmd/arm/exception64.c new file mode 100644 index 0000000000..a363818532 --- /dev/null +++ b/cmd/arm/exception64.c @@ -0,0 +1,33 @@ +// 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> + +static int do_undefined(cmd_tbl_t *cmdtp, int flag, int argc, + char * const argv[]) +{ + /* + * 0xe7f...f. is undefined in ARM mode + * 0xde.. is undefined in Thumb mode + */ + asm volatile (".word 0xe7f7defb\n"); + return CMD_RET_FAILURE; +} + +static cmd_tbl_t cmd_sub[] = { + U_BOOT_CMD_MKENT(undefined, CONFIG_SYS_MAXARGS, 1, do_undefined, + "", ""), +}; + +static char exception_help_text[] = + "<ex>\n" + " The following exceptions are available:\n" + " undefined - undefined instruction\n" + ; + +#include <exception.h> diff --git a/cmd/riscv/Makefile b/cmd/riscv/Makefile new file mode 100644 index 0000000000..24df023ece --- /dev/null +++ b/cmd/riscv/Makefile @@ -0,0 +1,3 @@ +# SPDX-License-Identifier: GPL-2.0+ + +obj-$(CONFIG_CMD_EXCEPTION) += exception.o diff --git a/cmd/riscv/exception.c b/cmd/riscv/exception.c new file mode 100644 index 0000000000..547fb7d132 --- /dev/null +++ b/cmd/riscv/exception.c @@ -0,0 +1,29 @@ +// 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> + +static int do_undefined(cmd_tbl_t *cmdtp, int flag, int argc, + char * const argv[]) +{ + asm volatile (".word 0xffffffff\n"); + return CMD_RET_FAILURE; +} + +static cmd_tbl_t cmd_sub[] = { + U_BOOT_CMD_MKENT(undefined, CONFIG_SYS_MAXARGS, 1, do_undefined, + "", ""), +}; + +static char exception_help_text[] = + "<ex>\n" + " The following exceptions are available:\n" + " undefined - undefined instruction\n" + ; + +#include <exception.h> diff --git a/cmd/x86/Makefile b/cmd/x86/Makefile index bcc6d06582..707161440d 100644 --- a/cmd/x86/Makefile +++ b/cmd/x86/Makefile @@ -1,4 +1,5 @@ # SPDX-License-Identifier: GPL-2.0+ obj-y += mtrr.o +obj-$(CONFIG_CMD_EXCEPTION) += exception.o obj-$(CONFIG_HAVE_FSP) += fsp.o diff --git a/cmd/x86/exception.c b/cmd/x86/exception.c new file mode 100644 index 0000000000..ade1e2ea92 --- /dev/null +++ b/cmd/x86/exception.c @@ -0,0 +1,29 @@ +// 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> + +static int do_undefined(cmd_tbl_t *cmdtp, int flag, int argc, + char * const argv[]) +{ + asm volatile (".word 0xffff\n"); + return CMD_RET_FAILURE; +} + +static cmd_tbl_t cmd_sub[] = { + U_BOOT_CMD_MKENT(undefined, CONFIG_SYS_MAXARGS, 1, do_undefined, + "", ""), +}; + +static char exception_help_text[] = + "<ex>\n" + " The following exceptions are available:\n" + " undefined - undefined instruction\n" + ; + +#include <exception.h> diff --git a/include/exception.h b/include/exception.h new file mode 100644 index 0000000000..d65c585341 --- /dev/null +++ b/include/exception.h @@ -0,0 +1,58 @@ +/* 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> + */ + +static int do_exception(cmd_tbl_t *cmdtp, int flag, int argc, + char * const argv[]) +{ + cmd_tbl_t *cp; + + if (argc != 2) + return CMD_RET_USAGE; + + /* drop sub-command parameter */ + argc--; + argv++; + + cp = find_cmd_tbl(argv[0], cmd_sub, ARRAY_SIZE(cmd_sub)); + + if (cp) + return cp->cmd(cmdtp, flag, argc, argv); + + return CMD_RET_USAGE; +} + +static int exception_complete(int argc, char * const argv[], char last_char, + int maxv, char *cmdv[]) +{ + int len = 0; + int i = 0; + cmd_tbl_t *cmdtp; + + switch (argc) { + case 1: + break; + case 2: + len = strlen(argv[1]); + break; + default: + return 0; + } + for (cmdtp = cmd_sub; cmdtp != cmd_sub + ARRAY_SIZE(cmd_sub); cmdtp++) { + if (i >= maxv - 1) + return i; + if (!strncmp(argv[1], cmdtp->name, len)) + cmdv[i++] = cmdtp->name; + } + cmdv[i] = NULL; + return i; +} + +U_BOOT_CMD_COMPLETE( + exception, 2, 0, do_exception, + "Forces an exception to occur", + exception_help_text, exception_complete +); -- 2.19.2 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot