[PATCH 1/1] cmd: exception: unaligned data access on RISC-V

Heinrich Schuchardt xypron.glpk at gmx.de
Wed Aug 5 12:26:43 CEST 2020


On 8/5/20 10:47 AM, Rick Chen wrote:
> Hi Heinrich
>
>> From: Heinrich Schuchardt [mailto:xypron.glpk at gmx.de]
>> Sent: Tuesday, August 04, 2020 7:10 PM
>> To: Rick Jian-Zhi Chen(陳建志)
>> Cc: u-boot at 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 at 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);

Thanks for reviewing.

The printf statement will never be reached if the system does not
support unaligned access. Why should anybody care about the actual
addresses?

A reasonable message here might be:

printf("The system supports unaligned access.\n");

>
> return CMD_RET_SUCCESS;
> ====================================
> So if run in S-Mode, it will work as below:
>
> RISC-V # exception unaligned

Do we ever run the U-Boot shell in S-mode? Shouldn't we always drop to
M-mode before reaching the shell?

If I am in the U-Boot shell, why does S-mode not print out the registers
like M-Mode does? What is missing?

Best regards

Heinrich

> 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



More information about the U-Boot mailing list