aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/firmware
diff options
context:
space:
mode:
authorArd Biesheuvel <ard.biesheuvel@linaro.org>2015-01-12 15:28:20 -0500
committerMatt Fleming <matt.fleming@intel.com>2015-01-15 16:28:35 -0500
commitddeeefe2dfbe1fa6b116b9362b1bec465b64c873 (patch)
treea79ebafc3c5ac24fabb034b60915fe46d57d3082 /drivers/firmware
parent2859dff97e54db4795b8b7d9606cb8efcec722ff (diff)
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: Ard Biesheuvel <ard.biesheuvel@linaro.org> Signed-off-by: Matt Fleming <matt.fleming@intel.com>
Diffstat (limited to 'drivers/firmware')
-rw-r--r--drivers/firmware/efi/libstub/Makefile14
-rw-r--r--drivers/firmware/efi/libstub/arm-stub.c8
-rw-r--r--drivers/firmware/efi/libstub/efi-stub-helper.c2
3 files changed, 19 insertions, 5 deletions
diff --git a/drivers/firmware/efi/libstub/Makefile b/drivers/firmware/efi/libstub/Makefile
index b14bc2b9fb4d..8902f52e0998 100644
--- a/drivers/firmware/efi/libstub/Makefile
+++ b/drivers/firmware/efi/libstub/Makefile
@@ -24,3 +24,17 @@ lib-y := efi-stub-helper.o
24lib-$(CONFIG_EFI_ARMSTUB) += arm-stub.o fdt.o 24lib-$(CONFIG_EFI_ARMSTUB) += arm-stub.o fdt.o
25 25
26CFLAGS_fdt.o += -I$(srctree)/scripts/dtc/libfdt/ 26CFLAGS_fdt.o += -I$(srctree)/scripts/dtc/libfdt/
27
28#
29# arm64 puts the stub in the kernel proper, which will unnecessarily retain all
30# code indefinitely unless it is annotated as __init/__initdata/__initconst etc.
31# So let's apply the __init annotations at the section level, by prefixing
32# the section names directly. This will ensure that even all the inline string
33# literals are covered.
34#
35extra-$(CONFIG_ARM64) := $(lib-y)
36lib-$(CONFIG_ARM64) := $(patsubst %.o,%.init.o,$(lib-y))
37
38OBJCOPYFLAGS := --prefix-alloc-sections=.init
39$(obj)/%.init.o: $(obj)/%.o FORCE
40 $(call if_changed,objcopy)
diff --git a/drivers/firmware/efi/libstub/arm-stub.c b/drivers/firmware/efi/libstub/arm-stub.c
index 75ee05964cbc..a1fda71c425a 100644
--- a/drivers/firmware/efi/libstub/arm-stub.c
+++ b/drivers/firmware/efi/libstub/arm-stub.c
@@ -17,10 +17,10 @@
17 17
18#include "efistub.h" 18#include "efistub.h"
19 19
20static int __init efi_secureboot_enabled(efi_system_table_t *sys_table_arg) 20static int efi_secureboot_enabled(efi_system_table_t *sys_table_arg)
21{ 21{
22 static efi_guid_t const var_guid __initconst = EFI_GLOBAL_VARIABLE_GUID; 22 static efi_guid_t const var_guid = EFI_GLOBAL_VARIABLE_GUID;
23 static efi_char16_t const var_name[] __initconst = { 23 static efi_char16_t const var_name[] = {
24 'S', 'e', 'c', 'u', 'r', 'e', 'B', 'o', 'o', 't', 0 }; 24 'S', 'e', 'c', 'u', 'r', 'e', 'B', 'o', 'o', 't', 0 };
25 25
26 efi_get_variable_t *f_getvar = sys_table_arg->runtime->get_variable; 26 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 * for both archictectures, with the arch-specific code provided in the 164 * for both archictectures, with the arch-specific code provided in the
165 * handle_kernel_image() function. 165 * handle_kernel_image() function.
166 */ 166 */
167unsigned long __init efi_entry(void *handle, efi_system_table_t *sys_table, 167unsigned long efi_entry(void *handle, efi_system_table_t *sys_table,
168 unsigned long *image_addr) 168 unsigned long *image_addr)
169{ 169{
170 efi_loaded_image_t *image; 170 efi_loaded_image_t *image;
diff --git a/drivers/firmware/efi/libstub/efi-stub-helper.c b/drivers/firmware/efi/libstub/efi-stub-helper.c
index a920fec8fe88..9bd9fbb5bea8 100644
--- a/drivers/firmware/efi/libstub/efi-stub-helper.c
+++ b/drivers/firmware/efi/libstub/efi-stub-helper.c
@@ -101,7 +101,7 @@ fail:
101} 101}
102 102
103 103
104unsigned long __init get_dram_base(efi_system_table_t *sys_table_arg) 104unsigned long get_dram_base(efi_system_table_t *sys_table_arg)
105{ 105{
106 efi_status_t status; 106 efi_status_t status;
107 unsigned long map_size; 107 unsigned long map_size;