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>
This commit is contained in:
Heinrich Schuchardt 2018-12-26 17:20:35 +01:00 committed by Tom Rini
parent c986aa624b
commit dab8788a8c
11 changed files with 232 additions and 0 deletions

View File

@ -86,6 +86,7 @@ M: Albert Aribaud <albert.u.boot@aribaud.net>
S: Maintained S: Maintained
T: git git://git.denx.de/u-boot-arm.git T: git git://git.denx.de/u-boot-arm.git
F: arch/arm/ F: arch/arm/
F: cmd/arm/
ARM ALTERA SOCFPGA ARM ALTERA SOCFPGA
M: Marek Vasut <marex@denx.de> M: Marek Vasut <marex@denx.de>
@ -677,6 +678,7 @@ M: Rick Chen <rick@andestech.com>
S: Maintained S: Maintained
T: git git://git.denx.de/u-boot-riscv.git T: git git://git.denx.de/u-boot-riscv.git
F: arch/riscv/ F: arch/riscv/
F: cmd/riscv/
F: tools/prelink-riscv.c F: tools/prelink-riscv.c
ROCKUSB ROCKUSB
@ -788,6 +790,7 @@ M: Bin Meng <bmeng.cn@gmail.com>
S: Maintained S: Maintained
T: git git://git.denx.de/u-boot-x86.git T: git git://git.denx.de/u-boot-x86.git
F: arch/x86/ F: arch/x86/
F: cmd/x86/
XTENSA XTENSA
M: Max Filippov <jcmvbkbc@gmail.com> M: Max Filippov <jcmvbkbc@gmail.com>

View File

@ -1433,6 +1433,12 @@ config CMD_EFIDEBUG
particularly for managing boot parameters as well as examining particularly for managing boot parameters as well as examining
various EFI status for debugging. various EFI status for debugging.
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 config CMD_LED
bool "led" bool "led"
depends on LED depends on LED

View File

@ -173,6 +173,8 @@ obj-$(CONFIG_CMD_BLOB) += blob.o
# Android Verified Boot 2.0 # Android Verified Boot 2.0
obj-$(CONFIG_CMD_AVB) += avb.o obj-$(CONFIG_CMD_AVB) += avb.o
obj-$(CONFIG_ARM) += arm/
obj-$(CONFIG_RISCV) += riscv/
obj-$(CONFIG_X86) += x86/ obj-$(CONFIG_X86) += x86/
obj-$(CONFIG_ARCH_MVEBU) += mvebu/ obj-$(CONFIG_ARCH_MVEBU) += mvebu/

7
cmd/arm/Makefile Normal file
View File

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

61
cmd/arm/exception.c Normal file
View File

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

33
cmd/arm/exception64.c Normal file
View File

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

3
cmd/riscv/Makefile Normal file
View File

@ -0,0 +1,3 @@
# SPDX-License-Identifier: GPL-2.0+
obj-$(CONFIG_CMD_EXCEPTION) += exception.o

29
cmd/riscv/exception.c Normal file
View File

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

View File

@ -1,4 +1,5 @@
# SPDX-License-Identifier: GPL-2.0+ # SPDX-License-Identifier: GPL-2.0+
obj-y += mtrr.o obj-y += mtrr.o
obj-$(CONFIG_CMD_EXCEPTION) += exception.o
obj-$(CONFIG_HAVE_FSP) += fsp.o obj-$(CONFIG_HAVE_FSP) += fsp.o

29
cmd/x86/exception.c Normal file
View File

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

58
include/exception.h Normal file
View File

@ -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
);