[U-Boot] [PATCH 1/1] efi_loader: re-enable GRUB workaround on 32bit ARM

Heinrich Schuchardt xypron.glpk at gmx.de
Sun Jul 28 08:13:24 UTC 2019


On 7/27/19 11:58 AM, Alexander Graf wrote:
>
> On 27.07.19 10:02, Heinrich Schuchardt wrote:
>> GRUB on ARM 32bit prior to version 2.04 lacks proper handling of caches.
>> In U-Boot v2019.04 a workaround for this was inadvertently removed.
>>
>> The workaround is currently also needed for booting on systems with
>> caches
>> that cannot be managed via CP15 (e.g. with an i.MX6 CPU).
>>
>> Re-enable the workaround and make it customizable.
>>
>> Fixes: f69d63fae281 ("efi_loader: use efi_start_image() for bootefi")
>> Signed-off-by: Heinrich Schuchardt <xypron.glpk at gmx.de>
>> ---
>>   lib/efi_loader/Kconfig        |  8 ++++++++
>>   lib/efi_loader/efi_boottime.c | 28 +++++++++++++---------------
>>   2 files changed, 21 insertions(+), 15 deletions(-)
>>
>> diff --git a/lib/efi_loader/Kconfig b/lib/efi_loader/Kconfig
>> index a7f2c68fa9..c7027a9676 100644
>> --- a/lib/efi_loader/Kconfig
>> +++ b/lib/efi_loader/Kconfig
>> @@ -107,4 +107,12 @@ config EFI_HAVE_RUNTIME_RESET
>>       default y
>>       depends on ARCH_BCM283X || FSL_LAYERSCAPE || PSCI_RESET ||
>> SYSRESET_X86
>>
>> +config EFI_GRUB_ARM32_WORKAROUND
>> +    bool "Workaround for GRUB on 32bit ARM"
>> +    default y
>> +    depends on ARM && !ARM64
>> +    help
>> +      GRUB prior to version 2.04 requires U-Boot to disable caches. This
>> +      workaround currently is also needed on systems with caches that
>> +      cannot be managed via CP15.
>>   endif
>> diff --git a/lib/efi_loader/efi_boottime.c
>> b/lib/efi_loader/efi_boottime.c
>> index 4f6e8d1679..f75ca1a67c 100644
>> --- a/lib/efi_loader/efi_boottime.c
>> +++ b/lib/efi_loader/efi_boottime.c
>> @@ -39,14 +39,6 @@ LIST_HEAD(efi_register_notify_events);
>>   /* Handle of the currently executing image */
>>   static efi_handle_t current_image;
>>
>> -/*
>> - * If we're running on nasty systems (32bit ARM booting into non-EFI
>> Linux)
>> - * we need to do trickery with caches. Since we don't want to break
>> the EFI
>> - * aware boot path, only apply hacks when loading exiting directly
>> (breaking
>> - * direct Linux EFI booting along the way - oh well).
>> - */
>> -static bool efi_is_direct_boot = true;
>
>
> By removing the toggling, you now couple a U-Boot configuration variant
> to a specific grub version. New grub versions will run Linux using the
> EFI stub. So enabling CONFIG_EFI_GRUB_ARM32_WORKAROUND means only old
> versions work, but new grub versions break.

No, the Wandboard boots fine with GRUB 2.04 and Linux 4.19.55. Do you
have any negative test results?

>
> We really should treat this like any other erratum and make it as
> runtime detected as possible, so that we don't block people from making
> forward progress towards a the "sane" boot path.

It is not possible to determine at runtime which assumptions a loaded
EFI binary makes about the cache. Your original logic counting the
number of StartImage() invocations cannot detect this. This is why I
added a customizing option.

>
> Btw, has there been any solution for the non-CP15 caches? They would
> still be broken with this applied, as payloads can rely on CP15 caches
> enabled (for unaligned accesses), but non-CP15 caches disabled, right?

No, this will need future work. With CONFIG_EFI_GRUB_ARM32_WORKAROUND=y
all caches are disabled.

On i.MX6 CONFIG_SYS_L2CACHE_OFF=y selectively disables the non-CP15
cache. So here CONFIG_EFI_GRUB_ARM32_WORKAROUND=n and
CONFIG_SYS_L2CACHE_OFF=y result in compliance with the UEFI spec.

Best regards

Heinrich

>
>
> Thanks,
>
> Alex
>
>
>> -
>>   #ifdef CONFIG_ARM
>>   /*
>>    * The "gd" pointer lives in a register on ARM and AArch64 that we
>> declare
>> @@ -1911,13 +1903,21 @@ error:
>>    */
>>   static void efi_exit_caches(void)
>>   {
>> -#if defined(CONFIG_ARM) && !defined(CONFIG_ARM64)
>> +#if defined(CONFIG_EFI_GRUB_ARM32_WORKAROUND)
>>       /*
>> -     * Grub on 32bit ARM needs to have caches disabled before jumping
>> into
>> -     * a zImage, but does not know of all cache layers. Give it a hand.
>> +     * Boooting Linux via GRUB prior to version 2.04 fails on 32bit
>> ARM if
>> +     * caches are enabled.
>> +     *
>> +     * TODO:
>> +     * According to the UEFI spec caches that can be managed via CP15
>> +     * operations should be enabled. Caches requiring platform
>> information
>> +     * to manage should be disabled. This should not happen in
>> +     * ExitBootServices() but before invoking any UEFI binary is
>> invoked.
>> +     *
>> +     * We want to keep the current workaround while GRUB prior to
>> version
>> +     * 2.04 is still in use.
>>        */
>> -    if (efi_is_direct_boot)
>> -        cleanup_before_linux();
>> +    cleanup_before_linux();
>>   #endif
>>   }
>>
>> @@ -2893,8 +2893,6 @@ efi_status_t EFIAPI efi_start_image(efi_handle_t
>> image_handle,
>>       if (ret != EFI_SUCCESS)
>>           return EFI_EXIT(EFI_INVALID_PARAMETER);
>>
>> -    efi_is_direct_boot = false;
>> -
>>       image_obj->exit_data_size = exit_data_size;
>>       image_obj->exit_data = exit_data;
>>
>> --
>> 2.20.1
>>
>



More information about the U-Boot mailing list