
Hi Heinrich
From: Heinrich Schuchardt [mailto:xypron.glpk@gmx.de] Sent: Tuesday, August 04, 2020 7:10 PM To: Rick Jian-Zhi Chen(陳建志) Cc: u-boot@lists.denx.de; Heinrich Schuchardt Subject: [PATCH 1/1] cmd: exception: unaligned data access on RISC-V
The command 'exception' can be used to test the handling of exceptions.
Currently the exception command only allows to create an illegal instruction exception on RISC-V.
Provide a sub-command 'exception unaligned' to cause a misaligned load address exception.
Adjust the online help for 'exception undefined'.
Signed-off-by: Heinrich Schuchardt xypron.glpk@gmx.de
cmd/riscv/exception.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-)
diff --git a/cmd/riscv/exception.c b/cmd/riscv/exception.c index 3c8dbbec0e..53159531d9 100644 --- a/cmd/riscv/exception.c +++ b/cmd/riscv/exception.c @@ -8,6 +8,17 @@ #include <common.h> #include <command.h>
+static int do_unaligned(struct cmd_tbl *cmdtp, int flag, int argc,
char *const argv[])
+{
asm volatile (
"auipc a1, 0\n"
"ori a1, a1, 3\n"
"lw a2, (0)(a1)\n"
);
return CMD_RET_FAILURE;
I suggest that we can modify it as below to print the unaligned address and data for more debug information.
int ret = 0; int addr = 0;
asm volatile ( "auipc a1, 0\n" "ori %0, a1, 3\n" "lw %1, (0)(a1)\n" : "=r" (addr), "=r" (ret) : : "memory" ); printf("unaligned addr 0x%x , ret 0x%x\n",addr,ret);
return CMD_RET_SUCCESS; ==================================== So if run in S-Mode, it will work as below:
RISC-V # exception unaligned unaligned addr 0x3ff92fd7 , ret 0x35e59300 RISC-V #
(gdb) x/4x 0x3ff92fd0 0x3ff92fd0: 0x7ac362ef 0x00000597 0x0035e593 0xc5174190 (gdb)
==================================== If run in M-Mode, it will work as below:
RISC-V # exception unaligned Unhandled exception: Load address misaligned EPC: 000000003ff92fdc RA: 000000003ff93032 TVAL: 000000003ff92fd7 EPC: 0000000000009fdc RA: 000000000000a032 reloc adjusted
### ERROR ### Please RESET the board ###
Thanks, Rick
+}
static int do_undefined(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) { @@ -16,6 +27,8 @@ static int do_undefined(struct cmd_tbl *cmdtp, int flag, int argc, }
static struct cmd_tbl cmd_sub[] = {
U_BOOT_CMD_MKENT(unaligned, CONFIG_SYS_MAXARGS, 1, do_unaligned,
"", ""), U_BOOT_CMD_MKENT(undefined, CONFIG_SYS_MAXARGS, 1, do_undefined, "", ""),
}; @@ -23,7 +36,8 @@ static struct cmd_tbl cmd_sub[] = { static char exception_help_text[] = "<ex>\n" " The following exceptions are available:\n"
" undefined - undefined instruction\n"
" undefined - illegal instruction\n"
" unaligned - load address misaligned\n" ;
#include <exception.h>
2.27.0