]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
efi/x86: libstub: Make DXE calls mixed mode safe
authorArd Biesheuvel <ardb@kernel.org>
Fri, 20 May 2022 10:07:58 +0000 (12:07 +0200)
committerArd Biesheuvel <ardb@kernel.org>
Wed, 1 Jun 2022 12:08:12 +0000 (14:08 +0200)
The newly added DXE calls use 64-bit quantities, which means we need to
marshall them explicitly when running in mixed mode. Currently, we get
away without it because we just bail when GetMemorySpaceDescriptor()
fails, which is guaranteed to happen due to the function argument mixup.

Let's fix this properly, though, by defining the macros that describe
how to marshall the arguments. While at it, drop an incorrect cast on a
status variable.

Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
arch/x86/include/asm/efi.h
drivers/firmware/efi/libstub/x86-stub.c

index bed74a0f2932dfdba626b239baddfbd07d06494f..71943dce691ed72ce4839adf9fb3b0a51cc0525d 100644 (file)
@@ -270,6 +270,8 @@ static inline u32 efi64_convert_status(efi_status_t status)
        return (u32)(status | (u64)status >> 32);
 }
 
+#define __efi64_split(val)             (val) & U32_MAX, (u64)(val) >> 32
+
 #define __efi64_argmap_free_pages(addr, size)                          \
        ((addr), 0, (size))
 
@@ -317,6 +319,13 @@ static inline u32 efi64_convert_status(efi_status_t status)
 #define __efi64_argmap_hash_log_extend_event(prot, fl, addr, size, ev) \
        ((prot), (fl), 0ULL, (u64)(addr), 0ULL, (u64)(size), 0ULL, ev)
 
+/* DXE services */
+#define __efi64_argmap_get_memory_space_descriptor(phys, desc) \
+       (__efi64_split(phys), (desc))
+
+#define __efi64_argmap_set_memory_space_descriptor(phys, size, flags) \
+       (__efi64_split(phys), __efi64_split(size), __efi64_split(flags))
+
 /*
  * The macros below handle the plumbing for the argument mapping. To add a
  * mapping for a specific EFI method, simply define a macro
index b14e88ccefcab5cedeca8ad5d1ce68be98e7d4b0..05ae8bcc9d671e46bb350d0193c866c54f22bb3d 100644 (file)
@@ -260,10 +260,10 @@ adjust_memory_range_protection(unsigned long start, unsigned long size)
                                      EFI_MEMORY_WB);
 
                if (status != EFI_SUCCESS) {
-                       efi_warn("Unable to unprotect memory range [%08lx,%08lx]: %d\n",
+                       efi_warn("Unable to unprotect memory range [%08lx,%08lx]: %lx\n",
                                 unprotect_start,
                                 unprotect_start + unprotect_size,
-                                (int)status);
+                                status);
                }
        }
 }