efi/x86: Move 32-bit code into efi_32.c
authorArd Biesheuvel <ardb@kernel.org>
Thu, 13 Aug 2020 17:38:17 +0000 (19:38 +0200)
committerArd Biesheuvel <ardb@kernel.org>
Thu, 20 Aug 2020 09:18:36 +0000 (11:18 +0200)
Now that the old memmap code has been removed, some code that was left
behind in arch/x86/platform/efi/efi.c is only used for 32-bit builds,
which means it can live in efi_32.c as well. So move it over.

Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
arch/x86/include/asm/efi.h
arch/x86/platform/efi/efi.c
arch/x86/platform/efi/efi_32.c

index b9c2667..bc9758e 100644 (file)
@@ -81,11 +81,8 @@ extern unsigned long efi_fw_vendor, efi_config_table;
        kernel_fpu_end();                                               \
 })
 
-
 #define arch_efi_call_virt(p, f, args...)      p->f(args)
 
-#define efi_ioremap(addr, size, type, attr)    ioremap_cache(addr, size)
-
 #else /* !CONFIG_X86_32 */
 
 #define EFI_LOADER_SIGNATURE   "EL64"
@@ -125,9 +122,6 @@ struct efi_scratch {
        kernel_fpu_end();                                               \
 })
 
-extern void __iomem *__init efi_ioremap(unsigned long addr, unsigned long size,
-                                       u32 type, u64 attribute);
-
 #ifdef CONFIG_KASAN
 /*
  * CONFIG_KASAN may redefine memset to __memset.  __memset function is present
@@ -143,17 +137,13 @@ extern void __iomem *__init efi_ioremap(unsigned long addr, unsigned long size,
 #endif /* CONFIG_X86_32 */
 
 extern struct efi_scratch efi_scratch;
-extern void __init efi_set_executable(efi_memory_desc_t *md, bool executable);
 extern int __init efi_memblock_x86_reserve_range(void);
 extern void __init efi_print_memmap(void);
-extern void __init efi_memory_uc(u64 addr, unsigned long size);
 extern void __init efi_map_region(efi_memory_desc_t *md);
 extern void __init efi_map_region_fixed(efi_memory_desc_t *md);
 extern void efi_sync_low_kernel_mappings(void);
 extern int __init efi_alloc_page_tables(void);
 extern int __init efi_setup_page_tables(unsigned long pa_memmap, unsigned num_pages);
-extern void __init old_map_region(efi_memory_desc_t *md);
-extern void __init runtime_code_page_mkexec(void);
 extern void __init efi_runtime_update_mappings(void);
 extern void __init efi_dump_pagetable(void);
 extern void __init efi_apply_memmap_quirks(void);
index f6ea8f1..d37ebe6 100644 (file)
@@ -49,7 +49,6 @@
 #include <asm/efi.h>
 #include <asm/e820/api.h>
 #include <asm/time.h>
-#include <asm/set_memory.h>
 #include <asm/tlbflush.h>
 #include <asm/x86_init.h>
 #include <asm/uv/uv.h>
@@ -496,74 +495,6 @@ void __init efi_init(void)
                efi_print_memmap();
 }
 
