Commit ddeeefe2 authored by Ard Biesheuvel's avatar Ard Biesheuvel Committed by Matt Fleming

arm64/efi: efistub: Apply __init annotation

This ensures all stub component are freed when the kernel proper is
done booting, by prefixing the names of all ELF sections that have
the SHF_ALLOC attribute with ".init". This approach ensures that even
implicitly emitted allocated data (like initializer values and string
literals) are covered.

At the same time, remove some __init annotations in the stub that have
now become redundant, and add the __init annotation to handle_kernel_image
which will now trigger a section mismatch warning without it.
Signed-off-by: default avatarArd Biesheuvel <ard.biesheuvel@linaro.org>
Signed-off-by: default avatarMatt Fleming <matt.fleming@intel.com>
parent 2859dff9
...@@ -13,13 +13,13 @@ ...@@ -13,13 +13,13 @@
#include <asm/efi.h> #include <asm/efi.h>
#include <asm/sections.h> #include <asm/sections.h>
efi_status_t handle_kernel_image(efi_system_table_t *sys_table, efi_status_t __init handle_kernel_image(efi_system_table_t *sys_table,
unsigned long *image_addr, unsigned long *image_addr,
unsigned long *image_size, unsigned long *image_size,
unsigned long *reserve_addr, unsigned long *reserve_addr,
unsigned long *reserve_size, unsigned long *reserve_size,
unsigned long dram_base, unsigned long dram_base,
efi_loaded_image_t *image) efi_loaded_image_t *image)
{ {
efi_status_t status; efi_status_t status;
unsigned long kernel_size, kernel_memsize = 0; unsigned long kernel_size, kernel_memsize = 0;
......
...@@ -24,3 +24,17 @@ lib-y := efi-stub-helper.o ...@@ -24,3 +24,17 @@ lib-y := efi-stub-helper.o
lib-$(CONFIG_EFI_ARMSTUB) += arm-stub.o fdt.o lib-$(CONFIG_EFI_ARMSTUB) += arm-stub.o fdt.o
CFLAGS_fdt.o += -I$(srctree)/scripts/dtc/libfdt/ CFLAGS_fdt.o += -I$(srctree)/scripts/dtc/libfdt/
#
# arm64 puts the stub in the kernel proper, which will unnecessarily retain all
# code indefinitely unless it is annotated as __init/__initdata/__initconst etc.
# So let's apply the __init annotations at the section level, by prefixing
# the section names directly. This will ensure that even all the inline string
# literals are covered.
#
extra-$(CONFIG_ARM64) := $(lib-y)
lib-$(CONFIG_ARM64) := $(patsubst %.o,%.init.o,$(lib-y))
OBJCOPYFLAGS := --prefix-alloc-sections=.init
$(obj)/%.init.o: $(obj)/%.o FORCE
$(call if_changed,objcopy)
...@@ -17,10 +17,10 @@ ...@@ -17,10 +17,10 @@
#include "efistub.h" #include "efistub.h"
static int __init efi_secureboot_enabled(efi_system_table_t *sys_table_arg) static int efi_secureboot_enabled(efi_system_table_t *sys_table_arg)
{ {
static efi_guid_t const var_guid __initconst = EFI_GLOBAL_VARIABLE_GUID; static efi_guid_t const var_guid = EFI_GLOBAL_VARIABLE_GUID;
static efi_char16_t const var_name[] __initconst = { static efi_char16_t const var_name[] = {
'S', 'e', 'c', 'u', 'r', 'e', 'B', 'o', 'o', 't', 0 }; 'S', 'e', 'c', 'u', 'r', 'e', 'B', 'o', 'o', 't', 0 };
efi_get_variable_t *f_getvar = sys_table_arg->runtime->get_variable; efi_get_variable_t *f_getvar = sys_table_arg->runtime->get_variable;
...@@ -164,7 +164,7 @@ efi_status_t handle_kernel_image(efi_system_table_t *sys_table, ...@@ -164,7 +164,7 @@ efi_status_t handle_kernel_image(efi_system_table_t *sys_table,
* for both archictectures, with the arch-specific code provided in the * for both archictectures, with the arch-specific code provided in the
* handle_kernel_image() function. * handle_kernel_image() function.
*/ */
unsigned long __init efi_entry(void *handle, efi_system_table_t *sys_table, unsigned long efi_entry(void *handle, efi_system_table_t *sys_table,
unsigned long *image_addr) unsigned long *image_addr)
{ {
efi_loaded_image_t *image; efi_loaded_image_t *image;
......
...@@ -101,7 +101,7 @@ efi_status_t efi_get_memory_map(efi_system_table_t *sys_table_arg, ...@@ -101,7 +101,7 @@ efi_status_t efi_get_memory_map(efi_system_table_t *sys_table_arg,
} }
unsigned long __init get_dram_base(efi_system_table_t *sys_table_arg) unsigned long get_dram_base(efi_system_table_t *sys_table_arg)
{ {
efi_status_t status; efi_status_t status;
unsigned long map_size; unsigned long map_size;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment