Loading Documentation/arm/uefi.rst +0 −4 Original line number Diff line number Diff line Loading @@ -65,10 +65,6 @@ linux,uefi-mmap-desc-size 32-bit Size in bytes of each entry in the UEFI linux,uefi-mmap-desc-ver 32-bit Version of the mmap descriptor format. linux,initrd-start 64-bit Physical start address of an initrd linux,initrd-end 64-bit Physical end address of an initrd kaslr-seed 64-bit Entropy used to randomize the kernel image base address location. ========================== ====== =========================================== arch/arm/include/asm/efi.h +2 −1 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ #ifdef CONFIG_EFI void efi_init(void); void arm_efi_init(void); int efi_create_mapping(struct mm_struct *mm, efi_memory_desc_t *md); int efi_set_mapping_permissions(struct mm_struct *mm, efi_memory_desc_t *md); Loading @@ -37,7 +38,7 @@ void efi_virtmap_load(void); void efi_virtmap_unload(void); #else #define efi_init() #define arm_efi_init() #endif /* CONFIG_EFI */ /* arch specific definitions used by the stub code */ Loading arch/arm/kernel/efi.c +79 −0 Original line number Diff line number Diff line Loading @@ -4,6 +4,7 @@ */ #include <linux/efi.h> #include <linux/memblock.h> #include <asm/efi.h> #include <asm/mach/map.h> #include <asm/mmu_context.h> Loading Loading @@ -73,3 +74,81 @@ int __init efi_create_mapping(struct mm_struct *mm, efi_memory_desc_t *md) return efi_set_mapping_permissions(mm, md); return 0; } static unsigned long __initdata screen_info_table = EFI_INVALID_TABLE_ADDR; static unsigned long __initdata cpu_state_table = EFI_INVALID_TABLE_ADDR; const efi_config_table_type_t efi_arch_tables[] __initconst = { {LINUX_EFI_ARM_SCREEN_INFO_TABLE_GUID, &screen_info_table}, {LINUX_EFI_ARM_CPU_STATE_TABLE_GUID, &cpu_state_table}, {} }; static void __init load_screen_info_table(void) { struct screen_info *si; if (screen_info_table != EFI_INVALID_TABLE_ADDR) { si = early_memremap_ro(screen_info_table, sizeof(*si)); if (!si) { pr_err("Could not map screen_info config table\n"); return; } screen_info = *si; early_memunmap(si, sizeof(*si)); /* dummycon on ARM needs non-zero values for columns/lines */ screen_info.orig_video_cols = 80; screen_info.orig_video_lines = 25; if (memblock_is_map_memory(screen_info.lfb_base)) memblock_mark_nomap(screen_info.lfb_base, screen_info.lfb_size); } } static void __init load_cpu_state_table(void) { if (cpu_state_table != EFI_INVALID_TABLE_ADDR) { struct efi_arm_entry_state *state; bool dump_state = true; state = early_memremap_ro(cpu_state_table, sizeof(struct efi_arm_entry_state)); if (state == NULL) { pr_warn("Unable to map CPU entry state table.\n"); return; } if ((state->sctlr_before_ebs & 1) == 0) pr_warn(FW_BUG "EFI stub was entered with MMU and Dcache disabled, please fix your firmware!\n"); else if ((state->sctlr_after_ebs & 1) == 0) pr_warn(FW_BUG "ExitBootServices() returned with MMU and Dcache disabled, please fix your firmware!\n"); else dump_state = false; if (dump_state || efi_enabled(EFI_DBG)) { pr_info("CPSR at EFI stub entry : 0x%08x\n", state->cpsr_before_ebs); pr_info("SCTLR at EFI stub entry : 0x%08x\n", state->sctlr_before_ebs); pr_info("CPSR after ExitBootServices() : 0x%08x\n", state->cpsr_after_ebs); pr_info("SCTLR after ExitBootServices(): 0x%08x\n", state->sctlr_after_ebs); } early_memunmap(state, sizeof(struct efi_arm_entry_state)); } } void __init arm_efi_init(void) { efi_init(); load_screen_info_table(); /* ARM does not permit early mappings to persist across paging_init() */ efi_memmap_unmap(); load_cpu_state_table(); } arch/arm/kernel/setup.c +1 −1 Original line number Diff line number Diff line Loading @@ -1141,7 +1141,7 @@ void __init setup_arch(char **cmdline_p) #endif setup_dma_zone(mdesc); xen_early_init(); efi_init(); arm_efi_init(); /* * Make sure the calculation for lowmem/highmem is set appropriately * before reserving/allocating any memory Loading arch/arm64/Makefile +7 −2 Original line number Diff line number Diff line Loading @@ -151,12 +151,17 @@ libs-$(CONFIG_EFI_STUB) += $(objtree)/drivers/firmware/efi/libstub/lib.a # Default target when executing plain make boot := arch/arm64/boot ifeq ($(CONFIG_EFI_ZBOOT),) KBUILD_IMAGE := $(boot)/Image.gz else KBUILD_IMAGE := $(boot)/vmlinuz.efi endif all: Image.gz all: $(notdir $(KBUILD_IMAGE)) Image: vmlinux Image vmlinuz.efi: vmlinux $(Q)$(MAKE) $(build)=$(boot) $(boot)/$@ Image.%: Image Loading Loading
Documentation/arm/uefi.rst +0 −4 Original line number Diff line number Diff line Loading @@ -65,10 +65,6 @@ linux,uefi-mmap-desc-size 32-bit Size in bytes of each entry in the UEFI linux,uefi-mmap-desc-ver 32-bit Version of the mmap descriptor format. linux,initrd-start 64-bit Physical start address of an initrd linux,initrd-end 64-bit Physical end address of an initrd kaslr-seed 64-bit Entropy used to randomize the kernel image base address location. ========================== ====== ===========================================
arch/arm/include/asm/efi.h +2 −1 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ #ifdef CONFIG_EFI void efi_init(void); void arm_efi_init(void); int efi_create_mapping(struct mm_struct *mm, efi_memory_desc_t *md); int efi_set_mapping_permissions(struct mm_struct *mm, efi_memory_desc_t *md); Loading @@ -37,7 +38,7 @@ void efi_virtmap_load(void); void efi_virtmap_unload(void); #else #define efi_init() #define arm_efi_init() #endif /* CONFIG_EFI */ /* arch specific definitions used by the stub code */ Loading
arch/arm/kernel/efi.c +79 −0 Original line number Diff line number Diff line Loading @@ -4,6 +4,7 @@ */ #include <linux/efi.h> #include <linux/memblock.h> #include <asm/efi.h> #include <asm/mach/map.h> #include <asm/mmu_context.h> Loading Loading @@ -73,3 +74,81 @@ int __init efi_create_mapping(struct mm_struct *mm, efi_memory_desc_t *md) return efi_set_mapping_permissions(mm, md); return 0; } static unsigned long __initdata screen_info_table = EFI_INVALID_TABLE_ADDR; static unsigned long __initdata cpu_state_table = EFI_INVALID_TABLE_ADDR; const efi_config_table_type_t efi_arch_tables[] __initconst = { {LINUX_EFI_ARM_SCREEN_INFO_TABLE_GUID, &screen_info_table}, {LINUX_EFI_ARM_CPU_STATE_TABLE_GUID, &cpu_state_table}, {} }; static void __init load_screen_info_table(void) { struct screen_info *si; if (screen_info_table != EFI_INVALID_TABLE_ADDR) { si = early_memremap_ro(screen_info_table, sizeof(*si)); if (!si) { pr_err("Could not map screen_info config table\n"); return; } screen_info = *si; early_memunmap(si, sizeof(*si)); /* dummycon on ARM needs non-zero values for columns/lines */ screen_info.orig_video_cols = 80; screen_info.orig_video_lines = 25; if (memblock_is_map_memory(screen_info.lfb_base)) memblock_mark_nomap(screen_info.lfb_base, screen_info.lfb_size); } } static void __init load_cpu_state_table(void) { if (cpu_state_table != EFI_INVALID_TABLE_ADDR) { struct efi_arm_entry_state *state; bool dump_state = true; state = early_memremap_ro(cpu_state_table, sizeof(struct efi_arm_entry_state)); if (state == NULL) { pr_warn("Unable to map CPU entry state table.\n"); return; } if ((state->sctlr_before_ebs & 1) == 0) pr_warn(FW_BUG "EFI stub was entered with MMU and Dcache disabled, please fix your firmware!\n"); else if ((state->sctlr_after_ebs & 1) == 0) pr_warn(FW_BUG "ExitBootServices() returned with MMU and Dcache disabled, please fix your firmware!\n"); else dump_state = false; if (dump_state || efi_enabled(EFI_DBG)) { pr_info("CPSR at EFI stub entry : 0x%08x\n", state->cpsr_before_ebs); pr_info("SCTLR at EFI stub entry : 0x%08x\n", state->sctlr_before_ebs); pr_info("CPSR after ExitBootServices() : 0x%08x\n", state->cpsr_after_ebs); pr_info("SCTLR after ExitBootServices(): 0x%08x\n", state->sctlr_after_ebs); } early_memunmap(state, sizeof(struct efi_arm_entry_state)); } } void __init arm_efi_init(void) { efi_init(); load_screen_info_table(); /* ARM does not permit early mappings to persist across paging_init() */ efi_memmap_unmap(); load_cpu_state_table(); }
arch/arm/kernel/setup.c +1 −1 Original line number Diff line number Diff line Loading @@ -1141,7 +1141,7 @@ void __init setup_arch(char **cmdline_p) #endif setup_dma_zone(mdesc); xen_early_init(); efi_init(); arm_efi_init(); /* * Make sure the calculation for lowmem/highmem is set appropriately * before reserving/allocating any memory Loading
arch/arm64/Makefile +7 −2 Original line number Diff line number Diff line Loading @@ -151,12 +151,17 @@ libs-$(CONFIG_EFI_STUB) += $(objtree)/drivers/firmware/efi/libstub/lib.a # Default target when executing plain make boot := arch/arm64/boot ifeq ($(CONFIG_EFI_ZBOOT),) KBUILD_IMAGE := $(boot)/Image.gz else KBUILD_IMAGE := $(boot)/vmlinuz.efi endif all: Image.gz all: $(notdir $(KBUILD_IMAGE)) Image: vmlinux Image vmlinuz.efi: vmlinux $(Q)$(MAKE) $(build)=$(boot) $(boot)/$@ Image.%: Image Loading