mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-17 18:36:00 +00:00
efi/x86: Move 32-bit code into efi_32.c
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>
This commit is contained in:
parent
8a8a3237a7
commit
39ada88f9c
@ -81,11 +81,8 @@ extern unsigned long efi_fw_vendor, efi_config_table;
|
|||||||
kernel_fpu_end(); \
|
kernel_fpu_end(); \
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
#define arch_efi_call_virt(p, f, args...) p->f(args)
|
#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 */
|
#else /* !CONFIG_X86_32 */
|
||||||
|
|
||||||
#define EFI_LOADER_SIGNATURE "EL64"
|
#define EFI_LOADER_SIGNATURE "EL64"
|
||||||
@ -125,9 +122,6 @@ struct efi_scratch {
|
|||||||
kernel_fpu_end(); \
|
kernel_fpu_end(); \
|
||||||
})
|
})
|
||||||
|
|
||||||
extern void __iomem *__init efi_ioremap(unsigned long addr, unsigned long size,
|
|
||||||
u32 type, u64 attribute);
|
|
||||||
|
|
||||||
#ifdef CONFIG_KASAN
|
#ifdef CONFIG_KASAN
|
||||||
/*
|
/*
|
||||||
* CONFIG_KASAN may redefine memset to __memset. __memset function is present
|
* 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 */
|
#endif /* CONFIG_X86_32 */
|
||||||
|
|
||||||
extern struct efi_scratch efi_scratch;
|
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 int __init efi_memblock_x86_reserve_range(void);
|
||||||
extern void __init efi_print_memmap(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(efi_memory_desc_t *md);
|
||||||
extern void __init efi_map_region_fixed(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 void efi_sync_low_kernel_mappings(void);
|
||||||
extern int __init efi_alloc_page_tables(void);
|
extern int __init efi_alloc_page_tables(void);
|
||||||
extern int __init efi_setup_page_tables(unsigned long pa_memmap, unsigned num_pages);
|
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_runtime_update_mappings(void);
|
||||||
extern void __init efi_dump_pagetable(void);
|
extern void __init efi_dump_pagetable(void);
|
||||||
extern void __init efi_apply_memmap_quirks(void);
|
extern void __init efi_apply_memmap_quirks(void);
|
||||||
|
@ -49,7 +49,6 @@
|
|||||||
#include <asm/efi.h>
|
#include <asm/efi.h>
|
||||||
#include <asm/e820/api.h>
|
#include <asm/e820/api.h>
|
||||||
#include <asm/time.h>
|
#include <asm/time.h>
|
||||||
#include <asm/set_memory.h>
|
|
||||||
#include <asm/tlbflush.h>
|
#include <asm/tlbflush.h>
|
||||||
#include <asm/x86_init.h>
|
#include <asm/x86_init.h>
|
||||||
#include <asm/uv/uv.h>
|
#include <asm/uv/uv.h>
|
||||||
@ -496,74 +495,6 @@ void __init efi_init(void)
|
|||||||
efi_print_memmap();
|
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 */
|
/* Merge contiguous regions of the same type and attribute */
|
||||||
static void __init efi_merge_regions(void)
|
static void __init efi_merge_regions(void)
|
||||||
{
|
{
|
||||||
|
@ -29,9 +29,35 @@
|
|||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
#include <asm/desc.h>
|
#include <asm/desc.h>
|
||||||
#include <asm/page.h>
|
#include <asm/page.h>
|
||||||
|
#include <asm/set_memory.h>
|
||||||
#include <asm/tlbflush.h>
|
#include <asm/tlbflush.h>
|
||||||
#include <asm/efi.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
|
* 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
|
* 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;
|
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 efi_map_region_fixed(efi_memory_desc_t *md) {}
|
||||||
void __init parse_efi_setup(u64 phys_addr, u32 data_len) {}
|
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)
|
void __init efi_runtime_update_mappings(void)
|
||||||
{
|
{
|
||||||
if (__supported_pte_mask & _PAGE_NX)
|
if (__supported_pte_mask & _PAGE_NX) {
|
||||||
runtime_code_page_mkexec();
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user