Эх сурвалжийг харах

efi: efistub: Convert into static library

This patch changes both x86 and arm64 efistub implementations
from #including shared .c files under drivers/firmware/efi to
building shared code as a static library.

The x86 code uses a stub built into the boot executable which
uncompresses the kernel at boot time. In this case, the library is
linked into the decompressor.

In the arm64 case, the stub is part of the kernel proper so the library
is linked into the kernel proper as well.

Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Signed-off-by: Matt Fleming <matt.fleming@intel.com>
Ard Biesheuvel 11 жил өмнө
parent
commit
f4f75ad574

+ 5 - 0
arch/arm64/Kconfig

@@ -292,6 +292,9 @@ config CMDLINE_FORCE
 	  This is useful if you cannot or don't want to change the
 	  This is useful if you cannot or don't want to change the
 	  command-line options your boot loader passes to the kernel.
 	  command-line options your boot loader passes to the kernel.
 
 
+config EFI_STUB
+	bool
+
 config EFI
 config EFI
 	bool "UEFI runtime support"
 	bool "UEFI runtime support"
 	depends on OF && !CPU_BIG_ENDIAN
 	depends on OF && !CPU_BIG_ENDIAN
@@ -299,6 +302,8 @@ config EFI
 	select UCS2_STRING
 	select UCS2_STRING
 	select EFI_PARAMS_FROM_FDT
 	select EFI_PARAMS_FROM_FDT
 	select EFI_RUNTIME_WRAPPERS
 	select EFI_RUNTIME_WRAPPERS
+	select EFI_STUB
+	select EFI_ARMSTUB
 	default y
 	default y
 	help
 	help
 	  This option provides support for runtime services provided
 	  This option provides support for runtime services provided

+ 1 - 0
arch/arm64/Makefile

@@ -48,6 +48,7 @@ core-$(CONFIG_XEN) += arch/arm64/xen/
 core-$(CONFIG_CRYPTO) += arch/arm64/crypto/
 core-$(CONFIG_CRYPTO) += arch/arm64/crypto/
 libs-y		:= arch/arm64/lib/ $(libs-y)
 libs-y		:= arch/arm64/lib/ $(libs-y)
 libs-y		+= $(LIBGCC)
 libs-y		+= $(LIBGCC)
+libs-$(CONFIG_EFI_STUB) += drivers/firmware/efi/libstub/
 
 
 # Default target when executing plain make
 # Default target when executing plain make
 KBUILD_IMAGE	:= Image.gz
 KBUILD_IMAGE	:= Image.gz

+ 1 - 2
arch/arm64/kernel/Makefile

@@ -4,8 +4,7 @@
 
 
 CPPFLAGS_vmlinux.lds	:= -DTEXT_OFFSET=$(TEXT_OFFSET)
 CPPFLAGS_vmlinux.lds	:= -DTEXT_OFFSET=$(TEXT_OFFSET)
 AFLAGS_head.o		:= -DTEXT_OFFSET=$(TEXT_OFFSET)
 AFLAGS_head.o		:= -DTEXT_OFFSET=$(TEXT_OFFSET)
-CFLAGS_efi-stub.o 	:= -DTEXT_OFFSET=$(TEXT_OFFSET) \
-			   -I$(src)/../../../scripts/dtc/libfdt
+CFLAGS_efi-stub.o 	:= -DTEXT_OFFSET=$(TEXT_OFFSET)
 
 
 CFLAGS_REMOVE_ftrace.o = -pg
 CFLAGS_REMOVE_ftrace.o = -pg
 CFLAGS_REMOVE_insn.o = -pg
 CFLAGS_REMOVE_insn.o = -pg

+ 0 - 6
arch/arm64/kernel/efi-stub.c

@@ -13,12 +13,6 @@
 #include <asm/efi.h>
 #include <asm/efi.h>
 #include <asm/sections.h>
 #include <asm/sections.h>
 
 
