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

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@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.boot@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 marex@denx.de @@ -624,6 +625,7 @@ M: Rick Chen rick@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.cn@gmail.com S: Maintained T: git git://git.denx.de/u-boot-x86.git F: arch/x86/ +F: cmd/x86/
XTENSA M: Max Filippov jcmvbkbc@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.glpk@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.glpk@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.glpk@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.glpk@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.glpk@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 +);

Hi Heinrich,
On Wed, 26 Dec 2018 at 09:20, Heinrich Schuchardt xypron.glpk@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@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
This needs something like Series-version: 2 (if you use patman) to set the version number in the header.
Did you look at using a uclass and driver, like sysreset?
Regards, Simon

On 12/29/18 2:39 PM, Simon Glass wrote:
Hi Heinrich,
On Wed, 26 Dec 2018 at 09:20, Heinrich Schuchardt xypron.glpk@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@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
This needs something like Series-version: 2 (if you use patman) to set the version number in the header.
Sorry for the mishap.
Did you look at using a uclass and driver, like sysreset?
Yes I have considered using a u-class. But I could not see how adding a separate u-class file would save lines, make the coding less complex, or make the coding easier to maintain. A u-class would make sense if there were other consumers for exceptions but the exception command. But I cannot imagine any.
There are better places to apply u-classes, e.g. I am really missing a u-class for file systems.
Best regards
Heinrich
Regards, Simon

Hi Heinrich,
On Sun, 30 Dec 2018 at 01:33, Heinrich Schuchardt xypron.glpk@gmx.de wrote:
On 12/29/18 2:39 PM, Simon Glass wrote:
Hi Heinrich,
On Wed, 26 Dec 2018 at 09:20, Heinrich Schuchardt xypron.glpk@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@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
This needs something like Series-version: 2 (if you use patman) to set the version number in the header.
Sorry for the mishap.
Did you look at using a uclass and driver, like sysreset?
Yes I have considered using a u-class. But I could not see how adding a separate u-class file would save lines, make the coding less complex, or make the coding easier to maintain. A u-class would make sense if there were other consumers for exceptions but the exception command. But I cannot imagine any.
In some sense driver model matches consumers and producers. There are clearly multiple producers - you have effectively implemented an API in a few places. We even have multiple impls for each arch.
So I still favour a uclass, but since you are pretty adamant that we should not do it, I'm not going to insist.
There are better places to apply u-classes, e.g. I am really missing a u-class for file systems.
Best regards
Heinrich
Regards, Simon
Regards, Simon

On 1/5/19 2:56 AM, Simon Glass wrote:
Hi Heinrich,
On Sun, 30 Dec 2018 at 01:33, Heinrich Schuchardt xypron.glpk@gmx.de wrote:
On 12/29/18 2:39 PM, Simon Glass wrote:
Hi Heinrich,
On Wed, 26 Dec 2018 at 09:20, Heinrich Schuchardt xypron.glpk@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@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
This needs something like Series-version: 2 (if you use patman) to set the version number in the header.
Sorry for the mishap.
Did you look at using a uclass and driver, like sysreset?
Yes I have considered using a u-class. But I could not see how adding a separate u-class file would save lines, make the coding less complex, or make the coding easier to maintain. A u-class would make sense if there were other consumers for exceptions but the exception command. But I cannot imagine any.
In some sense driver model matches consumers and producers. There are clearly multiple producers - you have effectively implemented an API in a few places. We even have multiple impls for each arch.
So I still favour a uclass, but since you are pretty adamant that we should not do it, I'm not going to insist.
Hello Tom,
in patchwork this patch is still in status 'NEW'.
It is unclear to me if you are going to merge it as is or if I should rework it.
Best regards
Heinrich
There are better places to apply u-classes, e.g. I am really missing a u-class for file systems.
Best regards
Heinrich
Regards, Simon
Regards, Simon _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot

On Mon, Feb 18, 2019 at 08:38:52PM +0100, Heinrich Schuchardt wrote:
On 1/5/19 2:56 AM, Simon Glass wrote:
Hi Heinrich,
On Sun, 30 Dec 2018 at 01:33, Heinrich Schuchardt xypron.glpk@gmx.de wrote:
On 12/29/18 2:39 PM, Simon Glass wrote:
Hi Heinrich,
On Wed, 26 Dec 2018 at 09:20, Heinrich Schuchardt xypron.glpk@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@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
This needs something like Series-version: 2 (if you use patman) to set the version number in the header.
Sorry for the mishap.
Did you look at using a uclass and driver, like sysreset?
Yes I have considered using a u-class. But I could not see how adding a separate u-class file would save lines, make the coding less complex, or make the coding easier to maintain. A u-class would make sense if there were other consumers for exceptions but the exception command. But I cannot imagine any.
In some sense driver model matches consumers and producers. There are clearly multiple producers - you have effectively implemented an API in a few places. We even have multiple impls for each arch.
So I still favour a uclass, but since you are pretty adamant that we should not do it, I'm not going to insist.
Hello Tom,
in patchwork this patch is still in status 'NEW'.
It is unclear to me if you are going to merge it as is or if I should rework it.
I guess I hadn't made a decision here. I guess if you're really sure it doesn't need what Simon is suggesting, then yes, I'll pick this up as-is. Thanks!

On Wed, Dec 26, 2018 at 05:20:35PM +0100, Heinrich Schuchardt 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@gmx.de
Applied to u-boot/master, thanks!
participants (4)
-
Heinrich Schuchardt
-
Heinrich Schuchardt
-
Simon Glass
-
Tom Rini