forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-13 9d77db3c730780c8ef5ccd4b66403ff5675cfe4e
kernel/drivers/firmware/efi/libstub/Makefile
....@@ -7,54 +7,102 @@
77 #
88 cflags-$(CONFIG_X86_32) := -march=i386
99 cflags-$(CONFIG_X86_64) := -mcmodel=small
10
-cflags-$(CONFIG_X86) += -m$(BITS) -D__KERNEL__ -O2 \
10
+cflags-$(CONFIG_X86) += -m$(BITS) -D__KERNEL__ \
1111 -fPIC -fno-strict-aliasing -mno-red-zone \
1212 -mno-mmx -mno-sse -fshort-wchar \
1313 -Wno-pointer-sign \
1414 $(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)
1618
1719 # arm64 uses the full KBUILD_CFLAGS so it's necessary to explicitly
1820 # 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)) \
2225 -fno-builtin -fpic \
2326 $(call cc-option,-mno-single-pic-base)
27
+cflags-$(CONFIG_RISCV) := $(subst $(CC_FLAGS_FTRACE),,$(KBUILD_CFLAGS)) \
28
+ -fpic
2429
25
-cflags-$(CONFIG_EFI_ARMSTUB) += -I$(srctree)/scripts/dtc/libfdt
30
+cflags-$(CONFIG_EFI_GENERIC_STUB) += -I$(srctree)/scripts/dtc/libfdt
2631
27
-KBUILD_CFLAGS := $(cflags-y) -DDISABLE_BRANCH_PROFILING \
32
+KBUILD_CFLAGS := $(cflags-y) -Os -DDISABLE_BRANCH_PROFILING \
33
+ -include $(srctree)/include/linux/hidden.h \
2834 -D__NO_FORTIFY \
29
- $(call cc-option,-ffreestanding) \
30
- $(call cc-option,-fno-stack-protector) \
35
+ -ffreestanding \
36
+ -fno-stack-protector \
3137 $(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))
3451
3552 GCOV_PROFILE := n
53
+# Sanitizer runtimes are unavailable and cannot be linked here.
3654 KASAN_SANITIZE := n
55
+KCSAN_SANITIZE := n
3756 UBSAN_SANITIZE := n
3857 OBJECT_FILES_NON_STANDARD := y
3958
4059 # Prevents link failures: __sanitizer_cov_trace_pc() is not linked in.
4160 KCOV_INSTRUMENT := n
4261
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
4466
4567 # 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
4869
4970 $(obj)/lib-%.o: $(srctree)/lib/%.c FORCE
5071 $(call if_changed_rule,cc_o_c)
5172
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))
5475
5576 lib-$(CONFIG_ARM) += arm32-stub.o
5677 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
58106
59107 #
60108 # arm64 puts the stub in the kernel proper, which will unnecessarily retain all
....@@ -70,13 +118,19 @@
70118 # a verification pass to see if any absolute relocations exist in any of the
71119 # object files.
72120 #
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))
75123
76
-STUBCOPY_RM-y := -R *ksymtab* -R *kcrctab*
77124 STUBCOPY_FLAGS-$(CONFIG_ARM64) += --prefix-alloc-sections=.init \
78125 --prefix-symbols=__efistub_
79126 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
80134
81135 $(obj)/%.stub.o: $(obj)/%.o FORCE
82136 $(call if_changed,stubcopy)
....@@ -88,17 +142,10 @@
88142 # this time, use objcopy and leave all sections in place.
89143 #
90144 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) $< $@