-/* Include shared EFI stub code */
-#include "../../../drivers/firmware/efi/efi-stub-helper.c"
-#include "../../../drivers/firmware/efi/fdt.c"
-#include "../../../drivers/firmware/efi/arm-stub.c"
-
-
 efi_status_t handle_kernel_image(efi_system_table_t *sys_table,
 efi_status_t 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,

+ 2 - 1
arch/x86/boot/compressed/Makefile

@@ -33,7 +33,8 @@ VMLINUX_OBJS = $(obj)/vmlinux.lds $(obj)/head_$(BITS).o $(obj)/misc.o \
 $(obj)/eboot.o: KBUILD_CFLAGS += -fshort-wchar -mno-red-zone
 $(obj)/eboot.o: KBUILD_CFLAGS += -fshort-wchar -mno-red-zone
 
 
 ifeq ($(CONFIG_EFI_STUB), y)
 ifeq ($(CONFIG_EFI_STUB), y)
-	VMLINUX_OBJS += $(obj)/eboot.o $(obj)/efi_stub_$(BITS).o
+	VMLINUX_OBJS += $(obj)/eboot.o $(obj)/efi_stub_$(BITS).o \
+				$(objtree)/drivers/firmware/efi/libstub/lib.a
 endif
 endif
 
 
 $(obj)/vmlinux: $(VMLINUX_OBJS) FORCE
 $(obj)/vmlinux: $(VMLINUX_OBJS) FORCE

+ 0 - 2
arch/x86/boot/compressed/eboot.c

@@ -280,8 +280,6 @@ void efi_char16_printk(efi_system_table_t *table, efi_char16_t *str)
 	}
 	}
 }
 }
 
 
-#include "../../../../drivers/firmware/efi/efi-stub-helper.c"
-
 static void find_bits(unsigned long mask, u8 *pos, u8 *size)
 static void find_bits(unsigned long mask, u8 *pos, u8 *size)
 {
 {
 	u8 first, len;
 	u8 first, len;

+ 3 - 0
drivers/firmware/efi/Kconfig

@@ -57,6 +57,9 @@ config EFI_PARAMS_FROM_FDT
 config EFI_RUNTIME_WRAPPERS
 config EFI_RUNTIME_WRAPPERS
 	bool
 	bool
 
 
+config EFI_ARMSTUB
+	bool
+
 endmenu
 endmenu
 
 
 config UEFI_CPER
 config UEFI_CPER

+ 1 - 0
drivers/firmware/efi/Makefile

@@ -7,3 +7,4 @@ obj-$(CONFIG_EFI_VARS_PSTORE)		+= efi-pstore.o
 obj-$(CONFIG_UEFI_CPER)			+= cper.o
 obj-$(CONFIG_UEFI_CPER)			+= cper.o
 obj-$(CONFIG_EFI_RUNTIME_MAP)		+= runtime-map.o
 obj-$(CONFIG_EFI_RUNTIME_MAP)		+= runtime-map.o
 obj-$(CONFIG_EFI_RUNTIME_WRAPPERS)	+= runtime-wrappers.o
 obj-$(CONFIG_EFI_RUNTIME_WRAPPERS)	+= runtime-wrappers.o
+obj-$(CONFIG_EFI_STUB)			+= libstub/

+ 26 - 0
drivers/firmware/efi/libstub/Makefile

@@ -0,0 +1,26 @@
+#
+# The stub may be linked into the kernel proper or into a separate boot binary,
+# but in either case, it executes before the kernel does (with MMU disabled) so
+# things like ftrace and stack-protector are likely to cause trouble if left
+# enabled, even if doing so doesn't break the build.
+#
+cflags-$(CONFIG_X86_32)		:= -march=i386
+cflags-$(CONFIG_X86_64)		:= -mcmodel=small
+cflags-$(CONFIG_X86)		+= -m$(BITS) -D__KERNEL__ $(LINUX_INCLUDE) -O2 \
+				   -fPIC -fno-strict-aliasing -mno-red-zone \
+				   -mno-mmx -mno-sse -DDISABLE_BRANCH_PROFILING
+
+cflags-$(CONFIG_ARM64)		:= $(subst -pg,,$(KBUILD_CFLAGS))
+cflags-$(CONFIG_ARM)		:= $(subst -pg,,$(KBUILD_CFLAGS)) \
+				   -fno-builtin -fpic -mno-single-pic-base
+
+KBUILD_CFLAGS			:= $(cflags-y) \
+				   $(call cc-option,-ffreestanding) \
+				   $(call cc-option,-fno-stack-protector)
+
+GCOV_PROFILE			:= n
+
+lib-y				:= efi-stub-helper.o
+lib-$(CONFIG_EFI_ARMSTUB)	+= arm-stub.o fdt.o
+
+CFLAGS_fdt.o			+= -I$(srctree)/scripts/dtc/libfdt/

+ 0 - 0
drivers/firmware/efi/arm-stub.c → drivers/firmware/efi/libstub/arm-stub.c


+ 0 - 0
drivers/firmware/efi/efi-stub-helper.c → drivers/firmware/efi/libstub/efi-stub-helper.c


+ 0 - 0
drivers/firmware/efi/efistub.h → drivers/firmware/efi/libstub/efistub.h


+ 0 - 0
drivers/firmware/efi/fdt.c → drivers/firmware/efi/libstub/fdt.c