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

Reply via email to