-#if defined(CONFIG_X86_32)
-
-void __init efi_set_executable(efi_memory_desc_t *md, bool executable)
-{
-       u64 addr, npages;
-
-       addr = md->virt_addr;
-       npages = md->num_pages;
-
-       memrange_efi_to_native(&addr, &npages);
-
-       if (executable)
-               set_memory_x(addr, npages);
-       else
-               set_memory_nx(addr, npages);
-}
-
-void __init runtime_code_page_mkexec(void)
-{
-       efi_memory_desc_t *md;
-
-       /* Make EFI runtime service code area executable */
-       for_each_efi_memory_desc(md) {
-               if (md->type != EFI_RUNTIME_SERVICES_CODE)
-                       continue;
-
-               efi_set_executable(md, true);
-       }
-}
-
-void __init efi_memory_uc(u64 addr, unsigned long size)
-{
-       unsigned long page_shift = 1UL << EFI_PAGE_SHIFT;
-       u64 npages;
-
-       npages = round_up(size, page_shift) / page_shift;
-       memrange_efi_to_native(&addr, &npages);
-       set_memory_uc(addr, npages);
-}
-
-void __init old_map_region(efi_memory_desc_t *md)
-{
-       u64 start_pfn, end_pfn, end;
-       unsigned long size;
-       void *va;
-
-       start_pfn = PFN_DOWN(md->phys_addr);
-       size      = md->num_pages << PAGE_SHIFT;
-       end       = md->phys_addr + size;
-       end_pfn   = PFN_UP(end);
-
-       if (pfn_range_is_mapped(start_pfn, end_pfn)) {
-               va = __va(md->phys_addr);
-
-               if (!(md->attribute & EFI_MEMORY_WB))
-                       efi_memory_uc((u64)(unsigned long)va, size);
-       } else
-               va = efi_ioremap(md->phys_addr, size,
-                                md->type, md->attribute);
-
-       md->virt_addr = (u64) (unsigned long) va;
-       if (!va)
-               pr_err("ioremap of 0x%llX failed!\n",
-                      (unsigned long long)md->phys_addr);
-}
-
-#endif
-
 /* Merge contiguous regions of the same type and attribute */
 static void __init efi_merge_regions(void)
 {
index 826ead6..e06a199 100644 (file)
 #include <asm/io.h>
 #include <asm/desc.h>
 #include <asm/page.h>
+#include <asm/set_memory.h>
 #include <asm/tlbflush.h>
 #include <asm/efi.h>
 
+void __init efi_map_region(efi_memory_desc_t *md)
+{
+       u64 start_pfn, end_pfn, end;
+       unsigned long size;
+       void *va;
+
+       start_pfn       = PFN_DOWN(md->phys_addr);
+       size            = md->num_pages << PAGE_SHIFT;
+       end             = md->phys_addr + size;
+       end_pfn         = PFN_UP(end);
+
+       if (pfn_range_is_mapped(start_pfn, end_pfn)) {
+               va = __va(md->phys_addr);
+
+               if (!(md->attribute & EFI_MEMORY_WB))
+                       set_memory_uc((unsigned long)va, md->num_pages);
+       } else {
+               va = ioremap_cache(md->phys_addr, size);
+       }
+
+       md->virt_addr = (unsigned long)va;
+       if (!va)
+               pr_err("ioremap of 0x%llX failed!\n", md->phys_addr);
+}
+
 /*
  * To make EFI call EFI runtime service in physical addressing mode we need
  * prolog/epilog before/after the invocation to claim the EFI runtime service
@@ -58,11 +84,6 @@ int __init efi_setup_page_tables(unsigned long pa_memmap, unsigned num_pages)
        return 0;
 }
 
-void __init efi_map_region(efi_memory_desc_t *md)
-{
-       old_map_region(md);
-}
-
 void __init efi_map_region_fixed(efi_memory_desc_t *md) {}
 void __init parse_efi_setup(u64 phys_addr, u32 data_len) {}
 
@@ -107,6 +128,15 @@ efi_status_t __init efi_set_virtual_address_map(unsigned long memory_map_size,
 
 void __init efi_runtime_update_mappings(void)
 {
-       if (__supported_pte_mask & _PAGE_NX)
-               runtime_code_page_mkexec();
+       if (__supported_pte_mask & _PAGE_NX) {
+               efi_memory_desc_t *md;
+
+               /* Make EFI runtime service code area executable */
+               for_each_efi_memory_desc(md) {
+                       if (md->type != EFI_RUNTIME_SERVICES_CODE)
+                               continue;
+
+                       set_memory_x(md->virt_addr, md->num_pages);
+               }
+       }
 }