efi_loader: allow compiling with clang
authorHeinrich Schuchardt <xypron.glpk@gmx.de>
Tue, 26 May 2020 23:58:30 +0000 (01:58 +0200)
committerHeinrich Schuchardt <xypron.glpk@gmx.de>
Wed, 3 Jun 2020 15:19:17 +0000 (17:19 +0200)
On ARM systems gd is stored in register r9 or x18. When compiling with
clang gd is defined as a macro calling function gd_ptr(). So we can not
make assignments to gd.

In the UEFI sub-system we need to save gd when leaving to UEFI binaries and
have to restore gd when reentering U-Boot.

Define a new function set_gd() for setting gd and use it in the UEFI
sub-system.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
Tested-by: Tom Rini <trini@konsulko.com>
arch/arm/include/asm/global_data.h
lib/efi_loader/efi_boottime.c

index f23b6bf..7c0905d 100644 (file)
@@ -117,4 +117,13 @@ static inline gd_t *get_gd(void)
 #endif
 #endif
 
+static inline void set_gd(volatile gd_t *gd_ptr)
+{
+#ifdef CONFIG_ARM64
+       __asm__ volatile("ldr x18, %0\n" : : "m"(gd_ptr));
+#else
+       __asm__ volatile("ldr r9, %0\n" : : "m"(gd_ptr));
+#endif
+}
+
 #endif /* __ASM_GBL_DATA_H */
index db34938..1591ad8 100644 (file)
@@ -49,7 +49,7 @@ static efi_handle_t current_image;
  * restriction so we need to manually swap its and our view of that register on
  * EFI callback entry/exit.
  */
-static volatile void *efi_gd, *app_gd;
+static volatile gd_t *efi_gd, *app_gd;
 #endif
 
 /* 1 if inside U-Boot code, 0 if inside EFI payload code */
@@ -89,7 +89,7 @@ int __efi_entry_check(void)
 #ifdef CONFIG_ARM
        assert(efi_gd);
        app_gd = gd;
-       gd = efi_gd;
+       set_gd(efi_gd);
 #endif
        return ret;
 }
@@ -99,7 +99,7 @@ int __efi_exit_check(void)
 {
        int ret = --entry_count == 0;
 #ifdef CONFIG_ARM
-       gd = app_gd;
+       set_gd(app_gd);
 #endif
        return ret;
 }
@@ -123,7 +123,7 @@ void efi_restore_gd(void)
        /* Only restore if we're already in EFI context */
        if (!efi_gd)
                return;
-       gd = efi_gd;
+       set_gd(efi_gd);
 #endif
 }
 
@@ -2920,7 +2920,7 @@ efi_status_t EFIAPI efi_start_image(efi_handle_t image_handle,
                 * otherwise __efi_entry_check() will put the wrong value into
                 * app_gd.
                 */
-               gd = app_gd;
+               set_gd(app_gd);
 #endif
                /*
                 * To get ready to call EFI_EXIT below we have to execute the