mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-23 15:11:16 +00:00
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>
This commit is contained in:
parent
2859dff97e
commit
ddeeefe2df
4 changed files with 26 additions and 12 deletions
|
@ -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
|
||||||
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 @@
|
||||||
|
|
||||||
#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,
|
||||||
* 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 @@ fail:
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
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;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue