mirror of
https://github.com/u-boot/u-boot.git
synced 2025-04-22 12:54:37 +00:00
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:
parent
c986aa624b
commit
dab8788a8c
11 changed files with 232 additions and 0 deletions
|
@ -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>
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
7
cmd/arm/Makefile
Normal 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
61
cmd/arm/exception.c
Normal 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
33
cmd/arm/exception64.c
Normal 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
3
cmd/riscv/Makefile
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# SPDX-License-Identifier: GPL-2.0+
|
||||||
|
|
||||||
|
obj-$(CONFIG_CMD_EXCEPTION) += exception.o
|
29
cmd/riscv/exception.c
Normal file
29
cmd/riscv/exception.c
Normal 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>
|
|
@ -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
29
cmd/x86/exception.c
Normal 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
58
include/exception.h
Normal 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
|
||||||
|
);
|
Loading…
Add table
Reference in a new issue