Hi Heinrich > From: Heinrich Schuchardt [mailto:xypron.g...@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.g...@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