On Sun, 9 Jan 2022 20:08:41 +0100
Heinrich Schuchardt <heinrich.schucha...@canonical.com> wrote:

> On 1/9/22 18:30, Andre Przywara wrote:
> > The arm64 version of the exception command was just defining the
> > undefined exception, but actually copied the AArch32 instruction.
> > 
> > Replace that with an encoding that is guaranteed to be and stay
> > undefined. Also add instructions to trigger unaligned access faults and
> > a breakpoint.
> > This brings ARM64 on par with ARM(32) for the exception command.
> > 
> > Signed-off-by: Andre Przywara <andre.przyw...@arm.com>
> > ---
> >   cmd/arm/exception64.c | 42 ++++++++++++++++++++++++++++++++++++++----
> >   1 file changed, 38 insertions(+), 4 deletions(-)
> > 
> > diff --git a/cmd/arm/exception64.c b/cmd/arm/exception64.c
> > index d5de50a0803..1a9730e6aec 100644
> > --- a/cmd/arm/exception64.c
> > +++ b/cmd/arm/exception64.c
> > @@ -12,14 +12,46 @@ static int do_undefined(struct cmd_tbl *cmdtp, int 
> > flag, int argc,
> >                     char *const argv[])
> >   {
> >     /*
> > -    * 0xe7f...f.   is undefined in ARM mode
> > -    * 0xde..       is undefined in Thumb mode
> > +    * Instructions starting with the upper 16 bits all 0 are permanently
> > +    * undefined. The lower 16 bits can be used for some kind of immediate.
> > +    * --- ARMv8 ARM (ARM DDI 0487G.a C6.2.339: "UDF")
> >      */
> > -   asm volatile (".word 0xe7f7defb\n");
> > +   asm volatile (".word 0x00001234\n");
> > +
> > +   return CMD_RET_FAILURE;
> > +}
> > +
> > +static int do_unaligned(struct cmd_tbl *cmdtp, int flag, int argc,
> > +                   char *const argv[])
> > +{
> > +   /*
> > +    * The load acquire instruction requires the data source to be
> > +    * naturally aligned, and will fault even if strict alignment fault
> > +    * checking is disabled.
> > +    * --- ARMv8 ARM (ARM DDI 0487G.a B2.5.2: "Alignment of data accesses") 
> >  
> 
> According to DI0487G_b_armv8_arm.pdf available at 
> https://developer.arm.com/documentation/ddi0487/latest the generation of 
> an alignment fault for ldar depends on FEAT_LSE2 (Large System 
> Extensions v2) which is mandatory for ARMv8.4. See p. B2-161.

Well found, but I wonder if that matters for the SoCs running U-Boot.
It looks like the Apple M1 is the only one so far and will probably
stay for a while.
But I can of course check ID_AA64MMFR2_EL1.AT before executing the LDAR,
and will ask around for a better method to provoke unaligned accesses.

Cheers,
Andre


> 
> Best regards
> 
> Heinrich
> 
> > +    */
> > +   asm volatile (
> > +           "mov    x1, sp\n\t"
> > +           "orr    x1, x1, #3\n\t"
> > +           "ldar   x0, [x1]\n"
> > +           ::: "x0", "x1" );
> > +
> > +   return CMD_RET_FAILURE;
> > +}
> > +
> > +static int do_breakpoint(struct cmd_tbl *cmdtp, int flag, int argc,
> > +                    char *const argv[])
> > +{
> > +   asm volatile ("brk      #123\n");
> > +
> >     return CMD_RET_FAILURE;
> >   }
> >   
> >   static struct cmd_tbl 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,
> >                      "", ""),
> >   };
> > @@ -27,7 +59,9 @@ static struct cmd_tbl cmd_sub[] = {
> >   static char exception_help_text[] =
> >     "<ex>\n"
> >     "  The following exceptions are available:\n"
> > -   "  undefined  - undefined instruction\n"
> > +   "  breakpoint - breakpoint instruction exception\n"
> > +   "  unaligned  - unaligned LDAR data abort\n"
> > +   "  undefined  - undefined instruction exception\n"
> >     ;
> >   
> >   #include <exception.h>  

Reply via email to