RE: [PATCH 0/1] Temporary fix for data abort on armv6z EFI boot

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

> -----Original Message-----
> From: Heinrich Schuchardt <xypron.glpk@xxxxxx>
> Sent: 19 November 2019 04:16
> To: Ard Biesheuvel <ard.biesheuvel@xxxxxxxxxx>; Mark Rutland
> <Mark.Rutland@xxxxxxx>; Guillaume Gardet <Guillaume.Gardet@xxxxxxx>
> Cc: Cristian Ciocaltea <cristian.ciocaltea@xxxxxxxxx>; Ingo Molnar
> <mingo@xxxxxxxxxx>; Kairui Song <kasong@xxxxxxxxxx>; Hans de Goede
> <hdegoede@xxxxxxxxxx>; Matthew Garrett <matthewgarrett@xxxxxxxxxx>;
> linux-efi <linux-efi@xxxxxxxxxxxxxxx>
> Subject: Re: [PATCH 0/1] Temporary fix for data abort on armv6z EFI boot
>
> On 11/18/19 8:41 PM, Ard Biesheuvel wrote:
> > (adding Heinrich and Guillaume again)
> >
> > On Mon, 18 Nov 2019 at 19:51, Mark Rutland <mark.rutland@xxxxxxx> wrote:
> >>
> >> On Mon, Nov 18, 2019 at 07:15:04PM +0100, Ard Biesheuvel wrote:
> >>> On Mon, 18 Nov 2019 at 19:10, Mark Rutland <mark.rutland@xxxxxxx>
> wrote:
> >>>>
> >>>> On Mon, Nov 18, 2019 at 07:42:51PM +0200, Cristian Ciocaltea wrote:
> >>>>> I'm trying to boot the Linux kernel on RaspberryPi Zero via GRUB2,
> >>>>> which in turn is executed by U-Boot as an UEFI binary.
> >>>>>
> >>>>> However, I'm facing data abort issues in efi_get_memory_map() that
> >>>>> seem to be related to some ldrd instructions generated by the
> >>>>> compiler.
> >>>>>
> >>>>> To simplify the investigation, I temporarily gave up on GRUB2 and
> >>>>> started directly the Linux kernel via U-Boot bootefi command.
> >>>>> The result is an immediate crash at PC 0x92c8:
>
> Hello Christian,
>
> could you, please, check if this patch applied to U-Boot v2019.10 resolves your
> problem:
>
> https://github.com/xypron/u-boot-patches/blob/efi-next/0001-arm-arm11-
> allow-unaligned-memory-access.patch
>
> Currently I do not have an ARMv6 board available for testing. (But I just ordered
> one.)

I tested your patch on top of u-boot v2019.10 and it fixes the armv6 data abort.

Thanks a lot!
Guillaume

>
> Best regards
>
> Heinrich Schuchardt
>
> >>>>>
> >>>>> data abort
> >>>>> pc : [<1c6b12c8>]          lr : [<1c6b1558>]
> >>>>> reloc pc : [<fe76a2c8>]    lr : [<fe76a558>]
> >>>>> sp : 1db43b30  ip : 00000000     fp : 1db43cc0
> >>>>> r10: 20494249  r9 : ffffffff     r8 : 00000000
> >>>>> r7 : 1db43b3c  r6 : 00000000     r5 : 1db43bfa  r4 : 1db43bb0
> >>>>> r3 : 1db43b9c  r2 : 00000028     r1 : 00000000  r0 : 1df4f828
> >>>>> Flags: nZCv  IRQs off  FIQs off  Mode SVC_32
> >>>>> Code: e3a02028 e3a01000 e527100c e5832000 (e1c420d4) UEFI image
> >>>>> [0x1c6a8000:0x1cb2ffff] pc=0x92c8 '/boot\zImage'
> >>>>> Resetting CPU ...
> >>>>>
> >>>>> The related disassembled section shows the *ldrd* instruction in
> >>>>> the context of the following statement:
> >>>>> *map->map_size =      *map->desc_size * 32;
> >>>>>
> >>>>> drivers/firmware/efi/libstub/efi-stub-helper.c:90
> >>>>>        *map->desc_size =       sizeof(*m);
> >>>>>      92ac:     e5913008        ldr     r3, [r1, #8]
> >>>>> drivers/firmware/efi/libstub/efi-stub-helper.c:84
> >>>>> {
> >>>>>      92b0:     e1a04001        mov     r4, r1
> >>>>> drivers/firmware/efi/libstub/efi-stub-helper.c:85
> >>>>>        efi_memory_desc_t *m = NULL;
> >>>>>      92b4:     e28d7018        add     r7, sp, #24
> >>>>> linux/drivers/firmware/efi/libstub/efi-stub-helper.c:90
> >>>>>        *map->desc_size =       sizeof(*m);
> >>>>>      92b8:     e3a02028        mov     r2, #40 ; 0x28
> >>>>>      92c4:     e5832000        str     r2, [r3]
> >>>>> linux/drivers/firmware/efi/libstub/efi-stub-helper.c:91
> >>>>>        *map->map_size =        *map->desc_size * 32;
> >>>>>      92c8:     e1c420d4        ldrd    r2, [r4, #4]
> >>>>
> >>>> At this point, r4 is 16-byte aligned, so that's a misaligned LDRD.
> >>>>
> >>>> Looking at version 2.8of the UEFI spec, in section 2.3.5 "AArch32
> >>>> Platforms", it states that SCTLR should be configured:
> >>>>
> >>>> | A=0, U=1 on ARMv6 and ARMv7
> >>>>
> >>>> ... which IIUC should permit a misaligned LDRD. Is U-Boot
> >>>> definitely configuring SCTLR that way? Or has it perhaps set A=1, U=0?
> >>>
> >>> LDRD requires word alignment only, no?
> >>
> >> Looking at the ARMv6 ARM ARM, I see mention of modulo-8 alignemnt
> >> checking (specifically for LDRD/STRD) when A=1, U=0. Unless I've
> >> misunder
> >>
> >> See A2.7.3 "Endian configuration and control" in ARM DDI 0100I. Table
> >> A2-6 and A2-8 both suggest that, with A2-8 saying that a Data Abort
> >> would result.
> >>
> >
> > You are right.
> >
> > I have added Heinrich to cc [again] - perhaps he knows whether u-boot
> > always adheres to this UEFI requirement?
> >

IMPORTANT NOTICE: The contents of this email and any attachments are confidential and may also be privileged. If you are not the intended recipient, please notify the sender immediately and do not disclose the contents to any other person, use it for any purpose, or store or copy the information in any medium. Thank you.




[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux