| .. | .. | 
|---|
| 7 | 7 | # | 
|---|
| 8 | 8 | cflags-$(CONFIG_X86_32)		:= -march=i386 | 
|---|
| 9 | 9 | cflags-$(CONFIG_X86_64)		:= -mcmodel=small | 
|---|
| 10 |  | -cflags-$(CONFIG_X86)		+= -m$(BITS) -D__KERNEL__ -O2 \ | 
|---|
|  | 10 | +cflags-$(CONFIG_X86)		+= -m$(BITS) -D__KERNEL__ \ | 
|---|
| 11 | 11 | -fPIC -fno-strict-aliasing -mno-red-zone \ | 
|---|
| 12 | 12 | -mno-mmx -mno-sse -fshort-wchar \ | 
|---|
| 13 | 13 | -Wno-pointer-sign \ | 
|---|
| 14 | 14 | $(call cc-disable-warning, address-of-packed-member) \ | 
|---|
| 15 |  | -				   $(call cc-disable-warning, gnu) | 
|---|
|  | 15 | +				   $(call cc-disable-warning, gnu) \ | 
|---|
|  | 16 | +				   -fno-asynchronous-unwind-tables \ | 
|---|
|  | 17 | +				   $(CLANG_FLAGS) | 
|---|
| 16 | 18 |  | 
|---|
| 17 | 19 | # arm64 uses the full KBUILD_CFLAGS so it's necessary to explicitly | 
|---|
| 18 | 20 | # disable the stackleak plugin | 
|---|
| 19 |  | -cflags-$(CONFIG_ARM64)		:= $(subst -pg,,$(KBUILD_CFLAGS)) -fpie \ | 
|---|
| 20 |  | -				   $(DISABLE_STACKLEAK_PLUGIN) | 
|---|
| 21 |  | -cflags-$(CONFIG_ARM)		:= $(subst -pg,,$(KBUILD_CFLAGS)) \ | 
|---|
|  | 21 | +cflags-$(CONFIG_ARM64)		:= $(subst $(CC_FLAGS_FTRACE),,$(KBUILD_CFLAGS)) \ | 
|---|
|  | 22 | +				   -fpie $(DISABLE_STACKLEAK_PLUGIN) \ | 
|---|
|  | 23 | +				   $(call cc-option,-mbranch-protection=none) | 
|---|
|  | 24 | +cflags-$(CONFIG_ARM)		:= $(subst $(CC_FLAGS_FTRACE),,$(KBUILD_CFLAGS)) \ | 
|---|
| 22 | 25 | -fno-builtin -fpic \ | 
|---|
| 23 | 26 | $(call cc-option,-mno-single-pic-base) | 
|---|
|  | 27 | +cflags-$(CONFIG_RISCV)		:= $(subst $(CC_FLAGS_FTRACE),,$(KBUILD_CFLAGS)) \ | 
|---|
|  | 28 | +				   -fpic | 
|---|
| 24 | 29 |  | 
|---|
| 25 |  | -cflags-$(CONFIG_EFI_ARMSTUB)	+= -I$(srctree)/scripts/dtc/libfdt | 
|---|
|  | 30 | +cflags-$(CONFIG_EFI_GENERIC_STUB) += -I$(srctree)/scripts/dtc/libfdt | 
|---|
| 26 | 31 |  | 
|---|
| 27 |  | -KBUILD_CFLAGS			:= $(cflags-y) -DDISABLE_BRANCH_PROFILING \ | 
|---|
|  | 32 | +KBUILD_CFLAGS			:= $(cflags-y) -Os -DDISABLE_BRANCH_PROFILING \ | 
|---|
|  | 33 | +				   -include $(srctree)/include/linux/hidden.h \ | 
|---|
| 28 | 34 | -D__NO_FORTIFY \ | 
|---|
| 29 |  | -				   $(call cc-option,-ffreestanding) \ | 
|---|
| 30 |  | -				   $(call cc-option,-fno-stack-protector) \ | 
|---|
|  | 35 | +				   -ffreestanding \ | 
|---|
|  | 36 | +				   -fno-stack-protector \ | 
|---|
| 31 | 37 | $(call cc-option,-fno-addrsig) \ | 
|---|
| 32 |  | -				   -D__DISABLE_EXPORTS \ | 
|---|
| 33 |  | -				   $(DISABLE_LTO) | 
|---|
|  | 38 | +				   -D__DISABLE_EXPORTS | 
|---|
|  | 39 | + | 
|---|
|  | 40 | +# | 
|---|
|  | 41 | +# struct randomization only makes sense for Linux internal types, which the EFI | 
|---|
|  | 42 | +# stub code never touches, so let's turn off struct randomization for the stub | 
|---|
|  | 43 | +# altogether | 
|---|
|  | 44 | +# | 
|---|
|  | 45 | +KBUILD_CFLAGS := $(filter-out $(RANDSTRUCT_CFLAGS), $(KBUILD_CFLAGS)) | 
|---|
|  | 46 | + | 
|---|
|  | 47 | +# remove SCS flags from all objects in this directory | 
|---|
|  | 48 | +KBUILD_CFLAGS := $(filter-out $(CC_FLAGS_SCS), $(KBUILD_CFLAGS)) | 
|---|
|  | 49 | +# disable LTO | 
|---|
|  | 50 | +KBUILD_CFLAGS := $(filter-out $(CC_FLAGS_LTO), $(KBUILD_CFLAGS)) | 
|---|
| 34 | 51 |  | 
|---|
| 35 | 52 | GCOV_PROFILE			:= n | 
|---|
|  | 53 | +# Sanitizer runtimes are unavailable and cannot be linked here. | 
|---|
| 36 | 54 | KASAN_SANITIZE			:= n | 
|---|
|  | 55 | +KCSAN_SANITIZE			:= n | 
|---|
| 37 | 56 | UBSAN_SANITIZE			:= n | 
|---|
| 38 | 57 | OBJECT_FILES_NON_STANDARD	:= y | 
|---|
| 39 | 58 |  | 
|---|
| 40 | 59 | # Prevents link failures: __sanitizer_cov_trace_pc() is not linked in. | 
|---|
| 41 | 60 | KCOV_INSTRUMENT			:= n | 
|---|
| 42 | 61 |  | 
|---|
| 43 |  | -lib-y				:= efi-stub-helper.o gop.o secureboot.o tpm.o | 
|---|
|  | 62 | +lib-y				:= efi-stub-helper.o gop.o secureboot.o tpm.o \ | 
|---|
|  | 63 | +				   file.o mem.o random.o randomalloc.o pci.o \ | 
|---|
|  | 64 | +				   skip_spaces.o lib-cmdline.o lib-ctype.o \ | 
|---|
|  | 65 | +				   alignedmem.o relocate.o vsprintf.o | 
|---|
| 44 | 66 |  | 
|---|
| 45 | 67 | # include the stub's generic dependencies from lib/ when building for ARM/arm64 | 
|---|
| 46 |  | -arm-deps-y := fdt_rw.c fdt_ro.c fdt_wip.c fdt.c fdt_empty_tree.c fdt_sw.c | 
|---|
| 47 |  | -arm-deps-$(CONFIG_ARM64) += sort.c | 
|---|
|  | 68 | +efi-deps-y := fdt_rw.c fdt_ro.c fdt_wip.c fdt.c fdt_empty_tree.c fdt_sw.c | 
|---|
| 48 | 69 |  | 
|---|
| 49 | 70 | $(obj)/lib-%.o: $(srctree)/lib/%.c FORCE | 
|---|
| 50 | 71 | $(call if_changed_rule,cc_o_c) | 
|---|
| 51 | 72 |  | 
|---|
| 52 |  | -lib-$(CONFIG_EFI_ARMSTUB)	+= arm-stub.o fdt.o string.o random.o \ | 
|---|
| 53 |  | -				   $(patsubst %.c,lib-%.o,$(arm-deps-y)) | 
|---|
|  | 73 | +lib-$(CONFIG_EFI_GENERIC_STUB)	+= efi-stub.o fdt.o string.o \ | 
|---|
|  | 74 | +				   $(patsubst %.c,lib-%.o,$(efi-deps-y)) | 
|---|
| 54 | 75 |  | 
|---|
| 55 | 76 | lib-$(CONFIG_ARM)		+= arm32-stub.o | 
|---|
| 56 | 77 | lib-$(CONFIG_ARM64)		+= arm64-stub.o | 
|---|
| 57 |  | -CFLAGS_arm64-stub.o 		:= -DTEXT_OFFSET=$(TEXT_OFFSET) | 
|---|
|  | 78 | +lib-$(CONFIG_X86)		+= x86-stub.o | 
|---|
|  | 79 | +lib-$(CONFIG_RISCV)		+= riscv-stub.o | 
|---|
|  | 80 | +CFLAGS_arm32-stub.o		:= -DTEXT_OFFSET=$(TEXT_OFFSET) | 
|---|
|  | 81 | + | 
|---|
|  | 82 | +# Even when -mbranch-protection=none is set, Clang will generate a | 
|---|
|  | 83 | +# .note.gnu.property for code-less object files (like lib/ctype.c), | 
|---|
|  | 84 | +# so work around this by explicitly removing the unwanted section. | 
|---|
|  | 85 | +# https://bugs.llvm.org/show_bug.cgi?id=46480 | 
|---|
|  | 86 | +STUBCOPY_FLAGS-y		+= --remove-section=.note.gnu.property | 
|---|
|  | 87 | + | 
|---|
|  | 88 | +# | 
|---|
|  | 89 | +# For x86, bootloaders like systemd-boot or grub-efi do not zero-initialize the | 
|---|
|  | 90 | +# .bss section, so the .bss section of the EFI stub needs to be included in the | 
|---|
|  | 91 | +# .data section of the compressed kernel to ensure initialization. Rename the | 
|---|
|  | 92 | +# .bss section here so it's easy to pick out in the linker script. | 
|---|
|  | 93 | +# | 
|---|
|  | 94 | +STUBCOPY_FLAGS-$(CONFIG_X86)	+= --rename-section .bss=.bss.efistub,load,alloc | 
|---|
|  | 95 | +STUBCOPY_RELOC-$(CONFIG_X86_32)	:= R_386_32 | 
|---|
|  | 96 | +STUBCOPY_RELOC-$(CONFIG_X86_64)	:= R_X86_64_64 | 
|---|
|  | 97 | + | 
|---|
|  | 98 | +# | 
|---|
|  | 99 | +# ARM discards the .data section because it disallows r/w data in the | 
|---|
|  | 100 | +# decompressor. So move our .data to .data.efistub and .bss to .bss.efistub, | 
|---|
|  | 101 | +# which are preserved explicitly by the decompressor linker script. | 
|---|
|  | 102 | +# | 
|---|
|  | 103 | +STUBCOPY_FLAGS-$(CONFIG_ARM)	+= --rename-section .data=.data.efistub	\ | 
|---|
|  | 104 | +				   --rename-section .bss=.bss.efistub,load,alloc | 
|---|
|  | 105 | +STUBCOPY_RELOC-$(CONFIG_ARM)	:= R_ARM_ABS | 
|---|
| 58 | 106 |  | 
|---|
| 59 | 107 | # | 
|---|
| 60 | 108 | # arm64 puts the stub in the kernel proper, which will unnecessarily retain all | 
|---|
| .. | .. | 
|---|
| 70 | 118 | # a verification pass to see if any absolute relocations exist in any of the | 
|---|
| 71 | 119 | # object files. | 
|---|
| 72 | 120 | # | 
|---|
| 73 |  | -extra-$(CONFIG_EFI_ARMSTUB)	:= $(lib-y) | 
|---|
| 74 |  | -lib-$(CONFIG_EFI_ARMSTUB)	:= $(patsubst %.o,%.stub.o,$(lib-y)) | 
|---|
|  | 121 | +extra-y				:= $(lib-y) | 
|---|
|  | 122 | +lib-y				:= $(patsubst %.o,%.stub.o,$(lib-y)) | 
|---|
| 75 | 123 |  | 
|---|
| 76 |  | -STUBCOPY_RM-y			:= -R *ksymtab* -R *kcrctab* | 
|---|
| 77 | 124 | STUBCOPY_FLAGS-$(CONFIG_ARM64)	+= --prefix-alloc-sections=.init \ | 
|---|
| 78 | 125 | --prefix-symbols=__efistub_ | 
|---|
| 79 | 126 | STUBCOPY_RELOC-$(CONFIG_ARM64)	:= R_AARCH64_ABS | 
|---|
|  | 127 | + | 
|---|
|  | 128 | +# For RISC-V, we don't need anything special other than arm64. Keep all the | 
|---|
|  | 129 | +# symbols in .init section and make sure that no absolute symbols references | 
|---|
|  | 130 | +# doesn't exist. | 
|---|
|  | 131 | +STUBCOPY_FLAGS-$(CONFIG_RISCV)	+= --prefix-alloc-sections=.init \ | 
|---|
|  | 132 | +				   --prefix-symbols=__efistub_ | 
|---|
|  | 133 | +STUBCOPY_RELOC-$(CONFIG_RISCV)	:= R_RISCV_HI20 | 
|---|
| 80 | 134 |  | 
|---|
| 81 | 135 | $(obj)/%.stub.o: $(obj)/%.o FORCE | 
|---|
| 82 | 136 | $(call if_changed,stubcopy) | 
|---|
| .. | .. | 
|---|
| 88 | 142 | # this time, use objcopy and leave all sections in place. | 
|---|
| 89 | 143 | # | 
|---|
| 90 | 144 | quiet_cmd_stubcopy = STUBCPY $@ | 
|---|
| 91 |  | -      cmd_stubcopy = if $(STRIP) --strip-debug $(STUBCOPY_RM-y) -o $@ $<; \ | 
|---|
| 92 |  | -		     then if $(OBJDUMP) -r $@ | grep $(STUBCOPY_RELOC-y); \ | 
|---|
| 93 |  | -		     then (echo >&2 "$@: absolute symbol references not allowed in the EFI stub"; \ | 
|---|
| 94 |  | -			   rm -f $@; /bin/false); 			  \ | 
|---|
| 95 |  | -		     else $(OBJCOPY) $(STUBCOPY_FLAGS-y) $< $@; fi	  \ | 
|---|
| 96 |  | -		     else /bin/false; fi | 
|---|
| 97 |  | - | 
|---|
| 98 |  | -# | 
|---|
| 99 |  | -# ARM discards the .data section because it disallows r/w data in the | 
|---|
| 100 |  | -# decompressor. So move our .data to .data.efistub, which is preserved | 
|---|
| 101 |  | -# explicitly by the decompressor linker script. | 
|---|
| 102 |  | -# | 
|---|
| 103 |  | -STUBCOPY_FLAGS-$(CONFIG_ARM)	+= --rename-section .data=.data.efistub | 
|---|
| 104 |  | -STUBCOPY_RELOC-$(CONFIG_ARM)	:= R_ARM_ABS | 
|---|
|  | 145 | +      cmd_stubcopy =							\ | 
|---|
|  | 146 | +	$(STRIP) --strip-debug -o $@ $<;				\ | 
|---|
|  | 147 | +	if $(OBJDUMP) -r $@ | grep $(STUBCOPY_RELOC-y); then		\ | 
|---|
|  | 148 | +		echo "$@: absolute symbol references not allowed in the EFI stub" >&2; \ | 
|---|
|  | 149 | +		/bin/false;						\ | 
|---|
|  | 150 | +	fi;								\ | 
|---|
|  | 151 | +	$(OBJCOPY) $(STUBCOPY_FLAGS-y) $< $@ | 
|---|