Merge tag 'kbuild-v6.10' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy...
[linux-2.6-block.git] / drivers / firmware / efi / libstub / Makefile
CommitLineData
b2441318 1# SPDX-License-Identifier: GPL-2.0
f4f75ad5
AB
2#
3# The stub may be linked into the kernel proper or into a separate boot binary,
4# but in either case, it executes before the kernel does (with MMU disabled) so
5# things like ftrace and stack-protector are likely to cause trouble if left
6# enabled, even if doing so doesn't break the build.
7#
0d60ffee
AB
8
9# non-x86 reuses KBUILD_CFLAGS, x86 does not
10cflags-y := $(KBUILD_CFLAGS)
11
f4f75ad5 12cflags-$(CONFIG_X86_32) := -march=i386
769e0fe1 13cflags-$(CONFIG_X86_64) := -mcmodel=small
bbf8e8b0 14cflags-$(CONFIG_X86) += -m$(BITS) -D__KERNEL__ \
f4f75ad5 15 -fPIC -fno-strict-aliasing -mno-red-zone \
3db5e0ba
NC
16 -mno-mmx -mno-sse -fshort-wchar \
17 -Wno-pointer-sign \
18 $(call cc-disable-warning, address-of-packed-member) \
003602ad 19 $(call cc-disable-warning, gnu) \
58d746c1
NC
20 -fno-asynchronous-unwind-tables \
21 $(CLANG_FLAGS)
f4f75ad5 22
ce279d37
LA
23# arm64 uses the full KBUILD_CFLAGS so it's necessary to explicitly
24# disable the stackleak plugin
0d60ffee 25cflags-$(CONFIG_ARM64) += -fpie $(DISABLE_STACKLEAK_PLUGIN) \
8358098b 26 -fno-unwind-tables -fno-asynchronous-unwind-tables
2e6fa86f 27cflags-$(CONFIG_ARM) += -DEFI_HAVE_STRLEN -DEFI_HAVE_STRNLEN \
da8dd0c7
AB
28 -DEFI_HAVE_MEMCHR -DEFI_HAVE_STRRCHR \
29 -DEFI_HAVE_STRCMP -fno-builtin -fpic \
41f1c484 30 $(call cc-option,-mno-single-pic-base)
afb2a4fb 31cflags-$(CONFIG_RISCV) += -fpic -DNO_ALTERNATIVE -mno-relax
0d60ffee 32cflags-$(CONFIG_LOONGARCH) += -fpie
f4f75ad5 33
40cd01a9 34cflags-$(CONFIG_EFI_PARAMS_FROM_FDT) += -I$(srctree)/scripts/dtc/libfdt
e8f3010f 35
0d60ffee
AB
36KBUILD_CFLAGS := $(subst $(CC_FLAGS_FTRACE),,$(cflags-y)) \
37 -Os -DDISABLE_BRANCH_PROFILING \
e544ea57 38 -include $(srctree)/include/linux/hidden.h \
3e2c044a 39 -D__NO_FORTIFY \
685969e0 40 -ffreestanding \
893ab004 41 -fno-stack-protector \
f77767ed 42 $(call cc-option,-fno-addrsig) \
f922c4ab 43 -D__DISABLE_EXPORTS
f4f75ad5 44
1a388792
AB
45#
46# struct randomization only makes sense for Linux internal types, which the EFI
47# stub code never touches, so let's turn off struct randomization for the stub
48# altogether
49#
50KBUILD_CFLAGS := $(filter-out $(RANDSTRUCT_CFLAGS), $(KBUILD_CFLAGS))
51
cc49c71d
ST
52# remove SCS flags from all objects in this directory
53KBUILD_CFLAGS := $(filter-out $(CC_FLAGS_SCS), $(KBUILD_CFLAGS))
f143ff39
ST
54# disable CFI
55KBUILD_CFLAGS := $(filter-out $(CC_FLAGS_CFI), $(KBUILD_CFLAGS))
6e20f185
ST
56# disable LTO
57KBUILD_CFLAGS := $(filter-out $(CC_FLAGS_LTO), $(KBUILD_CFLAGS))
cc49c71d 58
0d959814 59lib-y := efi-stub-helper.o gop.o secureboot.o tpm.o \
91d150c0 60 file.o mem.o random.o randomalloc.o pci.o \
43b1df0e 61 skip_spaces.o lib-cmdline.o lib-ctype.o \
2e6fa86f 62 alignedmem.o relocate.o printk.o vsprintf.o
e8f3010f 63
40cd01a9
AB
64# include the stub's libfdt dependencies from lib/ when needed
65libfdt-deps := fdt_rw.c fdt_ro.c fdt_wip.c fdt.c \
66 fdt_empty_tree.c fdt_sw.c
67
68lib-$(CONFIG_EFI_PARAMS_FROM_FDT) += fdt.o \
69 $(patsubst %.c,lib-%.o,$(libfdt-deps))
e8f3010f
AB
70
71$(obj)/lib-%.o: $(srctree)/lib/%.c FORCE
72 $(call if_changed_rule,cc_o_c)
73
732ea9db 74lib-$(CONFIG_EFI_GENERIC_STUB) += efi-stub.o string.o intrinsics.o systable.o \
42c8ea3d 75 screen_info.o efi-stub-entry.o
f4f75ad5 76
81a0bc39 77lib-$(CONFIG_ARM) += arm32-stub.o
6b56beb5 78lib-$(CONFIG_ARM64) += kaslr.o arm64.o arm64-stub.o smbios.o
c2d0b470 79lib-$(CONFIG_X86) += x86-stub.o
cb1c9e02 80lib-$(CONFIG_X86_64) += x86-5lvl.o
b7ac4b8e 81lib-$(CONFIG_RISCV) += kaslr.o riscv.o riscv-stub.o
d729b554 82lib-$(CONFIG_LOONGARCH) += loongarch.o loongarch-stub.o
ead384d9 83
41cd96fa 84CFLAGS_arm32-stub.o := -DTEXT_OFFSET=$(TEXT_OFFSET)
bf457786 85
a0509109
AB
86zboot-obj-$(CONFIG_RISCV) := lib-clz_ctz.o lib-ashldi3.o
87lib-$(CONFIG_EFI_ZBOOT) += zboot.o $(zboot-obj-y)
88
745e3ed8
KS
89lib-$(CONFIG_UNACCEPTED_MEMORY) += unaccepted_memory.o bitmap.o find.o
90
a0509109
AB
91extra-y := $(lib-y)
92lib-y := $(patsubst %.o,%.stub.o,$(lib-y))
93
e2179a09
KC
94# Even when -mbranch-protection=none is set, Clang will generate a
95# .note.gnu.property for code-less object files (like lib/ctype.c),
96# so work around this by explicitly removing the unwanted section.
2947a456 97# https://llvm.org/pr46480
e2179a09
KC
98STUBCOPY_FLAGS-y += --remove-section=.note.gnu.property
99
26a92425
AS
100STUBCOPY_RELOC-$(CONFIG_X86_32) := R_386_32
101STUBCOPY_RELOC-$(CONFIG_X86_64) := R_X86_64_64
102
103#
104# ARM discards the .data section because it disallows r/w data in the
105# decompressor. So move our .data to .data.efistub and .bss to .bss.efistub,
106# which are preserved explicitly by the decompressor linker script.
107#
108STUBCOPY_FLAGS-$(CONFIG_ARM) += --rename-section .data=.data.efistub \
109 --rename-section .bss=.bss.efistub,load,alloc
110STUBCOPY_RELOC-$(CONFIG_ARM) := R_ARM_ABS
111
ddeeefe2
AB
112#
113# arm64 puts the stub in the kernel proper, which will unnecessarily retain all
114# code indefinitely unless it is annotated as __init/__initdata/__initconst etc.
115# So let's apply the __init annotations at the section level, by prefixing
116# the section names directly. This will ensure that even all the inline string
117# literals are covered.
e8f3010f
AB
118# The fact that the stub and the kernel proper are essentially the same binary
119# also means that we need to be extra careful to make sure that the stub does
120# not rely on any absolute symbol references, considering that the virtual
121# kernel mapping that the linker uses is not active yet when the stub is
122# executing. So build all C dependencies of the EFI stub into libstub, and do
123# a verification pass to see if any absolute relocations exist in any of the
124# object files.
ddeeefe2 125#
e8f3010f
AB
126STUBCOPY_FLAGS-$(CONFIG_ARM64) += --prefix-alloc-sections=.init \
127 --prefix-symbols=__efistub_
61786170 128STUBCOPY_RELOC-$(CONFIG_ARM64) := R_AARCH64_ABS
e8f3010f 129
d7071743
AP
130# For RISC-V, we don't need anything special other than arm64. Keep all the
131# symbols in .init section and make sure that no absolute symbols references
f6e6e95c 132# exist.
d7071743
AP
133STUBCOPY_FLAGS-$(CONFIG_RISCV) += --prefix-alloc-sections=.init \
134 --prefix-symbols=__efistub_
d2baf8cc 135STUBCOPY_RELOC-$(CONFIG_RISCV) := -E R_RISCV_HI20\|R_RISCV_$(BITS)\|R_RISCV_RELAX
d7071743 136
ead384d9
HC
137# For LoongArch, keep all the symbols in .init section and make sure that no
138# absolute symbols references exist.
139STUBCOPY_FLAGS-$(CONFIG_LOONGARCH) += --prefix-alloc-sections=.init \
140 --prefix-symbols=__efistub_
141STUBCOPY_RELOC-$(CONFIG_LOONGARCH) := R_LARCH_MARK_LA
142
e8f3010f
AB
143$(obj)/%.stub.o: $(obj)/%.o FORCE
144 $(call if_changed,stubcopy)
ddeeefe2 145
696204fa
AB
146#
147# Strip debug sections and some other sections that may legally contain
148# absolute relocations, so that we can inspect the remaining sections for
149# such relocations. If none are found, regenerate the output object, but
150# this time, use objcopy and leave all sections in place.
151#
e8f3010f 152quiet_cmd_stubcopy = STUBCPY $@
e8d368ad 153 cmd_stubcopy = \
02562d0c 154 $(STRIP) --strip-debug -o $@ $<; \
e8d368ad
MY
155 if $(OBJDUMP) -r $@ | grep $(STUBCOPY_RELOC-y); then \
156 echo "$@: absolute symbol references not allowed in the EFI stub" >&2; \
157 /bin/false; \
158 fi; \
159 $(OBJCOPY) $(STUBCOPY_FLAGS-y) $< $@